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!

AngularChef
quelle
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

lauriii
quelle
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!

skaught
quelle
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);
  }


}

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