Điểm:0

Làm cách nào để có được nút kết xuất theo chủ đề đang hoạt động?

lá cờ jp

trong một hook_entity_postsave() chức năng trong mô-đun D7 tùy chỉnh của mình, tôi sẽ thực hiện các thao tác sau khi một nút được lưu:

$_ = node_view($entity, 'full');   
$html = drupal_render($_);         

Nhưng HTML được kết xuất dường như bỏ lỡ các mẫu của chủ đề đang hoạt động. ví dụ. bật gỡ lỗi chủ đề, tôi nhận được

 GỢI Ý TÊN TỆP:
   * đoạn-mục--trường-phần--full.tpl.php
   * đoạn-mục--trường-phần.tpl.php
   x đoạn-items.tpl.php

Chưa đoạn-mục--trường-phần--full.tpl.php được xác định trong chủ đề hoạt động của trang web (và được sử dụng chính xác khi trình bày các trang nút thông thường).

CHỈNH SỬA: Tôi nghĩ điều này có thể là do chủ đề quản trị đang hoạt động khi mã này chạy? Có cách nào để chuyển đổi đó?

Điểm:1
lá cờ bd

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();
lá cờ jp
Cảm ơn, tôi đã thử điều này nhưng nó không hoạt động. Tôi cũng đã thử phiên bản đầy đủ hơn tại https://stackoverflow.com/a/20476484/623519.Nó chỉ không chọn các mẫu từ chủ đề :-(
berliner avatar
lá cờ bd
@artfulrobot Bạn nói đúng. Ngoài ra, không có biến `$custom_theme` toàn cục. Tôi đã bị đánh lừa bởi một cái gì đó tôi thấy và không xác minh. Tôi đã cập nhật câu trả lời của tôi bây giờ. Tôi thực sự khuyên bạn nên thực hiện kết xuất sau nếu có thể. Chuyển đổi chủ đề trong khi yêu cầu đang hoạt động sẽ dễ dẫn đến rắc rối.
lá cờ jp
Cảm ơn! nó hoạt động! Tôi đã tìm thấy mức tăng hiệu suất: thay thế `drupal_flush_all_caches()` bằng `system_rebuild_theme_data();drupal_theme_rebuild();`

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.