Как добавить поля в пункты меню

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/… ), а затем запустить функцию обновления для обновления схемы.
Эяль

Ответы:

14

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

Михаил Гурей
источник
2
Это определенно верный путь, так как в версии 2.0 этого модуля ссылки на меню превращаются в полностью настраиваемые объекты. Лучшее решение, чем меню Colossal, потому что оно улучшает систему основного меню, а не заменяет ее.
Худри
1
+1 отлично
подходит
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 и т. д. ... Любой пример для типа поля изображения? Спасибо
бластуз
5
Я решил эту проблему. /update.php не работает, поэтому столбец никогда не создается. Я использовал drush для обновления db: drush updatedb --entity-updates
blastoise
1
Что вы положили в hook_form_menu_link_content_menu_link_content_form_alter (), чтобы добавить поле?
Мэтт
3

К сожалению, в Drupal 8 пользовательский интерфейс полей для ссылок меню по умолчанию отсутствует, как сказал @MatthieuScarset. Но 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' без пакета. Сейчас я пытаюсь достичь этого программно, но было бы лучше, если бы это тоже сработало.
бластуаз
2

Вы можете использовать Colossal Menu для добавления поля вместо основного модуля Menu.

Дэвид Барратт
источник
0

«Дополнения к пунктам меню» - один из способов добиться этого, как предложил @Mykhailo Gurei.

Но в моем случае мне пришлось добавить дополнительные поля и использовать модуль Mega menu. Я использовал «У нас мегаменю» и с ним «Дополнения пункта меню» не работает. Просто меню не отображается на внешней стороне (некоторые шаблоны переопределяют проблему).

Так что другой вариант, который работает с «We mega menu», это «Поля содержимого пункта меню»:

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

Имеет ту же функциональность и не конфликтует с модулем We mega menu.

MilanG
источник
-2

К сожалению, разработчики ядра Drupal 8 не сделали поля меню доступными для использования. Так что пока нельзя добавлять поля в ссылки меню.

Конструктор сайтов «обходной путь» заключается в создании пользовательского словаря, который может иметь настраиваемые поля.

MatthieuScarset
источник
4
Неправильно. MenuLinkContent является полемируемым объектом содержимого.
Милковский
1
Как бы вы добавили новые поля в MenuLinkContent?
Матье
1
см. ответы выше. Они оба объясняют, как добавить новые поля в MenuLinkContent.
Милковский
2
Дополнительные пункты
Михаил Гурей
1
Так что, чтобы быть ясно, @milkovsky Правда. MenuLinkContent НЕ является полемируемым объектом содержимого.
MatthieuScarset