web-dev-qa-db-ja.com

(コアを変更せずに)ファイルフィールドアイコンを変更するにはどうすればよいですか?

ファイルフィールドを表示するために生成されるマークアップは(この例ではPDF)です。

<img src="/modules/file/icons/application-pdf.png" title="application/pdf" alt="" class="file-icon">

別のアイコン画像を使用したいのですが。/modules/file/iconsの内容を変更せずにこれを行うにはどうすればよいですか?

デフォルトの画像を非表示にして、CSSで別の画像を表示できると思いますが、少し面倒です。

11
pushka

theme_file_icon をテーマに追加し、別のアイコン画像を指定します。見る - file_icon_path コアがどのアイコンを使用するかを決定する方法に関する参照用。

"file_icon_directory"変数に、アイコンへのパスを file_icon_path 関数は、その変数でパスを探します。

10
jhedstrom

これに関する2つの追加メモ:

  1. すべてのデフォルトのアイコンファイルをテーマディレクトリにコピーする必要はありません。
  2. カスタムアイコンを使用している場合、そのアイコンを見つけるには、適切な名前を付ける必要があります。

例として、.bib(bibtex)ファイルにカスタムアイコンを使用する必要がありました。このタイプは file_default_mimetype_mapping()にマップされます ですが、そのMIMEタイプ(text/x-bibtex)に特別に定義されたアイコンがないため、デフォルトでデフォルトのテキストアイコンに設定されます。

テーマのtemplate.phpのtheme_file_icon()をオーバーライドしましたが、アイコンパスが必要な場合にのみ変更されるようにしたので、デフォルトのアイコンディレクトリをテーマディレクトリにコピーする必要はありませんでした。

function mytheme_file_icon($variables) {
  $file = $variables['file'];
  $icon_directory = $variables['icon_directory'];

  $mime = check_plain($file->filemime);

  if ($mime == 'text/x-bibtex') {
    $icon_directory = drupal_get_path('theme', 'mytheme') . '/images';
  }

  $icon_url = file_icon_url($file, $icon_directory);
  return '<img class="file-icon" alt="" title="' . $mime . '" src="' . $icon_url . '" />';
}

2つ目は、アイコンに適切な名前を付ける必要があることです。 file_icon_url() をそのまま使用する場合、その関数の次のコードはアイコンのファイル名を決定します。

// For a few mimetypes, we can "manually" map to a generic icon.
$generic_mime = (string) file_icon_map($file);
$icon_path = $icon_directory . '/' . $generic_mime . '.png';
if ($generic_mime && file_exists($icon_path)) {
  return $icon_path;
}

したがって、私の場合、ファイルにtext-x-bibtex.pngという名前を付ける必要がありました。もちろん、好きなだけ名前を付けたい場合は(この場合はbibtex.png)、ファイル名を手動で設定します。

$icon_url = $icon_directory . '/bibtex.png';

どちらでも機能しますが、この方法では、デフォルトのアイコンをそのままにして、必要に応じて調整するだけです。

4
wonder95

私と tregis これを取得 File Field Icons 少し前にモジュールが完了しました。お役に立てれば

このモジュールは、デフォルトのファイルフィールドアイコンを変更する機能を追加します。コアアイコンパッケージ(このモジュールに含まれています)を使用するか、カスタムアイコンパッケージを定義できます。

1
Rudá Maia

与えられたいくつかの解決策ほどきれいではありませんが、これに対処する本当に簡単な方法は、CSS3 'type'属性セレクターを利用することです。これを使用して、カスタムアイコンを背景画像としてリンクにすばやく追加できます。両方がターゲットファイルにリンクされている結果。その後、元の画像を非表示にできます。私は次の外観を得るためにこれを行いました:

Screenshot of result

これは、上記の結果を達成するために使用したCSSです。

.views-field-field-image-files img.file-icon {display:none;}
.views-field-field-image-files a {padding-left: 100px; height: 80px; display: block; margin-bottom: 20px;}
.views-field-field-image-files a[type*="application/pdf"] {background: url(../img/icons/file-icon-pdf.gif) no-repeat; }
.views-field-field-image-files a[type*="application/Zip"] {background: url(../img/icons/file-icon-Zip.gif) no-repeat; }
.views-field-field-image-files a[type*="application/ppt"] {background: url(../img/icons/file-icon-ppt.gif) no-repeat; }
.views-field-field-image-files a[type*="application/pptx"] {background: url(../img/icons/file-icon-ppt.gif) no-repeat; }

私の例では、ビューを使用してファイルフィールドを表示していました。

0
Paul Trotter

(通常)テーマ関数を前処理できます。だからあなたが:

  1. すべてのアイコンをテーマにコピーして、1つまたは複数のアイコンを上書きしてもかまいません。
  2. テーマのtheme_file_icon()をオーバーライドする必要はありません。

全体をコピーmodules/file/iconsディレクトリからテーマ(私はfile_icons)、この前処理関数をテーマのtemplate.phpに追加します。

/**
 * Implements hook_preprocess_HOOK() for theme_file_icon().
 *
 * Change the icon directory to use icons from this theme.
 */
function MYTHEME_preprocess_file_icon(&$variables) {
  $variables['icon_directory'] = drupal_get_path('theme', 'MYTHEME') . '/file_icons';
}

この方法で条件付きオーバーライドをala @ wonder95で行うこともできますが、私は物事をシンプルに保ちたかったです。

0
Cottser