web-dev-qa-db-fra.com

Comment remplacer un modèle de vue par défaut d'un autre module?

Drupal fournit hook_theme(). Mais y a-t-il un hook_theme_alter ()? Je cherche quelque chose comme hook_menu_link_alter() , qui remplace les entrées du menu hook, mais pour le thème. Je souhaite modifier une entrée de thème de crochet de vue afin de pouvoir spécifier où rechercher l'un de mes modèles personnalisés. Je ne suis pas intéressé à le spécifier via l'interface Vues, ​​car il recherche le modèle de thème dans le dossier de thème, et je veux mon modèle dans un module de fonctionnalités.

J'ai trouvé hook_theme_registry_alter() et _theme_process_registry() . Vous pouvez répondre lequel est le meilleur à utiliser et pourquoi.

Laquelle de ces clés dois-je modifier pour que la vue récupère le modèle du module?

Si je mets views-data-export-xml-header - richard-feeds-nokia-movies - views-data-export-1 dans la fonction, la vue par défaut sélectionne views-data-export-xml-header. tpl.php. Si je mets ce modèle dans la couche de thème, la vue le reprend (même avec le crochet de modification du registre en place).

6
amateur barista

Votre fonctionnalité doit implémenter hook_theme_registry_alter(). Le cas d'utilisation que vous décrivez est exactement à quoi sert ce crochet. L'exemple de code lié sur la page API devrait vous aider à démarrer. L'idée de base est de cibler l'entrée qui correspond à l'entrée que views_theme() est en train d'insérer dans le registre et de modifier le modèle pour qu'il corresponde à celui de votre fonctionnalité.

13
jhedstrom

C'est le code que j'utilise pour déclarer un modèle de vue stocké dans le dossier modèle d'un module personnalisé.

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

Vous devriez pouvoir facilement le remplacer par un thème existant au lieu d'en ajouter un nouveau. J'espère que cela aide quelqu'un.

1
Sebastien M.