查找数组中的项目是否在子串树枝中

find if items in array are in substring twig

我在读 Find substring in the string in 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>

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

如何查找 "items in this array" 是否包含在 "this substring"

例子是这样的

{% 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 %}

没有骰子!

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

我认为您不应该访问 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 %}>

创建自定义 twig 函数将是更易于使用的解决方案

$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 %}