it-swarm.com.de

Wie überschreibe ich eine Standardansichtsvorlage aus einem anderen Modul?

Drupal bietet hook_theme(). Aber gibt es einen hook_theme_alter ()? Ich suche etwas wie hook_menu_link_alter() , das Hook-Menüeinträge überschreibt, aber für das Thema. Ich möchte einen View Hook-Themeneintrag ändern, damit ich angeben kann, wo nach einer meiner benutzerdefinierten Vorlagen gesucht werden soll. Ich bin nicht daran interessiert, es über die Benutzeroberfläche "Ansichten" anzugeben, da es nach der Themenvorlage im Themenordner sucht und ich meine Vorlage in einem Funktionsmodul haben möchte.

Ich fand hook_theme_registry_alter() und _theme_process_registry() . Sie können antworten, welches am besten zu verwenden ist und warum.

Welchen dieser Schlüssel sollte ich ändern, damit die Ansicht die Vorlage aus dem Modul übernimmt?

Wenn ich in die Funktion Ansichten-Daten-Export-XML-Header - Richard-Feeds-Nokia-Filme - Ansichten-Daten-Export-1 einfüge, nimmt die Ansicht standardmäßig Ansichten-Daten-Export-XML-Header auf. tpl.php. Wenn ich diese Vorlage in die Themenebene einfüge, nimmt die Ansicht sie auf (auch wenn der Registrierungsänderungs-Hook vorhanden ist).

6
amateur barista

Ihre Funktion sollte hook_theme_registry_alter() implementieren. Der von Ihnen beschriebene Anwendungsfall ist genau das, wofür dieser Haken gedacht ist. Mit dem auf der API-Seite verknüpften Beispielcode sollten Sie beginnen. Die Grundidee besteht darin, auf den Eintrag abzuzielen, der dem Eintrag entspricht, den views_theme() in die Registrierung einfügt, und die Vorlage so zu ändern, dass sie mit der in Ihrer Funktion übereinstimmt.

13
jhedstrom

Dies ist der Code, mit dem ich eine Ansichtsvorlage deklariere, die im Ordner template eines benutzerdefinierten Moduls gespeichert ist.

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

Sie sollten leicht in der Lage sein, ein vorhandenes Thema zu überschreiben, anstatt ein neues hinzuzufügen. Hoffe es hilft jemandem.

1
Sebastien M.