Deși acesta nu este un răspuns real la întrebarea dvs. „Cum pot forța în mod programatic salvarea aspectului nodului?”, am vrut să vă îndrept către Layout Builder IPE modul, pe care l-am creat pentru a rezolva un caz de utilizare similar cu al dumneavoastră: Oferiți posibilități de editare direct din pagina de vizualizare a unui nod.
Dacă aceasta nu este o opțiune pentru dvs., atunci soluția programatică probabil evoluează în jurul:
- conectarea la formularul de trimitere
- adăugând handler-ul de trimitere personalizat
- luați configurația blocului cumva
- actualizați OverridesSectionStorage pentru nod
- salvați nodul
- ștergeți spațiul de stocare temporar pentru generatorul de aspect al nodului respectiv
Cel puțin asta îmi amintesc. În timp ce lucram la Layout Builder IPE, am găsit că întreaga structură este puțin complicată să fiu sincer, care a fost motivul principal pentru a încerca să facem acest lucru o dată într-un mod mai generic.
Actualizați
Am căutat câteva detalii suplimentare care ar putea ajuta cu asta:
Pentru a obține secțiunile pentru un nod activat pentru generatorul de aspect, puteți utiliza LayoutEntityHelperTrait::getSectionStorageForEntity, de exemplu.:
$section_storage = $this->getSectionStorageForEntity($node);
$secțiuni = $section_storage->getSections();
Acest $secţiuni
variabila este o matrice de secțiuni, fiecare secțiune conținând componente de secțiune. Puteți repeta peste ele până când găsiți blocul pe care îl căutați și faceți ceea ce trebuie să faceți pentru a actualiza configurația (cod netestat):
foreach ($secțiuni ca $delta => $secțiune) {
foreach ($secțiune->getComponents() ca $component) {
// Fiecare componentă este un obiect de tip \Drupal\layout_builder\SectionComponent.
// Pentru a identifica blocul, puteți utiliza id-ul pluginului (sau UUID-ul dacă
// există mai multe blocuri de același tip).
$plugin_id = $component->getPluginId();
dacă ($plugin_id == 'BLOCK_PLUGIN_ID') {
$configurare = $component->get('configurare');
// Actualizați configurația și apoi actualizați componenta.
$component->setConfiguration($configurare);
}
}
}
Odată ce modificările necesare au fost făcute, secțiunile pot fi salvate înapoi în nod utilizând acest lucru:
$nod->get(OverridesSectionStorage::FIELD_NAME)->setValue($sections);
Și pentru a șterge temperatura, ceva de genul acesta ar trebui să funcționeze, deși acest lucru ar trebui să folosească DI, evident:
\Drupal::service('layout_builder.tempstore_repository')->delete($section_storage);