如何在视图zend中使用forward


how to use forward in view zend 2

我想写一个插件在ZF2,

插件的一个例子是在每个帖子中显示一个喜欢按钮。例如,它应该在PostsAction中打印

我知道我可以使用:

$like = $this->forward()->dispatch('Application'Controller'Index', array(
    'action' => 'like',
    'postId'   => $Id
));

$like变量返回一个用户可以点击的按钮。但我想在视图中重复一下。forward中没有定义视图

如果我使用

return $this->getView()->render('application/index/like', array('postId' => $Id));

我不能访问likeController中的postId,因为它是在视图中设置的。我如何实现这些类型的插件,需要一个动态变量?

看起来你只需要部分。ZF2中的部分只是一个视图,您可以在另一个视图中打印并为其提供一些参数。

你可以定义一个视图:

// application/partials/button.phtml
<button data-postId="<?php echo $this->postId ?>">Like It!</button>

并在其他视图中使用:

echo $this->partial('application/partials/button.phtml', array(
    'postId' => $thePostId
));


官方文档关于使用template_map

实现SO的好答案

使用视图帮助器解决方案

我认为你正在寻找的是一个自定义视图助手。你可以在官方ZF2文档中阅读到这一点。

你必须编写你的自定义按钮视图助手,注册它,然后你可以在你的视图中使用它。

辅助类:

namespace Application'View'Helper;
use Zend'View'Helper'AbstractHelper;
class LikeButtonHelper extends AbstractHelper
{
    public function __invoke($post)
    {
        //return here your button logic, you will have access to $post
    }
}

在配置文件中注册您的帮助器:

'view_helpers' => array(
    'invokables' => array(
        'likeButtonHelper' => 'Application'View'Helper'LikeButtonHelper',
    ),
)

最后在视图中你可以这样使用:

foreach($posts as $post){
    echo( ... your code to show the post ...);
    echo $this->likeButtonHelper($post);
}

UPDATE -使用转发插件

解决方案我想我现在明白你的意思了。我还认为你正在谈论的例子是在ZF2转发插件文档中被称为"小部件化"的内容。

我认为你做得对。您可以将返回值$like作为子值附加到原始控制器的视图(从您最初转发的位置)。

WidgetController中:

use Zend'View'Model'ViewModel;
class WidgetController extends AbstractActionController 
{
    public function likeAction()
    {
        $post= $this->params()->fromRoute('post');
        $viewModel = new ViewModel(array('post' => $post));
        $viewModel->setTemplate('view/widgets/like');
        return $viewModel;
    }
}

PostController中:

use Zend'View'Model'ViewModel;
class PostController extends AbstractActionController 
{
    public function postsAction()
    {
        $likeWidget = $this->forward()->dispatch('Application'Controller'WidgetController', array(
            'action' => 'like',
            'post'   => $post
        ));
        $viewModel = new ViewModel();
        $viewModel->setTemplate('view/posts/post');
        $viewModel = new ViewModel(array(
             //...add your other view variables...
        ));
        // Add the result from the forward plugin as child to the view model
        if ($likeWidget instanceof ViewModel) 
        {
            $viewModel->addChild($likeWidget , 'likeWidget');
        }
        return $view;
    }
}

最后在你的post view模板中添加:

echo($this->likeWidget);

这是小部件最终输出的位置。

问题仍然是你不能在视图中的foreach循环(打印你的文章的循环)中这样做。这就是为什么我建议使用视图助手和@copynpaste建议使用局部,这些更适合在视图中添加额外的逻辑


注意:就我个人而言,我不喜欢像点赞按钮这样简单的东西采用这种超前的解决方案。控制器中几乎没有任何逻辑,看起来过于复杂。这更适合于重用整个视图/页面,这些视图/页面既可以自己呈现,也可以嵌套在另一个视图中。偏导数或视图帮助器似乎更适合您想要做的事情,它们是非常合适的ZF2解决方案。

我找到了它,由Mohammad Rostami开发,特别感谢他:ZF2插件