#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);
}