В основном у меня есть условие if else, которое проверяет тип сущности узла и выводит значение на основе условия. Как видно из кода ниже, если entity type
является press_release
это выводит Press Release
на разметке и если entity type
является interview
, это выводит Interview
,
Проблема в том, что если существует несколько условий, становится трудно поддерживать их, есть ли способ сократить их?
{% for newsdesk in accordion.entity.field_newsdesk_and_press %}
{% if article.entity.getType == 'press_release' %}
<a href="#" class="tag-label">Press Release</a>
{% endif %}
{% if article.entity.getType == 'interview' %}
<a href="#" class="tag-label">interview</a>
{% endif %}
{% endfor %}
Дело в том, page.html.twig
вероятно, это второй худший шаблон для такого рода вещей (возглавляемый html.html.twig
и затем node.html.twig
). Вместо этого вам лучше сделать это на уровне поля.
Но прежде всего очень важно, чтобы вы включили отладку Twig. Просто следуйте: Отладка шаблонов Twig. Отныне вы будете получать предложения шаблона, напечатанные в виде комментариев HTML в вашей разметке. Смотрите пример выходных данных для поля body моего типа контента Article:
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'field' -->
<!-- FILE NAME SUGGESTIONS:
* field--node--body--article.html.twig
* field--node--body.html.twig
* field--node--article.html.twig
* field--body.html.twig
x field--text-with-summary.html.twig
* field.html.twig
-->
<!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' -->
<div property="schema:text" data-quickedit-field-id="node/1/body/en/teaser" class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item quickedit-field"><p>Elitphas sellus laoreet consequa laoreetc maecenas aesent iam ras fames. Volutpat sacras feugiatm hendre lacusp esent quamsusp uada netus. Duinulla sque teger justop justov metiam. Uisque vestibu tcras pretium llam lum llam. Consec ctetur llaut necinte magnap vel proin. Justo teger sedinteg vulput ligula arcu litora telluss eger. Roin massan quamnull nibh vitaenu sduis felis rproin ndisse. Ipsumves nullap teger mussed condim sacras.</p></div>
<!-- END OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' -->
Немного x
перед перечисленными шаблонами указывает, какие шаблоны используются в данный момент. И только поверх фактического поля вывода выводится относительный путь на вашем жестком диске к текущему файлу шаблона. Теперь вы можете пойти, скопировать этот шаблон, вставить его в тему templates
и переименуйте его в одном из прокомментированных предложений. Вероятно, настолько четко, насколько это возможно.
Так что в вашем случае это будет:
field--node--field-newsdesk-and-press--press-release.html.twig
field--node--field-newsdesk-and-press--interview.html.twig
А внутри вы редактируете разметку под свои нужды. С помощью hook_theme_suggestions_HOOK_alter
Существующие предложения шаблона также могут быть легко расширены для соблюдения режима просмотра.
Тем не менее, это не идеальное решение по моему собственному мнению (хотя это широко сделано таким образом). Управление большим количеством шаблонов может стать очень быстрым. Плюс: фактический пользовательский интерфейс поля в серверной части становится все более и более бесполезным.
Я бы рекомендовал вместо этого программно создать два псевдополя, которые просто можно поместить в настройки управления отображением каждого типа узла. Или сделать это полностью внутри функций предварительной обработки, опять же программно. Но это выйдет далеко за рамки вашего вопроса и его лучше задавать отдельно, если вы сами этого не сделаете.
С учетом вашего примера я могу предложить следующее:
{% for newsdesk in accordion.entity.field_newsdesk_and_press %}
<a href="#" class="tag-label">{{ article.entity.getType|humanize|title }}</a>
{% endfor %}