如何在 View zend 2 中使用 forward
how to use forward in view zend 2
我想用ZF2写一个插件,
该插件的一个示例是每个 post 中显示的赞按钮。例如,它应该在 PostsAction 中打印,
我知道我可以使用:
$like = $this->forward()->dispatch('Application\Controller\Index', array(
'action' => 'like',
'postId' => $Id
));
$like
变量 returns 用户可以点击的按钮。
但我想在视图中回应这一点。向前视图未定义。
如果我使用
return $this->getView()->render('application/index/like', array('postId' => $Id));
我无权访问 likeController
中的 postId
,因为它是在视图中设置的。我如何实现这些需要动态变量的插件?
使用视图助手的解决方案
我认为您正在寻找的是自定义视图助手。你可以阅读这篇 in the official ZF2 documentation.
您必须编写您的自定义按钮视图助手,注册它,然后您才能在您的视图中使用它。
帮手class:
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 所谓的“窗口化”内容。
我认为你做得对。您可以将 return 值 $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 视图模板中添加:
echo($this->likeWidget);
这是小部件最终输出的地方。
问题仍然存在,您不能在视图中的 foreach 循环(用于打印 posts 的循环)内执行此操作。这就是为什么我建议使用视图助手,而@copynpaste 建议使用部分视图助手,它们更适合在视图内部添加额外的逻辑。
注:
就我个人而言,我不喜欢这种像按钮这样简单的东西的前向解决方案。控制器中几乎没有任何逻辑,看起来过于复杂。这更适合重用整个 view/page ,它既可以自己呈现,也可以嵌套在另一个视图中。
partials 或 view helpers 似乎更适合你想做的事情,这些都是非常合适的 ZF2 解决方案。
看来你只需要部分。 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
我找到了,由 Mohammad Rostami 开发,特别感谢他:
Plugin In ZF2
我想用ZF2写一个插件,
该插件的一个示例是每个 post 中显示的赞按钮。例如,它应该在 PostsAction 中打印,
我知道我可以使用:
$like = $this->forward()->dispatch('Application\Controller\Index', array(
'action' => 'like',
'postId' => $Id
));
$like
变量 returns 用户可以点击的按钮。
但我想在视图中回应这一点。向前视图未定义。
如果我使用
return $this->getView()->render('application/index/like', array('postId' => $Id));
我无权访问 likeController
中的 postId
,因为它是在视图中设置的。我如何实现这些需要动态变量的插件?
使用视图助手的解决方案
我认为您正在寻找的是自定义视图助手。你可以阅读这篇 in the official ZF2 documentation.
您必须编写您的自定义按钮视图助手,注册它,然后您才能在您的视图中使用它。
帮手class:
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 所谓的“窗口化”内容。
我认为你做得对。您可以将 return 值 $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 视图模板中添加:
echo($this->likeWidget);
这是小部件最终输出的地方。
问题仍然存在,您不能在视图中的 foreach 循环(用于打印 posts 的循环)内执行此操作。这就是为什么我建议使用视图助手,而@copynpaste 建议使用部分视图助手,它们更适合在视图内部添加额外的逻辑。
注: 就我个人而言,我不喜欢这种像按钮这样简单的东西的前向解决方案。控制器中几乎没有任何逻辑,看起来过于复杂。这更适合重用整个 view/page ,它既可以自己呈现,也可以嵌套在另一个视图中。 partials 或 view helpers 似乎更适合你想做的事情,这些都是非常合适的 ZF2 解决方案。
看来你只需要部分。 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
我找到了,由 Mohammad Rostami 开发,特别感谢他: Plugin In ZF2