Invece di aggiungere file tpl (in questo caso, media-youtube-video.tpl.php) al tema. Come posso sostituire i modelli di campo da un modulo personalizzato? Compreso quando il campo viene utilizzato in una vista.
Invece di aggiungere file tpl (in questo caso, media-youtube-video.tpl.php) al tema. Come posso sostituire i modelli di campo da un modulo personalizzato? Compreso quando il campo viene utilizzato in una vista.
Risposte:
Sono sicuro che ci deve essere un modo più semplice per farlo, ma questo è ciò che faccio in genere:
1.
Registrare un'implementazione di temi prioritari con il registro dei temi di Drupal. Quindi, in mymod_theme()
, aggiungi un nuovo elemento. La variables
chiave deve corrispondere a quella delmedia_youtube_video
tema, ad es
/**
* 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. Aggiungi un hook di pre-elaborazione per l'implementazione del tema originale e suggerisci qui la tua nuova implementazione.
/*
* 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';
}
I suggerimenti vengono valutati dal sistema tematico in modo LIFO . Puoi leggere di più al riguardo qui .
Supponiamo che tu sappia che anche un altro modulo sta seguendo lo stesso approccio di questo per sovrascrivere l'implementazione, quindi puoi implementare hook_module_implements_alter()
e forzare il tuo hook_preprocess_THEME()
(vedi sopra) a essere chiamato per ultimo. Puoi leggere hook_module_implements_alter()
qui .
Questo vale anche per Views. In sintesi, devi solo scoprire il nome univoco corretto dell'implementazione del tema originale che desideri sostituire (in genere definita nel modulo di origine), aggiungere un hook di preelaborazione e aggiungere il tuo suggerimento di sostituzione lì.
Puoi anche decalare il nuovo tema nel modulo in questo modo:
/**
* 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;
}
Quindi inserire un file di directory / template che contenga un modello di campo come questo (standard) e denominarlo 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>
Dopo aver svuotato la cache, il tema utilizzerà questo modello archiviato a meno che non venga sostituito dal tema stesso, il che significa che è ancora possibile sovrascrivere questo modello nel tema.