web-dev-qa-db-ja.com

twigテンプレートのエンティティ要素に正しくアクセスする方法

リストにレンダリングしたいエンティティの配列があります。

$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,   
5
Kevin Nowaczyk

例外が説明するように、レンダリングできず、文字列に変換できないオブジェクトを印刷しようとしました。この場合はDrupal\Core\Field\FieldItemListこれは、フィールドを要求したときにdrupalエンティティによって返されるオブジェクトです({{ entity.id }}/{{ entity.label }})。

実際の値を取得するには、エンティティのメソッドを呼び出す必要があります(フィールドの実際の値は外部アクセスから保護されています)。

長い道のり:

{{ entity.get('id').get(0).get('value').getValue() }}

上記は、エンティティオブジェクトからidフィールドの値に到達するために必要な実際のパスです。

ただし、drupalは、マジックプロパティと呼ばれるものを通じてショートカットを提供します。

{{ entity.id.value }}
15
Eyal

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>
1

テンプレート用の変数を準備するfunction template_preprocess_chemical_taxonomy(&$variables)を実装する必要があります。

例として、_item-list.html.twig_の関数template_preprocess_item_list(&$variables)に関するコアを調べます。

0
Maouna

エンティティをtwigに渡す前にレンダリングする必要があります。

$render_controller = \Drupal::entityManager()->getViewBuilder('chemical');

foreach ($entities as $entity){
  $chemicals[] = $render_controller->view($entity);
}

もちろん、これは、エンティティのカスタムビュービルダーをまだ作成していない場合は作成することを意味します。

Core/modules/node/src/NodeViewBuilder.phpなどの別のビュービルダーをコピーできます

それをプロジェクトに移動し、カスタムエンティティで動作するように変更します。

0
oknate