Puncte:0

Cum să utilizați hook_node_insert pentru a marca automat nodurile unui anumit tip de conținut

drapel pe

Toate nodurile de un tip de conținut din proiectul meu trebuie să fie semnalate automat (de către modulul Flags) atunci când sunt create. Sunt conștient că există probabil o modalitate de a realiza acest lucru folosind modulul Reguli, dar încerc să construiesc primul meu modul personalizat pentru a face acest lucru, deoarece a) nu cred că voi avea nevoie de reguli pentru orice altceva în acest proiect și b) vreau să-mi ud picioarele în realizarea de module personalizate. (Am un modul de bază „hello world” care funcționează.)

O solicitare de asistență în modulul Flag pare să ofere o modalitate simplă de a semnaliza automat nodurile, dar mi se pare că ar face acest lucru nodurilor de toate tipurile de conținut. https://www.drupal.org/project/flag/issues/3030288

Pentru comoditate, aici este codul acolo, pentru un steag numit marcaj...

function your_module_node_insert(Drupal\Core\Entity\EntityInterface $entity){
 $flag = \Drupal::entityTypeManager()->getStorage('flag')->load('bookmark');
 \Drupal::service('flag')->flag($flag, $entity);
}

Pagina API pentru acest hook nu pare să-mi spună ce trebuie să știu. (https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/function/hook_ENTITY_TYPE_insert/9.0.x)

Întrebări: Este acesta chiar cârligul potrivit pentru această nevoie? Dacă da, cum l-aș putea restricționa la un anumit tip de conținut?

sonfd avatar
drapel in
Consultați [documentele Node](https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Entity%21Node.php/class/Node/9.2.x). Puteți obține tipul de conținut (aka bundle) al nodului cu `$entity->bundle()`, care este generic și va funcționa pentru toate entitățile de conținut.
sea26.2 avatar
drapel om
Va ajuta acest link? https://drupal.stackexchange.com/questions/185442/how-can-i-programmatical-create-a-node
drapel pe
Acestea sunt ambele utile pentru a completa golurile. Cu experiența mea aproape de zero în lucrul cu obiecte, clase, metode etc., trebuie în principal să înțeleg sintaxa. Modul corect de a face asta este să lucrezi printr-un curs de la conceptele de bază în sus, dar, da, să cauți scurtături. Orice exemple de cod suplimentare ar fi grozave. Unii vor fi mai aproape de ceea ce încerc să fac. Pot căuta modele, apoi pot încerca și eroare în restul drumului. Probabil.
drapel pe
Am actualizat întrebarea în lumina ultimelor mele teste.
Jaypan avatar
drapel de
Ai configurat entitatea? https://git.drupalcode.org/project/flag/-/tree/8.x-4.x#configuration. Dacă nu, atunci este posibil să diagnosticați greșit problema, încercați să rulați update.php.
drapel pe
Mulțumiri. După mai multe cercetări, am stabilit că codul meu funcționează, așa că îl mut la Answer. Motivul pentru care am crezut că eșuează este că flagul implicat are un câmp de referință pentru entitate și, desigur, acest cod nu setează acel câmp. Totuși, pune steagul.
Puncte:0
drapel pe

Asta merge la mine...

„rf_tweaks” este numele mașinii modulului, „research_note” este tipul de conținut al nodului, iar „research_item” este numele steagului.

utilizați Drupal\node\Entity\Node;

funcția rf_tweaks_node_insert(Nodul $nod) {
  dacă ($nod->bundle() == 'notă_cercetare'){
 $flag = \Drupal::entityTypeManager()->getStorage('flag')->load('research_item');
 \Drupal::service('flag')->flag($flag, $node);
}
}

Pentru beneficiul altor constructori de module pentru prima dată, acesta se află în fișierul rf_tweaks.module și fișierul începe cu <?php cerute în acelea.

drapel pe
Ei bine, a funcționat, dar acum nu mai este. Erori... „Stavilul nu se aplică pachetului entității. în Drupal\flag\FlagService->flag() (linia 294 din ...modules/contrib/flag/src/FlagService.php)” urmat de „Drupal\Core\Entity\EntityStorageException: Indicatorul nu se aplică pachetului entității. în Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (linia 810 din ...core/lib/Drupal/Core /Entity/Sql/SqlContentEntityStorage.php)."
drapel pe
De fapt, încă funcționează, dar trebuie să fii sigur că tipul de conținut rămâne activat în configurația pentru acel flag. Acest lucru se datorează faptului că modulul apelează flag api. (Sau așa sunt făcut să înțeleg.)

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.