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

13

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.

Allan Thomas
la source

Réponses:

12

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

1. Enregistrez une implémentation de thème prioritaire dans le registre de thèmes Drupal. Donc, dans mymod_theme(), ajoutez un nouvel élément. La variablesclé doit correspondre à celle du media_youtube_videothème, c'est-à-dire

/**
 * 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 crochet 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 thématique de façon 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é en dernier. Vous pouvez lire 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.

Amarnath Ravikumar
la source
Dans mon module personnalisé, j'ai une liste de sélection pour sélectionner le modèle à appliquer. J'ai 3 fichiers tpl. Alors, comment puis-je faire cela.
Fazeela Abu Zohra
Comment pouvons-nous remplacer le champ de corps de la forme de nœud s'il existe de nombreux types de nœuds?
Sukhjinder Singh
3

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.

David
la source