我正在关注此页面中“使用ViewScript装饰器完全自定义”部分 - > http://devzone.zend.com/article/3450
在我的表单类的init方法中,我添加了这个
$this->setDecorators(
array(
array(
'ViewScript',
array(
'script' => 'display.phtml'
)
)
)
);
现在,在我的表格出现的地方,我有这个:
发生错误
申请错误
我在这里做错了什么?我真的需要自定义表单的外观,我只想更改表单而不是整个页面的外观。
我试过这个:
$this->setElementDecorators(array(array('ViewScript', array('viewScript'=>'display.phtml'))))
哪个有效,但会影响整个页面的显示(我使用的是zend布局)。我只需要将表单的渲染传递给display.phtml页面。
注意:有没有特别的地方我必须放置display.phtml?我将它放在view \ scripts文件夹中。
答案 0 :(得分:2)
我认为这很简单。
由于一个简单的原因,ViewScript不能在表单的init()方法中使用。如果你看一下这个例子(可能还有你的display.phtml),就会有像这样的$this->form->firstname;
这样的echo语句。此时在init()中,表单元素尚未加载!
因此,作者正确显示了此代码
$form->setDecorators(array(
array('ViewScript', array('script' => 'demogForm.phtml'))
));
请注意,他使用$form
作为对象。在控制器或视图脚本中,您将表单作为对象加载,然后添加ViewScript。所以在你的一个控制器中你会做这样的事情
$form = new My_Form();
$scriptPath = '/path/to/script/display.pthml'
// or without a path if you have a script folder loaded
$form->setDecorators(array(
array('ViewScript', array('script' => $scriptPath))
));
这应该可以解决问题。
更新查看pthml的命名我假设(并希望)这是表单的特殊模板,而不是整个布局文件。如果您使用整个布局文件,那么当然是否会渲染整个页面!
答案 1 :(得分:1)
使用视图脚本时,我发现最好在视图级别进行任何此类更改。
忽略表单中的“ViewScript”装饰器详细信息,并从视图中设置它们,例如
<?php echo $this->form->setDecorators(array(
'PrepareElements',
array('ViewScript', array('viewScript' => '_forms/display.phtml'))
)) ?>
display.phtml
文件的位置是相对于模块的视图脚本文件夹的。如果这只是默认模块(在application
文件夹下),我的示例中的脚本将位于application/views/scripts/_forms/display.phtml
答案 2 :(得分:0)
如果您要删除<dt>
或<dd>
(标签和视图)等HTML标记,可以使用方法removeDecorator('HtmlTag')
或removeDecorator('Label')