Dado um ID de arquivo (fid), como posso obter o HTML que representa esse fid?

16

Eu estou olhando para fazer algo parecido com isto

$fid = 15;
$file = (array)file_load($fid);
$content = drupal_render($file);
echo $content;

E, especificamente, esse fid é da versão 7.x-2.x do módulo de mídia .

mikeytown2
fonte

Respostas:

16

Isso funciona para mim. Para vídeos através do módulo de mídia:

<?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;
?>

E para imagens; isso mostra quais predefinições estão disponíveis ( #style_name)

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

E isso renderizará o arquivo

<?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);
?>

Observe que image_load executa E / S.

E pelo contrário; dado um nome de arquivo obter uma fid.

<?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
?>

Dado o código de incorporação de mídia, obtenha um FID.

<?php
$file = media_parse_to_file($embed_code);
if (empty($file->fid)) {
  return FALSE;
}
return $file->fid;
?>
mikeytown2
fonte
Você pode explicar "$ key = 'media_'. Substr ($ file-> filemime, 6). '_Video';" ? Estou tentando renderizar um vídeo da fid. Não quero usar nenhum campo de vídeo e não tenho formatos de vídeo personalizados.
Tejas Vaidya
1
@TejasVaidya se $file->filemime = video/youtube, em seguida, a chave vai acabar sendo 'media_youtube_video', que irá utilizar a função de tema dentro de drupal.org/project/media_youtube (veja media_youtube_theme () )
mikeytown2
8

Você está aplicando mal drupal_render()no seu exemplo. drupal_render()mantém o conteúdo a ser exibido e as instruções de como renderizá-lo em uma matriz para que todo o conteúdo possa ser modificado por outros módulos, até o último momento antes da exibição. Tudo é carregado no drupal_render()argumento &$elements, que é o argumento para a função. drupal_render()não retorna elementos renderizados de variáveis ​​passadas em argumentos.

Veja a API do tema para uma série de funções que fornecerão HTML para vários elementos de conteúdo, incluindo arquivos.

Ashlar
fonte
odeio dizer isso, mas debug_backtrace me disse o contrário. Por isso fui com drupal_render na minha resposta / pergunta.
precisa saber é o seguinte