从不同目录中选择主要布局

时间:2013-12-20 11:56:31

标签: layout view phalcon

我有一个多模块应用程序。每个模块都有自己的视图服务和文件夹。但我需要的是使用来自不同文件夹的主布局(通常是views / index.phtml)。

我想渲染:

  1. 呈现应用/ MODULE-NAME / views / CONTROLLER-NAME / ACTION-NAME.phtml
  2. 渲染app / MODULE-NAME / views / layouts / CONTROLLER-NAME.phtml
  3. 跳过呈现apps / MODULE-NAME / views / index.phtml
  4. 呈现apps / views / index.phtml
  5. 我尝试使用https://github.com/phalcon/mvc/tree/master/multiple-shared-layouts的共享布局,但这不是我需要的。在这种情况下,MODULE-NAME / views / layouts / CONTROLLER-NAME.phtml的布局不会被应用程序呈现。

1 个答案:

答案 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。