在我的项目中我需要模块
在Module1中我有一个视图,需要渲染我在Module2中的视图,所以我正在做的是:
$this->partial('partials/hello/title.phtml','Module2',array('data' => $data))
似乎我正在调用视图,但在视图title.phtml里面我无法使用数据
未定义的变量:/site/src/module/Module2/view/partials/hello/title.phtml中的数据
我是否需要添加与配置相关的内容?
谢谢!
答案 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)。