Puncte:0

Cum să obțineți un nod randat în funcție de tema activă?

drapel jp

Într-o hook_entity_postsave() funcția din modulul meu personalizat D7, fac următoarele când un nod este salvat:

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

Dar HTML-ul randat pare să lipsească șabloanele temei active. de exemplu. activând depanarea temei, înțeleg

 SUGESTII DE NUME DE FIȘIER:
   * paragrafe-articole--câmp-secțiuni--full.tpl.php
   * paragrafe-articole--field-sections.tpl.php
   x paragrafe-articole.tpl.php

Inca paragrafe-articole--câmp-secțiuni--full.tpl.php este definită în tema activă a site-ului (și este utilizată corect la prezentarea paginilor nod normale).

EDITARE: Cred că acest lucru se poate datora faptului că tema de administrare este activă când rulează acest cod? Există vreo modalitate de a schimba asta?

Puncte:1
drapel bd

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();
drapel jp
Multumesc, am incercat asta dar nu merge. Am încercat și versiunea completă la https://stackoverflow.com/a/20476484/623519.Doar că nu preia șabloanele din temă :-(
berliner avatar
drapel bd
@artfulrobot Ai dreptate. De asemenea, nu există o variabilă globală `$custom_theme`. Am fost indus în eroare de ceva ce am văzut și nu am verificat. Mi-am actualizat răspunsul acum. Aș sugera cu tărie să faceți randarea la un moment ulterior, dacă este posibil. Schimbarea temelor în timpul solicitării active va duce cu ușurință la probleme.
drapel jp
Mulțumiri! funcționează! Am găsit un câștig de performanță: înlocuiți `drupal_flush_all_caches()` cu `system_rebuild_theme_data();drupal_theme_rebuild();`

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.