Zend Framework是一个可以从视图中访问函数的公共文件

时间:2009-10-04 21:45:11

标签: function zend-framework view

我需要有一个地方放置各种视图脚本将使用的一些常用函数,例如通过传递变量来创建一些html。我知道使用帮助器,但我希望能够在其中放置许多函数,而不仅仅是每个函数的一个帮助器。 它是我需要创建的插件吗?

感谢

6 个答案:

答案 0 :(得分:4)

视图助手绝对是最佳选择。您可以使用简单的设计模式为视图帮助程序对类似或相关函数的集合进行分组:

class App_View_Helper_Example extends Zend_View_Helper_Abstract
{
    /**
     * @param  mixed|null $var
     * @return App_View_Helper_Example 
     */
    public function example($var = null)
    {
        if ($var === null) {
            return $this;
        }
        return $this->function1($var); // shortcut to method most used
    }

    public function function1($var)
    {
        return $this->view->escape($var);
    }

    public function function2($var1, $var2)
    {
        return $this->view->escape(sprintf('%s: %d', $var1, $var2));
    }

    // and so on... 
}

这允许您在视图中调用辅助方法,如下所示:

$this->example($var);
$this->example()->function1($var);
$this->example()->function2($var1, $var2);

我将这种方法用于Google静态地图助手,它提供centered() - 方法来显示以给定位置为中心的地图和byMarkers() - 方法,该方法显示自动居中和缩放的静态地图围绕给定标记列表。

您可能遇到的唯一问题是在不同视图脚本中的助手中保持状态(例如,在使用布局或部分时),因为将使用每个视图脚本重建帮助程序。要跨越这些边界存储状态,您将不得不求助于Zend_Registry或某些静态成员字段。

答案 1 :(得分:3)

嗯,'听起来有点臭'。这些功能是什么?如果您的设计没问题,您就不需要这种垃圾箱类。如果它真的是关于视图,那么你应该创建视图助手,查看部分或部分循环!

答案 2 :(得分:0)

听起来像你想要的是partial helper

如果您不想使用帮助程序(包括部分帮助程序),您可以创建一些全局函数,将它们粘贴到某个文件中,并将其包含在引导程序文件中。

答案 3 :(得分:0)

如果你不想要一堆'帮助者'(这不像其他海报所建议的那样糟糕),你可以扩展Zend_View,添加成员方法,然后将Viewrenderer设置为你的扩展视图。 / p>

http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.viewrenderer

答案 4 :(得分:0)

谢谢大家的建议。 我发现你可以使用一个视图助手(比如Stefan所说的)来存储更多的函数,只需从中返回$ this:

class Zend_View_Helper_FormVars
{


    public function formVars(){

        return $this;

    }

    public function openFormFieldGroup($name=''){

        $html='';
        $html.='<div id="formFldGrpWrapper">';
        $html.='<div id="formFldGrpName"><b>'.$name.'</b></div>';
        return $html;

    }

}

现在在我的视图脚本中,我可以像这样使用它:

$formVars=$this->formVars();
$html.=$formVars->openFormFieldGroup('General');

但我也对贾斯汀说我可以拥有一个共同的扩展视图助手感兴趣? 我的所有观点或控制器都可以访问,以执行一些重复的任务,如一些html div / styles等等。我将如何进行设置?

感谢。

答案 5 :(得分:0)

  

但我也对贾斯汀说我可以拥有一个共同的扩展视图助手感兴趣?我的所有观点或控制器都可以访问,以执行一些重复的任务,如一些html div / styles等等。我将如何进行设置?

在答案中你会问这个额外的问题。我的回答也是如此。
首先,您需要问自己为什么要在一个类中拥有多个辅助函数

一个原因是您节省了额外的课程和文件包含。你怎么能这样做?

如果它们是相关的,您可以将它们放入一个视图助手中。但是不要做像

这样的事情
$this->htmlWrapper()->wrapParapgraph()->wrapContentBox()
    ->translateFromTo('NL', 'EN');

translateFromTo(…)与html-wrapping毫无关系。

如果要优化包含,可以将常用的帮助程序代码放入派生的View类中:

class MyView extends Zend_View
{
    function wrapParagraph() {}
    function otherFunction() {}
}

此选项在zend框架指南中也作为优化手段提及。

请注意,视图助手可重用性不受选择将视图助手创建为单独的类的影响。如果助手扩展Zend_View_Helper_Abstract,您将自动访问当前视图对象。

class My_View_Helper extends Zend_View_Helper_Abstract
{
    function wrapParagraph($content) {
        // do something …
        return $this->someOtherViewHelper();
    }

}

你还写了

  

$ formVars = $这 - &GT; formVars();

这实际上没有意义,因为Zend_View每个视图只注册一个视图助手。

$formVars=$this->formVars();
$formVars->doOneThing();
$formVars->doSecondThing();

相当于

$this->formVars()->doOneThing();
$this->formVars()->doSecondThing();

Singleton方面会对您设计视图助手的方式产生严重影响。