zend framework создает пустую группу отображения, а затем добавляет элемент

#zend-framework #zend-form #zend-form-element

#zend-framework #zend-form #zend-form-element

Вопрос:

Возможно ли создать пустую группу отображения, а затем добавить элементы?

Я пытался:

 addDisplayGroup(null, 'exampleGroup')
  

Но вы должны передать хотя бы элемент…

Мне нужно создать только пустую группу отображения.

Мне нужно это сделать, потому что после создания группы отображения я буду добавлять элементы один за другим в foreach….

Еще раз спасибо…

Комментарии:

1. просто поместите элементы в массив во время вашего foreach, а затем передайте его в -> addDisplayGroup

2. Привет, Макс, да, в конце я сделал это так… Я думал об этом… Я просто хочу, чтобы это было по-другому, потому что код выглядит более понятным… В любом случае все в порядке… Еще раз спасибо….

Ответ №1:

Вы могли бы попробовать с

 $form->addDisplayGroup(array(), 'exampleGroup');
  

а затем получает группу отображения следующим образом:

 $displayGroup = $form->getDisplayGroup('exampleGroup');
  

и добавляет элементы один за другим позже с $displayGroup->addElement() помощью или $displayGroup->createElement() .

Вы можете увидеть более подробную информацию в документации по группам отображения.

Редактировать:

ZF не позволяет добавлять группу отображения без элементов. Самым простым решением может быть сначала создать элементы, поместить их в массив, а затем передать этот массив addDisplayGroup .

Также можно создать экземпляр нового Zend_Form_DisplayGroup объекта, а затем добавить его в форму, используя $form->addDisplayGroups(array($group)) , но я сомневаюсь, что это удобнее, чем вызывать addDisplayGroup() с уже созданными элементами.

Надеюсь, это поможет,

Комментарии:

1. Спасибо за ваш ответ dinopmi… Я пробовал до вашего пути, но это не сработало… Возвращает исключение: для группы отображения не указаны допустимые элементы.

2. В этом случае, как отмечает @max4ever в своем комментарии, было бы проще сначала создать элементы и вызвать addDisplayGroup после того, как они будут готовы…

Ответ №2:

Как насчет переопределения метода формы addDisplayGroup($elements, $name) , добавления фиктивного элемента, если необходимо:

 class My_Form extends Zend_Form
{

    protected $dummyName = '_myDummy';

    public function addDisplayGroup(array $elements, $name)
    {
        if (count($elements) == 0){
            $elt = new Zend_Form_Element_Hidden($this->dummyName);
            $elt->setIgnore(true);
            $elements[] = $this->dummyName;
        }
        return parent::addDisplayGroup($elements, $name);
    }

    public function render(Zend_View_Interface $view = null)
    {
        $this->removeElement($this->dummyName);
        return parent::render($view);
    }
}
  

Затем в вашей форме теперь вы можете вызывать как:

 $displayGroup = $this->addDisplayGroup(array(), 'myDisplayGroup');

$elt1 = new Zend_Form_Element_Text('myElement1');
$displayGroup->addElement($elt1);

$elt2 = new Zend_Form_Element_Text('myElement2');
$displayGroup->addElement($elt2);

// etc
  

Ответ №3:

Мое решение:

 $zgody = $db->fetchAll($db->select()->from('rodo_regulki')->where( 'id_inwest =?', $inwest ));

$getFirstElement = $zgody[0]->id;
$this->addDisplayGroup(array('zgoda_'.$getFirstElement),'zgody', array('legend' => 'Zgody'));

foreach($zgody as $zgoda) {
    $element = 'zgoda_'.$zgoda->id;
    $addElement = $this->getElement($element);
    $displayGroup = $this->getDisplayGroup('zgody');
    $displayGroup->addElement($addElement);
}