Элементы формы ZEND в таблице, содержащей также данные из базы данных
Привет!:) У меня проблема с декораторами и формой, которые были бы в таблице, и в этой таблице я хочу иметь также данные из базы данных... Я не имею ни малейшего представления, как это сделать, чтобы иметь структуру, подобную приведенной ниже, скажем
<table>
<tr>
<td><?php echo array[0]['name']?>
//and here input from zend form
<td>
<select name='foo' id='bar'>
<option value='something'>Foo</option>
<option value='something2'>Foo2</option>
</select>
</td>
</tr>
</table>
Ofcourse tr будет больше и генерируется с помощью foreach или некоторого цикла.
У меня есть что-то вроде этого:
<?php
class EditArticles_Form_EditArticles extends Zend_Form
{
protected $uid;
public function render()
{
/* Form Elements & Other Definitions Here ... */
$this->setName('editarticles');
$data = new EditArticles_Model_DbTable_EditArticlesModel();
$datadata = $data->GetArticlesToEdit($this->getUid()); //here is my data from db
for ($i=0;$i<count($datadata);$i++)
{
$do = new Zend_Form_Element_Select(''.$i);
$do->addMultiOption('0', 'Aktywny');
$do->addMultiOption('1', 'Nieaktywny');
$this->addElements(array($do));
}
$submit = new Zend_Form_Element_Submit('updateart');
$this->addElement($submit);
//and here are decorators for array, and i would like to have in this table also data from array containing data from database
$this->addDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'table', 'id' => 'aaaa', 'style' => 'width:500px;')), 'Form',
));
$this->setElementDecorators(array(
'ViewHelper',
array( array('data' => 'HtmlTag'), array('tag' => 'td', 'style' => 'width:200px;')),
array('Label', array('tag' => 'td')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
),
//wykluczenie submita z overrida stulu
array('submit'), false);
return parent::render();
}
//setting user id for get content from db
public function setUid($uid) {
$this->uid = $uid;
return $this;
}
public function getUid() {
return $this->uid;
}
}
?>
вывод приведенного выше кода выглядит примерно так: (отмечен красным, где я хотел бы, чтобы это выбиралось из формы. На этом изображении таблица с данными - это другая таблица, сгенерированная в phtml, но я хотел бы сгенерировать эту таблицу по форме od просто вставьте только элементы формы в таблицу, созданную в представлении phtml).
http://img14.imageshack.us/img14/9973/clipboard01pw.png
Что-то найдено здесь: Zend_Form: записи базы данных в таблице HTML с флажками
но я не знаю с чего начать...
1 ответ
Несколько комментариев:
Как правило, добавление элементов в форму выполняется в
init()
, скорее, чемrender()
,Если объект потребителя (в данном случае форма) нуждается в зависимости (в данном случае в модели статьи) для своей работы, часто бывает полезно явно предоставить зависимость потребителю либо в конструкторе потребителя, либо через метод установки (например:
$form->setArticleModel($model)
). Это облегчает моделирование модели при тестировании формы и четко иллюстрирует зависимость формы от модели.Re: рендеринг другого контента в форме через декораторы: Может быть, посмотрите на декоратор AnyMarkup. Похоже (извините, я не могу полностью понять польский), вы хотите, чтобы в каждой строке вы выводили поле выбора. Таким образом, вы получаете свои строки, используя модель, перебирая строки, создавая поле выбора в каждой строке. Когда вы назначаете декораторы элементу выбора -
ViewHelper
,Errors
, вероятно,HtmlTag
декоратор, чтобы обернуть его в<td>
- Вы также добавляетеAnyMarkup
декоратор, чтобы подготовить кучу<td>
содержит ваши данные строки, наконец, оборачивая всю строку в<tr>
,
Возможно, что-то вроде этого (не полностью проверено, просто чтобы дать идею):
class EditArticles_Form_EditArticles extends Zend_Form
{
protected $model;
public function __construct($model)
{
$this->model = $model;
parent::__construct();
}
public function init()
{
$rows = $this->model->GetArticlesToEdit($this->getUid());
$numRows = count($rows);
for ($i = 0; $i < $numRows; $i++) {
$do = new Zend_Form_Element_Select('myselect' . $i);
$do->addMultiOption('0', 'Aktywny');
$do->addMultiOption('1', 'Nieaktywny');
$do->setDecorators(array(
'ViewHelper',
array(array('cell' => 'HtmlTag'), array(
'tag' => 'td'
)),
array('AnyMarkup', array(
'markup' => $this->_getMarkupForRow($i, $row),
'placement' => 'PREPEND',
)),
array(array('row' => 'HtmlTag'), array(
'tag' => 'tr'
)),
));
$this->addElement($do);
}
}
protected function _getMarkupForRow($i, $row)
{
return '<td>' . $i . '</td>' .
'<td>' . $row['nazwa'] . '</td>' .
'<td>' . $row['typ'] . '</td>' .
'<td>' . $row['rozmiar'] . '</td>';
}
}
Последнее замечание: не забудьте зарегистрировать путь префикса декоратора элемента следующим образом (в форме, вероятно, в init()
):
$this->addElementPrefixPath('My_Decorator', 'My/Decorator', self::DECORATOR);
Это позволяет элементу разрешать короткое имя AnyMarkup
в полное имя класса My_Decorator_AnyMarkup
,