Puncte:0

Ce cache ar trebui să invalidez într-un plugin de bloc care construiește matrice de randare pentru una sau mai multe vizualizări?

drapel in

Problema reală este că pluginul va returna uneori matrice de randare care sunt afișaje de blocuri discrete din aceeași vizualizare, eventual și cu argumente diferite. Ceea ce descopăr este că, în aceste cazuri, prima matrice de randare este stocată în cache, astfel încât afișajele ulterioare să fie aceleași cu cea inițială. Construiesc matricele de randare cu buildRenderable($display_id, $args, FALSE), care aparent va dezactiva memorarea în cache a etichetelor și a cheilor. Dar, nu sunt clar cum pot furniza manual un context cache personalizat fără o solicitare diferită.

4uk4 avatar
drapel cn
Acest lucru este legat de https://drupal.stackexchange.com/questions/307728/render-view-inside-block-with-caching. Cea mai bună strategie pentru contextul cache personalizat depinde de câte variații produce acest context.
steve avatar
drapel in
Am văzut problema la care ați făcut referire, ați putea detalia ce vrei să spui în comentariul tău @4uk4?
Puncte:1
drapel cn

Dar, nu sunt clar cum pot furniza manual un context de cache personalizat fără o cerere diferită.

Există trei strategii:

  1. Adăugați contextul cache personalizat la matricea de randare, apoi contextul cache-ului urcă în bloc și pagină adăugând variații la fiecare nivel în amonte.

  2. Adăugați un constructor leneș și setați proprietatea #create_placeholder. Apoi contextul cache personalizat nu mai apare.În schimb, blocul și pagina stocate în cache includ substituentul care este înlocuit de conținutul construit leneș mai târziu, când pagina stocată în cache este livrată.

  3. Adăugați o vârstă maximă de cache de 0. Blocurile sunt deja construite într-un generator leneș și sunt substituite dacă conținutul îndeplinește condiție auto-substituent. Acest lucru are ca rezultat un bloc niciodată memorat în cache și întotdeauna substituent.

Utilizați prima opțiune pentru un context cache care nu are prea multe variații. A doua opțiune este un pic mai mult efort de implementat, deoarece Drupal 8.8 aveți nevoie de o clasă suplimentară implementarea TrustedCallbackInterface sau RenderCallbackInterface, dar este mai flexibil pentru a defini conținutul static și dinamic, chiar și în cadrul aceluiași bloc. Mai ușoară este a treia opțiune, utilizați-o dacă conținutul blocului este atât de volatil încât stocarea în cache nu merită efortul.

steve avatar
drapel in
Are sens ca variabila „conținut” din șablon să conțină două matrice de randare distincte?
4uk4 avatar
drapel cn
Da, adesea folosiți containere pentru a le separa într-o structură care poate fi redată, care este și tematică. Vedeți https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Container.php/class/Container
steve avatar
drapel in
Bănuiesc că ceea ce întrebam este că variabila „conținut” din șablon conține matricele de randare _corecte_, folosind ID-urile de afișare a vizualizării discrete. Cu toate acestea, în cele din urmă nu sunt redate ca distincte, ceea ce este problema pe care o am. Pur și simplu redau „conținutul” cu „{% for value in content %} {{ value }} {% endfor %}”.
4uk4 avatar
drapel cn
În mod normal, numele variabilei „conținut” dintr-un șablon Drupal este o matrice de randare redată recursiv ca orice altă matrice de randare, fără a presupune o structură specifică.Dacă aveți control la ambele capete ale variabilei, ați putea face astfel de presupuneri, dar nu aș face acest lucru. Dacă altcineva nu este conștient de acest lucru și șterge șablonul de bloc personalizat sau trece la o altă temă care nu conține acest șablon, lucrurile se vor rupe.
4uk4 avatar
drapel cn
Dacă trebuie să redați variabile separate, adăugați un șablon personalizat la modulul dvs. pentru interior și utilizați șablonul bloc pentru a tema exteriorul blocului, dacă este necesar.
steve avatar
drapel in
Cred că probabil nu sunt clar. Ceea ce discutăm este un modul personalizat, cu o clasă de plugin bloc care returnează unul sau mai multe blocuri de vizualizare ca matrice de randare în metoda `build`. Aceste matrice de randare sunt tematice într-un șablon de bloc personalizat din modul. Întrebarea mea din aceste comentarii despre variabila „conținut” care este transmisă șablonului este următoarea: Are sens, în ceea ce privește problema pe care o întâmpin cu stocarea în cache a matricei de randare, să treacă matricele de randare _corecte_, distincte, către șablon, care sunt totuși în sfârșit redate incorect ca aceleași?
4uk4 avatar
drapel cn
Discutăm despre același lucru, diferența este că sugerez că aceste matrice de randare sunt tematice într-un șablon personalizat care nu este un șablon bloc. Consultați https://www.drupal.org/docs/theming-drupal/twig-in-drupal/create-custom-twig-templates-for-custom-module#s-step-33-render-as-part-of -un alt-plugin-cum ar fi-bloc.
steve avatar
drapel in
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/135849/discussion-between-steve-and-4uk4).
Puncte:0
drapel in

În cele din urmă, nu am putut, pentru toate aceste sugestii, să obțin prima matrice, nu memoria cache. Acest lucru ar putea fi încă din cauza unei deficiențe a procesului meu, dar în cele din urmă am folosit doar două vederi discrete, mai degrabă decât să încerc să fac ca matricele să varieze pe ID-ul afișajului pentru o singură vizualizare.

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.