間違い探し!どこかが間違っている!?

投稿日: 2025年08月29日
間違い探し!どこかが間違っている!?

こんにちは。
ぴころじーの竹川です。

突然なんだ!?と思われるかもしれません。

先の技術者ブログ、
【レビュー】SJCAM SJ8 Pro アクションカメラを使ってみた!夜のざらつき検証

にて発覚しました。インシデントレベルは緊急対応すべき不具合です(笑)

技術者ブログのコード(Twig Template)にミスがあり、埋め込んだはずの動画が表示されない。CKEditor5の設定も何もかも正しいのに、なぜか表示されない。もちろん、CKEditor5で編集しているときは表示されます。公開画面で表示されない。なんで?どーして?と3時間余り調べに調べまくって解決したので、自分の覚えとして残しておこうと思いまして、このような形にしました!

なお、動画の埋め込み方法は、Drupalが推奨しているメディアライブラリを使用する方法です。

CKEditor5では、Embed mediaを使います。(CKEditor5の設定で、下のほうにあるEmbed mediaフィルタを有効にし、適用順を上のほうにあげます。私の場合は上から2番目です。)

以下は、技術者ブログのTwig Templateコードです。いたって普通で簡単なものです。しかし、このコードには致命的な誤りがあったのです!私はこれで一つ賢くなりました・・・。


{% set title = convert_to_hankaku(node.title.value) %}
{% set body = convert_to_hankaku(node.body.value) %}
{% set header_image = node.field_image.entity.fileuri|image_style('rectangle_960_540') %}
{% set affiliates = node.field_affiliates %}
{% set created = node.created.value|date('Y年m月d日') %}
{% set changed = node.changed.value|date('Y年m月d日') %}

<div class="blog">
 <div class="blog__header">
   <h2>{{ title }}</h2>
   <div class="blog__header__meta">
     <span>投稿日: {{ created }}</span>
     {% if created != changed %}
       <span>更新日: {{ changed }}</span>
     {% endif %}
   </div>
   <div class="blog__header__header-image">
     <img src="{{ header_image }}" alt="{{ title }}">
   </div>
 </div>
 <div class="blog__body">
   {{ body|raw }}
 </div>
 <div class="blog__affiliates">
   {% if affiliates|length %}
     {% for i, affiliate in affiliates %}
       {% set url = affiliate.entity.field_link.uri %}
       {% set product_name = affiliate.entity.field_product_name.value %}
       {% set image = affiliate.entity.field_image.entity.fileuri|image_style('square_256_256') %}
       {% set shop_name = select_list_label(affiliate.entity.field_shop_name) %}
       <div class="blog__affiliates__affiliate">
         <a href="{{ url }}" target="_blank" rel="nofollow">
           <div class="blog__affiliates__affiliate__shop-name">
             {{ shop_name }}
           </div>
           <div class="blog__affiliates__affiliate__image">
             <img src="{{ image }}" alt="{{ product_name }}">
           </div>
           {% if product_name is not empty %}
             <div class="blog__affiliates__affiliate__product-name">
               {{ product_name|length > 14 ? product_name|slice(0, 14) ~ '…' : product_name }}
             </div>
           {% endif %}
         </a>
       </div>
     {% endfor %}
   {% endif %}
 </div>
</div>


上記のコードには、一つだけ致命的な誤りがあります。それはどこでしょう?

ヒントは、冒頭の悩んでいるところです!

また、コードの中に、convert_to_hankaku()、select_list_label()という関数があります。前者は、Twig TemplateからPHPを呼び出して、全角数字記号を半角に変換する関数です。後者は、選択リストから選択したラベルを取得する関数です。

持ち時間は10分です。さぁどうぞ!

答えはこちらです。↓

2行目
{% set body = convert_to_hankaku(node.body.processed) %}

valueは生の値を取得するため、body|rawでレンダリングすると、<drupal-media>を<video>にフィルタ処理できないようです。対策として、processedを使うと、それ自体がフィルタ済みの値を取得するので、きちんと表示される、ということです。