it-swarm-es.com

¿Cómo anulo una plantilla de vista predeterminada de otro módulo?

Drupal proporciona hook_theme(). ¿Pero hay un hook_theme_alter ()? Estoy buscando algo como hook_menu_link_alter() , que anula las entradas del menú de gancho, pero para el tema. Quiero modificar una entrada de tema de enlace de vista para poder especificar dónde buscar una de mis plantillas personalizadas. No estoy interesado en especificarlo a través de la interfaz Vistas, ya que busca la plantilla del tema dentro de la carpeta del tema, y ​​quiero que mi plantilla esté en un módulo de funciones.

Encontré hook_theme_registry_alter() y _theme_process_registry() . Puede responder cuál es el mejor para usar y por qué.

¿Cuál de estas teclas debo modificar para que la vista recoja la plantilla del módulo?

Si pongo views-data-export-xml-header - richard-feeds-nokia-movies - views-data-export-1 en la función, la vista predeterminada para recoger views-data-export-xml-header. tpl.php. Si pongo esa plantilla en la capa del tema, la vista la recoge (incluso con el enlace de alteración del registro en su lugar).

6
amateur barista

Su característica debe implementar hook_theme_registry_alter(). El caso de uso que describe es exactamente para qué sirve ese gancho. El código de ejemplo vinculado en la página API debería ayudarlo a comenzar. La idea básica es apuntar a la entrada que corresponde a la entrada que views_theme() está insertando en el registro y cambiar la plantilla para que coincida con la de su función.

13
jhedstrom

Este es el código que uso para declarar una plantilla de vista almacenada en la carpeta plantilla de un módulo personalizado.

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

Debería poder bifurcarlo fácilmente para anular un tema existente en lugar de agregar uno nuevo. Espero que ayude a alguien.

1
Sebastien M.