public function testRemovingFormItemsShouldNotRaiseExceptionsDuringIteration() { $this->setupElements(); $bar = $this->form->bar; $this->form->removeElement('bar'); try { foreach ($this->form as $item) { } } catch (Exception $e) { $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); } $this->form->addElement($bar); $this->form->addDisplayGroup(array('baz', 'bar'), 'bazbar'); $this->form->removeDisplayGroup('bazbar'); try { foreach ($this->form as $item) { } } catch (Exception $e) { $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); } $subForm = new Zend_Form_SubForm(); $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); $this->form->addSubForm($subForm, 'page1'); $this->form->removeSubForm('page1'); try { foreach ($this->form as $item) { } } catch (Exception $e) { $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); } }
/** * Explicitly removes and re-adds elements to the provided form to * ensure that the form re-builds the element order. * * Due to a bug this is required if the order of an element is * changed after the internal form index was created: * {@link http://framework.zend.com/issues/browse/ZF-9946} * * @param Zend_Form $form * @param array(Zend_Form_Element|Zend_Form|Zend_Form_DisplayGroup) $elements */ protected function reAssignElements(Zend_Form $form, array $elements) { $elementsByType = $this->categorizeElements($elements); foreach ($elementsByType['elements'] as $element) { /* @var $element Zend_Form_Element */ $form->removeElement($element->getName()); $form->addElement($element); } foreach ($elementsByType['subForms'] as $subForm) { /* @var $subForm Zend_Form */ $form->removeSubForm($subForm->getName()); $form->addSubForm($subForm, $subForm->getName()); } foreach ($elementsByType['displayGroups'] as $displayGroup) { /* @var $displayGroup Zend_Form_DisplayGroup */ $form->removeDisplayGroup($displayGroup->getName()); $form->addDisplayGroup($displayGroup->getElements(), $displayGroup->getName()); } }