Substituir modelo de campo pelo módulo personalizado

13

Em vez de adicionar arquivos tpl (neste caso, media-youtube-video.tpl.php) ao tema. Como substituir modelos de campo de um módulo personalizado? Incluindo quando o campo é usado em uma Visualização.

Allan Thomas
fonte

Respostas:

12

Tenho certeza de que deve haver uma maneira mais fácil de fazer isso, mas é o que normalmente faço:

1. Registre uma implementação de tema substituto no registro do tema Drupal. Então, mymod_theme()adicione um novo item. A variableschave deve corresponder à do media_youtube_videotema, ou seja,

/**
 * 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. Adicione um gancho de pré-processo para a implementação do tema original e sugira sua nova implementação aqui.

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

As sugestões são avaliadas pelo sistema temático de uma maneira LIFO . Você pode ler mais sobre isso aqui .

Suponha que você esteja ciente de que outro módulo também está seguindo a mesma abordagem que esta para substituir a implementação. Em seguida, você pode implementar hook_module_implements_alter()e forçar sua hook_preprocess_THEME()(veja acima) a ser chamada por último. Você pode ler hook_module_implements_alter() aqui .

Isso vale para o Views também. Em resumo, você só precisa descobrir o nome exclusivo correto da implementação do tema original que deseja substituir (normalmente definido no módulo de origem), adicionar um gancho de pré-processo e adicionar sua sugestão de substituição lá.

Amarnath Ravikumar
fonte
No meu módulo personalizado, tenho uma lista de seleção para selecionar o modelo a ser aplicado. Eu tenho 3 arquivos tpl. Então, como posso fazer isso.
Fazeela Abu Zohra 02/04
Como podemos substituir o campo do corpo do formulário do nó se houver muitos tipos de nós?
Sukhjinder Singh
3

Você também pode declarar novo tema no módulo desta maneira:

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

Em seguida, coloque um arquivo de diretório / template que contenha um modelo de campo como este (padrão) e nomeie-o como 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>

Após limpar o cache, seu tema usará esse modelo arquivado, a menos que não seja substituído pelo próprio tema, o que significa que você ainda poderá substituir esse modelo no seu tema.

David
fonte