如何更改文件字段图标(不更改核心)?


11

生成的用于显示文件字段的标记为(在此示例中为PDF):

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

我想使用其他图标图像。如何在不更改/ modules / file / icons内容的情况下执行此操作?

我想我可以隐藏默认图像并使用CSS显示另一幅图像,但看起来有点混乱。

Answers:


10

您可以覆盖theme_file_icon主题,并指定其他图标图像。请参阅file_icon_path以获取有关core如何确定要使用哪些图标的参考。

您也可以将“ file_icon_directory”变量设置为图标的路径,因为file_icon_path函数会在该变量中寻找路径。


按照jhedstrom的说法,我写了一个新手博客,介绍如何使用上述两个功能在此处实现此解决方案。希望对某人有帮助!
艾莉森(Alison)2012年

4

关于此的两个附加说明:

  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 . '" />';
}

第二件事是您必须适当地命名图标。如果仅使用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';

两种方法都可以使用,但是这种方法可让您将默认图标保留在原位置,并仅根据需要进行调整。



0

您通常可以预处理主题功能。因此,如果您:

  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

虽然不像给出的某些解决方案那么干净,但是处理此问题的一种非常简单的方法是利用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; }

在我的示例中,我使用视图显示文件字段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.