Feldvorlage mit benutzerdefiniertem Modul überschreiben

13

Anstatt dem Theme tpl-Dateien (in diesem Fall media-youtube-video.tpl.php) hinzuzufügen. Wie kann ich Feldvorlagen aus einem benutzerdefinierten Modul überschreiben? Einschließlich, wenn das Feld in einer Ansicht verwendet wird.

Allan Thomas
quelle

Antworten:

12

Ich bin mir sicher, dass es einen einfacheren Weg geben muss, aber das ist, was ich normalerweise mache:

1. Registrieren Sie eine übergeordnete Theme-Implementierung in der Drupal-Theme-Registry. Fügen Sie also in mymod_theme()ein neues Element hinzu. Der variablesSchlüssel muss mit dem des media_youtube_videoThemas übereinstimmen, d. H

/**
 * 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. Fügen Sie einen Vorverarbeitungs-Hook für die ursprüngliche Theme-Implementierung hinzu und schlagen Sie hier Ihre neue Implementierung vor.

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

Vorschläge werden vom Themensystem auf LIFO- Weise ausgewertet . Mehr dazu können Sie hier lesen .

Angenommen, Sie wissen, dass ein anderes Modul denselben Ansatz verfolgt wie dieses, um die Implementierung zu überschreiben. Dann können Sie implementieren hook_module_implements_alter()und erzwingen, dass Ihr hook_preprocess_THEME()(so) zuletzt aufgerufen wird. Sie können lesen Sie hook_module_implements_alter() hier .

Dies gilt auch für Views. Zusammenfassend müssen Sie nur den korrekten eindeutigen Namen der ursprünglichen Themenimplementierung herausfinden, die Sie überschreiben möchten (normalerweise im Quellmodul definiert), einen Vorverarbeitungs-Hook hinzufügen und dort Ihren überschreibenden Vorschlag hinzufügen.

Amarnath Ravikumar
quelle
In meinem benutzerdefinierten Modul habe ich eine Auswahlliste zum Auswählen der anzuwendenden Vorlage. Ich habe 3 tpl-Dateien. Wie kann ich das machen?
Fazeela Abu Zohra
Wie können wir das Body-Feld der Knotenform überschreiben, wenn es viele Knotentypen gibt?
Sukhjinder Singh
3

Sie können auch ein neues Thema in diesem Modul dekalieren:

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

Fügen Sie dann eine / template-Verzeichnisdatei ein, die eine Feldvorlage wie diese (Standard) enthält, und nennen Sie sie 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>

Nach dem Löschen des Caches verwendet Ihr Design diese abgelegte Vorlage, sofern sie nicht durch das Design selbst überschrieben wird. Das bedeutet, dass Sie diese Vorlage in Ihrem Design weiterhin überschreiben können.

David
quelle