【问题标题】:how to use forward in view zend 2如何在视图zend 2中使用forward
【发布时间】:2015-07-30 14:07:03
【问题描述】:

我想在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));

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

【问题讨论】:

  • 希望您不介意,但我做了一些更改以使您的问题更易于理解。我也回答了你的问题。我认为视图助手是您正在寻找的。​​span>

标签: php plugins zend-framework2 view-helpers


【解决方案1】:

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

所以你可以定义一个视图:

// 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】:

使用视图助手的解决方案

我认为您正在寻找的是自定义视图助手。你可以阅读这个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 被称为“小部件化”的内容。

我认为你做得对。您可以将返回值 $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 建议使用部分,这些更适合添加额外的逻辑inside视图。


注意: 就我个人而言,我不喜欢这种像按钮这样简单的转发解决方案。控制器中几乎没有任何逻辑,看起来过于复杂。这更适合重用整个视图/页面,该视图/页面既可以由自身呈现,也可以嵌套在另一个视图中。 partials 或 view helpers 似乎更适合您想要做的事情,并且这些是非常合适的 ZF2 解决方案。

【讨论】:

  • 我看到了一个代码,它回显了控制器的输出和它的视图,在你的例子中我们只有控制器,我想使用 MVC 结构插件,我想创建模型视图控制器我的喜欢按钮并使用它们,我之前看过一段代码,它监听 onDispatch 事件并使用转发然后重新运行输出。我现在没有那个代码
  • @MD66 我更新了我的答案,但我建议您认真考虑查看帮助程序或部分内容,而不是使用转发插件来完成您想做的事情。
  • 非常感谢,但我相信我们可以在视图中使用 onRender 或 onDispatch 事件监听器,无论如何谢谢你的回答
  • 非常感谢,我找到了,由 Mohammad Rostami 开发,特别感谢他:github.com/mbrostami/zf2Plugin
【解决方案3】:

我找到了,由 Mohammad Rostami 开发,特别感谢他: Plugin In ZF2

【讨论】:

  • 从您的问题来看,您并不清楚您是否正在寻找另一个模块。最好添加一个完整的代码示例,说明如何在您的答案中使用它。它可能会帮助其他最终来到这里的人。仅添加指向源的链接不被视为正确答案。
  • 这里无法发布所有代码,这里插入的代码可不是小代码
  • 你不应该发布所有代码,而是一个关于如何使用它的代码示例......该模块的文档很差,它将有助于其他堆栈溢出用户了解他们如何使用此插件以及代码与您的问题有何关联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多