Учитывая идентификатор файла (fid), как я могу получить HTML, который представляет этот fid?

Ответы:

16

Это работает для меня. Для видео через медиа-модуль:

<?php
  $file = file_load($fid);
  if (strpos($file->filemime, 'video/') !== 0) {
    return;
  }
  $key = 'media_' . substr($file->filemime, 6) . '_video';
  $formatter_info = file_info_formatter_types($key);
  $content = array();
  $content['#theme'] = $key;
  $content['#uri'] = $file->uri;
  if (isset($formatter_info['default settings'])) {
    $content['#options'] = $formatter_info['default settings'];
  }

  $rendered = drupal_render($content);
  return $rendered;
?>

И для изображений; это показывает вам, какие пресеты доступны ( #style_name)

<?php
$styles = image_styles();
echo '<pre>' . print_r($styles, TRUE) . '</pre>';
?>

И это сделает файл

<?php
$file = file_load($fid);
$image = image_load($file->uri);
$content = array(
  'file' => array(
    '#theme' => 'image_style',
    '#style_name' => 'large',
    '#path' => $image->source,
    '#width' => $image->info['width'],
    '#height' => $image->info['height'],
  ),
);
echo drupal_render($content);
?>

Обратите внимание, что image_load выполняет ввод-вывод.

И для обратного; учитывая имя файла получить фид.

<?php
$query = new EntityFieldQuery();
$result = $query
  ->entityCondition('entity_type', 'file')
  ->propertyCondition('filename', basename($filename))
  ->execute();
foreach ($result['file'] as $values) {
  $fid = $values->fid;
  break;
}
echo $fid
?>

Учитывая код встраивания медиа, получите FID.

<?php
$file = media_parse_to_file($embed_code);
if (empty($file->fid)) {
  return FALSE;
}
return $file->fid;
?>
mikeytown2
источник
Не могли бы вы объяснить "$ key = 'media_'. Substr ($ file-> filemime, 6). '_Video';" ? Я пытаюсь сделать видео из FID. Я не хочу использовать какое-либо поле видео, и у меня нет пользовательских форматов видео.
Теджас Вайдья
1
@TejasVaidya, если $file->filemime = video/youtubeв результате ключ будет 'media_youtube_video', который будет использовать функцию темы внутри drupal.org/project/media_youtube (см. Media_youtube_theme () )
mikeytown2
8

Вы неправильно применяете drupal_render()в своем примере. drupal_render()содержит содержимое для отображения и инструкции по его отображению в массиве, чтобы все содержимое могло быть изменено другими модулями до последнего момента перед отображением. Все загружается в drupal_render()аргумент &$elements, который является аргументом для функции. drupal_render()не возвращает отображаемые элементы из переменных, переданных в аргументах.

Посмотрите на API темы для ряда функций, которые будут предоставлять HTML для различных элементов содержимого, включая файлы.

штучный камень
источник
не хочу говорить это, но debug_backtrace сказал мне иначе. Вот почему я пошел с drupal_render в своем ответе / вопросе.
mikeytown2
4

Вероятно, вы ищете функцию file_get_content_headers () , которая устанавливает заголовки, позволяющие загружать файл или (если файл представляет собой текстовый файл или изображение) для просмотра встроенным.

Функция требует файловый объект, возвращаемый file_load_multiple () , file_load () или entity_load ('file') .

киамалуно
источник