【问题标题】:Override layout in Phalcon覆盖 Phalcon 中的布局
【发布时间】:2014-06-28 05:33:27
【问题描述】:

我发现了如何在 Phalcon 的帮助下进行视图覆盖:https://stackoverflow.com/a/19941928/74651

问题是它使用此方法进行布局,但如果原始视图路径上不存在该目录,则它会进入此方法。

phalcon 在哪里检查布局的目录以及如何覆盖它?

【问题讨论】:

    标签: php layout view phalcon


    【解决方案1】:

    Here 和某种here

    所以,你可以做三件事。首先,更改布局目录,第二,只需设置布局,或者第三,更改两者:)

    $view->setLayoutsDir('custom/layouts/');
    $view->setLayout('outrageouslyCustomLayout');
    

    查看documentation 中的所有方法。如果我没记错的话,路径必须是相对于您的视图目录的。

    标准视图提供了很多控制渲染的方法,您可能并不真的需要覆盖某些东西 – http://docs.phalconphp.com/en/latest/reference/views.html#control-rendering-levels

    【讨论】:

    • 谢谢你,不幸的是我的问题是相对目录;)但我现在找到了。
    【解决方案2】:

    好的,我只是在一些调试后才弄清楚.. 无法在视图类中转储变量,这有点烦人;)

    我的问题确实是,布局需要相对于视图目录。当您将视图目录覆盖为 on:https://stackoverflow.com/a/19941928/74651 时,它将在原始视图目录而不是覆盖上查找布局。

    可以在 _engineRender 中覆盖这个有点烦人,因为它们强制相对目录并且仅在发现文件不太灵活时才触发和事件。

    <?php
    namespace Phapp\Mvc;
    
    class View extends \Phalcon\Mvc\View {
    
        /**
        * @param array $engines
        * @param string $viewPath
        * @param boolean $silence
        * @param boolean $mustClean
        * @param \Phalcon\Cache\BackendInterface $cache
         */
        protected function _engineRender($engines, $viewPath, $silence, $mustClean, $cache) {        
        // Layout override
        if ($this->getCurrentRenderLevel() !== \Phalcon\Mvc\View::LEVEL_LAYOUT) {
            return parent::_engineRender($engines, $viewPath, $silence, $mustClean, $cache);                        
        }
        foreach ($engines as $extension => $engine) {
            if (!$engine instanceof View\Engine\ThemeInterface) {
                continue;
            }
            $layout = $engine->getThemePath().$viewPath.$extension;
            if (is_readable($layout)) {
                $originalViewDir = $this->getViewsDir();
                $this->setViewsDir($engine->getThemePath());
                $content = parent::_engineRender($engines, $viewPath, $silence, $mustClean, $cache);
                $this->setViewsDir($originalViewDir);
                return $content;
            }
        }
        }        
    }
    

    【讨论】:

      【解决方案3】:

      查看此框架:https://github.com/alanbarber111/cloud-phalcon-skeleton

      允许您拥有基于每个网站的设计包,并能够设置“回退”目录和“覆盖”目录。如果不出意外,看看 app/code/Core/Model/App/Design.php 和 app/code/core/Model/View* 看看我们是如何完成的。

      【讨论】:

      【解决方案4】:

      在你的控制器中使用它...为我工作

      public function initialize() {
        parent::initialize();
        $this->view->setTemplateAfter('yourtemplate');
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多