MYMODULE.module:
_function MYMODULE_preprocess_node(&$variables) {
if ($variables['node']->bundle() == 'content_type') {
$currentUserUID = \Drupal::currentUser()->id();
$recipients = $variables['node']->get('field_user_reference')->getValue();
$userList = array();
foreach ($recipients as $recipient) {
if ($recipient['target_id'] != $currentUserUID) {
$userList[] = \Drupal\user\Entity\User::load($recipient['target_id']);
}
}
if ($variables['node']->getOwnerId() != $currentUserUID) {
$userList[] = \Drupal\user\Entity\User::load($variables['node']->getOwnerId());
}
$variables['userList'] = $userList;
}
}
_
FILENAME.twig.html:
_{{ userList | render }}
_
私も使ってみました:
_$recipients = $variables['node']->get('field_user_reference')->view('compact');
_
if
内のforeach
ステートメントでUIDをフィルタリングしようとしました。
私の目標は、_field_user_referenceから参照されるすべてのユーザーを収集し、currentUser()
を単一の配列に除外しながらノードの所有者を追加することです。次に、その配列をtwigテンプレートファイルでユーザー表示モードとしてレンダリングする必要があります。この例では、compact
です。
私の行き詰まりがtwigレンダリング、またはより良い前処理にあるかどうかはわかりません。
twigテンプレートファイルで前処理されたユーザーオブジェクトをどのようにレンダリングしますか?
ノート:
_$recipients = $variables['node']->get('field_user_reference')->view('compact');
_
参照されたユーザーをコンパクトビューモードでレンダリングしますが、_$recipient->uid[0]->target_id != $currentUserUID
_のようなもので現在のユーザーを除外することはできません。
エンティティのリストをレンダリングする前に、レンダー配列を作成する必要があります。
$variables['userList'] = \Drupal::entityTypeManager()
->getViewBuilder('user')
->viewMultiple($userList, 'compact');
Twigでエンティティをレンダリングできるようになりました:
{{ userList }}
Twigは配列を自動的にレンダリングするため、レンダリングは必要ありません。