Як додати поля до пунктів меню


11

Мені потрібно створити головне меню, яке є підмножиною звичайного меню. Команда дизайнерів вважає, що користувачеві було б краще мати лише найважливіші посилання в головному меню, а не мати все. Деякі посилання - це меню верхнього рівня, а деякі - підменю. Для цього я сподівався, що зможу додати поле до форми пункту посилання меню у вигляді спадного меню. Під час створення посилання користувач може використовувати це спадне меню для "promoToMainMenuAsBigLink" або "promoToMainMenuAsSmallLink" або залишити жодне, щоб цей пункт не відображався в головному меню.

Я шукаю подібне рішення, як це рішення Drupal 7, але для Drupal 8.

Я сподівався, що зможу додати стовпчик у таблицю menu_link_content_data поруч із "розширеним". Я сподівався не зафіксувати цю інформацію в іншій таблиці, як показано в рішенні d7.

Мені вдалося додати поле до форми посилання у створеному спеціально створеному модулі, лише з метою тестування я лише додав текстове поле для початку:

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
    );
  }
}

Поле дійсно відображається у формі посилання, але воно ніколи не записується.

Може хтось мені допоможе в цьому?


Як би це не здавалося, користувацькі елементи посилань меню - це об'єкти вмісту ( api.drupal.org/api/drupal/… ). Це означає, що вам потрібно використовувати гачок, щоб додати поле (можливо, api.drupal.org/api/drupal/… ), а потім запустити функцію оновлення для оновлення схеми.
Eyal

Відповіді:


14

Перевірте модуль пункту меню Додатки .


2
Це, безумовно, шлях, оскільки версія v2.0 цього модуля перетворює посилання меню на повністю переборливі елементи. Краще рішення, ніж колосальне меню, оскільки воно покращує систему основного меню замість заміни.
Худрі

1
+1 відмінно підходить для включення сьогоднішньої дати в рядок меню, наприклад
therobyouknow

1
Там є стаття про всі можливості lembergsolutions.com/blog/…
Михайло Гурей

11

Ви можете використовувати hook_entity_base_field_infoдля додавання додаткового поля до menu_link_contentоб'єкта із наступним кодом:

/**
 * 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;
}

Див https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions для більш докладної інформації BaseFieldDefinition.

Після цього вам потрібно hook_form_menu_link_content_menu_link_content_form_alter()буде додати поле до форми.


5
Не потрібно додавати поля за допомогою зміни форми. Ви можете просто використовувати BaseFieldDefinition->setDisplayOptions()метод: ...->setDisplayOptions('form', [ ... ]).
мілковський

1
Як я можу створити поле зображення? Я не можу знайти приклад із цим типом поля, і мені це потрібно. Я можу побачити поле для завантаження зображень при використанні цього, але коли я намагаюся зберегти пункт меню, я отримую: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Стовпець не знайдено: 1054 Невідомий стовпець 'field_menu_image__target_id' Також коли я оновлюю сторінку для додавання Форма елемента меню, яку я бачу в журналах: Примітка: Не визначений індекс: field_menu_image__height Примітка: Не визначений індекс: field_menu_image__width і так далі ... Будь-який приклад для типу поля зображення? Спасибі
blastoise

5
Я вирішив цю проблему. /update.php не працює, тому стовпець ніколи не буде розміщено. Я використовував drush для оновлення db: drush updatedb --entity-updates
blastoise

1
Що ви вводите у гачку_форму_меню_схили_контакт_меню_схилу_конт_форма_форма (), щоб додати поле?
Метт

3

На жаль, в Drupal 8, як зазначає @MatthieuScarset, інтерфейс полів для посилань на меню за замовчуванням в Drupal 8 за замовчуванням не існує. Але menu_link_contentце суб'єкт вмісту в Drupal 8, тому до нього можна додати поля.

Варіант №1 Звичайно, це можна зробити програмно, як запропонував @Decipher.

Варіант №2. Але є ще одне вирішення для включення інтерфейсу полів для тимчасових посилань меню:

  1. відчинено Drupal\menu_link_content\Entity\MenuLinkContent
  2. Додайте field_ui_base_route = "entity.menu.add_link_form"до примітки
  3. Перебудувати кеш
  4. Відвідати /admin/structure/menu/manage/main/add/fields
  5. Керуйте всіма своїми полями, дисплеями
  6. Експортуйте конфігурацію свого сайту ( drush cex -y).
  7. Видаліть field_ui_base_route = "entity.menu.add_link_form"із примітки оDrupal\menu_link_content\Entity\MenuLinkContent
  8. Перебудувати кеш.

Я спробував такий підхід. Спочатку це виглядає добре, але коли я намагався створити нове поле, я отримую помилку: виникла проблема зі створенням образу меню Меню: Спроба створити поле 'field_menu_image' без розшарування. Я зараз намагаюся цього досягти програмно, але було б краще, якби це теж могло працювати.
вибух


0

"Екстри пункту меню" - це один із способів цього досягти, як запропонував @Mykhailo Gurei.

Але в моєму випадку мені довелося додати додаткові поля та використовувати модуль меню Mega. Я використовував "Ми мега-меню", а з ним "Додаткові елементи меню" не працюють. Меню просто не відображається на передній панелі (деякі шаблони перевизначають проблему).

Отже, інший варіант, який працює з "Ми мега-меню", є "Поля вмісту пункту меню":

https://www.drupal.org/project/menu_item_fields

Має таку ж функціональність і не суперечить мега-модулю We.


-2

На жаль, розробники основних ядер Drupal 8 не зробили посилання на меню надійними. Так що наразі неможливо додати поля до посилань на меню.

Розробник сайту "обіймає" - це створити власну лексику, яка може мати власні поля.


4
Неправильно. MenuLinkContent - це об'єкт змістовного вмісту.
мілковський

1
Як би ви зробили, щоб додати нові поля до MenuLinkContent?
MatthieuScarset

1
див. відповіді вище. Вони обидва пояснюють, як додати нові поля до MenuLinkContent.
мілковський

2
Пункт меню Додаткові елементи роблять це drupal.org/project/menu_item_extras
Михайло Гурей

1
Тож щоб було зрозуміло @milkovsky Правда. MenuLinkContent НЕ є об'єктом вмісту, який можна заповнити.
MatthieuScarset
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.