需要帮助搞清楚如何编写我的zend视图助手

时间:2010-08-03 15:14:16

标签: model-view-controller zend-framework zend-view view-helpers

我对Zend Framework和MVC很新,所以我正在寻找一些建议。我们有一个基本控制器类,我们在其中有一些方法来获取一些用户信息,帐户配置等。

所以我正在使用其中一些方法在各种控制器动作中编写代码,但现在我想避免重复这些代码,而且我想在控制器之外和视图助手中使用此代码作为它主要是输出一些JavaScript。所以控制器中的代码看起来像这样:

$obj= new SomeModel ( $this->_getModelConfig () );
$states = $obj->fetchByUser ( $this->user->getId() );
//Fair amount of logic here using this result to prepare some javascript that should be sent to the view...

$ this-> _getModelConfig和$ this-> user-> getId()是我可以在控制器中执行的操作,现在我的问题是将该信息传递给视图帮助程序的最佳方法是什么一旦我将此代码移出控制器?

我是否应该在控制器中调用这些方法并将结果存储到视图中并让帮助程序从那里获取它?

我想到的另一个选择是向助手添加一些参数,如果传递了参数,那么我将它们存储在助手的属性中并返回,并且在调用时不传递参数就可以执行工作。所以它看起来像这样:

来自控制器:

$this->view->myHelper($this->user->getId(), $this->_getModelConfig());

从视图:

<?= $this->myHelper(); %>

助手:

class Zend_View_Helper_MyHelper extends Zend_View_Helper_Abstract
{
    public $userId = '';
    public $config = null;
    public function myHelper ($userId = null, $config = null)
    {
        if ($userId) {
            $this->userId = $userId;
            $this->config = $config;
        } else {
            //do the work
            $obj = new SomeModel($this->config);
            $states = $obj->fetchByUser($this->userId);
            //do the work here  
        }
        return $this;
    }
}

欢迎任何建议!

2 个答案:

答案 0 :(得分:1)

首先是“$ this-&gt; myHelper();%&gt;”中的ASP样式结束标记这是不好的做法,因为它说更合理的是保持模型中的逻辑和控制器只是用于调用模型,获取结果并将其吐出到视图中进行查看。

我要做的是,如果我只想将一堆值传递给视图,我将它们填充到一个关联数组中并将它们发送出来。

无论如何你不应该做你的......

“//使用此结果准备一些应该发送到视图的JavaScript的公平数量的逻辑...”

参与控制器,我建议你制作一个为你做这个逻辑工作的新模型,你只需要在控制器中调用你的模型就可以传递所需的参数,然后将结果吐出来观点。

答案 1 :(得分:0)

最好的方法是通过控制器从模型中获取数据,然后传递给视图。但是如果你真的需要一个自定义帮助器来回显视图部分,我们只会知道你是否准确地说出了你想要做的事情。

如果您已在帮助程序中使用此逻辑,请尝试在视图中传递参数myhelper($ this-&gt; params); ?&GT;

您可能也想看看这种方法:

// In your view to put javascript in the header
// You can loop trought your data and then use it to generate the javascript.
<?php $this->headScript()->captureStart(); ?>
    $().ready(function(){
        $('#slideshow').cycle({ 
            fx:     'fade', 
            speed:  1000, 
            timeout: 6500, 
            pager:  '#nav'
        });
    });
<?php $this->headScript()->captureEnd() ?>