2015-01-12 7 views
5

मेरे पास एक कस्टम फॉर्मटाइप है, जिसे पैरेंट फॉर्म जारी रखने पर खुद को मूल इकाई में जोड़ना होगा।Symfony2 (> = 2.3): बच्चे से पैरेंट फॉर्म इवेंट कैसे सुनें?

Symfony < 2.3 में यह निम्न कार्य करके किया जा सकता है:

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

लेकिन Symfony 2.6 के उन्नयन मुझे पता चला है कि $builder->getParent() हटा दिया गया है के बाद। लेकिन अब मैं अभिभावक को जमा नहीं कर सकता।

इसलिए मैंने अपने निर्माता को श्रोता जोड़ा और सब्सक्राइबर के भीतर से माता-पिता का संदर्भ दिया। लेकिन यह वास्तव में काम नहीं करता है, के बाद से मैं माता पिता के फार्म पर एक जांच मान्य किया जा रहा है - जो यह नहीं है, क्योंकि यह अभी तक प्रस्तुत नहीं कर रहा है:

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

यह झूठी कोड के अगले टुकड़े के कारण होता है:

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

और क्योंकि माता पिता प्रपत्र पहले सभी बच्चों के माध्यम से लूप और प्रस्तुत कि, खुद पर $this->submitted = true सेट करने से पहले ... मुझे यकीन है कि अगर माता-पिता मान्य है नहीं कर रहा हूँ।


टी एल; डॉ

मैं अपने माता पिता के फार्म के लिए एक Eventlistener जोड़ सकते हैं, मेरे माता-पिता फार्म समायोजित करने के लिए बिना? मैं चाहता हूं कि मेरा फूटाइप कुछ ऐसा हो जो मैं सभी रूपों में जोड़ सकूं, बिना फूटाइप विशिष्ट के लिए कुछ तर्क जानने/याद रखना।

+0

जैसा कि आप कहते हैं, 2.3 में getParent को हटा दिया गया था। क्या आप उपयोग के मामले का अधिक विस्तार से वर्णन कर सकते हैं? एक बेहतर समाधान हो सकता है। – Cerad

+1

यह एक इकाई है जिसे किसी अन्य इकाई में जोड़ा जा सकता है। इस मामले में यह एक मेनूइटम है जो पृष्ठ बनाए जाने पर बनाया जाता है। यह मेनूइटम पृष्ठ के शीर्षक पर आधारित है, इसलिए इसके लिए इनपुट के लिए इसके माता-पिता की आवश्यकता है। लेकिन मैं नहीं चाहता कि पेज 'जान' जाए, वहां मेनूइटम है जो उसके ऊपर निर्भर करता है। तो इससे पहले, मैं पेज एडमिन में एक मेनूइटम जोड़ सकता था और वह था। अब मैं व्यवस्थापक में एक ग्राहक जोड़ना चाहता हूं - जो ** गंदा ** – Oskar

+0

एक ही समस्या है, मैं जानना चाहता हूं कि रूट फॉर्म मान्य है, मुझे 2 में ऐसा करने का कोई तरीका नहीं मिल रहा है।6 :( – Tiois

उत्तर

0

मुझे एक ही कार्यक्षमता की आवश्यकता है क्योंकि मेरे पास एक कस्टम फॉर्म फ़ील्ड है जिसे सभी मैप किए गए फ़ील्ड अपडेट किए जाने के बाद मूल इकाई की आवश्यकता होती है। दुर्भाग्य से माता-पिता पर SUBMIT चलाने से पहले बच्चे के रूपों के POST_SUBMIT को कॉल किया जाता है।

मैं घटना के बच्चे को बच्चे से पास कर रहा था, और वहां अपना श्रोता लगा रहा था। नौकरी पाने के लिए मुझे दो श्रोताओं की आवश्यकता थी: एक संसाधित मूल्य प्राप्त करने के लिए, और एक मुख्य इकाई को अद्यतन करने के लिए। संदर्भ द्वारा बंद करने के लिए $ जेनरेट पासवर्ड को पास करने से आप बच्चे की घटना से माता-पिता को डेटा साझा कर सकते हैं।

जनक :: buildForm

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

बाल :: 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 
    } 
} 

(कस्टम फ़ील्ड एक चेकबॉक्स एक उपयोगकर्ता प्रबंधन मॉड्यूल के लिए 'को बचाने पर नया पासवर्ड जेनरेट' चिह्नित है। यह ईमेल उपयोगकर्ता जेनरेट किया गया पासवर्ड, यही कारण है कि मुझे मुख्य इकाई से नवीनतम ईमेल पता चाहिए)

+0

यह एक विचार है, लेकिन इसे अभी भी मूल रूप से संशोधित करने की आवश्यकता है। और ओपी की तरह मैं इसे संशोधित नहीं कर सकता। –

संबंधित मुद्दे