Como adicionar campos aos itens de menu

11

Preciso criar um menu principal que seja um subconjunto do menu regular. A equipe de design acha que seria melhor o usuário ter apenas os links mais importantes no menu principal e não ter tudo. Alguns links são menu de nível superior e outros são submenus. Para isso, esperava poder adicionar um campo ao formulário do item do link do menu como uma lista suspensa. Ao criar um link, o usuário pode usar esse menu suspenso para "promotionToMainMenuAsBigLink" ou "promotionToMainMenuAsSmallLink" ou deixar nenhum para não mostrar o item no menu principal.

Estou procurando uma solução semelhante à Drupal 7, mas Drupal 8.

Eu esperava poder adicionar uma coluna na tabela menu_link_content_data ao lado de 'expandido'. Eu esperava não ter que registrar essas informações em outra tabela, como mostrado na solução d7.

Consegui adicionar um campo ao formulário do link em um módulo personalizado que construí, apenas para fins de teste, apenas adicionei um campo de texto para começar:

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

O campo é realmente mostrado no formulário do link, mas nunca é registrado.

alguém poderia me ajudar com isso?

Guillaume Bois
fonte
Por mais improvável que pareça, os itens de link de menu personalizados são entidades de conteúdo ( api.drupal.org/api/drupal/… ). Isso significa que você precisa usar um gancho para adicionar o campo (talvez api.drupal.org/api/drupal/… ) e depois executar uma função de atualização para atualizar o esquema.
Eyal

Respostas:

14

Verifique o módulo de itens extras do menu .

Mykhailo Gurei
fonte
2
Definitivamente, este é o caminho a seguir, já que a v2.0 deste módulo transforma os links de menu em entidades totalmente em campo. Solução melhor que o menu Colossal, pois aprimora o sistema de menus principal em vez de substituí-lo.
Hudri
1
+1 excelente para incluir a data de hoje na barra de menus, por exemplo
therobyouknow 20/11
1
Existe o artigo sobre todos os recursos lembergsolutions.com/blog/…
Mykhailo Gurei
11

Você pode usar hook_entity_base_field_infopara adicionar um campo adicional à menu_link_contententidade com o seguinte código:

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

Consulte https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions para obter mais detalhes BaseFieldDefinition.

Depois disso, você precisará hook_form_menu_link_content_menu_link_content_form_alter()adicionar um campo ao formulário.

Decifrar
fonte
5
Você não precisa adicionar campos via formulário alterado. Você pode simplesmente usar o BaseFieldDefinition->setDisplayOptions()método: ...->setDisplayOptions('form', [ ... ]).
milkovsky
1
Como posso criar um campo de imagem? Não consigo encontrar um exemplo com esse tipo de campo e preciso dele. Posso ver o campo de upload da imagem ao usá-lo, mas ao tentar salvar o item de menu, recebo: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Coluna não encontrada: 1054 Coluna desconhecida 'field_menu_image__target_id' Também quando atualizo a página para adicionar formulário do item de menu que vejo nos logs: Aviso: Índice indefinido: field_menu_image__height Aviso: Índice indefinido: field_menu_image__width e assim por diante ... Algum exemplo para o tipo de campo de imagem? Graças
blastoise
5
Eu resolvi esse problema. /update.php não está funcionando, portanto, a coluna nunca é criada. Eu usei o drush para atualizar o db: drush updatedb --entity-updates
blastoise
1
O que você coloca em hook_form_menu_link_content_menu_link_content_form_alter () para adicionar o campo?
Matt
3

Infelizmente, não há campos de interface do usuário para links de menu por padrão no Drupal 8, como disse @MatthieuScarset. Como menu_link_contenté uma entidade de conteúdo no Drupal 8, é possível adicionar campos a ele.

Opção 1 É claro que você pode fazer isso de forma programática, como o @Decipher sugeriu.

Opção 2 Mas há outra solução alternativa para ativar os campos da interface do usuário para os links do menu temporariamente:

  1. Aberto Drupal\menu_link_content\Entity\MenuLinkContent
  2. Adicionar field_ui_base_route = "entity.menu.add_link_form"à anotação
  3. Reconstruir cache
  4. Visita /admin/structure/menu/manage/main/add/fields
  5. Gerencie todos os seus campos, monitores
  6. Exporte a configuração do seu site ( drush cex -y).
  7. Remova field_ui_base_route = "entity.menu.add_link_form"da anotação emDrupal\menu_link_content\Entity\MenuLinkContent
  8. Reconstrua o cache.
milkovsky
fonte
Eu tentei essa abordagem. No começo, parece bom, mas quando tentei criar um novo campo, recebo um erro: Ocorreu um problema ao criar o campo Imagem do menu: Tente criar um campo 'field_menu_image' sem um pacote. Estou tentando conseguir isso programaticamente agora, mas seria melhor se isso pudesse funcionar também.
precisa saber é o seguinte
2

Você pode usar o menu colossal para adicionar o campo em vez do módulo de menu principal.

David Barratt
fonte
0

"Itens extras do menu" é uma maneira de conseguir isso, como sugeriu @Mykhailo Gurei.

Mas no meu caso eu tive que adicionar campos extras e usar o módulo de menu Mega. Eu estava usando "We mega menu" e com ele "Menu item extras" não está funcionando. Simplesmente o menu não é mostrado no front-end (alguns modelos substituem o problema).

Portanto, outra opção que funciona com "We mega menu" é "Campos de conteúdo do item de menu":

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

Tem a mesma funcionalidade e não tem conflito com o módulo mega do menu We.

MilanG
fonte
-2

Infelizmente, os principais desenvolvedores do Drupal 8 não tornaram os links de menu em campo. Portanto, não é possível adicionar campos aos links do menu no momento.

O construtor de sites "solução alternativa" é criar um vocabulário personalizado que pode ter campos personalizados.

MatthieuScarset
fonte
4
Errado. MenuLinkContent é uma entidade de conteúdo em campo.
milkovsky
1
Como você faria para adicionar novos campos ao MenuLinkContent?
precisa saber é o seguinte
1
veja as respostas acima. Ambos explicam como adicionar novos campos ao MenuLinkContent.
milkovsky
2
Extras item de menu fazer isso drupal.org/project/menu_item_extras
Mykhailo Gurei
1
Para ser claro, @milkovsky True. MenuLinkContent NÃO é uma entidade de conteúdo em campo.
MatthieuScarset