Cómo agregar campos a los elementos del menú

11

Necesito crear un menú principal que sea un subconjunto del menú normal. El equipo de diseño cree que sería mejor para el usuario tener solo los enlaces más importantes en el menú principal y no tenerlo todo. Algunos enlaces son menús de nivel superior y otros son submenús. Para esto esperaba poder agregar un campo al formulario de elemento de enlace de menú como un menú desplegable. Al crear un enlace, el usuario podría usar este menú desplegable para "promoteToMainMenuAsBigLink" o "promoteToMainMenuAsSmallLink" o no dejar ninguno para que no se muestre el elemento en el menú principal.

Estoy buscando una solución similar a esta solución Drupal 7 pero para Drupal 8.

Esperaba poder agregar una columna en la tabla menu_link_content_data al lado de 'expandido'. Esperaba no tener que registrar esta información en otra tabla como se muestra en la solución d7.

Pude agregar un campo al formulario de enlace en un módulo personalizado que construí, solo para fines de prueba solo agregué un campo de texto para comenzar:

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

El campo se muestra en el formulario de enlace, pero nunca se registra.

¿Puede alguien ayudarme con esto?

Guillaume Bois
fuente
Por improbable que parezca , los elementos de enlace de menú personalizados son entidades de contenido ( api.drupal.org/api/drupal/… ). Eso significa que necesita usar un gancho para agregar el campo (tal vez api.drupal.org/api/drupal/… ) y luego ejecutar una función de actualización para actualizar el esquema.
Eyal

Respuestas:

14

Verifique el módulo Extras del elemento del menú .

Mykhailo Gurei
fuente
2
Definitivamente, este es el camino a seguir, a partir de la versión 2.0 de este módulo convierte los enlaces del menú en entidades totalmente confiables. Mejor solución que el menú Colosal porque mejora el sistema de menú central en lugar de reemplazarlo.
Hudri
1
+1 ideal para incluir la fecha de hoy en la barra de menú, por ejemplo
therobyouknow
1
Hay un artículo sobre todas las funciones lembergsolutions.com/blog/…
Mykhailo Gurei
11

Puede usar hook_entity_base_field_infopara agregar un campo adicional a la menu_link_contententidad con el siguiente 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 obtener más detalles BaseFieldDefinition.

Después de lo cual, hook_form_menu_link_content_menu_link_content_form_alter()deberá agregar un campo al formulario.

Descifrar
fuente
55
No tiene que agregar campos a través del formulario alter. Usted puede simplemente usar el BaseFieldDefinition->setDisplayOptions()método: ...->setDisplayOptions('form', [ ... ]).
milkovsky
1
¿Cómo puedo crear un campo de imagen? No puedo encontrar un ejemplo con este tipo de campo y lo necesito. Puedo ver el campo de carga de imágenes cuando uso esto, pero cuando intento guardar el elemento del menú obtengo: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Columna no encontrada: 1054 Columna desconocida 'field_menu_image__target_id' También cuando actualizo la página para agregar formulario de elemento de menú que veo en los registros: Aviso: índice indefinido: field_menu_image__height Aviso: índice indefinido: field_menu_image__width y así sucesivamente ... ¿Algún ejemplo para el tipo de campo de imagen? Gracias
blastoise
55
He resuelto este problema. /update.php no funciona, por lo que la columna nunca se crea. He usado drush para actualizar db: drush updatedb --entity-updates
blastoise
1
¿Qué pones en hook_form_menu_link_content_menu_link_content_form_alter () para agregar el campo?
Matt
3

Desafortunadamente, de hecho, no hay campos UI para enlaces de menú por defecto en Drupal 8 como dijo @MatthieuScarset. Pero menu_link_contentes una entidad de contenido en Drupal 8, por lo que es posible agregarle campos.

Opción n. ° 1 Por supuesto, puede hacerlo mediante programación como sugirió @Decipher.

Opción # 2 Pero hay otra solución alternativa para habilitar los campos de la interfaz de usuario para los enlaces de menú temporales:

  1. Abierto Drupal\menu_link_content\Entity\MenuLinkContent
  2. Agregar field_ui_base_route = "entity.menu.add_link_form"a la anotación
  3. Reconstruir caché
  4. Visitar /admin/structure/menu/manage/main/add/fields
  5. Administra todos tus campos, pantallas
  6. Exporte la configuración de su sitio ( drush cex -y).
  7. Eliminar field_ui_base_route = "entity.menu.add_link_form"de la anotación enDrupal\menu_link_content\Entity\MenuLinkContent
  8. Reconstruir caché.
milkovsky
fuente
Intenté este enfoque. Al principio se ve bien, pero cuando traté de crear un nuevo campo me sale un error: Hubo un problema al crear el campo Imagen del menú: Intento crear un campo 'field_menu_image' sin un paquete. Estoy tratando de lograr esto programáticamente ahora, pero sería mejor si esto pudiera funcionar también.
blastoise
2

Puede usar el menú colosal para agregar el campo en lugar del módulo del menú principal.

David Barratt
fuente
0

"Elementos adicionales del menú" es una forma de lograr esto, como sugirió @Mykhailo Gurei.

Pero en mi caso tuve que agregar campos adicionales y usar el módulo de menú Mega. Estaba usando "We mega menu" y con él "Menu item extras" no funciona. Simplemente el menú no se muestra en el front-end (algunos problemas de anulación de plantillas).

Entonces, otra opción que funciona con "We mega menu" es "Campos de contenido del elemento de menú":

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

Tiene la misma funcionalidad y no tiene conflicto con We mega menu module.

MilanG
fuente
-2

Desafortunadamente, los desarrolladores principales de Drupal 8 no han hecho que los enlaces del menú sean confiables. Por lo tanto, no es posible agregar campos a los enlaces del menú por ahora.

El creador de sitios "evita" es crear un vocabulario personalizado que puede tener campos personalizados.

MatthieuScarset
fuente
44
Incorrecto. MenuLinkContent es una entidad de contenido confiable.
milkovsky
1
¿Cómo haría para agregar nuevos campos a MenuLinkContent?
MatthieuScarset
1
ver las respuestas arriba. Ambos explican cómo agregar nuevos campos a MenuLinkContent.
milkovsky
2
Los elementos del menú Extras lo hacen drupal.org/project/menu_item_extras
Mykhailo Gurei
1
Para que quede claro @milkovsky Cierto. MenuLinkContent NO es una entidad de contenido exigible.
MatthieuScarset