【问题标题】:ViewScript decorator unable to setViewScript 装饰器无法设置
【发布时间】:2011-08-10 00:42:00
【问题描述】:

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

【问题讨论】:

    标签: php zend-framework zend-form


    【解决方案1】:

    我觉得就这么简单。

    ViewScript 不能用于表单的 init() 方法,原因很简单。如果您查看示例(可能还有您的 display.phtml),就会有类似$this->form->firstname; 的回显语句。此时 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 的命名,我假设(并希望)这是您的表单的特殊模板,不是您的整个布局文件。如果您使用整个布局文件,那么当然会渲染整个页面!

    【讨论】:

    • 装饰器只在渲染时被调用。您可以在添加元素之前、之后或期间添加它们。
    • 我希望这种细微差别在文档中的某处更加明显。我花了太长时间想知道我在 init() 中设置 ViewScript 装饰器的尝试是否因为我做错了什么而失败。
    【解决方案2】:

    在使用视图脚本时,我发现最好在视图级别进行任何此类更改。

    忽略表单中的“ViewScript”装饰器详细信息并从视图中设置它们,例如

    <?php echo $this->form->setDecorators(array(
        'PrepareElements',
        array('ViewScript', array('viewScript' => '_forms/display.phtml'))
    )) ?>
    

    display.phtml 文件的位置相对于模块的视图脚本文件夹。如果这只是默认模块(在application 文件夹下),我示例中的脚本将位于application/views/scripts/_forms/display.phtml

    【讨论】:

    • 我以 init() 形式执行此操作,它更改了页面。我真的只想更改表单渲染的输出,而不是整个页面。有没有办法做到这一点?
    • @AntonioCS 您是否尝试过我的回答中概述的视图?你的display.phtml 文件是什么样的?
    【解决方案3】:

    如果您想删除 HTML 标签,如 &lt;dt&gt;&lt;dd&gt;(标签和视图脚本),您可以使用方法 removeDecorator('HtmlTag')removeDecorator('Label')

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多