在其他模块ZF2中渲染部分

时间:2014-09-10 09:15:03

标签: zend-framework2

在我的项目中我需要模块

  • 模块1
  • 单词数

在Module1中我有一个视图,需要渲染我在Module2中的视图,所以我正在做的是:

$this->partial('partials/hello/title.phtml','Module2',array('data' => $data))

似乎我正在调用视图,但在视图title.phtml里面我无法使用数据

未定义的变量:/site/src/module/Module2/view/partials/hello/title.phtml中的数据

我是否需要添加与配置相关的内容?

谢谢!

2 个答案:

答案 0 :(得分:3)

您没有正确调用它,请尝试:

$this->partial('partials/hello/title.phtml', array('data' => $data));

请参阅:http://framework.zend.com/manual/2.3/en/modules/zend.view.helpers.partial.html

部分在不同模块中的事实并不重要。必须将模块名称指定为第二个参数才是ZF1中的东西。

答案 1 :(得分:0)

另一种解决方案是在module-bootstrap中添加您自己的视图路径解析器:

class Module
{
    /* @var \Zend\ServiceManager\ServiceManager $SM */
    public static $SM;
    /* @var \Zend\EventManager\EventManager $EM */
    public static $EM; 

    public function onBootstrap(MvcEvent $e)
    {
        self::$SM = $e->getApplication()->getServiceManager();
        self::$EM = $e->getApplication()->getEventManager();

        //change view resolver to resolve views from {Module}/view/{Controller}/{Action}.phtml path
        self::$EM->attach('dispatch', function($e) {
            self::$SM->get('ViewRenderer')->resolver()->attach(
                    new \Engine\View\Resolver\MCA() , 10
             );
        });
    }
    ....

Resolver获取一个字符串,并且必须返回path或false(如果没有解析),只需编写解析器来理解其他模块路径:

<?php
namespace Engine\View\Resolver;

use Zend\View\Renderer\RendererInterface as Renderer;

/**
 * Resolves view scripts based on a stack of paths
 */
class MCA implements \Zend\View\Resolver\ResolverInterface
{
    public function resolve($name, Renderer $renderer = null)
    {
        $path = explode('/', $name);
        if (count($path)<3){
            return false;
        }
        $module = array_shift($path);
        $resolvedPath = ROOT_PATH . '/module/'. ucfirst($module) . '/view/' . implode('/', $path). '.phtml';
        if (!file_exists($resolvedPath)){
            return false;
        }
        return $resolvedPath;
    }
}

可能存在碰撞,但您可以调节旋转变压器的优先级(例如10)。