Fehler beim Erstellen eines benutzerdefinierten Zweigfilters


7

Ich versuche, in Drupal 8 einen benutzerdefinierten Zweigfilter zu erstellen. Ziel ist es, meinen benutzerdefinierten Filter in einer Vorlage wie der folgenden zu verwenden:

{{ a_variable|myfilter }}

Ich habe ein benutzerdefiniertes Modul mit 3 Dateien erstellt:

MODULE.info.yml
MODULE.services.yml
src/TwigExtension/MyExtension.php

Die MODULE.info.ymlDatei enthält die üblichen Werte.

Die MODULE.services.ymlDatei enthält:

services:
  MODULE.twig_extension:
#   arguments: ['@renderer']  #  <-- Initial code (USELESS)
    class: Drupal\MODULE\TwigExtension\MyExtension
    tags:
      - { name: twig.extension }

Die src/TwigExtension/MyExtension.phpDatei enthält:

namespace Drupal\MODULE\TwigExtension;

// use Drupal\Core\Template\TwigExtension;  // <-- Initial code (WRONG)

class MyExtension extends \Twig_Extension {    
// class MyExtension extends TwigExtension {  // <-- Initial code (WRONG)

  /**
   * Generates a list of all Twig filters that this extension defines.
   */
  public function getFilters() {
    return [
      new \Twig_SimpleFilter('myfilter', array($this, 'myFilter')),
    ];
  }

  /**
   * Gets a unique identifier for this Twig extension.
   */
  public function getName() {
    return 'MODULE.twig_extension';
  }

  /**
   * Replaces all instances of "animal" in a string with "plant".
   */
  public static function myFilter($string) {
    return str_replace(array('animal'), array('plant'), $string);
  }

}

Mein anfänglicher Code hat den folgenden Fehler erhalten: "Aufruf einer Mitgliedsfunktion generateFromRoute () für ein Nichtobjekt in /core/lib/Drupal/Core/Template/TwigExtension.php in Zeile 224".

Aber ich habe jetzt den Code nach Lauriis Antwort korrigiert und er funktioniert perfekt!


1
Hm, ich habe meine Implementierung überprüft und alles scheint in Ordnung zu sein. Verwenden Sie den Fehler von Ihrer Nebenstelle? Vielleicht rufen Sie irgendwo eine schlechte Funktion im Zweig auf? Versuchen Sie, zu einem Kernthema zu wechseln und dort Ihre Funktion n aufzurufen.

Es war ein subtiler Fehler, ersetzt TwigExtensionmit \Twig_Extension. ;-)
AngularChef

1
leopathu.in/content/create-custom-twig-filter-drupal-8 In diesem Artikel wurde der benutzerdefinierte Zweigfilter anhand des Beispiels ausführlich erläutert. Sie können auch den Beispielcode von der Seite herunterladen.
Leopathu

Antworten:


8

Das Problem im obigen Code ist, dass Ihre Twig-Erweiterungsklasse die interne Drupal Twig-Erweiterungsklasse erweitert. Dadurch werden die vom Drupal-Kern hinzugefügten Twig-Erweiterungen zerstört, und deshalb wird der Fehler angezeigt.

Um dies zu beheben, sollten Sie Ihre Twig-Erweiterungen dazu bringen, die interne Twigs-Erweiterungsklasse von Twigs zu erweitern. Ihre Klasse sollte folgendermaßen definiert sein:

class MyExtension extends \Twig_Extension {

Nachdem Sie diese Änderung vorgenommen haben, können Sie auch die für diese Klasse festgelegten Argumente aus der Liste entfernen MODULE.services.yml


Super, es funktioniert! Vielen Dank, Lauriii. Ich werde meinen ursprünglichen Code aktualisieren, um Ihre Antwort wiederzugeben.
AngularChef

Seltsam ... Mein ursprünglicher Code wurde nach dem im twig_extension_testKernmodul gefundenen Code modelliert .
AngularChef

Es steht ein Patch an, um twig_extension_test zu reparieren. Testmodule sind leider nicht immer die besten Beispiele.
Cottser

0

Das obige Beispiel ist noch nicht aktiviert. (dh: Die 'Argumente'-Klausel in .services scheint erforderlich zu sein.)

Schauen Sie sich / core / modules / system / tests / modules / twig_extension_test an, um einen Zweigfilter und eine Funktion zu modellieren!


Follow-up: aus welchem ​​Grund auch immer ... der twig_extension_test scheint nur zu funktionieren, wenn er unter einem / admin-Pfad
angezeigt

0

Es scheint, dass wir die \ Twig_Extension-Klasse direkter verwenden müssen.

MODULE.services.yml services: MODULE.twig.filters: arguments: ['@renderer'] class: Drupal\MODULE\TwigExtension\HexToRgb tags: - { name: twig.extension }

/src/TwigExtension/HexToRgb.php

/**
 * @file
 * Contains Drupal\MODULE\TwigExtension.
 */

namespace Drupal\MODULE\TwigExtension;


/**
 * A Twig extension (filter) converts hex color to rgb.
 */
class HexToRgb extends \Twig_Extension {

  /**
   * Generates a list of all Twig filters that this extension defines.
   */
  public function getFilters() {
    return array(
      new \Twig_SimpleFilter('hexToRGB', [$this, 'hexToRGB'], ['is_safe' => ['html']]),
      new \Twig_SimpleFilter('rangeToPercent', [$this, 'rangeToPercent'], ['is_safe' => ['html']]),
    );
  }

  /**
   * Gets a unique identifier for this Twig extension.
   */
  public function getName() {
    return 'MODULE.twig.filters';
  }

  /**
   * convert 3 or 6 char hex color to comma seperated RGB colors
   */
  public static function hexToRgb($hex=000000) {
    $r = $g = $b = FALSE;
    $hex = str_replace("#", "", $hex);

    if(strlen($hex) == 3) {
      $r = hexdec(substr($hex, 0, 1).substr($hex, 0, 1));
      $g = hexdec(substr($hex, 1, 1).substr($hex, 1, 1));
      $b = hexdec(substr($hex, 2, 1).substr($hex, 2, 1));
    } else {
      $r = hexdec(substr($hex, 0, 2));
      $g = hexdec(substr($hex, 2, 2));
      $b = hexdec(substr($hex, 4, 2));
    }

    $rgb = array($r, $g, $b);

    return implode(",", $rgb);
  }

  /**
   * convert range (0 to 100) to a percent with 2 decimals
   */
  public static function rangeToPercent($range=0) {
    return round(($range/100), 2);
  }


}


arguments: ['@renderer']ist nicht erforderlich, da die \Twig_ExtensionKlasse keinen Konstruktor hat.
Tim

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.