嗨那里:)我有装饰器和表格的问题,这将在表中,在这个表中希望也有来自数据库的数据...我不知道怎么做这个有一个像这样的结构下面的内容,让我们说
<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生成的表,但我想生成该表通过form od只将表单元素插入到phtml视图中生成的那个表中。
http://img14.imageshack.us/img14/9973/clipboard01pw.png
这里找到的东西: Zend_Form: Database records in HTML table with checkboxes
但我不知道如何开始...
答案 0 :(得分:2)
几条评论:
通常,在表单中添加元素是在init()
中完成的,而不是render()
。
如果消费者对象(在这种情况下,表单)需要依赖(在这种情况下,文章模型)来完成其工作,那么明确地向消费者提供依赖性通常是有帮助的,或者在消费者的构造函数中或通过setter方法(例如:$form->setArticleModel($model)
)。这使得在测试表单时更容易模拟模型,并清楚地说明了表单对模型的依赖。
Re:通过装饰器渲染表单中的其他内容:也许,看一下AnyMarkup decorator。它看起来像(对不起,不能完全理解波兰语)你希望在你输出的每一行上都有一个选择框。因此,您使用模型获取行,循环遍历行,在每行上创建选择框。将装饰器分配给选择元素 - 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
。