web-dev-qa-db-ja.com

プログラムでユーザーオブジェクトの配列を作成し、Twigテンプレートで印刷する

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_のようなもので現在のユーザーを除外することはできません。

1
Prestosaurus

エンティティのリストをレンダリングする前に、レンダー配列を作成する必要があります。

$variables['userList'] = \Drupal::entityTypeManager()
  ->getViewBuilder('user')
  ->viewMultiple($userList, 'compact');

Twigでエンティティをレンダリングできるようになりました:

{{ userList }}    

Twigは配列を自動的にレンダリングするため、レンダリングは必要ありません。

2
4k4