ghi đè node.tpl.php trong một mô-đun


8

Tôi đã tạo một mô-đun có thể hiển thị nội dung của một loại nội dung nhất định. Việc hiển thị khá phức tạp và để có thể tắt và nhóm mọi thứ lại với nhau, tôi đã tạo ra một mô-đun cho việc này.

Nhưng cuối cùng, nó chỉ nên ghi đè lên nút.tpl.php bình thường bằng tệp .tpl.php tùy chỉnh. Khi tôi đặt tệp vào thư mục mẫu của mình, nó sẽ được chọn và các trang hiển thị như dự định, nhưng tôi không thể làm cho nó hoạt động khi tệp nằm trong thư mục mô-đun.

Tôi đã đọc rất nhiều điều về regsiter tệp .tpl và tiền xử lý nhưng không có gì kết hợp các phần tôi cần.

Đây là những gì tôi có cho đến nay

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}

1
Tôi có thể được gọi ra về điều này, nhưng theo quan điểm khiêm tốn (không phải vậy) của tôi, một mô-đun không nên quan tâm đến một nút trông như thế nào khi được hiển thị, tất cả những gì cần quan tâm là chuyển dữ liệu đó đến chủ đề, sau đó thực hiện phần hiển thị. Bây giờ, nếu bạn muốn mô-đun của mình tạo một đối tượng tùy chỉnh được hiển thị trong một nút, đó là một câu chuyện khác, thì bạn có thể tạo một mẫu cho điều đó. Nhưng, nếu bạn muốn làm ngắn mạch bước đó, thì việc đặt node.tpl.php của bạn vào thư mục chủ đề là cách duy nhất 'đúng' để thực hiện.
Jimajamma

Nếu bất cứ ai đang muốn làm điều này cụ thể trong Drupal 6, hãy xem câu trả lời này: stackoverflow.com/a/6153043/1154642
bryanbraun 22/11/13

Câu trả lời:


3

Không rõ ràng trong câu hỏi của bạn nếu bạn đang đặt mẫu của bạn vào sites/all/custom/moduleshoặc trong sites/all/custom/modules/the_name_of_mymodule. Nó cần phải là sau này.

Tuy nhiên, nếu bạn:

  • Có mẫu của bạn ở nơi thích hợp.
  • Đã truy cập admin/appearanceđường dẫn để buộc làm mới đăng ký chủ đề.
  • Xóa tất cả các bộ nhớ cache phía sau.

... nhưng vẫn không có xúc xắc, bạn luôn có thể chỉ định trong hook_theme () của mình khi thực hiện theme_pathkhóa:

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}

vẫn không hoạt động, tôi có cần theme_hook_suggestions hay nên tự mình chọn nó lấy mẫu? 'Ứng dụng' là loại nội dung, 'Ứng dụng' tên mô-đun
dazz

Có lẽ vấn đề mà bạn đang gặp phải là tên của chức năng chủ đề node--app. Một cái tên tốt hơn sẽ là node_app, và bạn sẽ gọi chức năng theo chủ đề bằng cách làm theme('node_app', [$vars]);Tôi không chắc chắn theme('node--app')là thứ tôi từng thấy và gần như chắc chắn rằng nó sẽ không hoạt động.
barista nghiệp dư

Ngoài ra, biến $ path được cung cấp để bạn không phải thực hiện điệu nhảy drupal_get_path (). $ path là vị trí của mô-đun đang triển khai hook_theme, trong trường hợp này là mô-đun có tên ứng dụng.
barista nghiệp dư

1
Tên chủ đề cần phải được 'node__app'(gạch dưới đôi) không'node_app'
Junaid

3

Nghĩ rằng tôi sẽ đăng giải pháp mà tôi tìm thấy:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}

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.