10个Twig技巧改善Drupal主题

Twig是Drupal8滞后使用的主题引擎,Twig是一个模板引擎,对开发人员和设计人员都很友好。它的语法直观、逻辑清晰、灵活。在这篇文章中,成都长风云Drupal开发团队将介绍10个Twig技巧,这些技巧将增强您的Drupal主题化过程,并使主题化变得有趣和高效。

1、调试器

调试是理解的门户,因此在任何提示或技巧之前,必须启用Twig调试器。这将在模板建议周围添加HTML注释,并显示正在使用的模板。

在services.yml中,设置

twig.config:
 debug: true
 auto_reload: true
 cache: false

使用dump()进行检查

{{ dump(content) }}
// for cleaner outputs, install Devel and use kint()
{{ kint(content) }}

2.模板建议

Drupal生成覆盖模板的模板建议,并允许您对模板字段进行精细控制。例如,默认的node.html.twig可以通过使用node-article.html.twig扩展为特定于内容类型,或者进一步扩展到视图模式node-article-teaser.html.twig。
专业提示:控制你的主题,不要用条件逻辑来膨胀模板,而是通过在主题中添加预处理钩子来利用模板建议:

function mytheme_preprocess_node(&$variables) {
 if ($variables['node']->getType() == 'article' && $variables['view_mode'] == 'teaser') {
   $variables['theme_hook_suggestions'][] = 'node__article__teaser__featured';
 }
}

3.使用斜纹过滤器

Twig允许直接在模板中操纵变量。

// String filters
{{ title|lower }}
{{ title|replace({'Drupal': 'Twig'}) }}
// Date formatting
{{ node.created.value|date("F j, Y") }}

// Length checks
{% if items|length > 3 %}
 <p>There are many items.</p>
{% endif %}

专业提示:将过滤器与默认过滤器结合使用,以避免空值:

{{ content.field_subtitle|default('No subtitle available') }}

4.使用Twig功能

Twig附带了各种可供使用的辅助功能。
path():生成内部链接

<a href="{{ path('entity.node.canonical', {'node': node.id}) }}">
 {{ node.title.value }}
</a>

url():输出完整的url

{{ url('entity.node.canonical', {'node': node.id}) }}

include():重用部分模板

{{ include('@mytheme/partials/_button.html.twig', {text: 'Read More'}) }}

attach_library(): 加载主题的 libraries

{{ attach_library('mytheme/custom-styles') }}

5.树枝可重复使用组件

Drupal的10个重点是基于组件的主题化设计方法,因此必须使用Twig组件。

创建_card.html.twig组件

<div class="card">
 <h2>{{ title }}</h2>
 <p>{{ body }}</p>
 <a href="#">Read more</a>
</div>

将其包含在其他模板中:

{{ include('@mytheme/components/_card.html.twig', {
 title: node.label,
 body: content.body,
 url: path('entity.node.canonical', {'node': node.id})
}) }}

6.条件和循环

条件属性可用于保持最小和干净

<div class="alert {{ status == 'error' ? 'alert-danger' : 'alert-success' }}">
 {{ message }}
</div>

循环使用有用的变量:

{% for item in items %}
 <li class="{{ loop.first ? 'first' : '' }} {{ loop.last ? 'last' : '' }}">
   {{ item }}
 </li>
{% endfor %}

7.使用块扩展模板

Twig支持继承,例如Base模板Base.html.Twig

<html>
 <head>{% block head %}{% endblock %}</head>
 <body>
   {% block content %}{% endblock %}
 </body>
</html>

可以扩展子模板

{% extends "base.html.twig" %}
{% block content %}
 <h1>{{ title }}</h1>
 {{ body }}
{% endblock %}

这也使得构建基于组件的主题变得更加容易。 

8.高级归因

Drupal的核心属性对象可以通过Twig模板访问,这是一种动态管理类和属性的强大方法。

<div{{ attributes.addClass('node', 'node--' ~ node.bundle) }}>
 {{ content }}
 // You could also merge attributes
 {{ title_attributes.addClass('page-title') }}
</div>

9.性能考虑因素

1)在生产环境中禁用调试器
2)使用包含或嵌入,而不是复制标记
3)缓存输出

10.附加库

Drupal 10中,Twig主题可以以极其模块化的方式与第三方库相结合:

附加库:

{{ attach_library('mytheme/hero-banner') }}

在mytheme.libraries.yaml中定义库

hero-banner:
 css:
   theme:
     css/components/hero-banner.css: {}
 js:
   js/hero-banner.js: {}

 

联系我们

提供基于Drupal的门户网站、电子商务网站、移动应用开发及托管服务

长按加微信
长风云微信
长按关注公众号
长风云公众号