เป็นเพราะธีมผู้ดูแลระบบของคุณทำงานเมื่อคุณเรนเดอร์
ไม่มีวิธีที่ตรงไปตรงมาและง่ายในการเปลี่ยนธีมระหว่างคำขอ และคุณอาจพบปัญหาเพิ่มเติม
ฉันจะพิจารณาตัวเลือกอื่นๆ เช่น การสร้างโหนดมาร์กอัปผ่านการเรียกกลับเมนูที่ใช้ธีมส่วนหน้าโดยตรงในของคุณ hook_entity_postsave
หรือในงาน cron เป็นต้น
หากคุณยังต้องการลองใช้โดยการเปลี่ยนธีม นี่เป็นวิธีที่ได้ผลสำหรับฉันในตอนนี้ หลังจากปรับแต่งโค้ดเล็กน้อยจาก https://stackoverflow.com/a/56358189/368479 และขอยืมรหัสจาก drupal_theme_initialize().
การเปลี่ยนแปลงที่โดดเด่นที่สุดคือการล้างแคชเมื่อสิ้นสุดฟังก์ชันสวิตช์ ในด้านประสิทธิภาพนี่แย่มาก แต่ฉันไม่สามารถทำงานได้หากไม่มีมัน
/**
* สลับไปยังหรือจากธีมอื่นในช่วงกลางของคำขอ
*
* สิ่งนี้มีประโยชน์หากคุณต้องการเรนเดอร์บางอย่าง (เช่น โหนด) ในโหนดอื่น
* ธีมโดยไม่ต้องเปลี่ยนธีมของทั้งหน้า ตัวอย่างการใช้งานคือ
* เมื่อคุณต้องการเรนเดอร์บางอย่างสำหรับผู้ใช้ส่วนหน้าจากหน้าผู้ดูแลระบบ
*
* ตัวอย่างการใช้งาน:
* my_module_switch_theme('บาร์ติก');
* $node = node_load(1);
* $renderable = node_view($โหนด);
* $rendered = เรนเดอร์($renderable);
* my_module_switch_theme();
*
* @param สตริง|null $ถึง
* ชื่อของธีมที่จะเปลี่ยนไปใช้ หากเป็น NULL ก็จะเปลี่ยนกลับไปเป็น
* ธีมเดิม
*/
ฟังก์ชัน my_module_switch_theme (สตริง $to = NULL) {
$theme ทั่วโลก, $theme_key;
// สำรองข้อมูลธีมเดิม
คง $original_theme;
ถ้า (ว่าง ($ original_theme)) {
$original_theme = $ธีม;
}
// ทำการสลับ
$ธีม = $ถึง ?? $original_theme;
$theme_key = $ธีม;
// ค้นหาธีมดั้งเดิมของเราทั้งหมดและใส่ไว้ในอาร์เรย์
$themes = list_themes();
$base_theme = อาร์เรย์ ();
$บรรพบุรุษ = $ธีม;
ในขณะที่ ($ancestor && isset($themes[$ancestor]->base_theme)) {
$ancestor = $themes[$ancestor]->base_theme;
$base_theme[] = $themes[$บรรพบุรุษ];
}
_drupal_theme_initialize($themes[$theme], array_reverse($base_theme));
// ธีมสามารถปรับเปลี่ยนฟังก์ชันได้ ดังนั้นให้รีเซ็ตแคช drupal_alter()
drupal_static_reset('drupal_alter');
// ล้างแคช
drupal_flush_all_caches();
}
โปรดทราบว่าสิ่งนี้อาจไม่ทำงานหากคุณนำไปใช้ hook_custom_theme สำหรับเพจที่มีการดำเนินการ แต่ถ้าคุณใช้ธีมของผู้ดูแลระบบ ฉันเดาว่าไม่เป็นเช่นนั้น
โค้ดข้างต้นสามารถใช้ได้เหมือนในตัวอย่างต่อไปนี้ และใช้อย่างถูกต้อง node.tpl.php
จากธีม bartik แทนที่จะเป็นธีมปัจจุบันที่ใช้ อย่างน้อยก็ในการตั้งค่าทดสอบของฉัน
my_module_switch_theme('บาร์ติก');
$โหนด = node_load(1);
$renderable = node_view($โหนด);
$rendered = เรนเดอร์($renderable);
my_module_switch_theme();