web-dev-qa-db-fra.com

Remplacer le modèle de champ avec un module personnalisé

Au lieu d'ajouter des fichiers tpl (dans ce cas, media-youtube-video.tpl.php) au thème. Comment remplacer les modèles de champs d'un module personnalisé? Y compris lorsque le champ est utilisé dans une vue.

13
Allan Thomas

Je suis sûr qu'il doit y avoir un moyen plus simple de le faire, mais c'est ce que je fais généralement:

1. Enregistrez une implémentation de thème prioritaire avec le registre de thème Drupal. Donc, dans mymod_theme() , ajoutez un nouvel élément. La touche variables doit correspondre à celle du thème media_youtube_video ie.

/**
 * 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. Ajoutez un hook de prétraitement pour l'implémentation du thème d'origine et suggérez votre nouvelle implémentation ici.

/*
 * 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';
}

Les suggestions sont évaluées par le système de thème à la mode LIFO . Vous pouvez en savoir plus à ce sujet ici .

Supposons que vous soyez conscient qu'un autre module suit également la même approche que celui-ci pour remplacer l'implémentation, alors vous pouvez implémenter hook_module_implements_alter() et forcer votre hook_preprocess_THEME() (voir ci-dessus) à être appelée en dernier . Vous pouvez lire sur hook_module_implements_alter()ici .

Cela vaut également pour les vues. En résumé, il vous suffit de trouver le nom unique correct de l'implémentation de thème d'origine que vous souhaitez remplacer (généralement défini dans le module source), d'ajouter un crochet de prétraitement et d'y ajouter votre suggestion de remplacement.

12
Amarnath Ravikumar

Vous pouvez également décaler le nouveau thème dans le module de cette façon:

/**
* 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;
}

Ensuite, placez dans un fichier de répertoire/template qui contient un modèle de champ comme celui-ci (standard) et nommez-le 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 ?>:&nbsp;</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>

Après avoir effacé le cache, votre thème utilisera ce modèle déposé sauf s'il n'est pas remplacé par le thème lui-même, ce qui signifie que vous pouvez toujours remplacer ce modèle dans votre thème.

3
David