有没有办法通过phalcon中的视图dir的辅助路径?
在zend框架中我认为语法是$this->view->addScriptPath('/backup/path');
$this->view->addScriptPath('/preferred/path');
所以,如果首选路径中有一个文件,它将使用它,如果没有,它将通过链回退。
我使用这个,例如,当大多数页面相同时,移动版本,但有些必须显着不同,我不想只为2或3个变体复制所有视图
在phalcon中,我尝试向视图发送一个数组,但这只会导致无法正常工作
$di->set('view', function() use ($config) {
$view = new \Phalcon\Mvc\View();
$view->setViewsDir( array('/preferred/path/', '/backup/path/') );
return $view;
});
答案 0 :(得分:4)
我通过扩展Phalcon\Mvc\View\Engine\Volt
在render($template_path, $params, $must_clean = null)
方法中,我设置备用路径,检查文件是否可用,如果是,我切换给出了替换路径的$ template_path。然后这只是一个呼叫的案例:
return parent::render($template_path, $params, $must_clean);
其中$ template_path包含新的(替代)路径。
如果你的替代路径可能会在每个项目的基础上改变而你需要在bootstrap中设置它,那么当你从di获得一个“视图”而不是这样做时,你会在获得伏特时这样做。
请记住,所有视图都使用该方法呈现,因此您还必须考虑布局和部分视图 - 具体取决于您的实现。
示例:(这尚未经过测试,它基于我自己的代码中的类似设置)
<?php
class Volt extends Phalcon\Mvc\View\Engine\Volt
{
private $skin_path;
public function render($template_path, $params, $must_clean = null)
{
$skin_template = str_replace(
$this->di->getView()->getViewsDir(),
$this->getSkinPath(),
$template_path
);
if (is_readable($skin_template)) {
$template_path = $skin_template;
}
return parent::render($template_path, $params, $must_clean);
}
public function setSkinPath($data)
{
$this->skin_path = $data;
}
public function getSkinPath()
{
return $this->skin_path;
}
}
在你的引导程序中:
$di->setShared('volt', function($view, $di) {
$volt = new Volt($view, $di);
$volt->setSkinPath('my/alternative/dir/');
return $volt;
});
非常感谢nickolasgregory @ github指出了我正确的方向。
答案 1 :(得分:3)
@strayobject提出的方法对我也很有帮助,但我发现在伏特模板中使用extend
或其他语句不起作用。
以下是适用于extend
和include
的精致解决方案:
use Phalcon\Mvc\View\Engine\Volt;
class VoltExtension extends Volt
{
// Override default Volt getCompiler method
public function getCompiler()
{
if (!$this->_compiler) {
$this->_compiler = new VoltCompilerExtension($this->getView());
$this->_compiler->setOptions($this->getOptions());
$this->_compiler->setDI($this->getDI());
}
return $this->_compiler;
}
}
并且
use Phalcon\Mvc\View\Engine\Volt;
class VoltCompilerExtension extends Volt\Compiler
{
public function compileFile($path, $compiledPath, $extendsMode = null)
{
$skinPath = $this->getOption('skinPath');
if ($skinPath) {
$skinTemplate = str_replace(
$this->getDI()->getView()->getViewsDir(),
$skinPath,
$path
);
if (is_readable($skinTemplate)) {
$path = $skinTemplate;
}
}
return parent::compileFile($path, $compiledPath, $extendsMode);
}
}
用法:
$volt = new VoltExtension($view, $di);
$volt->setOptions(
array(
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_',
'compileAlways' => false,
'skinPath' => $config->application->skinPath
)
);
答案 2 :(得分:0)
请查看此phalcon框架更新。它为每个网站提供多个视图包的支持(您可以拥有多个网站)。 magento框架的用户会发现它易于使用: