Puncte:2

Memorarea în cache a ID-ului nodului pe hook_form_alter()

drapel in

Am un formular web cu un câmp de e-mail. Încorporez formularul web pe fiecare nod, cu un câmp pe nod pentru adresa de e-mail.

am implementat hook_form_alter() în fișierul meu .theme care încarcă nodul folosind $nod = \Drupal::routeMatch()->getParameter('nod');.

Apoi pot încărca nodul și pot obține adresa de e-mail adecvată și o setez în formularul web. Problema este că nodul este stocat în cache pentru utilizatorii anonimi. Nu contează pe ce nod mă aflu, $node->id() returnează întotdeauna același ID de nod stocat în cache.

Am încercat fie aceste linii, dar ID-ul nodului este în continuare același.

\Drupal::service('page_cache_kill_switch')->trigger();
$vars['#cache']['max-age'] = 0;

Înțeleg că trebuie să șterg etichetele cache și contextul cache, dar niciunul dintre exemple nu arată exact cum să fac acest lucru în hook_form_alter().

Cum pot șterge corect memoria cache?

Puncte:5
drapel cn

Când obțineți parametri de rută, aveți nevoie de acest context cache:

$form['#cache']['contexts'][] = 'rută';

De asemenea, este posibil să doriți să adăugați datele din memoria cache a nodului, astfel încât formularul să fie invalidat atunci când nodul este salvat cu o valoare de câmp diferită:

$renderer = \Drupal::service('renderer');
$renderer->addCacheableDependency($form, $node);

Contextul cache este aplicat formularului și tuturor elementelor paginii în care este plasat formularul. Deci, aceasta funcționează indiferent unde încorporați formularul.

Dacă formularul este încorporat într-un nod, obținerea nodului din potrivirea rutei nu este probabil cea mai bună idee. Ar trebui să utilizați nodul sau ID-ul nodului ca parametru atunci când apelați formularul. Apoi puteți încerca răspunsul de la @sonfd deoarece nu aveți nevoie de chei cache separate pentru nod și formular web.

drapel in
Asta a făcut-o. Mulțumesc mult!! $form['#cache']['contexts'][] = 'rută';
Puncte:3
drapel in

Problema este că formularul web este stocat în cache cu datele $node de la primul nod vizitat, dar trebuie ca formularul web să fie unic pentru fiecare nod.

Puteți dezactiva cheile cache pentru formularul dvs. web - acest lucru va împiedica cache-ul formularului web să fie singur, dar va permite totuși ca formularul web să fie stocat în cache împreună cu părintele (nodul), cu toate metadatele cache ale formularului web.

În dumneavoastră hook_form_FORM_ID_alter() (cea pe care o utilizați pentru a seta adresa de e-mail), puteți dezactiva tastele cache precum:

if (isset($form['#cache']['keys']) {
  unset($form['#cache']['keys']);
}

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.