web-dev-qa-db-fra.com

Comment ajouter des champs aux éléments de menu

J'ai besoin de construire un menu principal qui est un sous-ensemble du menu régulier. L'équipe de conception pense qu'il serait préférable pour l'utilisateur de n'avoir que les liens les plus importants dans le menu principal et de ne pas tout avoir. Certains liens sont des menus de niveau supérieur et certains sont des sous-menus. Pour cela, j'espérais pouvoir ajouter un champ au formulaire d'élément de lien de menu sous forme de liste déroulante. Lors de la création d'un lien, l'utilisateur peut utiliser cette liste déroulante pour "promouvoirToMainMenuAsBigLink" ou "promouvoirToMainMenuAsSmallLink" ou n'en laisser aucun pour ne pas afficher l'élément dans le menu principal.

Je recherche une solution similaire à celle-ci solution Drupal 7 mais pour Drupal 8.

J'espérais pouvoir ajouter une colonne dans la table menu_link_content_data à côté de 'expand'. J'espérais ne pas avoir à enregistrer ces informations dans un autre tableau comme indiqué dans la solution d7.

J'ai pu ajouter un champ au formulaire de lien dans un module personnalisé que je construis, juste à des fins de test, j'ai seulement ajouté un champ de texte pour commencer:

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

Le champ est en effet affiché dans le formulaire de lien mais il n'est jamais enregistré.

Quelqu'un peut il m'aider avec ça?

11
Guillaume Bois
14
Mykhailo Gurei

Vous pouvez utiliser hook_entity_base_field_info Pour ajouter un champ supplémentaire à l'entité menu_link_content Avec le code suivant:

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

Voir https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions pour plus de détails sur BaseFieldDefinition.

Après quoi, vous aurez besoin de hook_form_menu_link_content_menu_link_content_form_alter() pour ajouter un champ au formulaire.

11
Decipher

Malheureusement, il n'y a en effet aucun champ UI pour les liens de menu par défaut dans Drupal 8 comme l'a dit @MatthieuScarset. Mais menu_link_content est une entité de contenu dans Drupal 8, il est donc possible d'y ajouter des champs.

Option # 1 Bien sûr, vous pouvez le faire par programme comme l'a suggéré @Decipher.

Option # 2 Mais il existe une autre solution de contournement pour activer les champs UI pour les liens de menu temporaires:

  1. Ouvert Drupal\menu_link_content\Entity\MenuLinkContent
  2. Ajouter field_ui_base_route = "entity.menu.add_link_form" à l'annotation
  3. Reconstruire le cache
  4. Visite /admin/structure/menu/manage/main/add/fields
  5. Gérez tous vos champs, affiche
  6. Exportez la configuration de votre site (drush cex -y).
  7. Retirer field_ui_base_route = "entity.menu.add_link_form" de l'annotation à Drupal\menu_link_content\Entity\MenuLinkContent
  8. Reconstruisez le cache.
3
milkovsky

Vous pouvez utiliser Menu colossal pour ajouter le champ au lieu du module de menu principal.

2
David Barratt

"Extras des éléments de menu" est un moyen d'y parvenir, comme l'a suggéré @Mykhailo Gurei.

Mais dans mon cas, j'ai dû ajouter des champs supplémentaires et utiliser le module de menu Mega. J'utilisais "We mega menu" et avec lui "Menu item extras" ne fonctionne pas. Le menu simple n'est pas affiché sur le front-end (certains modèles remplacent le problème).

Donc, une autre option qui fonctionne avec "We mega menu" est "Field item content fields":

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

A la même fonctionnalité et n'a pas de conflit avec le module de menu We mega.

0
MilanG