Anular plantilla de campo con módulo personalizado

13

En lugar de agregar archivos tpl (en este caso, media-youtube-video.tpl.php) al tema. ¿Cómo puedo anular plantillas de campo de un módulo personalizado? Incluso cuando el campo se usa en una Vista.

Allan Thomas
fuente

Respuestas:

12

Estoy seguro de que debe haber una manera más fácil de hacer esto, pero esto es lo que normalmente hago:

1. Registre una implementación de tema primordial con el registro de temas de Drupal. Entonces, en mymod_theme(), agregue un nuevo elemento. La variablesclave debe coincidir con la del media_youtube_videotema, es decir

/**
 * 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. Agregue un enlace de preproceso para la implementación del tema original y sugiera su nueva implementación aquí.

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

El sistema de temas evalúa las sugerencias de forma LIFO . Puedes leer más sobre esto aquí .

Suponga que sabe que otro módulo también está siguiendo el mismo enfoque que este para anular la implementación, luego puede implementar hook_module_implements_alter()y forzar su hook_preprocess_THEME()(ver arriba) para que se llame al último. Puedes leer sobre hook_module_implements_alter() aquí .

Esto también es válido para Vistas. En resumen, solo necesita encontrar el nombre único correcto de la implementación del tema original que desea anular (generalmente definido en el módulo fuente), agregar un enlace de preproceso y agregar allí su sugerencia principal.

Amarnath Ravikumar
fuente
En mi módulo personalizado, tengo una lista de selección para seleccionar la plantilla a aplicar. Tengo 3 archivos tpl. Entonces, ¿cómo puedo hacer esto?
Fazeela Abu Zohra
¿Cómo podemos anular el campo del cuerpo de la forma de nodo si hay muchos tipos de nodo?
Sukhjinder Singh
3

También puede decalar un nuevo tema en el módulo de esta manera:

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

Luego, coloque un archivo de directorio / template que contenga una plantilla de campo como esta (estándar) y asígnele el nombre 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>

Después de borrar el caché, su tema usará esta plantilla archivada a menos que no sea anulada por el tema en sí, lo que significa que aún puede anular esta plantilla en su tema.

David
fuente