/** * Inserts $newElement right before $reference. * * @param Zend_Form $form * @param Zend_Form_Element $reference * @param Zend_Form_Element $newElement */ protected function insertBefore(Zend_Form $form, Zend_Form_Element $reference, Zend_Form_Element $newElement) { /* @var $orderedElements array(Zend_Form_Element|Zend_Form|Zend_Form_DisplayGroup) */ $orderedElements = array_values(iterator_to_array($form)); // Ensure that each element has a numerical order value. $this->assignOrderValues($orderedElements); $buttonIndex = array_search($reference, $orderedElements, true); $buttonOrder = $orderedElements[$buttonIndex]->getOrder(); if ($buttonIndex === 0) { // Button is the first element, therefore no previous element // whose order could be used for calculation exists. // Choose a constant value which ensures that the calculated // order value for the new element avoids re-ordering. $previousElementOrder = $buttonOrder - 2; } else { $previousElementOrder = $orderedElements[$buttonIndex - 1]->getOrder(); } // Try to assign an order value between previous element and button order value. $newElementOrder = (int) round(($previousElementOrder + $buttonOrder) / 2); $newElement->setOrder($newElementOrder); // Insert $newElement at the position of the button. array_splice($orderedElements, $buttonIndex, 0, array($newElement)); if ($newElementOrder === $buttonOrder) { // Order values clash, therefore a re-ordering of the elements // starting with the captcha is required. $elementsFromCaptcha = array_slice($orderedElements, $buttonIndex); $this->assignOrderValues($elementsFromCaptcha); } $this->reAssignElements($form, $orderedElements); }