it-swarm.it

Come posso sostituire un modello di visualizzazione predefinito da un altro modulo?

Drupal fornisce hook_theme(). Ma c'è un hook_theme_alter ()? Sto cercando qualcosa come hook_menu_link_alter() , che sovrascrive le voci del menu hook, ma per il tema. Voglio modificare una voce del tema hook di visualizzazione in modo da poter specificare dove cercare uno dei miei modelli personalizzati. Non mi interessa specificarlo tramite l'interfaccia di Views, poiché cerca il modello di tema all'interno della cartella dei temi e voglio il mio modello in un modulo funzione.

Ho trovato hook_theme_registry_alter() e _theme_process_registry() . Puoi rispondere a quale è il migliore da usare e perché.

Quale di queste chiavi devo modificare per fare in modo che la vista raccolga il modello dal modulo?

Se inserisco views-data-export-xml-header - richard-feeds-nokia-movies - views-data-export-1 nella funzione, per impostazione predefinita View visualizza pick-data-export-xml-header. tpl.php. Se inserisco quel modello nel livello tema, la vista lo prende (anche con l'hook alter del registro in posizione).

6
amateur barista

La tua funzione dovrebbe implementare hook_theme_registry_alter(). Il caso d'uso che descrivi è esattamente lo scopo di quel gancio. Il codice di esempio collegato nella pagina API dovrebbe iniziare. L'idea di base è scegliere come target la voce corrispondente alla voce che views_theme() sta inserendo nel registro e modificare il modello in modo che corrisponda a quello nella funzione.

13
jhedstrom

Questo è il codice che uso per dichiarare un modello di visualizzazione memorizzato nella cartella template di un modulo personalizzato.

/**
 * Implements hook_theme_registry_alter().
 */
function custom_module_theme_registry_alter(&$theme_registry) {
  $extension   = '.tpl.php';
  $module_path = drupal_get_path('module', 'custom_module');
  $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

  foreach ($files as $file) {
    $template = drupal_basename($file->filename, $extension);
    $theme    = str_replace('-', '_', $template);
    list($base_theme, $specific) = explode('__', $theme, 2);

    // Don't override base theme.
    if (!empty($specific) && isset($theme_registry[$base_theme])) {
      $theme_info = array(
        'template'   => $template,
        'path'       => drupal_dirname($file->uri),
        'variables'  => $theme_registry[$base_theme]['variables'],
        'base hook'  => $base_theme,
        // Other available value: theme_engine.
        'type'       => 'module',
        'theme path' => $module_path,
      );

      $theme_registry[$theme] = $theme_info;
    }
  }
}

Dovresti essere in grado di biforcarlo facilmente sovrascrivendo un tema esistente invece di aggiungerne uno nuovo. Spero che aiuti qualcuno.

1
Sebastien M.