私のエンティティのファイルフィールドのダウンロードリンクをカスタマイズしようとしています。同様の設定で、リンクフィールドを次のようにカスタマイズできました。
<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
を使用したいと思いました。ただし、私のバージョンを使用している場合、このフィールドは常に空です。
これ以上何ができますか?
詳細な調査の結果、私は this ページで誤って答えを見つけました。以下を使用してリンクを参照できます。
<a href="{{ file_url (node.field_publication_file.entity.uri.value) }}">
Download
</a>
bootstrapテーマで定義されたフィールドは、ブートストラップのサブテーマではアクセスできないようです。同じことをするカスタムプリプロセッサを作成できたはずです。しかし、この解決策は私にとってはうまくいき、PHPコードを書く必要はありません。
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>