it-swarm-vi.com

Thêm một đề xuất chủ đề theo chương trình

Tôi đã tạo một mô-đun tính năng chỉ chứa chế độ xem và loại nội dung.

Ngay bây giờ các tệp page-node-x.tpl.phpviews-view-y.tpl.php Của tôi nằm trong thư mục chủ đề của tôi.

Có thể di chuyển chúng vào mô-đun tính năng của tôi?

8
jantimon

Tôi bắt đầu với câu trả lời của googletorp và xây dựng một hàm chung:

/**
 * Overrides a third-party template file with a local copy.
 *
 * To be called from hook_theme_registry_alter():
 * @code
 * function mymodule_theme_registry_alter(&$theme_registry) {
 *   // Override variant of foo template using local copy.
 *   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
 * }
 * @endcode
 *
 * @param array $theme_registry
 *   Theme registry array as passed to hook_theme_registry_alter().
 * @param string $template
 *   Name of template file without '.tpl.php' extension. Example: 'foo--variant'.
 * @param string $path
 *   Directory to load $template from.
 * @param string $preprocess_function
 *   Optional preprocess function.
 */
function custom_override_template(&$theme_registry, $template, $path, $preprocess_function = NULL) {
  if (strpos($template, '--') !== FALSE) {
    $hook_name = array_shift(explode('--', $template));
  }
  else {
    $hook_name = $template;
  }
  $hook_name = str_replace('-', '_', $hook_name);
  if (isset($theme_registry[$hook_name])) {
    // Copy hook info.
    $hook_info = $theme_registry[$hook_name];
    $hook_info['path'] = $path;
    $hook_info['template'] = $template;
    // Add to theme registry.
    $new_hook = str_replace('-', '_', $template);
    $theme_registry[$new_hook] = $hook_info;
    // Add preprocess function.
    if(!is_null($preprocess_function)){
      $theme_registry[$new_hook]['preprocess functions'][] = $preprocess_function;
    }
    return $new_hook;
  }
  else {
    throw new Exception(t('Unknown theme hook %hook.', array('%hook' => $hook_name)));
  }
}

Nó không chỉ cho phép ghi đè vị trí và tên của nút và xem các tệp tpl mà còn cung cấp chức năng tiền xử lý cho các khung nhìn.

Vì vậy, nếu bạn có mô-đun của riêng mình được gọi là mymodule với tệp mẫu, ví dụ sites/all/modules/mymodule/templates/foo--variant.tpl.php bây giờ bạn có thể dễ dàng sửa đổi sổ đăng ký chủ đề để sử dụng thư mục mẫu của riêng bạn:

function mymodule_theme_registry_alter(&$theme_registry) {
   // Override variant of foo template using local copy.
   custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
}
1
jantimon

Một mô-đun thực hiện hook_preprocess_page() hoặc hook_preprocess_node() có thể đề xuất các tệp mẫu mới bằng cách thay đổi biến $variables['theme_hook_suggestions'].

Mã chứa trong template_pre process_page () mà khởi tạo biến đó là như sau.

// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
  $variables['theme_hook_suggestions'] = $suggestions;
}

Mỗi đề xuất chủ đề cần khớp với một mục được trả về bởi hook_theme () .

Trong Chế độ xem, cần có một hàm tiền xử lý tương đương để sử dụng theo cách tương tự hoặc cách cho phép hook_preprocess_page() cho phép chức năng hiểu nếu trang được liên kết với chế độ xem.

5
kiamlaluno

Giải pháp để thêm khóa 'tệp mẫu' vào hook_views_api() dường như không hoạt động trong Drupal 7. Tuy nhiên, cách này hoạt động như một bùa mê:

/**
 * Implements hook_theme().
 */
function bigtexas_theme() {
  return array(
    'views_view_fields__slideshow' => array(
    'variables' => array('view' => NULL, 'options' => NULL, 'row' => NULL),
    'template' => 'views-view-fields--slideshow',
    'base hook' => 'views_view_fields',
    'path' => drupal_get_path('module', 'bigtexas') . '/theme',
  ),
 );
}
3
Joe Hyde

Đối với các khung nhìn, trên lý thuyết có một cơ chế cho các khung nhìn (có lẽ nó hoạt động cho tất cả các mẫu).

Bạn có thể đặt "đường dẫn mẫu" chính trong triển khai hook_view_api của mô-đun tùy chỉnh.

Khi bạn có chế độ xem này sẽ quét thư mục được chỉ định của bạn để tìm tệp mẫu. Đáng buồn là đơn giản nhất hiện tại không thành công, vì vậy tính năng này có thể chưa được chuyển sang drupal7, nhưng nếu ai đó muốn truy cập vào nó, hãy xem _view_find_module_temsheet () trong Views.module.

2
Daniel Wehner

Sổ đăng ký chủ đề là nơi Drupal lưu trữ tất cả các loại thông tin về các tệp mẫu, chức năng chủ đề, v.v. sẽ sử dụng.

Dù sao cũng giống như tất cả mọi thứ drupal, có một cái móc: hook_theme_registry_alter bạn có thể sử dụng để thay đổi sổ đăng ký chủ đề và điều này di chuyển các tệp mẫu của bạn thành một mô-đun. Tôi không khuyên bạn nên làm điều này, vì nó sẽ làm cho việc duy trì trang web phức tạp hơn. Nhưng nếu bạn muốn làm là, đây là cách nó được thực hiện.

2
googletorp

Cách dễ nhất là sử dụng hook_theme_registry_alter() và chỉ cần thêm đường dẫn của mô-đun của bạn vào đường dẫn chủ đề:

function mymodule_theme_registry_alter(&$theme_registry) {
  $theme_registry['[theme hook name, ie. page or views-view]']['theme paths'][] = drupal_get_path('module', 'mymodule');
}
2
Damien Tournoud

Như @jcsio đã nói, câu trả lời được chấp nhận trên trang này hoạt động, nhưng mẫu không thể bị ghi đè bởi một chủ đề.

http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry cung cấp giải pháp cho phép bạn thêm đường dẫn của mô-đun (và thư mục con ) để được quét tất cả các loại tệp .tpl.php.

Tôi hơi thay đổi nó, vì nó chứa biến 'đường dẫn chủ đề' dường như không được sử dụng bởi Drupal 7.

/**
 * Implements hook_theme_registry_alter()
**/
function mymodule_theme_registry_alter(&$theme_registry) {
  $mod_path = drupal_get_path('module', 'mymodule');
  $theme_registry_copy = $theme_registry;       // munge on a copy
  _theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
  $theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
}

Tôi đã thử cả câu trả lời được chấp nhận và giải pháp này, cho đến nay nó vẫn hoạt động với tôi!

1
lmeurs

Làm thế nào về một cách tiếp cận hơi trừu tượng với chủ đề phản ứng bối cảnh?

http://drupal.org/project/context_reaction_theme

Kết thúc bối cảnh của bạn trong Tính năng và thậm chí có thể xuất được. Nhưng có lẽ đây thực sự là một Drupal guru muốn tạo ra một cái gì đó sâu hơn và biết lộ trình.

1
doublejosh