Puncte:2

Sunt deschis la toate indicațiile și sugestiile. Chiar apreciez.

drapel cn

Cum pot încărca un șablon dintr-un modul personalizat pe o anumită pagină?

Oferim conținutul nostru prin intermediul API-urilor. Uneori folosim abordarea Views Restful și uneori JSONAPI.

Trebuie să adăugăm un câmp API pe noduri care este o redare HTML completă a paginii acelui nod în funcție de tema (tehnic, am nevoie doar de... dar voi lua întregul document dacă îl pot obține).

Am încercat mai multe abordări:

Am încercat să folosesc serviciul de redare. Redă html complet din șablonul html.html.twig, dar elemente precum blocurile din pagină lipsesc. Bănuiesc că nu are tot contextul de care are nevoie.
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$conținut = $view_builder->view($node);
$build = [
  '#type' => 'html',
  'pagina' => [
    '#type' => 'pagina',
    '#theme' => 'pagina',
    '#title' => $node->get("titlu")->valoare,
    'conținut' => $conținut,
  ],
];
$pagina = \Drupal::service('renderer')->renderPlain($build);

Foarte similar, am încercat să folosesc twig_render_template. În mod similar, redă html complet, dar elemente precum blocurile de pe pagină lipsesc.
$markup = twig_render_template(drupal_get_path('theme', 'neato') . '/templates/base/html.html.twig', array(
  'pagina' => [
    '#type' => 'pagina',
    '#theme' => 'pagina',
    '#title' => $node->get("titlu")->valoare,
    'conținut' => $conținut,
  ],
  // Necesar pentru a preveni notificările când depanarea Twig este activată.
  'theme_hook_original' => 'nu se aplică',
));
$corp = (șir) $markup;

Ca o abordare separată, am încercat să fac o „subsolicitare”. Cu această abordare, obțin codul HTML randat, dar provoacă erori fatale de randare timpurie, cum ar fi „O invocare a renderRoot() rătăcită provoacă ruperea bulelor de active atașate”.
$kernel = \Drupal::service('http_kernel.basic');
$sub_request = \Symfony\Component\HttpFoundation\Request::create("/node/".$value->_entity->id(), 'GET');
$subResponse = $kernel->handle($sub_request, \Symfony\Component\HttpKernel\HttpKernelInterface::SUB_REQUEST);
$html = $subResponse->getContent();

Am încercat chiar să imit „bootstrap” complet drupal
$autoloader = necesită „/app/web/autoload.php”;
$sub_request = Request::create("/node/".$node->id(), 'GET');
$site_path = DrupalKernel::findSitePath($sub_request);
$kernel = DrupalKernel::createFromRequest($sub_request, $autoloader, 'prod');
$sub_response = $kernel->handle($sub_request, HttpKernelInterface::SUB_REQUEST);
$html = $sub_response->getContent();

john Smith avatar
drapel gr
la fel ca un mod probabil „nu atât de performant” și non-drupal, utilizați un file_get_contents pe adresa URL a paginii...
john Smith avatar
drapel gr
PS: tocmai am dat peste `\Drupal::service('renderer')->renderRoot(` în unele dintre codurile mele, poate că ajută în schimb folosirea `renderPlain`
4uk4 avatar
drapel cn
În mod normal, nu trebuie să redați deloc variabile. Dar dacă aveți nevoie, atunci utilizați `\Drupal::service('renderer')->render()`. Cele două metode de mai sus sunt doar pentru cazuri de utilizare specifice, nu pentru randările normale ale paginilor.
drapel cn
De acord. Nu așa sunt redate în mod normal paginile. Este un caz limită pentru specificațiile mele. Am încercat \Drupal::service('renderer')->renderRoot și render() în mai multe moduri. Nu a avut niciodată tot contextul. Am primit scheletul HTML al paginii, dar blocurile și altele încă lipseau. Am descoperit că va trebui să imiteți cererea completă a Drupal, care este complexă, și a început să vă simțiți ca o direcție mai proastă. Am urmat o cale similară pentru înregistrarea lui @johnSmith de a folosi file_get_contents(). Când nodurile sunt salvate, folosim httpClient pentru a face o a doua cerere către site.Răspunsul este salvat într-un câmp și inclus în API. Mersi!!
Puncte:1
drapel cn

Am urmat o cale similară pentru înregistrarea lui @johnSmith de a folosi file_get_contents(). Mulțumiri!

TL;DR; Când nodurile sunt salvate, folosim httpClient pentru a face o a doua cerere către site. Răspunsul este salvat într-un câmp și inclus în API. Mersi!!

Detalii

  • Un câmp nou a fost adăugat la tipurile de conținut asociate. Acest câmp va fi folosit pentru a stoca pagina HTML randată.

  • A fost scris un modul personalizat. Când nodurile tipurilor de conținut asociate sunt create sau actualizate, se face o solicitare ulterioară folosind httpClient. Această solicitare se face către pagina nodului. Răspunsul HTML este salvat în noul câmp.

    //Am salvat numele de domeniu configurat în care să facem această solicitare de randare în configurația Drupal.

    $config = \Drupal::service('config.factory')->getEditable('myApi.static_server_settings');

    $domain = $config->get('myApi.theme_domain');

    //Solicitați pagina redată a acestui nod

    $nid = $nod->id();

    $client = \Drupal::httpClient();

    $request = $client->get($domain.'/node/'.$nid);

    $render = (șir) $request->getBody();

  • API-ul nostru a fost extins pentru a include acest câmp.Ca alternativă, atunci când API-ul rulează, dacă noul câmp este gol, aceeași cerere ulterioară httpClient este făcută din mers.

  • Am creat un proces de lot care actualizează câmpul „pagină redată” pentru tot conținutul. Acesta poate fi rulat dacă tema este actualizată. În cele din urmă, îl putem declanșa din scripturile noastre de creare a temei/glup/lucurile CI.

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.