RenderElementをオーバーライドするにはどうすればよいですか?


7

HtmlTagのレンダリング方法を制御するHtmlTagと呼ばれるDrupal 8 RenderElementがあります。これをオーバーライドして、デフォルトの動作を変更できるようにしたいと思います。

HtmlTagを拡張して必要なものをオーバーライドするクラスを作成することはできますが、Drupalコアとテーマシステムは新しいクラスをどのように使用することを知っていますか?

あるいは、hook_theme_registry_alter()新しいクラスを使用するようにDrupal 8に指示するために使用すべきでしょうか?

これを達成するための最良の方法は本当にわかりませんし、これが行われた例はないようです。


なぜHTML_tag要素をオーバーライドしようとしているのですか?
Eyal

デフォルトのvoid要素@Eyal
Clive

すべてのスクリプトタグをJSON配列で使用する単純なパスに変換する。これは、JavaScriptベースのスクリプトローダーで使用するためのものです。
Lomax

回答:


6

使用hook_element_info_alter()は1つのオプションですが、それが最良であるかどうかはわかりません。

既存のクラスは、2つの事前レンダリングコールバックを設定します。これらは、独自のクラスでオーバーライドできます。

function MYMODULE_element_info_alter(array &$types) {
  $types['html_tag']['#pre_render'] = [
    [\Drupal\mymodule\HtmlTag::class, 'preRenderConditionalComments'],
    [\Drupal\mymodule\HtmlTag::class, 'preRenderHtmlTag'],
  ];
}

...

namespace Drupal\mymodule;

use Drupal\Core\Render\Element\HtmlTag as CoreHtmlTag;

class HtmlTag extends CoreHtmlTag {

  public function preRenderHtmlTag($element) {
    // ...
  }

  public function preRenderConditionalComments($element) {
    // ...
  }

}

これは面白い。複数の投稿モジュールがこれを行うと、問題が発生しますか?
ケビン

@Kevin、うん、レースがありますが、以前のバージョンのフックにすぎません。それも予測可能でありhook_module_implements_alter、それが発生した場合にフックの実装に順序を強制するための適切な手段があります
Clive

私はこれが他の理由@Kevinで正しくないと感じるべきであると追加する必要があります-OPがたとえば静的変数をオーバーライドするだけの場合、DRYに違反する可能性があります$voidElements-親クラスはselfそれstaticを参照するのではなく使用するため、のpreRenderHtmlTag全体にコピーアンドペーストする必要があります
クライヴ

@Cliveはのコンテンツを上書きする$voidElementsことはできます$element = parent::preRenderHtmlTag($element);か?プライベートではなく保護されているだけなので、呼び出しますか?
4k4

残念ながら@ 4k4ではありません-親クラスがstaticキーワードでそれを参照している場合は機能self::$voidElementsしますが、それを使用すると常に拡張クラスではなくコアのHtmlTagの変数を参照します
Clive

0

hook_element_info_alter()が十分に機能しない場合は、hook_element_plugin_alter()を追加して、要素(RenderElementがサブセットである)のプラグインクラスを直接変更するというコアの問題があります。https://www.drupal.org / project / drupal / issues / 2987208

コアパッチは、この新しい変更フックを指定する$this->alterInfo('element_plugin');inの1行追加ですElementInfoManager

次に、カスタムモジュールで:

function hook_element_plugin_alter(array &$definitions) {
 // Use a custom class for the HtmlTag element.
 $definitions['html_tag']['class'] = '\Drupal\mymodule\RenderElement\MyHtmlTagElement';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.