"Начинается с" в шаблоне Twig

У меня есть шаблон ветки, где я бы хотел проверить, начинается ли элемент с определенного значения

{% if item.ContentTypeId == '0x0120' %}
    <td><a href='?parentId={{ item.Id }}'>{{ item.BaseName }}</a><br /></td>
{% else %}
    <td><a href='?{{ item.UrlPrefix }}'>{{ item.LinkFilename }}</a></td>
{% endif %}

0x0120 может выглядеть так или более сложным, как этот 0x0120D52000D430D2B0D8DD6F4BBB16123680E4F78700654036413B65C740B168E780DA0FB4BX. Единственное, что я хочу сделать, это убедиться, что он начинается с 0x0120.

Идеальное решение было бы решить это с помощью регулярного выражения, но я не знаю, поддерживает ли Twig это?

благодаря

Ответ 1

Да, Twig поддерживает регулярные выражения в сравнении: http://twig.sensiolabs.org/doc/templates.html#comparisons

В вашем случае это будет:

{% if item.ContentTypeId matches '/^0x0120.*/' %}
  ...
{% else %}
  ...
{% endif %}

Ответ 2

Вы можете сделать это прямо сейчас в Twig:

{% if 'World' starts with 'F' %}
{% endif %}

"Ends with" также поддерживается:

{% if 'Hello' ends with 'n' %}
{% endif %}

Существуют и другие удобные ключевые слова:

Сложные сравнения строк:

{% if phone matches '{^[\\d\\.]+$}' %} {% endif %}

(Примечание: двойная обратная косая черта преобразуется в одну обратную косую черту по ветке)

Строка содержит:

{{ 'cd' in 'abcde' }}
{{ 1 in [1, 2, 3] }}

См. Дополнительную информацию здесь: http://twig.sensiolabs.org/doc/templates.html#comparisons

Ответ 3

Вы можете использовать фильтр slice. Просто выполните:

{% if item.ContentTypeId[:6] == '0x0120' %}
{% endif %}

Ответ 4

Вы всегда можете сделать свой собственный фильтр, который выполняет необходимое сравнение.

Согласно документам:

При вызове Twig, вызываемый PHP получает левую часть фильтра (перед каналом |) в качестве первого аргумента и дополнительные аргументы, переданные фильтру (в круглых скобках()) в качестве дополнительных аргументов.

Итак, вот модифицированный пример.

Создание фильтра так же просто, как связать имя с вызываемым PHP:

// an anonymous function
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) {
    /* do your work here */
});

Затем добавьте фильтр в среду Twig:

$twig = new Twig_Environment($loader);
$twig->addFilter($filter);

И вот как использовать его в шаблоне:

{% if item.ContentTypeId | compareBeginning('0x0120') == true %}
{# not sure of the precedence of | and == above, may need parentheses #}

Я не парень PHP, поэтому я не знаю, как PHP выполняет регулярные выражения, но анонимная функция выше предназначена для возврата true, если $longString начинается с $startsWith. Я уверен, что вы найдете это тривиальным для реализации.