So fügen Sie Menüpunkten Felder hinzu


11

Ich muss ein Hauptmenü erstellen, das eine Teilmenge des regulären Menüs ist. Das Designteam hält es für besser, wenn der Benutzer nur die wichtigsten Links im Hauptmenü hat und nicht alles. Einige Links sind Menüs der obersten Ebene und andere Untermenüs. Zu diesem Zweck hatte ich gehofft, dem Menü-Link-Element-Formular ein Feld als Dropdown-Liste hinzufügen zu können. Beim Erstellen eines Links kann der Benutzer diese Dropdown-Liste verwenden, um "fördernToMainMenuAsBigLink" oder "fördernToMainMenuAsSmallLink" oder "keine", um das Element nicht im Hauptmenü anzuzeigen.

Ich suche nach einer ähnlichen Lösung wie diese Drupal 7-Lösung, aber nach Drupal 8.

Ich hatte gehofft, in der Tabelle menu_link_content_data neben 'erweitert' eine Spalte hinzufügen zu können. Ich hatte gehofft, diese Informationen nicht in einer anderen Tabelle wie in der d7-Lösung aufzeichnen zu müssen.

Ich konnte dem Linkformular in einem von mir erstellten benutzerdefinierten Modul ein Feld hinzufügen. Zu Testzwecken habe ich zunächst nur ein Textfeld hinzugefügt:

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

Das Feld wird zwar im Linkformular angezeigt, aber nie aufgezeichnet.

Kann mir jemand dabei helfen?


So unwahrscheinlich es auch klingen mag , benutzerdefinierte Menü-Link-Elemente sind Inhaltselemente ( api.drupal.org/api/drupal/… ). Das bedeutet, dass Sie einen Hook verwenden müssen, um das Feld hinzuzufügen (möglicherweise api.drupal.org/api/drupal/… ) und dann eine Aktualisierungsfunktion ausführen müssen, um das Schema zu aktualisieren.
Eyal

Antworten:



11

Sie können hook_entity_base_field_infoder menu_link_contentEntität ein zusätzliches Feld mit dem folgenden Code hinzufügen :

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

Weitere Informationen zu finden Sie unter https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitionsBaseFieldDefinition .

Danach müssen Sie hook_form_menu_link_content_menu_link_content_form_alter()dem Formular ein Feld hinzufügen.


5
Sie müssen keine Felder über Formularänderung hinzufügen. Sie können einfach die BaseFieldDefinition->setDisplayOptions()Methode verwenden : ...->setDisplayOptions('form', [ ... ]).
Milkovsky

1
Wie kann ich ein Bildfeld erstellen? Ich kann mit diesem Feldtyp kein Beispiel finden und brauche es. Ich kann das Bild-Upload-Feld sehen, wenn ich dieses verwende, aber wenn ich versuche, den Menüpunkt zu speichern, erhalte ich: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'field_menu_image__target_id' Auch wenn ich die Seite zum Hinzufügen aktualisiere Menüelementform, die ich in Protokollen sehe: Hinweis: Undefinierter Index: field_menu_image__height Hinweis: Undefinierter Index: field_menu_image__width usw. Ein Beispiel für den Bildfeldtyp? Danke
Blastoise

5
Ich habe dieses Problem gelöst. /update.php funktioniert nicht, daher wird die Spalte niemals erstellt. Ich habe Drush verwendet, um DB zu aktualisieren: Drush UpdatedB
Entity

1
Was geben Sie in hook_form_menu_link_content_menu_link_content_form_alter () ein, um das Feld hinzuzufügen?
Matt

3

Leider gibt es in Drupal 8 standardmäßig keine Benutzeroberfläche für Menüverknüpfungen, wie @MatthieuScarset sagte. Da menu_link_contentes sich jedoch um eine Inhaltsentität in Drupal 8 handelt, können Felder hinzugefügt werden.

Option 1 Natürlich können Sie dies programmgesteuert tun, wie von @Decipher vorgeschlagen.

Option 2 Es gibt jedoch eine andere Problemumgehung, um die Benutzeroberfläche für Felder für Menüverknüpfungen vorübergehend zu aktivieren:

  1. Öffnen Drupal\menu_link_content\Entity\MenuLinkContent
  2. In field_ui_base_route = "entity.menu.add_link_form"auf die Anmerkung
  3. Cache neu erstellen
  4. Besuch /admin/structure/menu/manage/main/add/fields
  5. Verwalten Sie alle Ihre Felder, Anzeigen
  6. Exportieren Sie Ihre Site-Konfiguration ( drush cex -y).
  7. field_ui_base_route = "entity.menu.add_link_form"Aus der Anmerkung unter entfernenDrupal\menu_link_content\Entity\MenuLinkContent
  8. Cache neu erstellen.

Ich habe diesen Ansatz ausprobiert. Zuerst sieht es gut aus, aber als ich versuchte, ein neues Feld zu erstellen, wurde folgende Fehlermeldung angezeigt: Es gab ein Problem beim Erstellen des Felds. Menübild: Versuchen Sie, ein Feld 'field_menu_image' ohne Bundle zu erstellen. Ich versuche dies jetzt programmatisch zu erreichen, aber es wäre besser, wenn dies auch funktionieren könnte.
Blastoise


-2

Leider haben Drupal 8-Kernentwickler Menü-Links nicht feldfähig gemacht. Daher ist es derzeit nicht möglich, Felder zu Menü-Links hinzuzufügen.

Der Site Builder "umgeht" besteht darin, ein benutzerdefiniertes Vokabular zu erstellen, das benutzerdefinierte Felder enthalten kann.


4
Falsch. MenuLinkContent ist eine feldfähige Inhaltsentität.
Milkovsky

1
Wie würden Sie MenuLinkContent neue Felder hinzufügen?
MatthieuScarset

1
siehe die Antworten oben. Beide erklären, wie Sie MenuLinkContent neue Felder hinzufügen.
Milkovsky


1
Also um klar zu sein @milkovsky True. MenuLinkContent ist KEINE feldfähige Inhaltsentität.
MatthieuScarset
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.