【发布时间】:2014-06-28 05:33:27
【问题描述】:
我发现了如何在 Phalcon 的帮助下进行视图覆盖:https://stackoverflow.com/a/19941928/74651
问题是它使用此方法进行布局,但如果原始视图路径上不存在该目录,则它会进入此方法。
phalcon 在哪里检查布局的目录以及如何覆盖它?
【问题讨论】:
我发现了如何在 Phalcon 的帮助下进行视图覆盖:https://stackoverflow.com/a/19941928/74651
问题是它使用此方法进行布局,但如果原始视图路径上不存在该目录,则它会进入此方法。
phalcon 在哪里检查布局的目录以及如何覆盖它?
【问题讨论】:
所以,你可以做三件事。首先,更改布局目录,第二,只需设置布局,或者第三,更改两者:)
$view->setLayoutsDir('custom/layouts/');
$view->setLayout('outrageouslyCustomLayout');
查看documentation 中的所有方法。如果我没记错的话,路径必须是相对于您的视图目录的。
标准视图提供了很多控制渲染的方法,您可能并不真的需要覆盖某些东西 – http://docs.phalconphp.com/en/latest/reference/views.html#control-rendering-levels
【讨论】:
好的,我只是在一些调试后才弄清楚.. 无法在视图类中转储变量,这有点烦人;)
我的问题确实是,布局需要相对于视图目录。当您将视图目录覆盖为 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;
}
}
}
}
【讨论】:
查看此框架:https://github.com/alanbarber111/cloud-phalcon-skeleton
允许您拥有基于每个网站的设计包,并能够设置“回退”目录和“覆盖”目录。如果不出意外,看看 app/code/Core/Model/App/Design.php 和 app/code/core/Model/View* 看看我们是如何完成的。
【讨论】:
在你的控制器中使用它...为我工作
public function initialize() {
parent::initialize();
$this->view->setTemplateAfter('yourtemplate');
}
【讨论】: