ViewScript装饰器无法设置

时间:2011-08-10 00:42:00

标签: php zend-framework zend-form

我正在关注此页面中“使用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文件夹中。

3 个答案:

答案 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')