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.yml
Datei enthält die üblichen Werte.
Die MODULE.services.yml
Datei enthält:
services:
MODULE.twig_extension:
# arguments: ['@renderer'] # <-- Initial code (USELESS)
class: Drupal\MODULE\TwigExtension\MyExtension
tags:
- { name: twig.extension }
Die src/TwigExtension/MyExtension.php
Datei 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!
TwigExtension
mit\Twig_Extension
. ;-)Antworten:
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:
Nachdem Sie diese Änderung vorgenommen haben, können Sie auch die für diese Klasse festgelegten Argumente aus der Liste entfernen
MODULE.services.yml
quelle
twig_extension_test
Kernmodul gefundenen Code modelliert .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!
quelle
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
quelle
arguments: ['@renderer']
ist nicht erforderlich, da die\Twig_Extension
Klasse keinen Konstruktor hat.Versuchen Sie es mit https://www.drupal.org/project/twig_extender . Fügen Sie ein Plugin-System für benutzerdefinierte Zweigfunktionen und Filter hinzu
quelle