Zastąp szablon pola niestandardowym modułem

13

Zamiast dodawać pliki tpl (w tym przypadku media-youtube-video.tpl.php) do motywu. Jak mogę zastąpić szablony pól z niestandardowego modułu? W tym, gdy pole jest używane w widoku.

Allan Thomas
źródło

Odpowiedzi:

12

Jestem pewien, że musi istnieć łatwiejszy sposób na zrobienie tego, ale zazwyczaj tak robię:

1. Zarejestruj nadrzędną implementację motywu w rejestrze motywów Drupal. Więc mymod_theme()dodaj nowy element. variablesKlucz musi być zgodny z media_youtube_videoIE tematu

/**
 * 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. Dodaj zaczep wstępnego przetwarzania oryginalnej implementacji motywu i zasugeruj tutaj nową implementację.

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

Sugestie są oceniane przez system motywów w sposób LIFO . Możesz przeczytać więcej na ten temat tutaj .

Załóżmy, że zdajesz sobie sprawę, że inny moduł również stosuje to samo podejście, co ten, aby zastąpić implementację, a następnie możesz zaimplementować hook_module_implements_alter()i wymusić hook_preprocess_THEME()(patrz wyżej) wywołanie na końcu. Możesz przeczytać o hook_module_implements_alter() tutaj .

Dotyczy to również widoków. Podsumowując, musisz tylko znaleźć poprawną unikalną nazwę oryginalnej implementacji kompozycji, którą chcesz zastąpić (zazwyczaj zdefiniowaną w module źródłowym), dodać haczyk wstępnego przetwarzania i dodać tam swoją nadrzędną sugestię.

Amarnath Ravikumar
źródło
W moim module niestandardowym mam listę wyboru do wyboru szablonu do zastosowania. Mam 3 pliki tpl. Jak mogę to zrobić?
Fazeela Abu Zohra
Jak możemy zastąpić pole treści formularza węzła, jeśli istnieje wiele typów węzłów?
Sukhjinder Singh,
3

W ten sposób możesz również zadeklarować nowy motyw w module:

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

Następnie umieść plik katalogu / template, który zawiera szablon pola taki jak ten (standardowy) i nazwij go field - nazwa-pola-twojego-pola.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>

Po wyczyszczeniu pamięci podręcznej Twój motyw będzie używał tego szablonu, chyba że nie zostanie zastąpiony przez sam motyw, co oznacza, że ​​nadal możesz zastąpić ten szablon w swoim motywie.

David
źródło