Переопределить шаблон поля с помощью пользовательского модуля

13

Вместо добавления файлов tpl (в данном случае media-youtube-video.tpl.php) в тему. Как я могу переопределить шаблоны полей из пользовательского модуля? В том числе, когда поле используется в представлении.

Аллан Томас
источник

Ответы:

12

Я уверен, что должен быть более простой способ сделать это, но это то, что я обычно делаю:

1. Зарегистрируйте основную реализацию темы в реестре тем Drupal. Итак, mymod_theme()добавьте новый элемент. variablesКлюч должен совпадать с media_youtube_videoтемой , т.е.

/**
 * 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. Добавьте обработчик препроцесса для исходной реализации темы и предложите свою новую реализацию здесь.

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

Предложения оцениваются системой тем в стиле LIFO . Вы можете прочитать больше об этом здесь .

Предположим, вы знаете, что другой модуль также использует тот же подход, что и этот, чтобы переопределить реализацию, тогда вы можете реализовать hook_module_implements_alter()и заставить ваш hook_preprocess_THEME()(см. Выше) быть вызванным последним. Вы можете прочитать о hook_module_implements_alter() здесь .

Это верно и для Views. Таким образом, вам просто нужно узнать правильное уникальное имя исходной реализации темы, которую вы хотите переопределить (обычно это определяется в исходном модуле), добавить ловушку предварительной обработки и добавить туда свое предложение переопределения.

Амарнат Равикумар
источник
В моем пользовательском модуле у меня есть список выбора для выбора шаблона для применения. У меня есть 3 файла TPL. Так как я могу это сделать.
Фазила Абу Зохра
Как мы можем переопределить поле тела формы узла, если существует много типов узлов?
Сукхиндер Сингх
3

Вы также можете удалить новую тему из модуля следующим образом:

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

Затем поместите в каталог / template файл, который содержит шаблон поля, подобный этому (стандартному), и назовите его 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>

После очистки кэша ваша тема будет использовать этот сохраненный шаблон, если он не переопределен самой темой, что означает, что вы можете переопределить этот шаблон в своей теме.

Дэвид
источник