我有一个多模块应用程序。每个模块都有自己的视图服务和文件夹。但我需要的是使用来自不同文件夹的主布局(通常是views / index.phtml)。
我想渲染:
我尝试使用https://github.com/phalcon/mvc/tree/master/multiple-shared-layouts的共享布局,但这不是我需要的。在这种情况下,MODULE-NAME / views / layouts / CONTROLLER-NAME.phtml的布局不会被应用程序呈现。
答案 0 :(得分:2)
好的,我不确定这是否是正确的方法,但我认为你可以做的是类似于下面的内容。虽然请考虑这意味着您必须选择所有视图,它不会自动执行任何操作
在Module.php文件中,将视图设置为简单视图
$di['view'] = function() {
$view = new \Phalcon\Mvc\View\Simple();
$view->setViewsDir(realpath(__DIR__.'../../../apps/'));
return $view;
};
然后在你的bootstrap index.php中禁用自动视图渲染
$application->useImplicitView(false); // add this line
echo $application->handle()->getContent();
最后,在您的操作方法中,您可以执行以下操作来选择您的观点
public function fooAction(){
echo $this->view->render('common/index');
echo $this->view->render('frontend/Views/layouts/index');
echo $this->view->render('frontend/Views/Index/foo');
}
毫无疑问,有些人认为你可以构建一个可以自动处理这个问题的插件或组件,但这应该可以达到你想要的效果(虽然你可能需要重新编写你的应用程序)
实际上,上面的基本示例是在baseController中执行以下操作
public function beforeExecuteRoute($dispatcher){
$module = $dispatcher->getModuleName();
$controller = $dispatcher->getControllerName();
$action = $dispatcher->getActionName();
$this->temp = $this->view->render('/'.$module.'/Views/'.$controller.'/'.$action);
}
然后执行控制器调用
echo $this->temp; //temp set above
您可能希望首先检查baseController中是否存在这些文件,但显然您可以根据$ module / $ controller等将不同的视图附加到$ this-> temp。