「ドキュメント」メディアバンドルがあり、「埋め込み」というカスタム表示モードがあります。
その表示モードでは、media name
プロパティとdocument
ファイルフィールド以外のすべてを削除しました。
media name
の場合、使用可能な唯一の形式はplain text
で、「メディアにリンク」するオプションがあります。これにより、media/2
のようなリンクが提供されます。このリンクをクリックすると、ファイルをダウンロードできます。
私のdocument
フィールドには、Generic file
(それにリンクされたファイル名)、RSS Enclosure
、Table of files
、およびURL to file
が表示されます。
誰かがGeneric file
のようなリンクを生成する簡単な方法を持っていますが、ファイル名の代わりにmedia name
を表示しますか?例えばHandbook
対handbook__2017_fin_updated_some_other_rubish_26.pdf
私がこれをやった方法
@Berdirの提案に従って、私はこれをテーマで行いました。ただし、メディアの出力をハイジャックする代わりに(メディア表示モードに基づく制御に最適です)、ファイル名を設定することを選択しました。
残念ながら、ファイルからメディアエンティティを取得する方法が見つからなかったため、メディアエンティティとファイルエンティティの両方を含む_template_preprocess_media
_を使用し、次にsetFilename()
メソッドを使用します。
大まかに:
_file = $variables['elements']['#media']->field_file->entity;
$file->setFilename($variables['name']);
_
アクセシビリティを向上させるには、ファイルのサイズとタイプを「表示」する必要があります。これはここで利用できますが、これを_file-link.html.twig
_で行うとわかりやすくなります。他の多くの素敵なものが属性に追加されます。
これはフォーマッタ構成だけでは不可能であり、誰かが「エンティティラベルが付いたファイルへのリンク」フォーマッタを作成する必要がありますが、これもそれほど複雑ではありません。
しかし、メディアテンプレートで直接、簡単に行うことができます。名前はmedia--document--embed.html.twig
のようになり、コンテンツは次のようになります。
<div{{ attributes }}>
<a class="document-link" title="{{ name }}" href="{{ file_url(elements['#media'].field_document.entity.uri.value) }}" target="_blank" rel="noopener">{{ name }}</a>
</div>
ここにはターゲットとnoopener relも含めましたが、もちろんそれはあなた次第です。
これを実装する最良の方法は、ファイル名を設定しないことです。代わりに、ファイルの#descriptionを設定する必要があります。次の例では、「file」というバンドルのメディアがあり、その中に「field_media_file」というファイルフィールドがあります。次に、各ファイルの説明をメディア名に設定します。
if ($variables['media']->bundle() == 'file' && !empty($variables['content']['field_media_file'])) {
foreach (Element::children($variables['content']['field_media_file']) as $delta) {
$variables['content']['field_media_file'][$delta]['#description'] = $variables['name'];
}
}
このモジュールは、あなたが求めていることを実行しているようです(BTWがここで私を導いた同じ質問がありました): https://www.drupal.org/project/link_plain_text_formatter
function template_preprocess_media(array &$variables) {
$media = $variables['media'];
$name = $media->getName();
if (!empty($name)) {
$mediaArray = $media->toArray();
if (!empty($mediaArray['field_media_file'][0]['target_id'])) {
$fileId = $mediaArray['field_media_file'][0]['target_id'];
$file = \Drupal\file\Entity\File::load($fileId);
$file->setFilename($name);
}
}
}