Jak dodawać pola do pozycji menu


11

Muszę zbudować menu główne, które jest podzbiorem zwykłego menu. Zespół projektowy uważa, że ​​lepiej byłoby, gdyby użytkownik miał tylko najważniejsze linki w menu głównym i nie miał wszystkiego. Niektóre łącza to menu najwyższego poziomu, a niektóre to podmenu. W tym celu miałem nadzieję, że będę w stanie dodać pole do formularza pozycji łącza menu jako menu rozwijane. Podczas tworzenia linku użytkownik może użyć tego menu rozwijanego do „promotToMainMenuAsBigLink” lub „promotToMainMenuAsSmallLink” lub pozostawić, aby nie wyświetlać pozycji w menu głównym.

Szukam podobnego rozwiązania, jak to rozwiązanie Drupal 7, ale Drupal 8.

Miałem nadzieję, że będę mógł dodać kolumnę w tabeli menu_link_content_data obok „expanded”. Miałem nadzieję, że nie będę musiał zapisywać tych informacji w innej tabeli, jak pokazano w rozwiązaniu d7.

Byłem w stanie dodać pole do formularza linku w niestandardowym module, który buduję, tylko dla celów testowych dodałem tylko pole tekstowe na początek:

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

Pole jest rzeczywiście pokazane w formie linku, ale nigdy nie jest rejestrowane.

Czy ktoś może mi w tym pomóc?


Choć wydaje się to mało prawdopodobne, niestandardowe elementy łącza menu są elementami treści ( api.drupal.org/api/drupal/... ). Oznacza to, że musisz użyć haka, aby dodać pole (może api.drupal.org/api/drupal/… ), a następnie uruchomić funkcję aktualizacji, aby zaktualizować schemat.
Eyal

Odpowiedzi:



11

Możesz użyć, hook_entity_base_field_infoaby dodać dodatkowe pole do menu_link_contentencji za pomocą następującego kodu:

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

Zobacz https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions więcej szczegółów na temat BaseFieldDefinition.

Następnie musisz hook_form_menu_link_content_menu_link_content_form_alter()dodać pole do formularza.


5
Nie musisz dodawać pól poprzez formularz zmiany. Można po prostu użyć BaseFieldDefinition->setDisplayOptions()metody: ...->setDisplayOptions('form', [ ... ]).
Milkovsky,

1
Jak mogę stworzyć pole obrazu? Nie mogę znaleźć przykładu z tym typem pola i potrzebuję go. Widzę pole przesyłania obrazu podczas korzystania z tego, ale kiedy próbuję zapisać element menu, otrzymuję: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Nie znaleziono kolumny: 1054 Nieznana kolumna 'field_menu_image__target_id' Również gdy odświeżam stronę dla dodania formularz pozycji menu Widzę w dziennikach: Uwaga: Niezdefiniowany indeks: pole_obraz_obrazu___wysokość Uwaga: Niezdefiniowany indeks: pole_obraz_obraz_ szerokość i tak dalej ... Czy jest jakiś przykład typu pola obrazu? Dzięki
blastoise 31.01.17

5
Rozwiązałem ten problem. /update.php nie działa, więc kolumna nigdy nie jest tworzona. Użyłem drush do aktualizacji db: drush updatedb --entity-updates
blastoise 31.01.17

1
Co wstawiasz w hook_form_menu_link_content_menu_link_content_form_alter (), aby dodać pole?
Matt

3

Niestety, w Drupal 8 nie ma domyślnie interfejsu użytkownika dla pól menu, jak powiedział @MatthieuScarset. Ale menu_link_contentjest elementem treści w Drupal 8, więc można do niego dodawać pola.

Opcja nr 1 Oczywiście możesz to zrobić programowo, jak sugeruje @Decipher.

Opcja nr 2 Istnieje jednak inne obejście umożliwiające tymczasowe włączenie interfejsu użytkownika pól dla łączy menu:

  1. otwarty Drupal\menu_link_content\Entity\MenuLinkContent
  2. Dodaj field_ui_base_route = "entity.menu.add_link_form"do adnotacji
  3. Odbuduj pamięć podręczną
  4. Wizyta /admin/structure/menu/manage/main/add/fields
  5. Zarządzaj wszystkimi polami, wyświetla
  6. Wyeksportuj konfigurację witryny ( drush cex -y).
  7. Usuń field_ui_base_route = "entity.menu.add_link_form"z adnotacji wDrupal\menu_link_content\Entity\MenuLinkContent
  8. Odbuduj pamięć podręczną.

Próbowałem tego podejścia. Na początku wygląda dobrze, ale kiedy próbowałem utworzyć nowe pole, pojawia się błąd: Wystąpił problem z tworzeniem pola Obraz menu: Próba utworzenia pola „field_menu_image” bez pakietu. Próbuję to teraz osiągnąć programowo, ale byłoby lepiej, gdyby to również działało.
blastoise


0

„Dodatki do pozycji menu” to jeden ze sposobów na osiągnięcie tego, jak sugerował @Mykhailo Gurei.

Ale w moim przypadku musiałem dodać dodatkowe pola i użyć modułu menu Mega. Użyłem „My mega menu”, a wraz z nim „Dodatki do pozycji menu” nie działają. Po prostu menu nie jest wyświetlane na interfejsie (niektóre problemy z nadpisywaniem szablonów).

Tak więc inną opcją, która działa z „My mega menu” jest „Pola zawartości pozycji menu”:

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

Ma tę samą funkcjonalność i nie ma konfliktu z modułem We mega menu.


-2

Niestety, programiści Drupal 8 nie udostępnili linków menu. Dlatego na razie nie można dodawać pól do łączy menu.

Kreator stron „obejść” ma na celu stworzenie niestandardowego słownictwa, które może mieć niestandardowe pola.


4
Źle. MenuLinkContent to obiekt z możliwością zmiany zawartości.
Milkovsky,

1
Jak byś zrobił, aby dodać nowe pola do MenuLinkContent?
MatthieuScarset,

1
patrz odpowiedzi powyżej. Obaj wyjaśniają, jak dodać nowe pola do MenuLinkContent.
Milkovsky,

2
Pozycja menu Dodatki zrób to drupal.org/project/menu_item_extras
Mykhailo Gurei

1
Aby być jasnym @milkovsky Prawda. MenuLinkContent NIE jest obiektem z możliwością zmiany treści.
MatthieuScarset
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.