Puncte:1

MenuLink vs MenuLinkContent - ce rost are?

drapel in

Mă chinui să aflu relația dintre MenuLink și MenuLinkContent.

Creez un nou articol de meniu, cum ar fi:

$menuItem = MenuLinkContent::create($params);

De asemenea, pot interoga acele elemente precum:

$menuItems = \Drupal::entityTypeManager()->getStorage('menu_link_content')->loadByProperties(['link.uri' => "intern:$path"]);

Și asta funcționează bine. Acum, dacă am nevoie de unul dintre acele obiecte, vreau să-i iau „frații” - alt obiect care împărtășește același părinte. Am o structură ciudată:

$this->menuLinkManager = \Drupal::service('plugin.manager.menu.link');
$parentId = $menuItem->getParentId();
$parent = $this->menuLinkManager->createInstance($this->menuLinkManager->getDefinition($parentId)['id']);

Și aici primesc părintele, dar nu mai este obiectul MenuLinkContent, ci o instanță a lui MenuLinkInterface. Are unele câmpuri ca MenuLinkContent, dar nu toate. i.e. Nu știu cum să obțin calea linkului și similar.

Acolo pot merge mai departe:

$frați = $this->menuLinkManager->getChildIds($parent->getPluginId());

Dar întrebarea principală este hCum să obțin MenuLinkContent când am acel obiect MenuLinkInterface?

Sub-intrebare - de ce oh de ce este nevoie de acest sistem de meniu paralel și de clase de meniu paralel?

Jaypan avatar
drapel de
Interfețele nu sunt obiecte, ele sunt definiția cerințelor clasei care implementează interfața. MenuLinkContent implementează MenuLinkInterface, este probabil ca obiectul cu care lucrați să fie de fapt un obiect MenuLinkContent.
4uk4 avatar
drapel cn
Consultați https://drupal.stackexchange.com/questions/259739/why-are-methods-for-going-from-the-menulinkcontent-menu-link-plugin-class-to-the
apaderno avatar
drapel us
Clasa [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9.x) implementează [`MenuLinkContent] `](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21MenuLinkInterface.php/interface/MenuLinkInterface/8.9.x) și [`ContainerFactoryPluginInterface`](https:// api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Plugin%21ContainerFactoryPluginInterface.php/interface/ContainerFactoryPluginInterface/8.9.x).
apaderno avatar
drapel us
Având în vedere că a doua interfață definește doar metoda `create()`, există vreo metodă de care aveți nevoie și care nu este definită în interfața `MenuLinkInterface`?
apaderno avatar
drapel us
(De asemenea, aveți grijă să nu confundați [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9. .x), care implementează un plugin, cu [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Entity%21MenuLinkContent.php/class/MenuLinkContent/ 8.9.x) clasă care este o clasă de entitate.)
4uk4 avatar
drapel cn
Este același lucru cu pluginurile bloc și entitățile block_content. În ambele cazuri, entitățile stocate sunt folosite pentru a deriva pluginuri.Subiectul pe care l-am legat și următorul subiect legat acolo demonstrează cum puteți determina ID-ul derivat al pluginului care este identic cu UUID-ul entității.
drapel in
Așa că am nevoie de o modalitate de a lucra cu elementele de meniu. Pentru a le crea, setați căi, greutăți, părinte, pentru a interoga părinții și copiii lor. Asta e tot. Cred că MenuLinkContent este clasa de entitate @apaderno menționată. Dar când am acel meniuLinkManager, primesc altceva.
Puncte:0
drapel cn
$frați = $this->menuLinkManager->getChildIds($parent->getPluginId());

Dar întrebarea principală este cum să obțin MenuLinkContent când am acel obiect MenuLinkInterface?

Există două tipuri de ID-uri de plugin. Fără sau cu două puncte :.

Pluginuri nederivate

Fără acestea indică direct la o singură definiție de plugin.

De exemplu, meniul de administrare

\Drupal::service('plugin.manager.menu.link')->getChildIds('system.admin');

constă în principal din linkuri de meniu nederivate pe care le găsiți în fișierele *.links.menu.yml.

Pluginuri derivate

Cu două puncte, prima parte este ID-ul pluginului de bază, iar a doua parte este ID-ul derivatului.

De exemplu, dacă ați creat un meniu principal cu mai multe niveluri din UI și aplicați această comandă pe un meniu părinte

\Drupal::service('plugin.manager.menu.link')->getChildIds('standard.front_page');

Primești link-uri ca acesta

menu_link_content:421a421a-cb1d-33e7-a810-1e7341f7906b

pentru pluginul de bază MenuLinkContent (BTW definit și în a fișier YAML) cu un derivat pentru entitățile MenuLinkContent (identificate prin UUID).

$entity = \Drupal::service('entity.repository')
  ->loadEntityByUuid('menu_link_content', '421a421a-cb1d-33e7-a810-1e7341f7906b');

Dacă aveți deja o instanță de plugin, puteți obține UUID-ul de la obiectul plugin. Vedea https://drupal.stackexchange.com/a/235769/47547

drapel in
Mulțumesc. Mi-am dat seama după ce am urmărit linkul din comentariul tău, dar cu siguranță este bine să ai un răspuns complet. IMHO, este inutil de complicat: pentru unele interogări am nevoie de manager de linkuri de meniu, pentru altele de depozitul de entități. Uneori, id-ul este doar un număr, cum ar fi un id de nod, alteori este content_type:uuid. Uneori poți accesa toate proprietățile, când nu poți. Din nou, IMHO, având un singur depozit, un singur format de id, o singură clasă și întotdeauna toate câmpurile disponibile ar face viața mult mai ușoară. Și mai rău, este greu să găsești documentația/exemplul adecvat. Iertați-mi punctul de vedere naiv.

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.