2015-01-12 9 views
5

Ana Form devam ettiğinde, ana varlıka kendini eklemesi gereken özel bir FormType'ım var.Symfony2 (> = 2.3): Ebeveyn formu olayını çocuktan nasıl dinleyebilirim?

Symfony < 2.3 bu aşağıdakileri yaparak yapılabilir:

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' 
     ); 
    } 
} 

Ama $builder->getParent() kaldırıldığını fark ettik Symfony 2.6 yükselttikten sonra. Ama şimdi gönderilmekte olan ebeveyni dinleyemiyorum.

Bu yüzden dinleyiciyi oluşturucuma ekledim ve üst öğeyi Abonenin içinden başvuruda buldum.

function postSubmit(FormEvent $e) 
{ 
    if ($e->getForm()->getParent()->getRoot()->isValid()) { 
     //this gives 'false' 

Bu sahte kod sonraki parça kaynaklanır: henüz sunulmamış beri, ki değil - ben geçerli olmak ana formdaki bir kontrol yapmak beri Ama bu gerçekten çalışmıyor

// Symfony\Component\Form\Form.php @ line 744 
public function isValid() 
{ 
    if (!$this->submitted) { 
     return false; 
    } 

ve ebeveyn formu öncelikle oğul döngüsü ve kendi üzerine $this->submitted = true ayarlamadan önce ... Ben ebeveyn geçerli olup olmadığından emin değilim, o gönderir çünkü

.


TL; DR

nasıl ebeveyn Formunu ayarlamak zorunda kalmadan, benim ana formu bir EventListener ekleyebilir? FooType'ımın, tüm FooType'a özel bir mantık yapmayı/hatırlamayı bilmeden, tüm formlara ekleyebileceğim bir şey olmasını istiyorum.

+0

Dediğiniz gibi, getParent 2.3'de kaldırıldı. Kullanım durumunu daha ayrıntılı olarak açıklayabilir misiniz? Daha iyi bir çözüm olabilir. – Cerad

+1

Başka bir varlığa eklenebilen bir varlıktır. Bu durumda, bir Sayfa kalıcı olduğunda oluşturulan bir MenuItem. Bu MenuItem, Sayfanın başlığına dayanmaktadır, bu nedenle giriş için üst öğeye ihtiyacı vardır. Ama ben Sayfanın 'bilmesini' istemiyorum, ona bağlı bir MenuItem var. Bu yüzden, daha önce PageAdmin'e bir MenuItem ekleyebilirdim ve o da buydu. Şimdi admin'e abone olun - bir abone ekleyin ** kirli ** – Oskar

+0

Aynı soruna sahip olmak, Kök formunun geçerli olup olmadığını bilmek istiyorum, bunu 2'de yapmanın bir yolunu bulamıyorum.6 :( – Tiois

cevap

0

Eşlenen tüm alanlar güncellendikten sonra üst öğeye gereksinim duyan özel form alanım olduğu için aynı işleve ihtiyacım vardı. Ne yazık ki, alt öğe üzerindeki SUBMIT önce alt formların POST_SUBMIT çağrılır.

EventDispatcher'ı çocuğa aktarmayı ve dinleyicimi oraya bağlamayı bitirdim. İşi yapmak için iki dinleyiciye ihtiyacım vardı: biri işlenen değeri almak ve biri ana öğeyi güncellemek için. $ generatedPassword komutunu başvuruyla kapatarak, çocuk olayından ebeveyne veri paylaşmanızı sağlar.

Veli :: buildForm

$builder->add('generate_password', GeneratePasswordType::class, [ 
    'event_dispatcher' => $builder->getEventDispatcher(), 
]); 

Çocuk :: buildForm

//first listed to submit even to get current field value 
$generateNewPassword = false; 
$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) use (&generateNewPassword) { 
    $generateNewPassword = null !== $event->getData(); 
}); 

//then run updater after parent entity has been updated 
$parentDispatcher = $options['event_dispatcher']; 
$parentDispatcher->addListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use (&$generateNewPassword) { 
    $user = $event->getData(); 
    if(true === $generateNewPassword){ 
     //update password & email user new credentials 
    } 
} 

(özel alan bir kullanıcı yönetim modülü için 'kurtarmak yeni şifre oluşturmak' olarak işaretlenmiş bir onay kutusudur. Bu e-postaları kullanıcı tarafından oluşturulan parola, bu yüzden ana varlıktan en son e-posta adresine ihtiyacım var)

+0

Bu bir fikir, ancak hala ana formu değiştirmeyi gerektiriyor ve OP gibi değiştiremiyorum. –