Comment ajouter des champs aux éléments de menu

11

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 cherche une solution similaire à cette 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?

Guillaume Bois
la source
Aussi improbable que cela puisse paraître , les éléments de lien de menu personnalisés sont des entités de contenu ( api.drupal.org/api/drupal/… ). Cela signifie que vous devez utiliser un hook pour ajouter le champ (peut-être api.drupal.org/api/drupal/… ), puis exécuter une fonction de mise à jour pour mettre à jour le schéma.
Eyal

Réponses:

14

Vérifiez le module Options de menu supplémentaires .

Mykhailo Gurei
la source
2
C'est définitivement la voie à suivre, à partir de la version 2.0 de ce module, les liens de menu sont transformés en entités entièrement exploitables. Meilleure solution que le menu Colossal car elle améliore le système de menus principal au lieu de le remplacer.
Hudri
1
+1 idéal pour inclure la date du jour dans la barre de menus, par exemple
therobyouknow
1
Il y a l'article sur toutes les fonctionnalités lembergsolutions.com/blog/…
Mykhailo Gurei
11

Vous pouvez utiliser hook_entity_base_field_infopour ajouter un champ supplémentaire à l' menu_link_contententité 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 devrez hook_form_menu_link_content_menu_link_content_form_alter()ajouter un champ au formulaire.

Déchiffrer
la source
5
Vous n'êtes pas obligé d'ajouter des champs via la modification de formulaire. Vous pouvez simplement utiliser la BaseFieldDefinition->setDisplayOptions()méthode: ...->setDisplayOptions('form', [ ... ]).
milkovsky
1
Comment puis-je créer un champ d'image? Je ne trouve pas d'exemple avec ce type de champ et j'en ai besoin. Je peux voir le champ de téléchargement d'image lorsque j'utilise ceci, mais lorsque j'essaie d'enregistrer l'élément de menu, j'obtiens: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'field_menu_image__target_id' Aussi lorsque j'actualise la page pour l'ajouter forme d'élément de menu que je vois dans les journaux: Remarque: Index non défini: field_menu_image__height Remarque: Index non défini: field_menu_image__width et ainsi de suite ... Un exemple pour le type de champ d'image? Merci
blastoise
5
J'ai résolu ce problème. /update.php ne fonctionne pas, la colonne n'est donc jamais mise en caisse. J'ai utilisé drush pour mettre à jour db: drush updatedb --entity-updates
blastoise
1
Que mettez-vous dans hook_form_menu_link_content_menu_link_content_form_alter () pour ajouter le champ?
Matt
3

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_contentest 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 pour activer temporairement les champs UI pour les liens de menu:

  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. Supprimer field_ui_base_route = "entity.menu.add_link_form"de l'annotation àDrupal\menu_link_content\Entity\MenuLinkContent
  8. Reconstruisez le cache.
milkovsky
la source
J'ai essayé cette approche. Au début, cela semble bon, mais lorsque j'ai essayé de créer un nouveau champ, j'obtiens une erreur: il y a eu un problème lors de la création de l'image du menu de champ: essayez de créer un champ 'field_menu_image' sans bundle. J'essaie de réaliser cela par programme maintenant, mais il serait préférable que cela fonctionne également.
blastoise
2

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

David Barratt
la source
0

"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.

MilanG
la source
-2

Malheureusement, les développeurs principaux de Drupal 8 n'ont pas rendu les liens de menu modifiables. Il n'est donc pas possible d'ajouter des champs aux liens de menu pour l'instant.

Le constructeur de site "contourner" consiste à créer un vocabulaire personnalisé qui peut avoir des champs personnalisés.

MatthieuScarset
la source
4
Faux. MenuLinkContent est une entité de contenu champable.
milkovsky
1
Comment feriez-vous pour ajouter de nouveaux champs à MenuLinkContent?
MatthieuScarset
1
voir les réponses ci-dessus. Ils expliquent tous deux comment ajouter de nouveaux champs à MenuLinkContent.
milkovsky
2
Les extras des éléments de menu font cela drupal.org/project/menu_item_extras
Mykhailo Gurei
1
Donc, pour être clair @milkovsky True. MenuLinkContent n'est PAS une entité de contenu pouvant être mise en champ.
MatthieuScarset