我一直在使用zf2一段时间,但我无法解决以下问题。
例如。我们有一个名为" Product"它处理大部分产品。 另一个模块 - 让我们称之为"评论" - 应扩展产品模块并扩展产品视图以向用户提供产品评审。
直到这一点似乎没有问题。我们可以轻松覆盖Review模块中的产品视图。
现在我陷入困境的棘手部分。 还有第三个模块 - 让我们来称呼它"社交"。该模块应为整个应用程序提供社交功能。 此模块还应修改产品视图,并在产品页面中添加名为"电子邮件的链接给朋友"。
现在我的问题...... 审阅模块会修改产品视图。如果我覆盖社交模块中的视图,则Review模块中的更改将丢失。
//编辑 信息:社交和评论模块应该能够在不修改产品模块的情况下修改视图。
欢迎任何提示,提示或想法。
答案 0 :(得分:1)
这取决于您尝试避免重复的代码。
如果只是HTML内容,您可以create a custom ViewHelper
呈现所需的HTML。然后可以在需要“社交”内容的每个视图中重复使用它。
我怀疑你是在考虑一个'社交'控制器动作,你希望在其他视图中重用它的返回结果。如果是这样,一个灵魂就是使用forward()
controller plugin。
来自文档:
有时,您可能希望从匹配的控制器中调度其他控制器 - 例如,您可以使用此方法来构建“widgetized”内容。 Forward插件有助于实现[by]返回调度控制器操作的结果
这在像你这样的情况下非常有用,因为你需要“社交”模块作为视图的附加元素;而非替代品。
例如
// SocialModule\Controller\SocialController.php
// Controller action to display social buttons (twitter/facebook etc)
public function socialAction()
{
// Some controller logic...
// Returns the social button view
return new ViewModel(array('foo' => $bar));
}
// ProductModule\Controller\ProductController.php
public function productViewAction()
{
$product = $this->productService->find($this->params('id'));
// Displays the product 'view' page
$view = new ViewModel(array(
'product' => $product,
));
// Re-disptach the social module action and return it's view model
$socialView = $this->forward()->dispatch('SocialModule\Controller\Social', array(
'action' => 'social',
));
// We now have the view model, attach it to our view
$view->addChild($socialView, 'social');
// Return the aggregated view
return $view;
}
所有需要的是在视图中呈现内容
// product-view.phtml
echo $this->social;