Điểm:1

MenuLink so với MenuLinkContent - vấn đề là gì?

lá cờ in

Tôi đang cố gắng tìm ra mối quan hệ giữa MenuLink và MenuLinkContent.

Tôi đang tạo mục menu mới như:

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

Tôi cũng có thể truy vấn những yếu tố như:

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

Và điều đó hoạt động tốt. Bây giờ nếu tôi cần một trong những đối tượng đó, tôi muốn lấy đó là "anh chị em" - đối tượng khác có cùng cha mẹ. Tôi có một số cấu trúc kỳ lạ:

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

Và ở đây tôi nhận nó là đối tượng cha, nhưng nó không còn là đối tượng MenuLinkContent nữa mà là đối tượng của MenuLinkInterface. Nó có một số trường là MenuLinkContent, nhưng không phải tất cả. I E. Tôi không biết làm thế nào để có được đường dẫn liên kết và tương tự.

Ở đó tôi có thể đi xa hơn:

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

Nhưng câu hỏi chính là hLàm thế nào để có được MenuLinkContent khi tôi có đối tượng MenuLinkInterface đó?

Câu hỏi phụ - tại sao lại cần hệ thống menu song song này và các lớp menu song song?

Jaypan avatar
lá cờ de
Các giao diện không phải là các đối tượng, chúng là định nghĩa về các yêu cầu của lớp thực hiện giao diện. MenuLinkContent triển khai MenuLinkInterface, có khả năng đối tượng bạn đang làm việc thực sự là một đối tượng MenuLinkContent.
4uk4 avatar
lá cờ cn
Xem https://drupal.stackexchange.com/questions/259739/why-are-methods-for-going-from-the-menulinkcontent-menu-link-plugin-class-to-the
apaderno avatar
lá cờ us
Lớp [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9.x) triển khai lớp [`MenuLinkInterface `](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21MenuLinkInterface.php/interface/MenuLinkInterface/8.9.x) và [`ContainerFactoryPluginInterface`](https:// api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Plugin%21ContainerFactoryPluginInterface.php/interface/ContainerFactoryPluginInterface/8.9.x).
apaderno avatar
lá cờ us
Vì giao diện thứ hai chỉ xác định phương thức `create()`, có phương thức nào bạn cần không được xác định trong giao diện `MenuLinkInterface` không?
apaderno avatar
lá cờ us
(Ngoài ra, hãy cẩn thận để không nhầm lẫn [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9 .x), lớp này triển khai plugin, với [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Entity%21MenuLinkContent.php/class/MenuLinkContent/ 8.9.x) là một lớp thực thể.)
4uk4 avatar
lá cờ cn
Điều này cũng giống như các plugin khối và các thực thể block_content. Trong cả hai trường hợp, các thực thể được lưu trữ được sử dụng để lấy các plugin.Chủ đề tôi đã liên kết và chủ đề tiếp theo được liên kết ở đó minh họa cách bạn có thể xác định ID dẫn xuất của plugin giống hệt với UUID thực thể.
lá cờ in
Vì vậy, tôi cần một cách để làm việc với các mục menu. Để tạo chúng, hãy đặt đường dẫn, trọng số, cha mẹ, để truy vấn cha mẹ và con cái của chúng. Đó là tất cả. Tôi tin rằng MenuLinkContent là lớp thực thể mà @apaderno đã đề cập. Nhưng khi tôi mà menuLinkManager tôi nhận được một cái gì đó khác.
Điểm:0
lá cờ cn
$siblings = $this->menuLinkManager->getChildIds($parent->getPluginId());

Nhưng câu hỏi chính là làm cách nào để lấy MenuLinkContent khi tôi có đối tượng MenuLinkInterface đó?

Có hai loại ID plugin. Không có hoặc có dấu hai chấm :.

plugin không có nguồn gốc

Không có chúng trỏ trực tiếp đến một định nghĩa plugin duy nhất.

Ví dụ: menu quản trị

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

chủ yếu bao gồm các liên kết menu không có nguồn gốc mà ID bạn tìm thấy trong các tệp *.links.menu.yml.

plugin có nguồn gốc

Với dấu hai chấm, phần đầu tiên là ID plugin cơ sở và phần thứ hai là ID phái sinh.

Ví dụ: nếu bạn đã tạo menu chính đa cấp từ giao diện người dùng và áp dụng lệnh này trên menu cha

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

Bạn nhận được các liên kết như thế này

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

cho plugin cơ sở MenuLinkContent (BTW cũng được xác định trong tệp YAML) với trình dẫn xuất cho các thực thể MenuLinkContent (được xác định bởi UUID).

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

Nếu bạn đã có phiên bản plugin, bạn có thể lấy UUID từ đối tượng plugin. Nhìn thấy https://drupal.stackexchange.com/a/235769/47547

lá cờ in
Cảm ơn bạn. Tôi đã tìm ra nó sau khi theo liên kết từ nhận xét của bạn nhưng thật tốt khi có câu trả lời đầy đủ. IMHO phức tạp không cần thiết: đối với một số truy vấn, tôi cần trình quản lý liên kết menu, đối với kho lưu trữ thực thể khác. Đôi khi id chỉ là một số, giống như id nút, lúc khác lại là content_type:uuid. Đôi khi bạn có thể truy cập tất cả các thuộc tính, đôi khi bạn không thể. Một lần nữa, IMHO có một kho lưu trữ duy nhất, định dạng id duy nhất, một lớp duy nhất và luôn có sẵn tất cả các trường sẽ giúp cuộc sống dễ dàng hơn nhiều. Và tệ hơn, thật khó để tìm tài liệu/ví dụ thích hợp. Tha thứ cho quan điểm ngây thơ của tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.