web-dev-qa-db-ja.com

Twigでファイルフィールドへのカスタムリンクを作成します

私のエンティティのファイルフィールドのダウンロードリンクをカスタマイズしようとしています。同様の設定で、リンクフィールドを次のようにカスタマイズできました。

<a href="{{ node.field_publication_link.uri }}"> Link </a>

だから、ファイルフィールドのために、私は同様のことを試しました:

<a href="{{ node.field_publication_file.0.uri }}"> Download </a>

ただし、使用可能なuriフィールドなどはありません。テンプレートで実際に使用できるフィールドを特定するのに苦労しています。 kintはノイズが多すぎることがわかったので、メモリの消費を制限する必要があり、どのフィールドが使用可能であるのかまだわかりません。

または、field--field-publication-file.html.twigという特定のファイルフィールドのカスタムテンプレートを作成しようとしました。デバッグ情報から、レンダリングに使用されていることがわかります。私のテーマ(ブートストラップ)が通常使用するフィールドを見て、その動作を模倣しようとしました。具体的には、bootstrapバージョンでも使用されているフィールドlinkを使用したいと思いました。ただし、私のバージョンを使用している場合、このフィールドは常に空です。

これ以上何ができますか?

4
bmurauer

詳細な調査の結果、私は this ページで誤って答えを見つけました。以下を使用してリンクを参照できます。

<a href="{{ file_url (node.field_publication_file.entity.uri.value) }}"> 
  Download
</a>

bootstrapテーマで定義されたフィールドは、ブートストラップのサブテーマではアクセスできないようです。同じことをするカスタムプリプロセッサを作成できたはずです。しかし、この解決策は私にとってはうまくいき、PHPコードを書く必要はありません。

2
bmurauer

twigテンプレートで利用可能なfile_urlを使用するか、プリプロセッサでfile_create_url($file_uri);を使用して、テンプレートが処理済みの出力を簡単に消費できるようにすることができます。

ノードをホストエンティティとして、プリプロセスレイヤーでコーディングします。

function mymodule_preprocess_node($node) {
   if (!$node->your_file_field_machine_name->isEmpty()) {
     $file_entities = $node->get('your_file_field_machine_name')->referencedEntities();
     if(count($file_entities)) {
        foreach($file_entities as $file_entity) {
            $variables['file_renderable'][] = file_create_url($file_entity->getFileUri());
        }
     }
   }
}

他の方法はあなたが言及したものです、あなたのtwigテンプレートでfile_urlを使用してください。

<a href="{{ file_url (node.field_publication_file.entity.uri.value) }}"> 
  Download
</a>
1
arpitr