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的类。类的足迹看起来像这样。
有了这个,我们就可以开始创建我们自己的自定义过滤器和函数。
自定义过滤器
过滤器的工作原理是将某物作为输入并以某种方式对其进行更改。尽管您几乎可以将任何值传递给过滤器,但我们的想法是您应该真正传递易于操作的字符串。
要定义过滤器,请在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。
{{node.body.value|replace_wth_x}}
这并不是很有用,但您可以轻松创建过滤器来格式化号码或将密钥转换为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提升到另一个层次。如果您想了解更多此技术可以做什么,请查看TwigTweakDrupal模块,该模块为默认的DrupalTwig功能集添加了一些自定义过滤器和函数。