Вы здесь

Переопределение стандартного MIME type для загруженного файла

0

Доброго времени!

Сделал переопределение для стандартных иконок, которые Друпал прикрепляет к загруженным файлам. Решено через theme_file_icon() в template.php:

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

  // Обрезка стандартных MIME типов для формирования класса,
  // в стиле .icon-[document_type].
  $mime_type = array('application/');
  $mime = str_replace($mime_type, '', check_plain($file->filemime));

  // Заменяем стандартные картинки иконками,
  // которые были выгружены с помощью сервиса Fontello.   
  return '<i class="icon-' . $mime . '"></i>';
}

Почему так? Просто люблю шрифтовые иконки, которые не мылятся на мобильных устройствах c Retina (ибо являются SVG). Выглядит вот так (в примере загружен PDF):

MIME 1

Всё работает отлично и красиво, пока не начинаешь загружать файлы, например, DOCX или AI.
При этом выводится вот такой MIME:
application/vnd.openxmlformats-officedocument.wordprocessingml.document
Логичнее было бы application/docx, но это в идеальном мире.

Ну и в финальном коде это выглядит вот так:

...
<i class="icon-vnd.openxmlformats-officedocument.wordprocessingml.document"></i>
...

Лезу в ./includes/file.mimetypes.inc (именно там указаны все друпаловские MIME) и, действительно, на строке 107 нахожу следующее:

...
66 => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
...

И чуть ниже, на 476 строке:

...
'docx' => 66,
...

Думаю. Может быть просто переопределить этот элемент массива на более-менее адекватный (application/docx)? Копаюсь в гугле. И да, есть решение через hook_file_mimetype_mapping_alter(). По описанию, вроде как то, что мне нужно. Делаю вот так:

/**
 * Implements hook_file_mimetype_mapping_alter().
 */
function MYTHEME_file_mimetype_mapping_alter(&$mapping) {
  $mapping['mimetypes'][66] = 'application/word';
}

Но ничего не происходит. Как выводилась крякозабра, так и выводится. Нашёл (возможное) решение через модуль File MIME, но зачем ставить лишний модуль, когда можно тоже самое сделать в пару строк кода в template.php?!

Поэтому вопрос: что я делаю не так? Может быть не через этот хук это можно сделать?

Версия Drupal: 
7.x
Категория: 
File API
Вопрос задан 02.09.2015 - 16:39

Ответы

1

Может быть лучше добавлять иконки по расширению, а не по MIME:

return '<i class="icon-' . $extension . '"></i>';

В $variables['file'], кажется, нету отдельного элемента "расширение". Но его всегда можно достать из имени файла функцией pathinfo.

Ответ дан 02.09.2015 - 20:08

В очередной раз, благодарствую, Евгений!

Финальная функция выглядит вот так:

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

  // Распарсиваем имя файла через pathinfo(),
  // чтобы добраться до расширения.
  $path = pathinfo($file->filename);

  return '<i class="icon-' . $path['extension'] . '"></i>';
}
Комментарий оставлен 03.09.2015 - 14:08