Twig 模板布局 Yii2 框架

Posted

技术标签:

【中文标题】Twig 模板布局 Yii2 框架【英文标题】:Twig Template Layout Yii2 Framework 【发布时间】:2014-06-16 15:48:03 【问题描述】:

我想在 yii 2 中为我的所有树枝文件设置一个类似于 main.htm 的布局,但它会加载控制器首先调用的文件夹,所以我不能用扩展来调用我的布局。

在站点控制器中

public function actionIndex()


    return $this->render('index.htm');

这段代码调用views/site/index.htm

在我的 index.htm 中

% extends "main.html" %

所以如果我把main.html放在site文件夹里是没有问题的,但是我想把它放在layout文件夹中,并且可以调用每个控制器视图..我该怎么做呢??

views
->site
  ->index.html
->layouts
  ->main.html

例如在symfony中我们可以这样调用

% extends '::base.html.twig' %

但是在 Yii2 中我找不到这样做的方法....

我已经通过硬编码文件 viewRenderer.php 完成了这项工作。这不是我喜欢的方式,因为作曲家更新更改已经消失...

现在函数 init 是这样的,这里的 loader 为空。我为我的布局添加了加载器。

$this->twig = new \Twig_Environment(null, array_merge([
        'cache' => Yii::getAlias($this->cachePath),
        'charset' => Yii::$app->charset,
    ], $this->options));

添加加载器后..

$this->loader = new \Twig_Loader_Filesystem($_SERVER["DOCUMENT_ROOT"].'\views\layouts');

最后是 ViewRenderer.php 中的渲染函数

 public function render($view, $file, $params)

    $this->twig->addGlobal('this', $view);
    //$this->twig->setLoader(new TwigSimpleFileLoader(dirname($file)));
    $this->loader->addPath(dirname($file));
    return $this->twig->render(pathinfo($file, PATHINFO_BASENAME), $params);

我希望它没有在 yii2-twig 的核心文件中进行硬编码更改 ....

【问题讨论】:

github.com/yiisoft/yii2/pull/3907 【参考方案1】:

您是否尝试过在此处使用完整路径% extends "main.html" %。类似% extends "\layouts\main.html" %

甚至% extends "@app/views/layouts/main.html" %

我没有用twig和yii,但是值得一试。

【讨论】:

是的,我都试过了,如果你使用完整路径,只需像这样在站点文件夹之后添加并再次给出错误。比如 site/\layouts\main.html 或 site/@app/views/layouts/main.html。因为 twig 模板加载器文件夹在 viewRenderer.php 中定义为控制器视图文件夹 ...

以上是关于Twig 模板布局 Yii2 框架的主要内容,如果未能解决你的问题,请参考以下文章

yii2 使用twig 模板引擎

构建自己的PHP框架(Twig模板引擎)

Yii2框架博客系统前台界面布局

Yii2.0框架 视图 Views

Yii2框架bootstrap样式理解

Yii2框架加入API Modules