Thanks, Colin. After some tinkering I ended up doing something similar to your suggestion, but instead of recreating the display group, I used Zend_Form::createElement() instead of Zend_Form::addElement(). This allowed me to add the element to the form if the display group does not yet exist, or add it to the display group if it did (which, apparently, also adds the element to the form). Here's how it looked in the end:
public function addStandard(Standard $standard) { $name = 'standard_' . $standard->getId(); $element = $this->createElement('checkbox', $name); $displayGroup = $this->getDisplayGroup('standards'); if (null === $displayGroup) { $this->addElement($element); $this->addDisplayGroup(array($name), 'standards'); } else { $displayGroup->addElement($element); } } It would be nice if the Zend_Form_DisplayGroup::addElement() was smart enough to know if the element already belongs to the form, but the workaround above isn't too bad. -- Hector On Thu, Jul 30, 2009 at 1:03 PM, Colin Guthrie <gm...@colin.guthr.ie> wrote: > 'Twas brillig, and Hector Virgen at 30/07/09 18:56 did gyre and gimble: > > Hello, >> >> I am having some trouble with Zend_Form and display groups (ZF 1.8.2). I >> want to add an existing form element to an existing display group within the >> same form, but when I call $displayGroup->addElement($element), the element >> is re-added to the form, causing it to be rendered twice (once in the >> display group, and again outside of the display group). >> >> Here is my code (trimmed for clarity): >> >> class MyForm extends Zend_Form >> { >> public function init() >> { >> /* ... */ >> } >> >> public function addStandard(Standard $standard) >> { >> $name = 'standard_' . $standard->getId(); >> $this->addElement('checkbox', $name); >> $displayGroup = $this->getDisplayGroup('standards'); >> $displayGroup->addElement($this->getElement($name)); >> } >> } >> >> I have also tried just specifying the element's name, but that ends up in >> a fatal error: >> >> Call to a member function getName() on a non-object in >> /usr/share/pear/Zend/Form/DisplayGroup.php on line 433 >> >> >> I also noticed that I cannot create a display group without adding >> elements to it: >> >> $this->addDisplayGroup(array(), 'standards'); // throws exception "No >> valid elements specified for display group" >> >> This makes it difficult to create empty display groups as containers for >> the elements to be added later. >> >> I can get around this by creating the display group automatically when the >> first "standard" is added, but I am stumped on how to add the next standard >> to the existing display group. >> > > I run up against the same problem. > > In the end I had to tear down and recreate the display group each time I > wanted to add an element to it. I totally meant to follow up for plumb > forgot - sorry :s > > Here is the code I use to get the desired end result. Ugly, but hey. > > > You can probably guess some element names but $el is the new element and > the $displayGroupLegend/Description vars are also filled in prior to this > code but can be overridden. $displayGroup is obviously the name of the > display group in question. > > HTHs > > $this->_form->addElement($el); > if (!empty($displayGroup)) > { > $curr_elements = array(); > $dg = $this->_form->getDisplayGroup($displayGroup); > > if (!is_null($dg)) > { > // It seems that the only way to edit an existing displaygroup > // is to remove and recreate it :s > > // This would appear to be a bug in Zend Form. > $displayGroupLegend = $dg->getLegend(); > $displayGroupDescription = $dg->getDescription(); > $cur_elements = array_keys($dg->getElements()); > $this->_form->removeDisplayGroup($displayGroup); > } > > $cur_elements[] = $el->getName(); > $this->_form->addDisplayGroup($cur_elements, $displayGroup); > $dg = $this->_form->getDisplayGroup($displayGroup); > > if (!empty($displayGroupLegend)) > $dg->setLegend($displayGroupLegend); > > if (!empty($displayGroupDescription)) > $dg->setDescription($displayGroupDescription); > > } > > > -- > > Colin Guthrie > gmane(at)colin.guthr.ie > http://colin.guthr.ie/ > > Day Job: > Tribalogic Limited [http://www.tribalogic.net/] > Open Source: > Mandriva Linux Contributor [http://www.mandriva.com/] > PulseAudio Hacker [http://www.pulseaudio.org/] > Trac Hacker [http://trac.edgewall.org/] > >