Mam niestandardowy typ FormType, który musi dodać się do jednostki nadrzędnej, gdy formularz nadrzędny będzie się utrzymywał.Symfony2 (> = 2.3): Jak odsłuchać wydarzenie w formie rodzica od dziecka?
< W Symfony 2.3 można to zrobić w następujący sposób:
class FooType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
...
$builder->getParent()->addEventSubscriber(new FooSubscriber)
}
}
class FooSubscriber implements EventSubscriberInterface
{
static function getSubscribedEvents()
{
return array(
FormEvents::POST_SUBMIT => 'postSubmit'
);
}
}
Ale po uaktualnieniu do Symfony 2.6 Odkryłam, że $builder->getParent()
został usunięty. Ale teraz nie mogę słuchać nadsyłanego rodzica.
Więc dodałem detektor do mojego konstruktora i odwołałem się do rodzica z subskrybenta. Ale to naprawdę nie działa, ponieważ robię czek na formularzu dominującej jest ważne - co nie jest, ponieważ nie jest jeszcze składać:
function postSubmit(FormEvent $e)
{
if ($e->getForm()->getParent()->getRoot()->isValid()) {
//this gives 'false'
Ta fałszywa jest spowodowane przez następny kawałek kodu:
// Symfony\Component\Form\Form.php @ line 744
public function isValid()
{
if (!$this->submitted) {
return false;
}
a ponieważ forma dominująca pierwszy pętli przez wszystkie dzieciaki i twierdzi, że przed ustawieniem $this->submitted = true
na siebie ... nie jestem pewien, czy rodzic jest ważny.
TL; DR
Jak mogę dodać EventListener do mojego formularza nadrzędnego, bez konieczności dostosowania moja forma rodzicem? Chcę, aby mój FooType był czymś, co mogę dodać do wszystkich formularzy, bez konieczności znajomości/pamiętania, aby zrobić jakąś logikę dla tego specyficznego FooType.
Jak powiedziałeś, getParent został usunięty w wersji 2.3. Czy możesz opisać przypadek użycia bardziej szczegółowo? Może być lepszym rozwiązaniem. – Cerad
Jest to jednostka, którą można dodać do innej jednostki. W tym przypadku jest to MenuItem, który jest tworzony po utrwaleniu strony. Ta pozycja menu jest oparta na tytule strony, więc do wejścia potrzebny jest jej element nadrzędny. Ale nie chcę aby strona wiedziała, że istnieje MenuItem, które zależy od niego. Więc wcześniej, po prostu mogłem dodać MenuItem do PageAdmin i to było to. Teraz mogę_ dodać subskrybenta w administratorze - co jest ** brudne ** – Oskar
Mając ten sam problem, chcę wiedzieć, czy formularz główny jest prawidłowy, nie mogę znaleźć sposobu, aby to zrobić w 2.6 :( – Tiois