查找数组中的项目是否在子串树枝中
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 %}
我在读 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 %}