it-swarm-vi.com

Làm cách nào để ghi đè mẫu xem mặc định từ mô-đun khác?

Drupal cung cấp hook_theme(). Nhưng có hook_theme_alter () không? Tôi đang tìm kiếm một cái gì đó như hook_menu_link_alter() , ghi đè các mục menu hook, nhưng cho chủ đề. Tôi muốn sửa đổi mục nhập chủ đề khung nhìn để tôi có thể chỉ định nơi cần tìm một trong các mẫu tùy chỉnh của mình. Tôi không quan tâm đến việc chỉ định nó thông qua giao diện Lượt xem, vì nó tìm mẫu chủ đề bên trong thư mục chủ đề và tôi muốn mẫu của mình trong một mô-đun tính năng.

Tôi tìm thấy hook_theme_registry_alter()_theme_process_registry() . Bạn có thể trả lời cái nào là tốt nhất để sử dụng và tại sao.

Tôi nên sửa đổi khóa nào trong số các phím này để tạo chế độ xem lấy mẫu từ mô-đun?

Nếu tôi đặt chế độ xem-data-export-xml-header - richard-feed-nokia-movies - view-data-export-1 trong tính năng, thì View mặc định để chọn tiêu đề view-data-export-xml-header. tpl.php. Nếu tôi đặt mẫu đó trong lớp chủ đề, chế độ xem sẽ chọn nó (ngay cả khi đăng ký thay đổi móc tại chỗ).

6
amateur barista

Tính năng của bạn sẽ triển khai hook_theme_registry_alter(). Trường hợp sử dụng mà bạn mô tả là chính xác những gì hook đó là dành cho. Mã ví dụ được liên kết trên trang API sẽ giúp bạn bắt đầu. Ý tưởng cơ bản là nhắm mục tiêu mục tương ứng với mục mà views_theme() đang chèn vào sổ đăng ký và thay đổi mẫu để khớp với mục trong tính năng của bạn.

13
jhedstrom

Đây là mã tôi sử dụng để khai báo mẫu xem được lưu trữ trong thư mục template của mô-đun tùy chỉnh.

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

Bạn có thể dễ dàng phân tách nó ghi đè lên một chủ đề hiện có thay vì thêm một chủ đề mới. Hy vọng nó sẽ giúp được ai đó.

1
Sebastien M.