Cách thêm các trường vào các mục menu


11

Tôi cần xây dựng một menu chính là một tập hợp con của menu thông thường. Nhóm thiết kế nghĩ rằng sẽ tốt hơn cho người dùng khi chỉ có các liên kết quan trọng nhất trong menu chính và không có mọi thứ. Một số liên kết là menu cấp cao nhất và một số là menu phụ. Đối với điều này, tôi đã hy vọng có thể thêm một trường vào biểu mẫu mục liên kết trình đơn dưới dạng thả xuống. Khi tạo liên kết, người dùng có thể sử dụng danh sách thả xuống này để "quảng báToMainMothyAsBigLink" hoặc "thăng cấpMainMothyAsSmallLink" hoặc không để không hiển thị mục trên menu chính.

Tôi đang tìm kiếm một giải pháp tương tự như giải pháp Drupal 7 này nhưng cho Drupal 8.

Tôi đã hy vọng có thể thêm một cột trong bảng menu_link_content_data bên cạnh 'được mở rộng'. Tôi đã hy vọng không phải ghi thông tin này vào một bảng khác như thể hiện trong giải pháp d7.

Tôi đã có thể thêm một trường vào biểu mẫu liên kết trong mô-đun tùy chỉnh mà tôi xây dựng, chỉ với mục đích thử nghiệm, tôi chỉ thêm một trường văn bản để bắt đầu:

custom_menu.module:

function custom_menu_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if($form_id == 'menu_link_content_menu_link_content_form') {
    $form['promoteToMainMenu'] = array(
      '#type' => 'textfield',
      '#title' => t('Promote to main menu'),
      '#description' => t('Promote link menu to main menu.'),
      '#default_value' => '',
      '#weight' => -9
    );
  }
}

Trường thực sự được hiển thị trong các hình thức liên kết nhưng nó không bao giờ được ghi lại.

Ai đó có thể giúp tôi với điều này?


Nghe có vẻ không ổn, các mục liên kết menu tùy chỉnh là các thực thể nội dung ( api.drupal.org/api/drupal/ mẹo ). Điều đó có nghĩa là bạn cần sử dụng một hook để thêm trường (có thể là api.drupal.org/api/drupal/ mẹo ) và sau đó chạy một hàm cập nhật để cập nhật lược đồ.
Mắt

Câu trả lời:


13

Kiểm tra mô-đun Menu Item Extras .


2
Đây chắc chắn là con đường để đi, vì phiên bản v2.0 của mô-đun này biến các liên kết menu thành các mục hoàn toàn có thể thực hiện được. Giải pháp tốt hơn so với menu Colossal vì nó tăng cường hệ thống menu cốt lõi thay vì thay thế nó.
Hudri

1
Ví dụ, +1 tuyệt vời để bao gồm ngày hôm nay trong thanh menu, ví dụ
trị liệu

1
Có bài viết về tất cả các tính năng lpricesolutions.com/blog/ Kẻ
Mykhailo Gurei

11

Bạn có thể sử dụng hook_entity_base_field_infođể thêm một trường bổ sung vào menu_link_contentthực thể với mã sau:

/**
 * Implements hook_entity_base_field_info().
 */
function HOOK_entity_base_field_info(EntityTypeInterface $entity_type) {
  $fields = [];

  if ($entity_type->id() == 'menu_link_content') {
    $fields['FIELD_NAME'] = BaseFieldDefinition::create('FIELD_TYPE')
      ->setLabel(t('FIELD_LABEL'))
      ->setDescription(t('FIELD_DESCRIPTION '))
      ->setDisplayOptions('form',array('type' => 'FIELD_TYPE', 'weight' => 0));
  }

  return $fields;
}

Xem https://www.drupal.org/docs/8/api/entity-api/defining-and-USE-content-entity-field-def địnhs để biết thêm chi tiết về BaseFieldDefinition.

Sau đó, bạn sẽ cần hook_form_menu_link_content_menu_link_content_form_alter()thêm một trường vào biểu mẫu.


