Slimphp - Twig 动态包含

Slimphp - Twig dynamic include

我需要在 twig 模板中动态包含模板。因此模板将包含在 routes.php

中定义的页面

我尝试像下面的代码一样连接字符串和变量,但仍然无法正常工作。

routes.php:

$app->get('/home', function ($request, $response, $args) {
  $data['page'] = "home";
  return $this->view->render($response, 'Home/layout.html', $data);
});

Home/layout.html:

{% include 'Home/_header.html' %}
{% include 'Home/_topbar.html' %}
{% include 'Home/_sidebar.html' %}
{% include 'Home/' ~ data.page ~ '.html' %}
{% include 'Home/_footer.html' %}

错误信息:

Unable to find template "Home/.html" (looked into: ../App/Templates) in "Home/layout.html" at line 4.

我找到了自己的解决方案,但这不是我想要的。所以我像这样编辑 routes.php 和 layout.html:

routes.php:

$app->get('/home', function ($request, $response, $args) {
  $data['page'] = "{% include 'Home/home.html' %}";
  return $this->view->render($response, 'Home/layout.html', $data);
});

Home/layout.html:

{% include 'Home/_header.html' %}
{% include 'Home/_topbar.html' %}
{% include 'Home/_sidebar.html' %}
{% include template_from_string(page) %}
{% include 'Home/_footer.html' %}

我想要的是发送包含来自 routes.php 的模板文件名称的变量,而不是模板语法。

您正在访问错误的变量。您将以下内容传递给 twig

$data['page'] = "home";
return $this->view->render($response, 'Home/layout.html', $data);

这意味着要访问 twig 中的变量 page 你只需要调用 page 而不是 data.page 因为数组 data 不是甚至传递给你的模板

这意味着您的模板应如下所示

{% include 'Home/_header.html' %}
{% include 'Home/_topbar.html' %}
{% include 'Home/_sidebar.html' %}
{% include 'Home/' ~ page ~ '.html' %}
{% include 'Home/_footer.html' %}

其实你自己看报错信息就知道了

Unable to find template "Home/.html"

由于Home/.html之间没有任何内容,这意味着变量data.page不存在。我建议在开发时启用调试模式然后你会得到一个错误你试图访问一个未定义的变量