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


8

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 tin page-node-x.tpl.phpcủa tôi và của tôi views-view-y.tpl.phpnằ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?

Câu trả lời:


5

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 () 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 chức năng tiền xử lý tương đương để sử dụng theo cách tương tự hoặc cách cho hook_preprocess_page()phép chức năng đó hiểu nếu trang được liên kết với chế độ xem.


3

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

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

2

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. Lộn xộn với nó có thể dẫn đến những khoảnh khắc WTF sau này, vì mọi thứ sẽ không hoạt động như mặc định.

Dù sao cũng giống như tất cả mọi thứ, có một cái móc: hook_theme_registry_alterbạ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 vào 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.


+1 - Tôi đã thử cách này nhưng không thành công .. Bạn có thể cung cấp một ví dụ không?
jantimon

@Ghommey: Liên kết được cung cấp đi kèm với mã ví dụ, không biết làm thế nào để giải thích nó tốt hơn.
googletorp

2

Đố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

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 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');
}

Nhìn vào theme()thực hiện, có vẻ như không theme paththể là một mảng. Bạn có chắc chắn điều này hoạt động? Xem api.drupal.org/api/drupal/includes%21theme.inc/feft/theme/7
Capi Etheriel

Về nhận xét của tôi ở trên: đã theme pathstừng làm việc trong Drupal 6, nhưng Drupal 7 đã thay đổi hành vi đó trong drupal.org/node/678714 Dường như, từ các bình luận # 29 và # 31 trong vấn đề được đề cập, các đề xuất chủ đề từ các mô-đun phải được khai báo trong hook_theme của mô-đun đó, nhưng làm thế nào để làm điều đó chỉ là một bài tập cho người đọc: /
Capi Etheriel

1

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 câu hỏi của Drupal guru muốn tạo ra một cái gì đó sâu sắc hơn và biết lộ trình.


Không có mô-đun D7 và cam kết cuối cùng là một nửa năm trước.
jantimon

Vẫn hoạt động thực sự tốt trên các trang web Drupal 6 của tôi :)
doublejosh

1

Tôi bắt đầu với câu trả lời của googletorp và xây dựng một chức năng 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 bạn được gọi mymodulebằng tệp mẫu, ví dụ: sites/all/modules/mymodule/templates/foo--variant.tpl.phpbâ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');
}

Điều này buộc Drupal sử dụng mẫu trong thư mục mô-đun của bạn. Một chủ đề sẽ không thể ghi đè lên nó (mà nó nên được).
jcisio

1

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-regology cung cấp một 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 cho tất cả các loại của tập tin .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!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.