5
Bạn không phải thêm các trường thông qua thay đổi hình thức. Bạn chỉ có thể sử dụng BaseFieldDefinition->setDisplayOptions()phương pháp : ...->setDisplayOptions('form', [ ... ]).
milkovsky

1
Làm thế nào tôi có thể tạo trường hình ảnh? Tôi không thể tìm thấy ví dụ với loại trường này và tôi cần nó. Tôi có thể thấy trường tải lên hình ảnh khi sử dụng nhưng khi tôi cố lưu mục menu tôi nhận được: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định 'field_menu_image__target_id' biểu mẫu mục menu tôi thấy trong nhật ký: Thông báo: Chỉ mục không xác định: field_menu_image__height Thông báo: Chỉ mục không xác định: field_menu_image__ference, v.v ... Có ví dụ nào cho loại trường hình ảnh không? Cảm ơn
nổ

5
Tôi đã giải quyết vấn đề này. /update.php không hoạt động nên cột không bao giờ được đóng. Tôi đã sử dụng drush để cập nhật db: drush updatedb --entity động cập nhật
Blastoise

1
Bạn đặt gì vào hook_form_menu_link_content_menu_link_content_form_alter () để thêm trường?
Matt

3

Thật không may, thực sự không có giao diện người dùng cho các liên kết menu theo mặc định trong Drupal 8 như @MatthieuScarset nói. Nhưng menu_link_contentlà một thực thể nội dung trong Drupal 8, vì vậy có thể thêm các trường vào nó.

Tùy chọn # 1 Tất nhiên bạn có thể thực hiện theo chương trình như @Decodes đề xuất.

Tùy chọn # 2 Nhưng có một cách giải quyết khác để cho phép các trường UI cho các liên kết menu tạm thời:

  1. Mở Drupal\menu_link_content\Entity\MenuLinkContent
  2. Thêm field_ui_base_route = "entity.menu.add_link_form"vào chú thích
  3. Xây dựng lại bộ đệm
  4. Chuyến thăm /admin/structure/menu/manage/main/add/fields
  5. Quản lý tất cả các lĩnh vực của bạn, hiển thị
  6. Xuất cấu hình trang web của bạn ( drush cex -y).
  7. Xóa field_ui_base_route = "entity.menu.add_link_form"khỏi chú thích tạiDrupal\menu_link_content\Entity\MenuLinkContent
  8. Xây dựng lại bộ nhớ cache.

Tôi đã thử phương pháp này. Lúc đầu có vẻ tốt, nhưng khi tôi cố gắng tạo trường mới, tôi gặp lỗi: Có một vấn đề khi tạo trường Hình ảnh menu: Cố gắng tạo trường 'field_menu_image' mà không có gói. Tôi đang cố gắng để đạt được điều này theo lập trình bây giờ, nhưng sẽ tốt hơn nếu điều này cũng có thể làm việc.
nổ


-2

Thật không may, các nhà phát triển lõi 8 của Drupal đã không tạo được các liên kết Menu. Vì vậy, hiện tại không thể thêm các trường vào liên kết menu.

Trình tạo trang web "làm việc xung quanh" là tạo ra một từ vựng tùy chỉnh có thể có các trường tùy chỉnh.


4
Sai lầm. MenuLinkContent là một thực thể nội dung có thể thực hiện được.
milkovsky

1
Bạn sẽ làm thế nào để thêm các trường mới vào MenuLinkContent?
MatthieuScarset

1
xem câu trả lời ở trên Cả hai đều giải thích cách thêm các trường mới vào MenuLinkContent.
milkovsky

2
Mục menu Extras làm điều đó drupal.org/project/menu_item_extras
Mykhailo Gurei

1
Vì vậy, để rõ ràng @milkovsky Đúng. MenuLinkContent KHÔNG phải là một thực thể nội dung có thể thực hiện được.
MatthieuScarset
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.