web-dev-qa-db-ja.com

ファイルへのリンクとしてのメディア名

「ドキュメント」メディアバンドルがあり、「埋め込み」というカスタム表示モードがあります。

その表示モードでは、media nameプロパティとdocumentファイルフィールド以外のすべてを削除しました。

media nameの場合、使用可能な唯一の形式はplain textで、「メディアにリンク」するオプションがあります。これにより、media/2のようなリンクが提供されます。このリンクをクリックすると、ファイルをダウンロードできます。

私のdocumentフィールドには、Generic file(それにリンクされたファイル名)、RSS EnclosureTable of files、およびURL to fileが表示されます。

誰かがGeneric fileのようなリンクを生成する簡単な方法を持っていますが、ファイル名の代わりにmedia nameを表示しますか?例えばHandbookhandbook__2017_fin_updated_some_other_rubish_26.pdf

1
mediaashley

私がこれをやった方法

@Berdirの提案に従って、私はこれをテーマで行いました。ただし、メディアの出力をハイジャックする代わりに(メディア表示モードに基づく制御に最適です)、ファイル名を設定することを選択しました。

残念ながら、ファイルからメディアエンティティを取得する方法が見つからなかったため、メディアエンティティとファイルエンティティの両方を含む_template_preprocess_media_を使用し、次にsetFilename()メソッドを使用します。

大まかに:

_file = $variables['elements']['#media']->field_file->entity;
$file->setFilename($variables['name']);
_

アクセシビリティを向上させるには、ファイルのサイズとタイプを「表示」する必要があります。これはここで利用できますが、これを_file-link.html.twig_で行うとわかりやすくなります。他の多くの素敵なものが属性に追加されます。

1
mediaashley

これはフォーマッタ構成だけでは不可能であり、誰かが「エンティティラベルが付いたファイルへのリンク」フォーマッタを作成する必要がありますが、これもそれほど複雑ではありません。

しかし、メディアテンプレートで直接、簡単に行うことができます。名前は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も含めましたが、もちろんそれはあなた次第です。

3
Berdir

これを実装する最良の方法は、ファイル名を設定しないことです。代わりに、ファイルの#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'];
    }
}
1
shaxaaa

このモジュールは、あなたが求めていることを実行しているようです(BTWがここで私を導いた同じ質問がありました): https://www.drupal.org/project/link_plain_text_formatter

0
sdmeyers
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);
    }
  }
}
0
Karsten Madsen