Chắc chắn là do chủ đề quản trị của bạn đang hoạt động khi bạn kết xuất.
Không có cách nào đơn giản và dễ dàng để chuyển đổi chủ đề khi đang yêu cầu và bạn có thể sẽ gặp phải các sự cố khác.
Tôi sẽ xem xét các lựa chọn khác, ví dụ: tạo đánh dấu nút thông qua lệnh gọi lại menu sử dụng chủ đề giao diện người dùng, trực tiếp trong hook_entity_postsave
hoặc trong một công việc định kỳ chẳng hạn.
Nếu bạn vẫn muốn thử bằng cách chuyển đổi chủ đề, thì đây là cách nó hoạt động với tôi bây giờ sau một chút mày mò với mã từ https://stackoverflow.com/a/56358189/368479 và mượn mã từ drupal_theme_initialize().
Thay đổi đáng chú ý nhất là xóa bộ nhớ cache khi kết thúc chức năng chuyển đổi. Về mặt hiệu suất, điều này thật tồi tệ, nhưng tôi không thể làm cho nó hoạt động nếu không có nó.
/**
* Chuyển sang hoặc từ một chủ đề thay thế ở giữa một yêu cầu.
*
* Điều này hữu ích nếu bạn cần kết xuất thứ gì đó (chẳng hạn như nút) ở dạng khác
* chủ đề mà không thay đổi chủ đề của toàn bộ trang. Một trường hợp sử dụng ví dụ là
* khi bạn cần kết xuất thứ gì đó cho người dùng giao diện người dùng từ trang quản trị.
*
* Ví dụ sử dụng:
* my_module_switch_theme('bartik');
* $node = node_load(1);
* $renderable = node_view($node);
* $rendered = kết xuất($renderable);
* my_module_switch_theme();
*
* @param string|null $to
* Tên của chủ đề để chuyển sang. Nếu NULL, nó chuyển về
* chủ đề ban đầu.
*/
function my_module_switch_theme(string $to = NULL) {
toàn cầu $theme, $theme_key;
// Sao lưu theme gốc.
tĩnh $ original_theme;
nếu (trống ($ original_theme)) {
$ original_theme = $theme;
}
// Thực hiện chuyển đổi.
$theme = $to ?? $ original_theme;
$theme_key = $theme;
// Tìm tất cả các chủ đề tổ tiên của chúng tôi và đặt chúng vào một mảng.
$themes = list_themes();
$base_theme = mảng();
$tổ tiên = $theme;
while ($ancestor && isset($themes[$ancestor]->base_theme)) {
$ancestor = $themes[$ancestor]->base_theme;
$base_theme[] = $themes[$ancestor];
}
_drupal_theme_initialize($themes[$theme], array_reverse($base_theme));
// Chủ đề có thể có các chức năng thay đổi, vì vậy hãy đặt lại bộ đệm drupal_alter().
drupal_static_reset('drupal_alter');
// Xóa bộ nhớ cache.
drupal_flush_all_caches();
}
Lưu ý rằng điều này có thể không hoạt động nếu bạn thực hiện hook_custom_theme cho trang mà hành động xảy ra, nhưng nếu bạn sử dụng chủ đề quản trị viên thì tôi đoán đó không phải là trường hợp.
Sau đó, mã ở trên có thể được sử dụng như trong ví dụ sau và sử dụng chính xác nút.tpl.php
từ chủ đề bartik thay vì chủ đề mà chủ đề hiện tại sử dụng, ít nhất là trong thiết lập thử nghiệm của tôi.
my_module_switch_theme('bartik');
$node = node_load(1);
$renderable = node_view($node);
$rendered = kết xuất($renderable);
my_module_switch_theme();