2

有没有办法通过辅助路径到达 phalcon 中的视图目录?

在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;
});
4

3 回答 3

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 包含新的(替代)路径。

如果您的替代路径可能会在每个项目的基础上发生变化,并且您需要在引导程序中设置它,那么在从 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,他为我指明了正确的方向。

于 2013-11-12T23:13:56.237 回答
3

@strayobject 提出的方法也对我有帮助,但我发现extend在 volt 模板中使用或其他语句不起作用。

这是与extendand一起使用的改进解决方案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
     )
 );
于 2013-11-17T13:01:42.590 回答
0

请看一下这个 phalcon 框架更新。它为每个网站提供多个视图包的支持(您可以拥有多个网站)。magento 框架的用户会发现它易于使用:

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

于 2014-05-13T14:26:58.527 回答