/** * An extension to Jeremy Kendall's code (http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/). Instead of adding single element, the code below attempts to dynamically add a set of elements to a form. /* index controller: getRequest()->isPost()) { $this->view->form = $form; return; } // Form has been submitted - run data through preValidation() $form->preValidation($_POST); // If the form doesn't validate, pass to view and return if (! $form->isValid($_POST)) { $this->view->form = $form; return; } // Form is valid $this->view->form = $form; } public function newfieldAction () { $this->_helper->layout->disableLayout(); $ajaxContext = $this->_helper->getHelper('AjaxContext'); $ajaxContext->addActionContext('addelm', 'html')->initContext(); $id = $this->_getParam('id', null); $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; } } ?> Form class: setRequired(true); $this->addElement($element); $this->addElement('hidden', 'id', array('value' => 1)); $element = new Zend_Form_Element_Button('addentries', array('id' => 'add')); $element->setOrder(90); $this->addElement($element); $element = new Zend_Form_Element_Button('removeentries', array('id' => 'remove')); $element->setOrder(91); $this->addElement($element); $element = new Zend_Form_Element_Submit('submit'); $element->setOrder(92); $this->addElement($element); } /** * After post, pre validation hook * * Finds all fields where name includes 'newName' and uses addNewField to add * them to the form object * * @param array $data $_GET or $_POST */ public function preValidation (array $data) { // array_filter callback function findForms ($field) { // return field names that include 'newName' if (strpos($field, 'child') !== false) { return $field; } } $subForms = array_filter(array_keys($data), 'findForms'); $children = array(); foreach ($subForms as $subform) { if (is_array($data[$subform])) { // subforms added earlier will be passed to post as an array $children[$subform] = $data[$subform]; } } foreach ($children as $key => $fields) { // strip the id number off of the field name and use it to set new order $order = ltrim($key, 'child') + 1; $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); } } ?> index.phtml:
form; ?>