2011-11-09 8 views
6

मैं यह लेख पढ़ें: http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/प्रस्तुत पर ajax के साथ एक फार्म के लिए एक उप-प्रपत्र जोड़े

कि बहुत दिलचस्प था और यह ठीक काम करता है।

मुझे ऐसा करने की ज़रूरत है लेकिन सबफॉर्म के साथ। मेरा मतलब है कि जब कोई उपयोगकर्ता बटन दबाता है, तो मैं AJAX के माध्यम से कॉल करता हूं, जो एक क्रिया जो मेरे मौजूदा रूप में एक सबफॉर्म जोड़ता है, जोड़ता है और प्रदर्शित करता है।

उदाहरण के लिए:
मेरे पास एक ऐसा फॉर्म है जहां उपयोगकर्ता को अपने बच्चों का नाम और उपनाम भरना होगा, इसलिए एक बटन "बच्चा जोड़ें" है। जब उपयोगकर्ता उस बटन को दबाता है तो सबफॉर्म को मेरे मौजूदा रूप में जोड़ा जाना चाहिए और प्रदर्शित किया जाना चाहिए। सबमिट करने पर यह उस आलेख में उदाहरण की तरह मान्य होगा। केवल अंतर यह है कि वहां वह सिर्फ एक ही क्षेत्र जोड़ता है। मुझे सबफॉर्म जोड़ने की ज़रूरत है, लेकिन बिल्कुल वैसे ही।

public function clonerecursivegroupAction() 
{ 
    $this->_helper->layout->disableLayout(); 
    $ajaxContext = $this->_helper->getHelper('AjaxContext'); 
    $ajaxContext->addActionContext('clonerecursivegroup', 'html')->initContext(); 

    $id = $this->_getParam('id', null); 

    $subform1 = new Zend_Form_SubForm(); 

    $Element1 = $subform1->createElement('text', 'text1'); 
    $Element1->setLabel('text1')->setRequired(true); 
    $Element2 = $subform1->createElement('text', 'text2'); 
    $Element2->setLabel('text2')->setRequired(false); 

    $subform1->addElement($Element1); 
    $subform1->addElement($Element2); 

    $this->view->field = $subform1->__toString(); 
} 

यह लगभग काम करता है:

मैं अपने एक्शन (अजाक्स द्वारा कहा जाता है) में निम्नलिखित की कोशिश की।
इस क्रिया का दृश्य सबफॉर्म का एचटीएमएल कोड देता है, इसलिए मेरे AJAX कॉल की सफलता पर मैं इसे प्रदर्शित करता हूं।

समस्या यह है कि सबमिट पर यह फ़ॉर्म को मान्य करता है लेकिन यह अभी भी नया सबफ़ॉर्म खो गया है। यह आलेख में केवल एक तत्व के साथ नहीं होता है। मुझे लगता है कि मुझे उप फॉर्म को मौजूदा फॉर्म में जोड़ने की ज़रूरत है, लेकिन कैसे?

+0

हाय Samuele आप की जांच करना चाहिए js सत्यापन पुस्तकालय बीमा करने के लिए यह क्या करता है, के रूप में मैं यदि आप भिन्न फॉर्म (फॉर्म के अंदर फॉर्म) जोड़ते हैं तो अधिकांश लाइब्रेरी को फॉर्म और आईडी में सत्यापन जोड़ें, यह पूर्ण फॉर्म को मान्य नहीं करेगा –

उत्तर

2

सबफॉर्म तत्वों के उपसर्ग का उपसर्ग जोड़ें। मैंने subforms का प्रतिनिधित्व करने के लिए उपसर्ग "बच्चे" का इस्तेमाल किया। प्रत्येक सबफॉर्म को बाल 1, child2 और इसी तरह के रूप में बनाया जाएगा।

public function clonerecursivegroupAction() 
{ 
     //.. Other code 

     $subform = new Zend_Form_SubForm(); 
    $subform->setIsArray(true); 
    $subform->setName("child$id"); 
    $Element1 = $subform->createElement('text', "newfield$id"); 
    $Element1->setLabel("newfield$id") 
      ->setRequired(true); 
    $subform->addElement($Element1); 

    $Element1 = $subform->createElement('text', "nextfield$id"); 
    $Element1->setLabel("nextfield$id") 
      ->setRequired(true); 

    $subform->addElement($Element1); 

    $this->view->field = $subform; 
// Rest of your statements 

} 

फिर, preValidation समारोह में, उप-प्रपत्र उपसर्ग का उपयोग करके subforms को फिल्टर, क्षेत्र नाम के बजाय:

public function preValidation(array $data) { 
     // array_filter callback 
     function findForms($field) { 
     // return field names that include 'child' 
      if (strpos($field, 'child') !== false) { 
       return $field; 
      } 
     } 

     $subForms = array_filter(array_keys($data), 'findForms'); //filter the subform elements 

     $children = array(); 
     foreach ($subForms as $subform) { 

      if (is_array($data[$subform])) { 
     $children[$subform] = $data[$subform]; 
     } 

     } 

     //Iterate the children 
     foreach ($children as $key => $fields) { //$key = subformname, $field=array containing fiend names and values 

     // strip the id number off of the field name and use it to set new order 
     $order = ltrim($key, 'child') + 2; 
     $this->addNewForm($key, $fields, $order); 
    } 

}

जोड़ें नया प्रपत्र समारोह उप रूपों में से प्रत्येक बनाता है

 public function addNewForm($form, $elements, $order) { 

      $subform = new Zend_Form_SubForm(); 
    $subform->setIsArray(true); 
    foreach ($elements as $key => $el) { 
      $Element1 = $subform->createElement('text', $key); 
       $Element1->setLabel($form.$key) 
      ->setValue($el) 
       ->setRequired(true); 
        $subform->addElement($Element1); 
    } 
     $this->addSubForm($subform, $form, $order); 

    } 

[संपादित करें] एक उप-प्रपत्र रचनात्मक के लिए setIsArray का उपयोग करना: और मुख्य रूप से जुड़ जाता एक सरणी तत्व के रूप में subform के प्रत्येक तत्व को एट्स। यह preValidate समारोह को सरल बनाता है। इस सुविधा का उपयोग करने के लिए कोड संपादित किया।

complete code in pastebin

यहाँ belongsTo का उपयोग कर एक और समाधान है देखें, उप प्रपत्र तत्वों के लिए सरणी संकेतन प्रदान: http://www.stephenrhoades.com/?p=364

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