Phalcon备份视图路径

时间:2013-06-13 12:59:07

标签: php phalcon

有没有办法通过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;
});

3 个答案:

答案 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或其他语句不起作用。

以下是适用于extendinclude的精致解决方案:

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框架的用户会发现它易于使用:

https://github.com/alanbarber111/cloud-phalcon-skeleton