Em vez de adicionar arquivos tpl (neste caso, media-youtube-video.tpl.php) ao tema. Como substituir modelos de campo de um módulo personalizado? Incluindo quando o campo é usado em uma Visualização.
Em vez de adicionar arquivos tpl (neste caso, media-youtube-video.tpl.php) ao tema. Como substituir modelos de campo de um módulo personalizado? Incluindo quando o campo é usado em uma Visualização.
Respostas:
Tenho certeza de que deve haver uma maneira mais fácil de fazer isso, mas é o que normalmente faço:
1.
Registre uma implementação de tema substituto no registro do tema Drupal. Então, mymod_theme()
adicione um novo item. A variables
chave deve corresponder à do media_youtube_video
tema, ou seja,
/**
* Implements hook_theme().
*/
function mymod_theme() {
return array(
'my_media_youtube_video' => array(
'variables' => array('uri' => NULL, ...), // see media_youtube_theme() for this
// bundle the template file with the module itself
// i.e. theme/my-media-youtube-video.tpl.php
'template' => 'my-media-youtube-video',
'path' => drupal_get_path('module', 'mymod') . '/theme
)
);
}
2. Adicione um gancho de pré-processo para a implementação do tema original e sugira sua nova implementação aqui.
/*
* Implements hook_preprocess_media_youtube_video().
*
* Or more generally, hook_preprocess_THEME().
*/
function mymod_preprocess_media_youtube_video(&$variables) {
// If your overriding implementation is not a template but
// is implemented in a different file,
// then remember to include the file explicitly at this point..
$variables['theme_hook_suggestions'][] = 'my_media_youtube_video';
}
As sugestões são avaliadas pelo sistema temático de uma maneira LIFO . Você pode ler mais sobre isso aqui .
Suponha que você esteja ciente de que outro módulo também está seguindo a mesma abordagem que esta para substituir a implementação. Em seguida, você pode implementar hook_module_implements_alter()
e forçar sua hook_preprocess_THEME()
(veja acima) a ser chamada por último. Você pode ler hook_module_implements_alter()
aqui .
Isso vale para o Views também. Em resumo, você só precisa descobrir o nome exclusivo correto da implementação do tema original que deseja substituir (normalmente definido no módulo de origem), adicionar um gancho de pré-processo e adicionar sua sugestão de substituição lá.
Você também pode declarar novo tema no módulo desta maneira:
/**
* Implements hook_theme().
*/
function yourmodule_theme($existing, $type, $theme, $path) {
$theme = array();
$theme['field__field_nameofyourfield'] = array(
'render element' => 'content',
'base hook' => 'field',
'template' => 'field--field-nameofyourfield',
'path' => drupal_get_path('module', 'yourmodule') . '/templates',
);
return $theme;
}
Em seguida, coloque um arquivo de diretório / template que contenha um modelo de campo como este (padrão) e nomeie-o como field - field-nameofyourfield.tpl.php:
<div class="<?php print $classes; ?>"<?php print $attributes; ?>>
<?php if (!$label_hidden): ?>
<div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>: </div>
<?php endif; ?>
<div class="field-items"<?php print $content_attributes; ?>>
<?php foreach ($items as $delta => $item): ?>
<div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
<?php endforeach; ?>
</div>
</div>
Após limpar o cache, seu tema usará esse modelo arquivado, a menos que não seja substituído pelo próprio tema, o que significa que você ainda poderá substituir esse modelo no seu tema.