Drupal 9:创建自定义 Twig 函数和过滤器

虽然 Twig 本身就是一个强大的工具,但有时您需要从 Drupal 中提取数据或以某种方式对其进行操作。我通常使用预处理步骤来执行此操作,但我最近发现也可以在 Drupal 框架内扩展 Twig 以提供您自己的函数和过滤器。如果您有自定义模板并且需要对数据项执行特殊操作以以不同方式对其进行格式化,这将非常有用。

配置

在我们可以在 Drupal 中创建 Twig 过滤器和函数之前,我们需要告诉 Drupal 我们有一个包含它们的类。这是通过在您的模块服务文件中创建一个包含标签tag.extension的条目来完成的。在名为“custom_twig”的模块中,该文件将被称为 custom_twig.services.yml 并将包含以下内容。

services:

  custom_twig.twig.CustomTwig:

    class: Drupal\custom_twig\CustomTwig

    tags:

      - { name:twig.extension}

这指向一个扩展类 Twig\Extension\AbstractExtension 的类。类的足迹看起来像这样。

<?php

 

namespace Drupal\custom_twig;

 

use Twig\Extension\AbstractExtension;

use Twig\TwigFilter;

use Twig\TwigFunction;

 

/**

 * Custom twig functions.

 */

class CustomTwig extends AbstractExtension {

}

有了这个,我们就可以开始创建我们自己的自定义过滤器和函数。

自定义过滤器

过滤器的工作原理是将某物作为输入并以某种方式对其进行更改。尽管您几乎可以将任何值传递给过滤器,但我们的想法是您应该真正传递易于操作的字符串。

要定义过滤器,请在 CustomTwig 类中创建一个名为 getFilters 的方法。此方法返回一个 TwigFilter 对象数组,这些对象有一个名称和一个回调作为构造函数的参数。

public function getFilters() {

  return [

    new TwigFilter('replace_wth_x', [$this, 'replaceWithX']),

  ];

}

我们在上面定义了一个名为 replaceWithX 的回调,我们可以将其定义为类 CustomTwig 中的一个方法。过滤器只接受单个值,该值作为单个参数呈现给回调方法。replaceWithX 方法接受传入的文本并简单地用字母 x 替换不是空白字符的所有内容。返回值在 Twig 模板系统中打印出来。

public function replaceWithX($text) {

  $text = preg_replace('/[^\s]/', 'x', $text);

  return $text;

}

要使用此过滤器,我们使用 Twig 过滤器语法。以下示例将节点的正文文本传递给过滤器,然后过滤器将页面内容打印为一堆 x。

<p>{{ node.body.value|replace_wth_x }}</p>

这并不是很有用,但您可以轻松创建过滤器来格式化号码或将密钥转换为 YouTube 链接。只要你保持简单,你就可以做到。

自定义函数

函数比过滤器稍微复杂一些,因为它们可以接受多个参数,并且比过滤器的用途稍多。要创建自定义 Twig 函数,请创建一个名为getFunctions(). 这应该返回一个 TwigFunction 对象的数组,这些对象有一个名称和一个回调作为构造函数的参数。 

public function getFunctions() {

  return [

    new TwigFunction('print_author', [$this, 'printAuthor']),

  ];

}

在上面的示例中,我们定义了一个名为 print_author 的自定义方法。这将调用可以接受多个参数的方法 printAuthor。在这种情况下,我们只是接受一个节点对象并在使用它之前检查它的类型是否正确。我倾向于这样做,而不是通过类型提示,因为实际上很容易意外地将不正确的类型传递给方法并使方法崩溃。

public function printAuthor($node) {

  if (!($node instanceof \Drupal\node\Entity\Node)) {

    return;

  }

  $user = $node->getOwner();

  return $user->getDisplayName();

}

此方法通过加载节点的作者并返回此值来操作。要使用这个 Twig 函数,我们使用以下语法调用它。这假设我们在 node.html.twig 模板文件中,因为我将完整的节点对象传递给函数。

{{ print_author(node) }}

如果节点没有作者,则此处打印的值为“匿名”,如果有,则为作者的用户名。同样,这是一个简单的示例,但您可以轻松地将对象传递给此方法并返回在默认 Twig 语法中无法执行的值。这就像将类列表放在一起或将两个字段组合在一起之类的事情。您可以添加其他参数,甚至可以使用依赖注入来添加其他类型的 Drupal 对象,这一事实使这种方法非常强大。

使用像这样的自定义过滤器和函数确实可以让您将 Twig 提升到另一个层次。如果您想了解更多此技术可以做什么,请查看 Twig Tweak Drupal 模块,该模块为默认的 Drupal Twig 功能集添加了一些自定义过滤器和函数。

以上是 Drupal 9:创建自定义 Twig 函数和过滤器 的全部内容, 来源链接: utcz.com/z/360827.html

回到顶部