カスタムTwigフィルター作成時のエラー


7

Drupal 8でカスタムTwigフィルターを作成しようとしています。目標は、次のようなテンプレートでカスタムフィルターを使用することです。

{{ a_variable|myfilter }}

3つのファイルを含むカスタムモジュールを作成しました。

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

MODULE.info.ymlファイルには、通常の値が含まれています。

MODULE.services.ymlファイルが含まれています:

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

src/TwigExtension/MyExtension.phpファイルが含まれています:

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

}

最初のコードで次のエラーが発生しました:「224行目の/core/lib/Drupal/Core/Template/TwigExtension.phpの非オブジェクトに対するメンバー関数generateFromRoute()の呼び出し」。

しかし、私は今、lauriiiの答えに従ってコードを修正しました、そしてそれは完全に機能します!


1
うーん、私は私の実装をチェックしましたが、すべて問題ないようです。エラーがあなたの拡張機能に起因することはわかりますか?多分あなたはどこかで小枝の悪い機能を呼んでいますか?コアテーマに切り替えて、関数nを呼び出してみてください。

これは微妙なエラーで、に置き換えTwigExtensionられました\Twig_Extension。;-)
AngularChef

1
leopathu.in/content/create-custom-twig-filter-drupal-8この記事では、カスタムtwigフィルターについて例を用いて説明し、ページからサンプルコードをダウンロードすることもできました。
Leopathu

回答:


8

上記のコードの問題は、Twig拡張クラスが内部のDrupal Twig拡張クラスを拡張していることです。これは、Drupalコアによって追加されたTwig拡張機能を破壊するため、エラーが発生します。

これを修正するには、Twig拡張をTwigs内部Twig拡張クラスに拡張する必要があります。クラスは次のように定義する必要があります:

class MyExtension extends \Twig_Extension {

その変更を行った後、そのクラスに設定された引数を MODULE.services.yml


すばらしい、うまくいきました!どうもありがとう、lauriii。元のコードを更新して、回答を反映させます。
AngularChef

奇妙なことに...私の最初のコードは、twig_extension_testコアモジュールで見つかったものをモデルにしています。
AngularChef

twig_extension_testを修正するための保留中のパッチがあります。残念ながら、テストモジュールは常に最良の例とは限りません。
Cottser、2015

0

上記のサンプルはまだオフになっています。

/ core / modules / system / tests / modules / twig_extension_testを見て、twigフィルターと関数をモデル化してください!


フォローアップ:なんらかの理由で... twig_extension_testは、/ adminパスの下で表示した場合にのみ機能するようです...
skaught

0

\ Twig_Extensionクラスをより直接使用する必要があるようです。

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']\Twig_Extensionクラスにはコンストラクタがないため、不要です。
ティム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.