Puncte:0

Setați descrierea linkului meniu în hook_entity_presave()

drapel cn

Cum actualizez descrierea link-ului meniului cu hook_ENTITY_TYPE_presave()?

Pot imprima titlul link-ului meniu și descrierea link-ului meniu cu următorul cod.

kint($entity->meniu['titlu']);  
kint($entity->meniu['descriere']);

Vreau să actualizez descrierea linkului de meniu doar când titlul linkului de meniu nu este NULL, așa că linkul de meniu va exista. De fapt, vreau să copiez titlul linkului de meniu în descrierea linkului de meniu (când titlul linkului de meniu nu este gol).

Următorul cod actualizează titlul nodului, dar aș dori să știu cum să actualizez descrierea link-ului meniului.

/**
 * Implementează hook_ENTITY_TYPE_presave().
 */
funcția hook_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  
  if ($entity->bundle() == 'pagina') {

    // salvează o valoare diferită ca titlu
    $entity->title = 'Titlu nou';

    // Următorul de mai jos afișează „titlul” și „descrierea” linkului de meniu
    kint($entity->meniu['titlu']);
    kint($entity->meniu['descriere']);

    // cum actualizez descrierea meniului?
    // cele de mai jos nu funcționează?
    $entity->menu['description'] = "Noua descriere a link-ului meniului";
    
  }
}
Puncte:0
drapel in

Link-urile de meniu sunt entități în sine. Cu excepția cazului în care ați făcut ceva special pentru a crea un nou tip de entitate de link pentru meniu, acestea vor fi tip de entitate menu_link_content.

Poți să folosești hook_ENTITY_TYPE_presave() pentru a vă face schimbarea. Rețineți că atunci când vedeți o secțiune cu majuscule a unui cârlig, înseamnă că ar trebui înlocuită cu o anumită valoare, de ex. hook_node_presave() sau hook_menu_link_content_presave(). Diferența dintre acestea și hook_entity_presave() este că acesta din urmă va trage când orice entitatea este salvată, în timp ce cârligele specifice tipului de entitate se vor declanșa numai atunci când o entitate de acel tip specific este salvată.

Având în vedere toate acestea, ceva de genul următor ar trebui să funcționeze:

// Începutul fișierului.
utilizați Drupal\menu_link_content\MenuLinkContentInterface;

/**
 * Asigurați-vă că orice link de meniu cu un titlu are o descriere care se potrivește.
 *
 * Implementează hook_ENTITY_TYPE_presave().
 */
MY_MODULE_menu_link_content_presave(MenuLinkContentInterface $menu_link) {
  dacă (!$menu_link->titlu->isEmpty()) {
    $menu_link->set('descriere', $menu_link->titlu->valoare);
  }
}
websoft avatar
drapel cn
Bună, mulțumesc foarte mult. Am încercat cele de mai sus, dar primesc următoarea eroare?
websoft avatar
drapel cn
TypeError: Argumentul 1 transmis la addmenudesc_menu_link_content_presave() trebuie să fie o instanță a Drupal\menu_link_content\Entity\MenuLinkContentInterface, o instanță a Drupal\menu_link_content\Entity\MenuLinkContent dat în addmenudesc_menu_link_content/1velink_dev. /craftedbydesign/web/modules/custom/addmenudesc/addmenudesc.module)
websoft avatar
drapel cn
Am folosit funcția addmenudesc_menu_link_content_presave($menu_link) { } și acum pare să funcționeze perfect. Am omis MenuLinkContentInterface? Există vreun motiv pentru care ar trebui să aibă MenuLinkContentInterface?
sonfd avatar
drapel in
Oh, greseala mea. Am greșit calea pentru clasa MenuLinkContentInterface. Am actualizat răspunsul - declarația de utilizare corectă este `utilizați Drupal\menu_link_content\MenuLinkContentInterface;`
sonfd avatar
drapel in
Este util să tastați parametrii atunci când puteți. Un efect secundar este că vă ajută IDE-ul să știe care este variabila, dar, mai important, vă asigurați că variabila transmisă funcției este de tipul la care funcția se așteaptă (sau erori).Există câteva puncte frumoase despre [Când ar trebui să folosesc indicația de tip în PHP] (https://stackoverflow.com/questions/536514/when-should-i-use-type-hinting-in-php)

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.