Come aggiungere campi alle voci di menu


11

Devo creare un menu principale che sia un sottoinsieme del menu normale. Il team di progettazione ritiene che sarebbe meglio per l'utente avere solo i collegamenti più importanti nel menu principale e non avere tutto. Alcuni collegamenti sono menu di livello superiore e alcuni sono sottomenu. Per questo speravo di poter aggiungere un campo al modulo di voce di collegamento del menu come un menu a discesa. Quando si crea un collegamento, l'utente può utilizzare questo menu a discesa per "promotionToMainMenuAsBigLink" o "promotionToMainMenuAsSmallLink" o lasciare nessuno per non mostrare l'elemento nel menu principale.

Sto cercando una soluzione simile a questa soluzione Drupal 7 ma per Drupal 8.

Speravo di poter aggiungere una colonna nella tabella menu_link_content_data accanto a "espanso". Speravo di non dover registrare queste informazioni in un'altra tabella come mostrato nella soluzione d7.

Sono stato in grado di aggiungere un campo al modulo di collegamento in un modulo personalizzato che ho creato, solo a scopo di test ho aggiunto solo un campo di testo per iniziare:

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

Il campo è effettivamente mostrato nel modulo di collegamento ma non viene mai registrato.

Qualcuno può aiutarmi con questo?


Per quanto sembri improbabile, le voci di collegamento al menu personalizzate sono entità di contenuto ( api.drupal.org/api/drupal/… ). Ciò significa che è necessario utilizzare un hook per aggiungere il campo (forse api.drupal.org/api/drupal/… ) e quindi eseguire una funzione di aggiornamento per aggiornare lo schema.
Eyal,

Risposte:


14

Controllare il modulo Extra voce di menu .


2
Questa è sicuramente la strada da percorrere, a partire dalla versione 2.0 di questo modulo trasforma i collegamenti di menu in entità completamente fieldable. Soluzione migliore del menu Colossal perché migliora il sistema di menu principale invece di sostituirlo.
Hudri,

1
+1 ottimo per includere la data di oggi nella barra dei menu, ad esempio
therobyouknow

1
C'è l'articolo su tutte le funzionalità lembergsolutions.com/blog/…
Mykhailo Gurei,

11

È possibile utilizzare hook_entity_base_field_infoper aggiungere un campo aggiuntivo menu_link_contentall'entità con il seguente codice:

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

Vedi https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions per maggiori dettagli su BaseFieldDefinition.

Dopodiché, dovrai hook_form_menu_link_content_menu_link_content_form_alter()aggiungere un campo al modulo.


5
Non è necessario aggiungere campi tramite la modifica del modulo. Si può semplicemente utilizzare il BaseFieldDefinition->setDisplayOptions()metodo: ...->setDisplayOptions('form', [ ... ]).
milkovsky,

1
Come posso creare un campo immagine? Non riesco a trovare un esempio con questo tipo di campo e ne ho bisogno. Riesco a vedere il campo di caricamento dell'immagine quando lo utilizzo, ma quando provo a salvare la voce di menu ottengo: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Colonna non trovata: 1054 Colonna sconosciuta 'field_menu_image__target_id' Anche quando aggiorno la pagina per aggiungere modulo voce di menu che vedo nei registri: Avviso: indice indefinito: field_menu_image__height Avviso: indice indefinito: field_menu_image__width e così via ... Qualche esempio per il tipo di campo immagine? Grazie
blastoise il

5
Ho risolto questo problema. /update.php non funziona, quindi la colonna non viene mai creata. Ho usato drush per aggiornare db: drush updatedb --entity-updates
blastoise

1
Cosa inserisci in hook_form_menu_link_content_menu_link_content_form_alter () per aggiungere il campo?
Matt,

3

Sfortunatamente in Drupal 8 non ci sono effettivamente campi UI per i collegamenti di menu, come diceva @MatthieuScarset. Ma menu_link_contentè un'entità di contenuto in Drupal 8, quindi è possibile aggiungere campi ad essa.

Opzione n. 1 Naturalmente puoi farlo programmaticamente come suggerito da @Decipher.

Opzione n. 2 Ma esiste un'altra soluzione alternativa per abilitare l'interfaccia utente dei campi per i collegamenti di menu temporanei:

  1. Aperto Drupal\menu_link_content\Entity\MenuLinkContent
  2. Aggiungi field_ui_base_route = "entity.menu.add_link_form"all'annotazione
  3. Ricostruisci cache
  4. Visitare /admin/structure/menu/manage/main/add/fields
  5. Gestisci tutti i tuoi campi, display
  6. Esporta la configurazione del tuo sito ( drush cex -y).
  7. Rimuovi field_ui_base_route = "entity.menu.add_link_form"dall'annotazione all'indirizzoDrupal\menu_link_content\Entity\MenuLinkContent
  8. Ricostruisci cache.

Ho provato questo approccio. All'inizio sembra buono, ma quando ho provato a creare un nuovo campo ho ricevuto un errore: Si è verificato un problema durante la creazione del campo Immagine menu: Tentativo di creare un campo "field_menu_image" senza un pacchetto. Sto cercando di raggiungere questo obiettivo a livello di codice ora, ma sarebbe meglio se anche questo potesse funzionare.
Blastoise,


0

"Extra di voci di menu" è un modo per raggiungere questo obiettivo, come suggerito da @Mykhailo Gurei.

Ma nel mio caso ho dovuto aggiungere campi extra e utilizzare il modulo menu Mega. Stavo usando "We mega menu" e con esso "Extra voce di menu" non funziona. Semplicemente il menu non viene visualizzato sul front-end (alcuni modelli hanno la precedenza sul problema).

Quindi un'altra opzione che funziona con "We mega menu" è "Campi contenuti voci di menu":

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

Ha la stessa funzionalità e non è in conflitto con il modulo mega menu.


-2

Sfortunatamente, gli sviluppatori principali di Drupal 8 non hanno reso campi i collegamenti ai menu. Quindi per ora non è possibile aggiungere campi ai collegamenti ai menu.

Il costruttore di siti "aggirare" è quello di creare un vocabolario personalizzato che può avere campi personalizzati.


4
Sbagliato. MenuLinkContent è un'entità di contenuto fieldable.
milkovsky,

1
Come faresti per aggiungere nuovi campi a MenuLinkContent?
MatthieuScarset,

1
vedi le risposte sopra. Entrambi spiegano come aggiungere nuovi campi a MenuLinkContent.
milkovsky

2
Le
voci del

1
Quindi, per essere chiari @milkovsky True. MenuLinkContent NON è un'entità di contenuto fieldable.
MatthieuScarset,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.