/** * Dojo-enable a form instance * * @param Zend_Form $form * @return void */ public static function enableForm(Zend_Form $form) { $form->addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator')->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element')->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator')->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator')->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); foreach ($form->getSubForms() as $subForm) { self::enableForm($subForm); } if (null !== ($view = $form->getView())) { self::enableView($view); } }
/** * jQuery-enable a form instance * * @param \Zend_Form $form * @return void */ public static function enableForm(\Zend_Form $form) { $form->addPrefixPath('ZendX_JQuery_Form_Decorator', 'ZendX/JQuery/Form/Decorator', 'decorator')->addPrefixPath('ZendX_JQuery_Form_Element', 'ZendX/JQuery/Form/Element', 'element')->addElementPrefixPath('ZendX_JQuery_Form_Decorator', 'ZendX/JQuery/Form/Decorator', 'decorator')->addDisplayGroupPrefixPath('ZendX_JQuery_Form_Decorator', 'ZendX/JQuery/Form/Decorator'); foreach ($form->getSubForms() as $subForm) { self::enableForm($subForm); } if (null !== ($view = $form->getView())) { self::enableView($view); } }
/** * Adds unique IDs to all elements in the given form. * * @param Zend_Form $form */ public function enhance(Zend_Form $form) { foreach ($form->getSubForms() as $subForm) { /* @var $subForm Zend_Form */ $this->enhance($subForm); } foreach ($form->getElements() as $element) { /* @var $element Zend_Form_Element */ $this->updateId($element); } }
/** * Recurse through a form object, rendering errors * * @param \Zend_Form $form * @param \Zend_View_Interface $view * @return string */ protected function _recurseForm(\Zend_Form $form) { $subFormsWithErrors = array(); $subFormMessages = array(); $tabId = 0; foreach ($form->getSubForms() as $subForm) { if ($subForm instanceof \Gems_Form_TabSubForm) { // See if any of the subformelements has an error message foreach ($subForm->getElements() as $subFormElement) { $elementMessages = $subFormElement->getMessages(); if (count($elementMessages)) { $subFormsWithErrors[$tabId] = $subForm->getAttrib('title'); // Save subform title $subForm->setAttrib('jQueryParams', array('class' => 'taberror')); // Add css class to the subform $form->selectTab($tabId); // Select the tab, this way the last tab with error is always selected break; // don't check other elements } } // Preserve subform level custom messages if we have an error if (array_key_exists($tabId, $subFormsWithErrors)) { $subFormMessages[$tabId] = $subForm->getCustomMessages(); } $tabId++; } } // If we found at least one error, and 'verbose' is true if ($this->getVerbose() && (!empty($subFormsWithErrors) || $form->isErrors())) { // First show form level custom error messages (the elements show their own errors) $formMessage = $form->getCustomMessages(); if (!empty($formMessage)) { foreach ($formMessage as $message) { \Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->addMessage($message); } } // Now browse through the tabs with errors foreach ($subFormsWithErrors as $tabIdx => $tabName) { // If more then one tab, show in which tab we found the errors if ($tabId > 1) { $translator = \Zend_Registry::get('Zend_Translate'); \Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->addMessage(sprintf($translator->_('Error in tab "%s"'), $tabName)); } // If we have them, show the tab custom error messages foreach ($subFormMessages[$tabIdx] as $subFormMessage) { foreach ($subFormMessage as $message) { \Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->addMessage("--> " . $message); } } } } }
public function testCanSetAllSubFormDecoratorsAtOnce() { $this->setupSubForm(); $this->form->setSubFormDecorators(array(array('Callback', array('callback' => 'strip_tags')))); foreach ($this->form->getSubForms() as $subForm) { $this->assertFalse($subForm->getDecorator('FormElements')); $this->assertFalse($subForm->getDecorator('HtmlTag')); $this->assertFalse($subForm->getDecorator('Fieldset')); $this->assertFalse($subForm->getDecorator('DtDdWrapper')); $decorator = $subForm->getDecorator('Callback'); $this->assertTrue($decorator instanceof \Zend\Form\Decorator\Callback); } }
/** * Bereitet die Validierung vor. * * Zu jedem Language-Element in den Unterformularen wird ein zusätzlicher Validator hinzugefügt, der die POST Daten * für alle Unterformulare und die Position des Formulars mitbekommt, damit die Prüfung ausgeführt werden kann. * * @param Zend_Form $form * @param array $data * @param array $context */ public function prepareValidation($form, $data, $context = null) { $position = 0; $languages = $this->getSelectedLanguages($data); foreach ($form->getSubForms() as $name => $subform) { if (array_key_exists($name, $data)) { $element = $subform->getElement(Admin_Form_Document_Title::ELEMENT_LANGUAGE); if (!is_null($element)) { $element->addValidator(new Form_Validate_LanguageUsedOnceOnly($languages, $position++)); } } } }
/** * Change form elements order to match query order * * @return void */ private function _orderFormElements() { $hasCustomOrder = false; foreach ($this->_form->getSubForms() as $form) { foreach ($form->getElements() as $key => $element) { if (is_numeric($element->getOrder())) { $hasCustomOrder = true; break; } } } if ($hasCustomOrder === true) { return; } $fieldsOrder = array_flip($this->_fields); foreach ($this->_form->getSubForms() as $form) { $i = 100; foreach ($form->getElements() as $key => $element) { $fieldOrder = isset($fieldsOrder[$key]) ? $fieldsOrder[$key] : $i++; $element->setOrder($fieldOrder); } } }
protected function _buildTable(Zend_Form $form) { # generate table header if ($this->_tableHeadersBuilt !== true) { if ($form instanceof Zend_Form_SubForm) { foreach ($form->getElements() as $eName => $e) { if (isset($this->_tableHeaders[$eName])) { throw new Exception(sprintf('Invalid sub-form (table row configuration) "%s" for table layout - table header already set for this column "%s"', $form->getName(), $eName)); } $this->_tableHeaders[$eName] = $e->getLabel(); } foreach ($form->getSubForms() as $formName => $subForm) { $this->_buildTable($subForm); } return false; } # get headers from first sub-form $subform = $form->getSubForms(); $subform = current($subform); $this->_buildTable($subform); $this->_tableHeadersBuilt = true; } if ($form instanceof Zend_Form_SubForm) { foreach ($form->getElements() as $eName => $e) { if ($this->getOption('doNotSetDecorators') !== true) { $e->setDecorators(array('ViewHelper')); } if (isset($this->_tableCell[$eName])) { throw new Exception(sprintf('Invalid sub-form (table row configuration) "%s" for table layout - table cell "%s" already set for row %d', $form->getName(), $eName, $this->_rowIndex)); } $this->_tableCell[$eName] = $e; } foreach ($form->getSubForms() as $formName => $subForm) { $this->_buildTable($subForm); } return; } # $form is not instance of Zend_Form_SubForm $result = array(); foreach ($form->getSubForms() as $formName => $subForm) { $this->_tableCell = array(); $this->_rowIndex++; $this->_buildTable($subForm); if (empty($this->_tableCell)) { # no data generated from current subform continue; } $result[$this->_rowIndex] = $this->_tableCell; } if (empty($result)) { return ''; } $tableRows = array(); foreach ($result as $rowIndex => $row) { $elements = array(); foreach ($this->_tableHeaders as $eName => $label) { if (!isset($row[$eName])) { throw new Exception(sprintf('Invalid form "%s" for table layout - missing table cell "%s" for row %d', $form->getName(), $eName, $rowIndex)); } # display messages in the same table cell as the input field $elements[] = implode('<br />', array_merge($row[$eName]->getMessages(), array($row[$eName]->render()))); } $tableRows[] = '<tr><td>' . implode('</td><td>', $elements) . '</td></tr>' . "\n"; } return '<table><tr><th>' . implode('</th><th>', $this->_tableHeaders) . '</th></tr>' . "\n" . implode('', $tableRows) . '</table>'; }
/** * Set a form instance * * @param Zend_Form $form * @return Zend_Controller_Action_Helper_MultiPageForm */ public function setForm(Zend_Form $form) { $this->_form = $form; $subForms = $form->getSubForms(); // Loop through all the subforms and check if they all have a name foreach ($subForms as $subForm) { $formName = $subForm->getName(); if (empty($formName)) { /** * @see Zend_Controller_Action_Exception */ require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('A subform needs to have a name.'); } } // Chaining return $this; }
/** * Retrieve all form subForms/subforms * * @param bool $sort * @return array */ public function getSubForms($sort = false) { if (!$sort) { return parent::getSubForms(); } else { $this->_sort(); $subForms = array(); foreach ($this->_order as $key => $order) { $subForms[] = $this->getSubForm($key); } return $subForms; } }
/** * @group ZF-5613 */ public function testAddSubFormsPerConfig() { // Create form $form = new Zend_Form(array('subForms' => array(array('form' => array('elements' => array('foo' => array('text', array('label' => 'Foo', 'decorators' => array('ViewHelper', 'Label')))), 'id' => 'subform1', 'decorators' => array('FormElements')), 'name' => 'subform1', 'order' => 2), array('form' => array('elements' => array('bar' => array('text', array('label' => 'Bar', 'decorators' => array('ViewHelper', 'Label')))), 'id' => 'subform2', 'decorators' => array('FormElements')), 'name' => 'subform2', 'order' => 1)))); $form->removeDecorator('HtmlTag'); // Tests $subForms = $form->getSubForms(); $subForm1 = current($subForms); $subForm2 = next($subForms); $this->assertSame(array('subform1', 'subform2'), array($subForm1->getName(), $subForm2->getName())); $expected = '<form enctype="application/x-www-form-urlencoded" action="" method="post">' . PHP_EOL . PHP_EOL . '<label for="subform2-bar" class="optional">Bar</label>' . PHP_EOL . PHP_EOL . '<input type="text" name="subform2[bar]" id="subform2-bar" value="" />' . PHP_EOL . PHP_EOL . '<label for="subform1-foo" class="optional">Foo</label>' . PHP_EOL . PHP_EOL . '<input type="text" name="subform1[foo]" id="subform1-foo" value="" />' . '</form>'; $this->assertSame($expected, $form->render($this->getView())); }
/** * Ermittelt alle Subformen (Subpages) * @return Myself_Form_Page_Interface */ public function getSubForms() { $subForms = parent::getSubForms(); $newForms = array(); foreach ($subForms as $form) { if (!$form->isAvailable()) { // Remove form data from namespace unset($this->getNamespace()->{$form->getName()}); continue; } $newForms[$form->getName()] = $form; } return $newForms; }
/** * Set a form instance * * @param Zend_Form $form * @return Zym_Controller_Action_Helper_MultiForm */ public function setForm(Zend_Form $form) { $this->_form = $form; $subForms = $form->getSubForms(); foreach ($subForms as $subForm) { $formName = $subForm->getName(); if (empty($formName)) { /** * @see Zym_Controller_MultiPageForm_Exception_NoName */ require_once 'Zym/Controller/Action/Helper/MultiPageForm/Exception/NoName.php'; throw new Zym_Controller_MultiPageForm_Exception_NoName('A subform needs to have a name.'); } } return $this; }
/** * Create an html code from form elements to render a plain text fom.<br /> * This function filter subForms and create the read only view.<br /> * Utilize the elementRender function to do the same with elements.<br /> * * @param Zend_Form $form The form to transform into readOnlu view. * * @return string $this->_html The html code for the elements rendering. */ public function subFormRender(Zend_Form $form, $subFormName = "") { $subForms = null; if (!$this->_listOpened) { $this->_html = $this->_openListTag; $this->_listOpened = true; } if (!empty($subFormName)) { $subForm = $form->getSubForm($subFormName); $this->_html .= $this->elementRender($subForm); } else { $subForms = $form->getSubForms(); $nbSubForms = count($subForms); $position = 1; foreach ($subForms as $subForm) { $this->_html .= '<fieldset id = "' . $subForm->getId() . '" class="' . $subForm->getAttrib('class') . '">'; $this->_html .= '<legend class="readOnly">'; $this->_html .= $subForm->getLegend(); $this->_html .= '</legend>'; // Do not close the list after rendering elemnts of the sub forms. $this->_closeList = false; // Render sub form elements $this->_html .= $this->elementRender($subForm); $this->_html .= '</fieldset>'; if ($this->_addSeparator && in_array($position, $this->_separatorPosition)) { $this->_html .= '<div class="' . $this->_separatorClass . '"></div>'; } $position++; } $this->_html .= $this->_closeListTag; } return $this->_html; }