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?
Vérifiez le module Éléments de menu supplémentaires .
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.
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:
Drupal\menu_link_content\Entity\MenuLinkContent
field_ui_base_route = "entity.menu.add_link_form"
à l'annotation/admin/structure/menu/manage/main/add/fields
drush cex -y
).field_ui_base_route = "entity.menu.add_link_form"
de l'annotation à Drupal\menu_link_content\Entity\MenuLinkContent
Vous pouvez utiliser Menu colossal pour ajouter le champ au lieu du module de menu principal.
"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.