回答:
theme_file_icon
テーマをオーバーライドして、別のアイコン画像を指定できます。file_icon_path
コアがどのアイコンを使用するかを決定する方法については、参考資料を参照してください。
「file_icon_directory」変数をアイコンへのパスに設定することもできfile_icon_path
ます。関数がその変数でパスを探すためです。
これに関する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';
どちらでも機能しますが、この方法では、デフォルトのアイコンをそのままにして、必要に応じて調整するだけです。
私とtregisは、このFile Field Iconsモジュールを少し前に完成させました。お役に立てれば
このモジュールは、デフォルトのファイルフィールドアイコンを変更する機能を追加します。コアアイコンパッケージ(このモジュールに含まれています)を使用するか、カスタムアイコンパッケージを定義できます。
(通常)テーマ関数を前処理できます。だからあなたが:
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で行うこともできますが、私は物事をシンプルに保ちたかったです。
与えられたいくつかの解決策ほどきれいではありませんが、これに対処する本当に簡単な方法は、CSS3 'type'属性セレクターを利用することです。これを使用して、カスタムアイコンを背景画像としてリンクにすばやく追加できます。両方がターゲットファイルにリンクされている結果。その後、元の画像を非表示にできます。私は次の外観を得るためにこれを行いました:
これは、上記の結果を達成するために使用した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; }
私の例では、ビューを使用してファイルフィールドを表示していました。