Drupal 8.1.1をAcquiaのLightningディストリビューションで使用しています。メディアエンティティ(ツイート、instagram投稿、youtubeビデオ、画像など)を埋め込んでキャプチャできるようにする必要があります結果のHTML出力はフックで出力されますが、$ node-> body-> valueは次のような奇妙なマークアップを提供します。
<drupal-entity data-align=\"none\" data-caption=\"\" data-embed-button=\"media_library\" data-entity-embed-display=\"entity_reference:entity_reference_entity_view\" data-entity-embed-settings=\"{"view_mode":"media_library"}\" data-entity-id=\"21\" data-entity-type=\"media\" data-entity-uuid=\"ea90ea95-6b7e-4e44-a1a6-4e7baabe3cb7\"></drupal-entity>\r\n"
そして、レンダラーサービスを介してエンティティをレンダリングすると、前述のマークアップに相当するHTMLだけでなく、ノードの出力全体が得られます。
この出力を解析して、埋め込まれたエンティティの実際のHTMLを取得する方法はありますか?
本体には、ckeditorで埋め込みボタンを押したときに設定されるトークンが含まれています。
この未加工のボディコンテンツは、次のフィルターで処理されます。
http://cgit.drupalcode.org/entity_embed/tree/src/Plugin/Filter/EntityEmbedFilter.php
public function process($text, $langcode) {
$result = new FilterProcessResult($text);
if (strpos($text, 'data-entity-type') !== FALSE && (strpos($text, 'data-entity-embed-display') !== FALSE || strpos($text, 'data-view-mode') !== FALSE)) {
$dom = Html::load($text);
$xpath = new \DOMXPath($dom);
foreach ($xpath->query('//drupal-entity[@data-entity-type and (@data-entity-uuid or @data-entity-id) and (@data-entity-embed-display or @data-view-mode)]') as $node) {
/** @var \DOMElement $node */
....
本文フィールドのみを使用してUIでビューモードを構築するか、コードでフィルターを適用する必要があります。
最後の正しい答え here の助けを借りて、エンティティ埋め込みマークアップを目的のHTMLマークアップに変換することができました。