Score:1

MenuLink กับ MenuLinkContent - ประเด็นคืออะไร?

ธง in

ฉันพยายามหาความสัมพันธ์ระหว่าง MenuLink และ MenuLinkContent

ฉันกำลังสร้างรายการเมนูใหม่เช่น:

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

ฉันยังสามารถค้นหาองค์ประกอบเหล่านั้นเช่น:

$menuItems = \Drupal::entityTypeManager()->getStorage('menu_link_content')->loadByProperties(['link.uri' => "ภายใน:$path"]);

และนั่นได้ผลดี ตอนนี้ถ้าฉันต้องการหนึ่งในวัตถุเหล่านั้น ฉันอยากได้มันเป็น "พี่น้อง" - วัตถุอื่นที่ใช้พาเรนต์เดียวกัน ฉันมีโครงสร้างแปลก ๆ :

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

และที่นี่ฉันได้รับมันเป็นพาเรนต์ แต่ไม่ใช่วัตถุ MenuLinkContent อีกต่อไป แต่เป็นตัวอย่างของ MenuLinkInterface มีบางฟิลด์เป็น MenuLinkContent แต่ไม่ใช่ทั้งหมด เช่น. ฉันไม่รู้วิธีรับเส้นทางลิงก์และสิ่งที่คล้ายกัน

ฉันสามารถไปต่อได้:

$siblings = $this->menuLinkManager->getChildIds($parent->getPluginId());

แต่คำถามหลักคือ hจะได้รับ MenuLinkContent เมื่อฉันมีวัตถุ MenuLinkInterface หรือไม่

คำถามย่อย - ทำไมโอ้ทำไมระบบเมนูแบบขนานและคลาสเมนูแบบขนานจึงจำเป็น

Jaypan avatar
de flag
อินเทอร์เฟซไม่ใช่วัตถุ แต่เป็นข้อกำหนดของคลาสที่ใช้อินเทอร์เฟซ MenuLinkContent ใช้ MenuLinkInterface ซึ่งเป็นไปได้ว่าวัตถุที่คุณกำลังทำงานด้วยนั้นเป็นวัตถุ MenuLinkContent
4uk4 avatar
cn flag
ดู https://drupal.stackexchange.com/questions/259739/why-are-methods-for-going-from-the-menulinkcontent-menu-link-plugin-class-to-the
apaderno avatar
us flag
คลาส [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9.x) ใช้ [`MenuLinkInterface `](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21MenuLinkInterface.php/interface/MenuLinkInterface/8.9.x) และ [`ContainerFactoryPluginInterface`](https:// api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Plugin%21ContainerFactoryPluginInterface.php/interface/ContainerFactoryPluginInterface/8.9.x)
apaderno avatar
us flag
เนื่องจากอินเทอร์เฟซที่สองกำหนดเฉพาะเมธอด `create()` มีวิธีใดที่คุณต้องการที่ไม่ได้กำหนดไว้ในอินเทอร์เฟซ `MenuLinkInterface`
apaderno avatar
us flag
(นอกจากนี้ ระวังอย่าสับสนระหว่าง [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9 .x) คลาสที่ใช้ปลั๊กอินกับ [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Entity%21MenuLinkContent.php/class/MenuLinkContent/ 8.9.x) คลาสที่เป็นเอนทิตีคลาส)
4uk4 avatar
cn flag
ซึ่งเหมือนกับบล็อกปลั๊กอินและเอนทิตี block_content ในทั้งสองกรณี เอนทิตีที่เก็บไว้จะถูกใช้เพื่อรับปลั๊กอินหัวข้อที่ฉันเชื่อมโยงและหัวข้อถัดไปที่เชื่อมโยงนั้นแสดงให้เห็นวิธีที่คุณสามารถกำหนด ID อนุพันธ์ของปลั๊กอินซึ่งเหมือนกับ UUID ของเอนทิตี
in flag
ดังนั้นฉันต้องการวิธีการทำงานกับรายการเมนู หากต้องการสร้าง ให้กำหนดเส้นทาง น้ำหนัก พาเรนต์ ค้นหาพาเรนต์และลูกๆ นั่นคือทั้งหมด ฉันเชื่อว่า MenuLinkContent เป็นคลาสเอนทิตีที่ @apaderno กล่าวถึง แต่เมื่อฉันเมนูLinkManager ฉันได้รับอย่างอื่น
Score:0
ธง cn
$siblings = $this->menuLinkManager->getChildIds($parent->getPluginId());

แต่คำถามหลักคือวิธีรับ MenuLinkContent เมื่อฉันมีวัตถุ MenuLinkInterface นั้น

รหัสปลั๊กอินมีสองประเภท ไม่มีหรือมีเครื่องหมายทวิภาค :.

ปลั๊กอินที่ไม่ได้มา

โดยไม่ชี้ไปที่คำนิยามปลั๊กอินเดียวโดยตรง

เช่น เมนูผู้ดูแลระบบ

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

ส่วนใหญ่ประกอบด้วยลิงก์เมนูที่ไม่ได้มาซึ่ง ID ที่คุณพบในไฟล์ *.links.menu.yml

ปลั๊กอินที่ได้มา

ด้วยโคลอน ส่วนแรกคือ ID ปลั๊กอินฐาน และส่วนที่สองคือ ID อนุพันธ์

ตัวอย่างเช่น หากคุณสร้างเมนูหลักหลายระดับจาก UI และใช้คำสั่งนี้กับพาเรนต์เมนู

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

คุณได้รับลิงค์เช่นนี้

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

สำหรับปลั๊กอินฐาน MenuLinkContent (BTW ยังกำหนดในไฟล์ ไฟล์ YAML) พร้อมตัวรับสำหรับเอนทิตี MenuLinkContent (ระบุโดย UUID)

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

หากคุณมีอินสแตนซ์ปลั๊กอินอยู่แล้ว คุณสามารถรับ UUID จากวัตถุปลั๊กอินได้ ดู https://drupal.stackexchange.com/a/235769/47547

in flag
ขอขอบคุณ. ฉันคิดออกหลังจากติดตามลิงก์จากความคิดเห็นของคุณ แต่เป็นการดีที่มีคำตอบที่สมบูรณ์ IMHO มีความซับซ้อนโดยไม่จำเป็น: สำหรับบางคำถาม ฉันต้องการตัวจัดการลิงก์เมนู สำหรับที่เก็บเอนทิตีอื่นๆ บางครั้ง id เป็นเพียงตัวเลข เช่น node id แต่บางครั้งก็เป็น content_type:uuid บางครั้งคุณสามารถเข้าถึงพร็อพเพอร์ตี้ทั้งหมดได้ บางครั้งคุณก็ไม่สามารถทำได้ อีกครั้ง IMHO ที่มีที่เก็บเดียว, รูปแบบรหัสเดียว, คลาสเดียวและฟิลด์ทั้งหมดที่มีให้เสมอจะทำให้ชีวิตง่ายขึ้นมาก และที่แย่กว่านั้น การหาเอกสารประกอบ/ตัวอย่างที่เหมาะสมทำได้ยาก ให้อภัยมุมมองที่ไร้เดียงสาของฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา