我想知道如何获取当前页面名称,基本上“只是”路由中的最后一个参数(即/ news或/ about)。我这样做是因为我希望能够突出显示导航中的当前页面。
理想情况下,我想将当前页面名称存储在全局变量中,以便在Twig中我可以将当前页面名称与链接进行比较并相应地添加一个类。
我无法弄清楚如何将当前页面名称添加到全局变量中。我尝试过这样的事情:
$app['twig']->addGlobal('current_page_name', $app['request']->getRequestUri());
位于我的app.php文件的顶部,但是“请求范围之外”错误。但我不想在每条路线中加入这一点。
最好的方法是什么?
答案 0 :(得分:16)
如果你在像这样的中间件之前把它放到应用程序级别,那就行了:
$app->before(function (Request $request) use ($app) {
$app['twig']->addGlobal('current_page_name', $request->getRequestUri());
});
您的问题的“页面名称”部分不清楚,您是否在寻找当前路线的名称?您甚至可以在之前的中间件中通过$request->get("_route")
访问它,因为在路由已经完成时会调用它。
答案 1 :(得分:1)
您还可以直接在独立导航树枝模板中生成导航列表。然后将其导入主模板。然后你只需要让silex传递给视图当前的页面标识符。最简单的方法...例如从Silex中你必须将“path”变量传递给你的视图。可能从数据库中获取nav_list并将其作为全局数组变量传递给twig模板会更方便。然而,这个例子是最简单的你可以做你想做的事。
nav.twig
{% set nav_list = [
["./", "home"],
["./contact", "contact"],
["./about", "about us"]
{# ... #}
] %}
{% set link_active = path|default("") %}
{% for link in nav_list %}
<li><a href="{{ link[0] }}" class="{% if link[0] == link_active %} activeClass {% endif %}" >{{ link[1] }}</a></li>
{% endfor %}
app.php
//...
$app->match('/about', function (Request $request) use ($app) {
return $app['twig']->render('about.twig', array(
'path' => './'.end(explode('/', $request->getRequestUri()))
));
});
//...