메뉴 항목에 필드를 추가하는 방법


11

일반 메뉴의 하위 세트 인 기본 메뉴를 빌드해야합니다. 디자인 팀은 사용자가 기본 메뉴에서 가장 중요한 링크 만 갖고 모든 것을 갖지 않는 것이 더 낫다고 생각합니다. 일부 링크는 최상위 메뉴이고 일부 링크는 하위 메뉴입니다. 이를 위해 메뉴 링크 항목 양식에 드롭 다운으로 필드를 추가 할 수 있기를 바랍니다. 링크를 만들 때 사용자는이 드롭 다운을 사용하여 "promoteToMainMenuAsBigLink"또는 "promoteToMainMenuAsSmallLink"로하거나 주 메뉴에 항목을 표시하지 않도록 남겨 둘 수 있습니다.

Drupal 7 솔루션 과 비슷한 솔루션을 찾고 있지만 Drupal 8을 찾고 있습니다.

'확장'옆에있는 테이블 menu_link_content_data에서 열을 추가 할 수 있기를 바랐습니다. 이 정보를 d7 솔루션에 표시된 것과 같은 다른 테이블에 기록하지 않기를 바랐습니다.

빌드 한 사용자 정의 모듈에서 링크 양식에 필드를 추가 할 수있었습니다. 테스트 목적으로 시작하기 위해 텍스트 필드 만 추가했습니다.

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

필드는 실제로 링크 형식으로 표시되지만 기록되지는 않습니다.

누군가 나를 도울 수 있습니까?


소리가 나지 않는 것처럼 사용자 정의 메뉴 링크 항목은 컨텐츠 엔티티입니다 ( api.drupal.org/api/drupal/… ). 즉, 후크를 사용하여 필드를 추가 한 다음 ( api.drupal.org/api/drupal/… ) 업데이트 함수를 실행하여 스키마를 업데이트해야합니다.
Eyal

답변:


14

메뉴 항목 추가 모듈을 확인하십시오 .


2
이 모듈의 v2.0부터는 메뉴 링크를 완전히 필드 화 가능한 엔트 로트로 바꿉니다. 코어 메뉴 시스템을 교체하는 대신 핵심 메뉴 시스템을 향상시키기 때문에 Colossal 메뉴보다 더 나은 솔루션입니다.
Hudri

1
예를 들어 메뉴 표시 줄에 오늘 날짜를 포함시키는 데 +1이 좋습니다
therobyouknow

1
모두에 대한 기사가 특징이다 lembergsolutions.com/blog/...은
Mykhailo Gurei

11

다음 코드 hook_entity_base_field_info를 사용하여 menu_link_content엔티티에 추가 필드를 추가하는 데 사용할 수 있습니다 .

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

에 대한 자세한 내용 은 https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions 를 참조하십시오 BaseFieldDefinition.

그런 hook_form_menu_link_content_menu_link_content_form_alter()다음 양식에 필드를 추가 해야 합니다.


5
form alter를 통해 필드를 추가 할 필요는 없습니다. 다음 BaseFieldDefinition->setDisplayOptions()방법을 간단히 사용할 수 있습니다 ...->setDisplayOptions('form', [ ... ])..
milkovsky

1
이미지 필드를 만들려면 어떻게합니까? 이 필드 유형으로 예제를 찾을 수 없어서 필요합니다. 이것을 사용할 때 이미지 업로드 필드를 볼 수 있지만 메뉴 항목을 저장하려고하면 다음과 같은 결과가 나타납니다. Drupal \ Core \ Entity \ EntityStorageException : SQLSTATE [42S22] : 열을 찾을 수 없음 : 1054 알 수없는 열 'field_menu_image__target_id'또한 추가를 위해 페이지를 새로 고치면 메뉴 항목 양식 로그에 표시됩니다. 참고 : 정의되지 않은 인덱스 : field_menu_image__height 참고 : 정의되지 않은 인덱스 : field_menu_image__width 등 ... 이미지 필드 유형에 대한 예는 무엇입니까? 감사합니다
blastoise

5
이 문제를 해결했습니다. /update.php가 작동하지 않으므로 열이 크레이트되지 않습니다. drush를 사용하여 db를 업데이트했습니다. drush updatedb --entity-updates
blastoise

1
필드를 추가하기 위해 hook_form_menu_link_content_menu_link_content_form_alter ()에 무엇을 넣습니까?
Matt

3

불행히도 @MatthieuScarset이 말한 것처럼 Drupal 8에는 기본적으로 메뉴 링크에 대한 필드 UI가 없습니다. 그러나 menu_link_contentDrupal 8의 컨텐츠 엔터티이므로 필드를 추가 할 수 있습니다.

옵션 # 1 물론 @Decipher가 제안한대로 프로그래밍 방식으로 수행 할 수 있습니다.

옵션 # 2 그러나 메뉴 링크의 필드 UI를 임시로 활성화하는 또 다른 해결 방법이 있습니다.

  1. 열다 Drupal\menu_link_content\Entity\MenuLinkContent
  2. field_ui_base_route = "entity.menu.add_link_form"주석에 추가
  3. 캐시 재 구축
  4. 방문 /admin/structure/menu/manage/main/add/fields
  5. 모든 필드, 디스플레이 관리
  6. 사이트 구성을 내보내십시오 ( drush cex -y).
  7. field_ui_base_route = "entity.menu.add_link_form"의 주석에서 제거Drupal\menu_link_content\Entity\MenuLinkContent
  8. 캐시를 다시 작성하십시오.

나는이 접근법을 시도했다. 처음에는 좋아 보이지만 새 필드를 만들려고 할 때 오류가 발생합니다. 필드 메뉴 이미지를 만드는 동안 문제가 발생했습니다. 번들없이 'field_menu_image'필드를 만들려고했습니다. 나는 이것을 프로그래밍 방식으로 달성하려고 노력하고 있지만 이것이 효과가 있다면 더 좋을 것입니다.
blastoise


0

@Mykhailo Gurei가 제안한 것처럼 "메뉴 항목 추가"는 이것을 달성하는 한 가지 방법입니다.

그러나 필자의 경우 추가 필드를 추가하고 메가 메뉴 모듈을 사용해야했습니다. "We mega menu"를 사용하고 있는데 "Menu extras"가 작동하지 않습니다. 프런트 엔드에는 단순히 메뉴가 표시되지 않습니다 (일부 템플릿은 문제를 재정의 함).

"We mega menu"에서 작동하는 다른 옵션은 "Menu item content fields"입니다.

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

기능이 동일하며 We mega 메뉴 모듈과 충돌하지 않습니다.


-2

불행하게도 Drupal 8 핵심 개발자는 메뉴 링크를 필드화할 수 없습니다. 따라서 지금은 메뉴 링크에 필드를 추가 할 수 없습니다.

사이트 빌더 "해결 방법"은 사용자 정의 필드를 가질 수있는 사용자 정의 어휘를 작성하는 것입니다.


4
잘못된. MenuLinkContent는 필드 가능한 컨텐츠 엔터티입니다.
milkovsky

1
MenuLinkContent에 새 필드를 추가하려면 어떻게합니까?
MatthieuScarset

1
위의 답변을 참조하십시오. 둘 다 MenuLinkContent에 새 필드를 추가하는 방법을 설명합니다.
milkovsky

2
메뉴 항목 엑스트라는 할 drupal.org/project/menu_item_extras
Mykhailo Gurei

1
@milkovsky True를 명확히하십시오. MenuLinkContent는 필드 가능한 컨텐츠 엔티티가 아닙니다.
MatthieuScarset
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.