Thay vì thêm các tệp tpl (trong trường hợp này, media-youtube-video.tpl.php) vào chủ đề. Làm cách nào tôi có thể ghi đè các mẫu trường từ một mô-đun tùy chỉnh? Bao gồm khi trường được sử dụng trong Chế độ xem.
Thay vì thêm các tệp tpl (trong trường hợp này, media-youtube-video.tpl.php) vào chủ đề. Làm cách nào tôi có thể ghi đè các mẫu trường từ một mô-đun tùy chỉnh? Bao gồm khi trường được sử dụng trong Chế độ xem.
Câu trả lời:
Tôi chắc chắn phải có một cách dễ dàng hơn để làm điều này nhưng đây là những gì tôi thường làm:
1.
Đăng ký thực hiện chủ đề ghi đè với sổ đăng ký chủ đề Drupal. Vì vậy, trong mymod_theme()
, thêm một mục mới. Các variables
chính phải khớp với các media_youtube_video
ví dụ chủ đề
/**
* Implements hook_theme().
*/
function mymod_theme() {
return array(
'my_media_youtube_video' => array(
'variables' => array('uri' => NULL, ...), // see media_youtube_theme() for this
// bundle the template file with the module itself
// i.e. theme/my-media-youtube-video.tpl.php
'template' => 'my-media-youtube-video',
'path' => drupal_get_path('module', 'mymod') . '/theme
)
);
}
2. Thêm một móc tiền xử lý để thực hiện chủ đề ban đầu và đề xuất triển khai mới của bạn ở đây.
/*
* Implements hook_preprocess_media_youtube_video().
*
* Or more generally, hook_preprocess_THEME().
*/
function mymod_preprocess_media_youtube_video(&$variables) {
// If your overriding implementation is not a template but
// is implemented in a different file,
// then remember to include the file explicitly at this point..
$variables['theme_hook_suggestions'][] = 'my_media_youtube_video';
}
Gợi ý được đánh giá bởi hệ thống chủ đề theo kiểu LIFO . Bạn có thể đọc thêm về điều này ở đây .
Giả sử bạn biết rằng một mô-đun khác cũng tuân theo cách tiếp cận tương tự như mô-đun này để ghi đè lên việc thực hiện, sau đó bạn có thể thực hiện hook_module_implements_alter()
và buộc hook_preprocess_THEME()
(xem ở trên) của bạn được gọi là cuối cùng. Bạn có thể đọc về hook_module_implements_alter()
đây .
Điều này cũng tốt cho Lượt xem. Tóm lại, bạn chỉ cần tìm ra tên duy nhất chính xác của việc triển khai chủ đề ban đầu mà bạn muốn ghi đè (thường được xác định trong mô-đun nguồn), thêm móc tiền xử lý và thêm đề xuất ghi đè của bạn vào đó.
Bạn cũng có thể decalare theme mới trong mô-đun theo cách này:
/**
* Implements hook_theme().
*/
function yourmodule_theme($existing, $type, $theme, $path) {
$theme = array();
$theme['field__field_nameofyourfield'] = array(
'render element' => 'content',
'base hook' => 'field',
'template' => 'field--field-nameofyourfield',
'path' => drupal_get_path('module', 'yourmodule') . '/templates',
);
return $theme;
}
Sau đó đặt vào tệp thư mục / mẫu có chứa mẫu trường như thế này (tiêu chuẩn) và đặt tên cho trường đó - trường-nameofyourfield.tpl.php:
<div class="<?php print $classes; ?>"<?php print $attributes; ?>>
<?php if (!$label_hidden): ?>
<div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>: </div>
<?php endif; ?>
<div class="field-items"<?php print $content_attributes; ?>>
<?php foreach ($items as $delta => $item): ?>
<div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
<?php endforeach; ?>
</div>
</div>
Sau khi xóa bộ nhớ cache, chủ đề của bạn sẽ sử dụng mẫu đã nộp này trừ khi nó không bị ghi đè bởi chính chủ đề, điều đó có nghĩa là bạn vẫn có thể ghi đè lên mẫu này trong chủ đề của mình.