Cu siguranță se datorează faptului că tema dvs. de administrare este activă atunci când faceți randarea.
Nu există o modalitate simplă și ușoară de a schimba tema în mijlocul unei solicitări și probabil că veți întâmpina alte probleme.
Aș lua în considerare alte opțiuni, de ex. crearea nodurilor de marcare printr-un apel invers de meniu care folosește tema frontend, fie direct în dvs hook_entity_postsave
sau într-un job cron de exemplu.
Dacă totuși doriți să îl încercați schimbând teme, acesta este modul în care a funcționat pentru mine acum, după câteva modificări cu codul de la https://stackoverflow.com/a/56358189/368479 și codul de împrumut de la drupal_theme_initialize().
Cea mai notabilă schimbare este ștergerea memoriei cache la sfârșitul funcției de comutare. Din punct de vedere al performanței, acest lucru este îngrozitor, dar nu aș putea să funcționeze fără el.
/**
* Comutați la sau de la o temă alternativă în mijlocul unei solicitări.
*
* Acest lucru este util dacă trebuie să redați ceva (cum ar fi un nod) într-un alt mod
* tema fără a schimba tema întregii pagini. Un exemplu de caz de utilizare este
* când trebuie să redați ceva pentru un utilizator front end dintr-o pagină de administrare.
*
* Exemplu de utilizare:
* my_module_switch_theme('bartik');
* $nod = node_load(1);
* $renderable = node_view($nod);
* $rendered = render($renderable);
* my_module_switch_theme();
*
* @param șir|null $to
* Numele temei la care să comutați. Dacă nul, se comută înapoi la
* temă originală.
*/
function my_module_switch_theme(șir $la = NULL) {
global $theme, $theme_key;
// Faceți o copie de rezervă a temei originale.
static $original_theme;
dacă (gol ($temă_originală)) {
$temă_originală = $temă;
}
// Efectuați comutarea.
$temă = $la ?? $temă_originală;
$theme_key = $theme;
// Găsiți toate temele noastre strămoși și puneți-le într-o matrice.
$teme = list_themes();
$temă_bază = matrice();
$stramos = $tema;
while ($ancestor && isset($themes[$ancestor]->base_theme)) {
$ancestor = $themes[$ancestor]->base_theme;
$base_theme[] = $teme[$ancestor];
}
_drupal_theme_initialize($themes[$theme], array_reverse($base_theme));
// Temele pot avea funcții de modificare, deci resetați memoria cache drupal_alter().
drupal_static_reset('drupal_alter');
// Goliți memoria cache.
drupal_flush_all_caches();
}
Rețineți că acest lucru ar putea să nu funcționeze dacă implementați hook_custom_theme pentru pagina în care se întâmplă acțiunea, dar dacă utilizați tema de admin, atunci cred că nu este cazul.
Codul de mai sus poate fi folosit ca în exemplul următor și folosește corect node.tpl.php
din tema bartik în loc de cea pe care o folosește tema curentă, cel puțin în configurarea mea de testare.
my_module_switch_theme('bartik');
$nod = nod_load(1);
$renderable = vizualizare_nod($nod);
$redat = randare($redabil);
my_module_switch_theme();