查找数组中的项目是否在子字符串 twig 中


find if items in array are in substring twig

im reading在 TWIG 中的字符串中查找子字符串

在单个项目上,它对我来说效果很好。

<!-- language: lang-html -->
<li {% if 'page' in app.request.get('_route')|lower %}class="active"{% endif %}>
    <a href="{{path('adminPage')}}">
        <i class="fa fa-file-text"></i> <span>{% trans %}pages_text{% endtrans %}</span> <small class="label pull-right bg-{% if nav_options.count_pages > 0 %}primary{% else %}red{% endif %}">{{ nav_options.count_pages }}</small>
    </a>
</li>

现在我发现自己需要它以不同的方式发生。

我将如何查找"此数组中的项目"是否包含在"此子字符串"中

示例如下所示

{% if ['str1','str2'] in/contained in app.request.get('_route')|lower %}class="active"{% endif %}

我试过这个,但不起作用。

我也宁愿避免使用"or"运算符,如果这是一个要求,那就这样吧,但如果可以避免,那就更好了。

我什至尝试了拆分参数。

{% if 'page,blog'|split(',') in app.request.get('_route')|lower %}active {% endif %}

没有骰子!

该代码旨在允许我在可折叠菜单项中有"几个可能的路由",如果任何可能的路由名称(我有几个路由名称,blog,blogAdd,blogEdit,blogPost等)包含"blog"(与页面相同,以及许多其他)应该打印"active"类。

创建自定义

树枝函数将是一个更容易使用的解决方案

$function = new Twig_SimpleFunction('array_in_string', function ($haystacks, $needle) {
    foreach($haystacks as $haystack) if (stripos($haystack, $needle) !== false) return true;
    return false;
});
$twig = new Twig_Environment($loader);
$twig->addFunction($function);

然后你在 Twig 中调用这个函数:

{% if array_in_string(['page','blog',], app.request.get('_route')) %}
   {# do sthing #}
{% endif %}

我认为你不应该访问HTTP的东西 - 例如获取变量 - 在你的观点中。这有点糊涂了你的MVC。

我会在您的控制器中解决所有这些问题,然后将结果传递给视图(显然未经测试,因此将其视为伪代码):

// controller
$thingIsActive =  in_array(strtolower($request->get('_route')), ['str1','str2']);
return $app['twig']->render('whatever.twig', ['thingIsActive' => $thingIsActive]);
{# whatever.twig #}
<li{% if thingIsActive %} class="active"{% endif %}>