Slimphp - Twig动态包括

时间:2018-04-18 20:04:27

标签: php twig slim

我需要在twig模板中动态包含模板。因此模板将包含在routes.php中定义的页面

我尝试连接字符串和变量,如下面的代码,但仍然无效。

routes.php文件

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

主/的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);
});

主/的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发送包含模板文件名称的变量,而不是模板语法。

1 个答案:

答案 0 :(得分:2)

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

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

这意味着要访问page内的变量twig,您只需要调用page而不是data.page,因为数组data甚至没有通过走向你的模板

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

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

在查看错误消息

时,您实际上可以自己说出来
  

无法找到模板" Home / .html"

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