Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony][SF2][Symfony2]Dodanie walidacji do formularza nie używającego encji
Crash89
post
Post #1





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

Ostrzeżenie: (0%)
-----


Chcę tutaj porównać jedną daną pobraną w przesyłanym formularzu z drugą.
Wyczytałem gdzieś że do rozwiązania tego problemu, przy tworzeniu formularza FormType należy wykorzystać obiekt Callback, konstrukcja wygląda mniej więcej tak:
  1. use Symfony\Component\Validator\ExecutionContextInterface;
  2. use Symfony\Component\Validator\Constraints\Callback;
  3.  
  4.  
  5. public function buildForm(FormBuilderInterface $builder, array $options)
  6. {
  7. $builder->add('pole','type',array(
  8. 'mapped' => false,
  9. 'constraints' => array(
  10. new Callback(array($this,'validate')
  11. ))));
  12. // i treść funkcji validate
  13.  
  14. public function validate(ExecutionContextInterface $context){
  15. if($data['pole1'] >= $data->['pole2']){
  16. $context->addViolation("Tekst błędu");
  17. }
  18. }
  19.  


Problem w tym że nie wiem gdzie mam umieścić funckję validate.
Umieszczałem ją w FormType i nie działa, także próbowałem w kontrolerze, ale tam też jakoś na to nie reaguje.
Przy formularzu wykorzystującym entity, umieszczam ją w entity i wszystko działa, ale tutaj nie mam takiej klasy.



Więc, gdzie umieścić tą funkcję? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
blahy
post
Post #2





Grupa: Zarejestrowani
Postów: 82
Pomógł: 22
Dołączył: 20.07.2010

Ostrzeżenie: (0%)
-----


Co to znaczy nie dziala?

Nie dziala bo zgodnie z dokumentacja: http://symfony.com/doc/current/reference/c...callback-option
callback dostaje:

Concrete callbacks receive an ExecutionContextInterface instance as only argument.
Static or closure callbacks receive the validated object as the first argument and the ExecutionContextInterface instance as the second argument.


Wiec Twoja metoda validate jest w dobrym miejscu (tzn moglaby byc gdzie indziej niz w form type, ale tutaj tez jest ok), ale powinna miec taka sygnature:
public function validate($value, ExecutionContextInterface $ec).

Tak jak ty masz powinienes dostac:
Catchable Fatal Error: Argument 1 passed to AppBundle\Form\TestType::validate() must implement interface Symfony\Component\Validator\Context\ExecutionContextInterface, string given
albo cos podobnego - bylby to lepszy komunikat niz "nie dziala". Jesli nie widzisz tych bledow to polecam developowac przez kontroler developerski (IMG:style_emoticons/default/smile.gif)

Dla pewnosci wysylam przykladowy form type, ktory dziala. Jesli w pole "Pole" wpiszemy "a" to formularz jest prawidlowy, a jesli b to dostaniemy blad podpiety pod pole: Pole musi byc a

  1. <?php
  2.  
  3. namespace AppBundle\Form;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\Validator\Constraints\Callback;
  8. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  9.  
  10. class TestType extends AbstractType
  11. {
  12. public function buildForm(FormBuilderInterface $builder, array $options)
  13. {
  14. $builder->add('pole','text',array(
  15. 'mapped' => false,
  16. 'constraints' => array(
  17. new Callback(array($this,'validate')
  18. ))));
  19. }
  20.  
  21. public function validate($value, ExecutionContextInterface $ec)
  22. {
  23. if ($value !== 'a') {
  24. $ec->buildViolation('Pole musi byc a')
  25. ->atPath('pole')
  26. ->addViolation();
  27. }
  28. }
  29.  
  30. public function getName()
  31. {
  32. return 'test';
  33. }
  34. }


no i kontroler:
  1. <?php
  2.  
  3. namespace AppBundle\Controller;
  4.  
  5. use AppBundle\Form\TestType;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  8.  
  9. class DefaultController extends Controller
  10. {
  11. /**
  12.   * @Route("/app/example", name="homepage")
  13.   */
  14. public function indexAction(\Symfony\Component\HttpFoundation\Request $request)
  15. {
  16. $form = $this->createForm(new TestType());
  17.  
  18. $form->handleRequest($request);
  19.  
  20. if ($form->isValid()) {
  21. die('valid');
  22. }
  23.  
  24. return $this->render('default/index.html.twig', [
  25. 'form' => $form->createView(),
  26. ]);
  27. }
  28. }
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 21:30