リストにレンダリングしたいエンティティの配列があります。
$ids = \Drupal::entityQuery('chemical')
->condition('tid', $tid)
->execute();
$controller = \Drupal::entityManager()->getStorage('chemical');
$entities = $controller->loadMultiple($ids);
$chemicals = [];
foreach ($entities as $entity){
$chemicals[] = ['id' => $entity->id(), 'label' => $entity->label()];
}
$output[] = [
'#theme' => 'chemical_taxonomy',
'#chemicals' => $chemicals,
];
return $output;
twigテンプレートは、{{ chemicals.label }}
と{{ chemicals.id }}
の配列を使用して、URLの順序付けられていないリストを作成します。ただし、$entities
をIDとラベルを抽出して新しい配列を構築する代わりに、テンプレートを使用するべきではありませんか?
'#chemicals' => $chemicals
を'#chemicals' => $entities
に置き換えると、エラーが発生します。
Uncaught PHP Exception Exception: "Object of type Drupal\\Core\\Field\\FieldItemList cannot be printed." at /var/www/Drupal_Sites/console/core/lib/Drupal/Core/Template/TwigExtension.php line 443,
例外が説明するように、レンダリングできず、文字列に変換できないオブジェクトを印刷しようとしました。この場合はDrupal\Core\Field\FieldItemList
これは、フィールドを要求したときにdrupalエンティティによって返されるオブジェクトです({{ entity.id }}
/{{ entity.label }}
)。
実際の値を取得するには、エンティティのメソッドを呼び出す必要があります(フィールドの実際の値は外部アクセスから保護されています)。
長い道のり:
{{ entity.get('id').get(0).get('value').getValue() }}
上記は、エンティティオブジェクトからidフィールドの値に到達するために必要な実際のパスです。
ただし、drupalは、マジックプロパティと呼ばれるものを通じてショートカットを提供します。
{{ entity.id.value }}
twigファイル内の完全なオブジェクトを取得するには、次のようにします。
$ids = \Drupal::entityQuery('chemical')
->condition('tid', $tid)
->execute();
$controller = \Drupal::entityManager()->getStorage('chemical');
$entities = $controller->loadMultiple($ids);
$output[] = [
'#theme' => 'chemical_taxonomy',
'#chemicals' => $entities,
];
return $output;
次に、twigファイルで次のようにします。
<ul>
{% for chemical in chemicals %}
<li data-id="{{ chemical.id() }}">{{ chemical.label() }}</li>
{% endfor %}
</ul>
テンプレート用の変数を準備するfunction template_preprocess_chemical_taxonomy(&$variables)
を実装する必要があります。
例として、_item-list.html.twig
_の関数template_preprocess_item_list(&$variables)
に関するコアを調べます。
エンティティをtwigに渡す前にレンダリングする必要があります。
$render_controller = \Drupal::entityManager()->getViewBuilder('chemical');
foreach ($entities as $entity){
$chemicals[] = $render_controller->view($entity);
}
もちろん、これは、エンティティのカスタムビュービルダーをまだ作成していない場合は作成することを意味します。
Core/modules/node/src/NodeViewBuilder.phpなどの別のビュービルダーをコピーできます
それをプロジェクトに移動し、カスタムエンティティで動作するように変更します。