Điểm:0

Đặt mô tả liên kết menu trong hook_entity_presave()

lá cờ cn

Làm cách nào để cập nhật mô tả liên kết menu với hook_ENTITY_TYPE_presave()?

Tôi có thể in tiêu đề liên kết menu và mô tả liên kết menu bằng đoạn mã sau.

kint($entity->menu['title']);  
kint($entity->menu['description']);

Tôi chỉ muốn cập nhật mô tả liên kết menu khi tiêu đề liên kết menu không phải là NULL để liên kết menu sẽ tồn tại. Trên thực tế, tôi muốn sao chép tiêu đề liên kết menu vào mô tả liên kết menu (khi tiêu đề liên kết menu không trống).

Đoạn mã sau cập nhật tiêu đề nút, nhưng tôi muốn biết cách cập nhật mô tả liên kết menu.

/**
 * Triển khai hook_ENTITY_TYPE_presave().
 */
function hook_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  
  if ($entity->bundle() == 'trang') {

    // lưu một giá trị khác làm tiêu đề
    $entity->title = 'Tiêu đề Mới';

    // Phần bên dưới xuất ra 'tiêu đề' và 'mô tả' của liên kết menu
    kint($entity->menu['title']);
    kint($entity->menu['description']);

    // làm cách nào để cập nhật mô tả menu?
    // bên dưới không hoạt động?
    $entity->menu['description'] = "Mô tả liên kết menu mới";
    
  }
}
Điểm:0
lá cờ in

Bản thân các liên kết menu là các thực thể. Trừ khi bạn đã làm điều gì đó đặc biệt để tạo loại thực thể liên kết menu mới, chúng sẽ là loại thực thể menu_link_content.

Bạn có thể dùng hook_ENTITY_TYPE_presave() để thực hiện thay đổi của bạn. Lưu ý rằng khi bạn nhìn thấy phần viết hoa toàn bộ của móc, điều đó có nghĩa là phần đó phải được thay thế bằng một giá trị cụ thể, ví dụ: hook_node_presave() hoặc hook_menu_link_content_presave(). Sự khác biệt giữa những điều này và hook_entity_presave() là cái sau sẽ kích hoạt khi không tí nào thực thể được lưu, trong khi các hook cụ thể của loại thực thể sẽ chỉ kích hoạt khi một thực thể thuộc loại cụ thể đó được lưu.

Với tất cả những điều này, một cái gì đó như sau sẽ hoạt động:

// Đầu tệp.
sử dụng Drupal\menu_link_content\MenuLinkContentInterface;

/**
 * Đảm bảo rằng bất kỳ liên kết menu nào có tiêu đề đều có mô tả phù hợp.
 *
 * Triển khai hook_ENTITY_TYPE_presave().
 */
MY_MODULE_menu_link_content_presave(MenuLinkContentInterface $menu_link) {
  if (!$menu_link->title->isEmpty()) {
    $menu_link->set('description', $menu_link->title->value);
  }
}
websoft avatar
lá cờ cn
Xin chào, cảm ơn rất nhiều. Tôi đã thử ở trên nhưng tôi gặp lỗi sau?
websoft avatar
lá cờ cn
TypeError: Đối số 1 được chuyển đến addmenudesc_menu_link_content_presave() phải là phiên bản của Drupal\menu_link_content\Entity\MenuLinkContentInterface, phiên bản của Drupal\menu_link_content\Entity\MenuLinkContent được cung cấp trong addmenudesc_menu_link_content_presave() (dòng 11 của /Users/mikereid/Sites/dev/d8 /craftedbydesign/web/modules/custom/addmenudesc/addmenudesc.module)
websoft avatar
lá cờ cn
Tôi đã sử dụng hàm addmenudesc_menu_link_content_presave($menu_link) { } và bây giờ nó hoạt động hoàn hảo. Tôi đã bỏ qua MenuLinkContentInterface? Có lý do nào khiến nó phải có MenuLinkContentInterface không?
sonfd avatar
lá cờ in
Ồ, lỗi của tôi. Tôi đã nhầm đường dẫn cho lớp MenuLinkContentInterface. Tôi đã cập nhật câu trả lời - câu lệnh sử dụng chính xác là `use Drupal\menu_link_content\MenuLinkContentInterface;`
sonfd avatar
lá cờ in
Sẽ rất hữu ích nếu bạn nhập các tham số của mình khi có thể. Một tác dụng phụ là nó giúp IDE của bạn biết biến đó là gì, nhưng quan trọng hơn là nó đảm bảo rằng biến được truyền cho hàm là loại mà hàm mong đợi (hoặc lỗi).Có một số điểm thú vị về [Khi nào tôi nên sử dụng gợi ý kiểu trong PHP](https://stackoverflow.com/questions/536514/when-nên-i-use-type-hinting-in-php)

Đă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.