Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF]2 Zmiana wiadomości validatora
Forum PHP.pl > Forum > PHP > Frameworki
Neider
Witam

Mam zdefiniowane entity User z polem server

  1. /**
  2.   * @ORM\ManyToOne(targetEntity="Nr\GuildBundle\Entity\Server", inversedBy="users")
  3.   * @ORM\JoinColumn(name="server_id", referencedColumnName="id", onDelete="CASCADE")
  4.   */
  5. private $server;


Następnie w formularzu dodaje je jako pole typu entity

  1. $builder->add('server', 'entity', array('class' => 'NrGuildBundle:Server',
  2. 'label' => 'user.form.server'))


Wszystko wyświetla się poprawnie, mam select z serwerami do wyboru. W momencie gdy zmienie sobię poprzez modyfikację wysłanego formularza, tak aby sprawdzić jak zachowa się formularz przy wyborze nie istniejącego serwera, wyświetla się błąd przy tym polu "Ta wartość jest nieprawidłowa.", więc tak jak powinno być.

Moje pytanie to:
Co należy dodać aby zmienić tą domyślną wiadomość o błędzie na moją własną. Brakuje mi definicjii walidatora na to pole (coś jak sfValidatorDoctrineChoice w 1.x) a mimo wszystko pole jest walidowane. W dokumentacji pola entity nic pomocnego nie znalazłem. Z drugiej strony, to chyba nie pole formularza powinno odpowiadać za to...
Neider
Z dokumentacją jestem zapoznany, zarówno cookbook jak i zwykłą książką. Możliwe że mi coś umknęło.
Chodzi mi o to że "magicznie" dodawany jest walidator na to pole bez mojej ingerencjii. Jak widać na pole server nie daję w annotcjach żadnego walidatora, a używam właśnie adnotacji do nich. User bazuje na modelu FOSUserBundle, ale pole server jest już moim własnym dodanym polem.

Chociażby na całą klasę mam nałożone walidatory, gdzie spokojnie mogę zmieniać komunikaty:
  1. /**
  2.  * Nr\CoreBundle\Entity\User\User
  3.  *
  4.  * @ORM\Table(name="user",
  5.  * uniqueConstraints={
  6.  * @ORM\UniqueConstraint(columns={"username", "server_id"}),
  7.  * }))
  8.  * @ORM\Entity(repositoryClass="Nr\CoreBundle\Entity\User\UserRepository")
  9.  * @DoctrineAssert\UniqueEntity(fields={"username", "server"}, message="user.exists_on_server")
  10.  * @DoctrineAssert\UniqueEntity(fields={"email"}, message="user.email_duplicate")
  11.  */


Na samym polu server, jak widać we wcześniejszym poście, żadnego constraint nie mam, a mimo to jakaś walidacja na tym polu się dokonuje. W dokumentacji nie znalazłem informacji o tym ani w rozdziałach dotyczących doctrine, forms lub validation.
ano
Jest to związane z wyjątkiem "TransformationFailedException".
Przy "sztucznym" wyborze nieistniejącego serwera wywalany jest ten wyjątek. Jest związany z
1. Polem typu "entity": https://github.com/symfony/symfony/blob/mas.../EntityType.php
2. Bezpośrednio zaś z transformatorem odpowiedzialnym za typ formularza "choice" - https://github.com/symfony/symfony/blob/mas...sformer.php#L56
-> transformator nie może znaleźć "właściwej" wartości i dlatego wypluwa TransformationFailedException.
Niestety, ten wyjątek jest wyciszany w trakcie bindowania danych do formularza.
Na formularzach działa "specjalne" rozszerzenie dodajace walidację:
https://github.com/symfony/symfony/blob/mas...orExtension.php
Kod
'invalid_message'            => 'This value is not valid.',

I ten komunikat bezpośrednio Ci się wyświetla w Twoim przypadku.

To niepożądane działanie jest opisane w tym issue:
https://github.com/symfony/symfony/issues/5607

Ale ten przypadek z błędem "Ta wartość jest nieprawidłowa" jest skrajny i w normalnym używaniu ciężko go 'wywołać' - trzeba preparować requesta z podanymi lewymi wartościami ;-)

Zastanów się, czy potrzebujesz koniecznie zmienić ten tekstu.
Neider
Dziękuję za tak wyczerpującą odpowiedź.

Jest tak jak piszesz, wystąpi to tylko jak ktoś lewe dane wyśle, aczkolwiek bardziej chodziło mi o kwestie "estetyki" żeby wyświetlić ładniejszy tekst niż wartość jest nieprawidłowa i aby na przyszłość wiedzieć skąd w ogóle ta walidacja się wzieła.
ano
Jeżeli używasz pola typu 'entity' (combo-box, radio buttony itp) to nie martw się o ten tekst. Jeśli ktoś tak spreparował żądanie, "zepsuł" wartości wysyłane z formularza, to nie ma znaczenie dla niego estetyka tego komunikatu błędu smile.gif
Oczywiście błąd nie musi wynikać ze spreparowania requestu, ale to są jednostkowe przypadki... (np. w czasie "submita formularza" lista Twoich serwerów się zmieniła. Na poprzednim ekranie były dostępne np 4 serwery do wyboru, po zmianach w Bazie zostały 3. Ktoś kto wybrał w formularzu "4" serwer zobaczy powyższy error)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.