如何在视图中使用前进zend 2

时间:2015-07-30 14:07:04

标签: php plugins zend-framework2 view-helpers

我想在ZF2中编写一个插件,

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

我知道我可以使用:

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

$like变量返回一个用户可以单击的按钮。 但我希望在视图中回应这一点。在前进中,视图未定义。

如果我使用

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

我无法访问postId中的likeController,因为它已在视图中设置。我如何实现这些需要动态变量的插件?

3 个答案:

答案 0 :(得分:1)

使用视图帮助

的解决方案

我认为您正在寻找的是自定义视图助手。您可以阅读in the official ZF2 documentation

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

助手类:

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);
}

更新 - 使用前向插件的解决方案

我想我现在明白你的意思了。我也认为你所谈论的例子是in the ZF2 forward plugin documentation被称为“widgetized”的内容。

我认为你正确地做到了。您可以将返回值$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;
    }
}

最后在你的帖子视图模板中添加:

echo($this->likeWidget);

这是小部件最终输出的地方。

问题仍然存在,你无法在视图中的foreach循环(打印帖子的循环)中执行此操作。这就是为什么我建议使用视图助手和@copynpaste建议使用部分,这些更适合在视图中添加内部

注意: 就个人而言,我不喜欢这种前进的解决方案,只需要像按钮一样简单。控制器中几乎没有逻辑,看起来过于复杂。这更适合重用整个视图/页面,这些视图/页面既可以自己呈现,也可以嵌套在另一个视图中。 部分或视图助手似乎更适合您想要做的事情,那些是非常合适的ZF2解决方案。

答案 1 :(得分:1)

看起来你只需要部分。 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
));

Official Documentation
Nice Answer on SO to implement with template_map

答案 2 :(得分:0)

我找到了它,由穆罕默德罗斯塔米开发,特别感谢他: Plugin In ZF2