วิธีเพิ่มเขตข้อมูลลงในรายการเมนู


11

ฉันต้องการสร้างเมนูหลักที่เป็นส่วนย่อยของเมนูปกติ ทีมออกแบบคิดว่ามันจะเป็นการดีกว่าสำหรับผู้ใช้ที่จะมีลิงค์ที่สำคัญที่สุดในเมนูหลักเท่านั้นและไม่มีทุกสิ่ง ลิงค์บางอันเป็นเมนูระดับบนสุดและบางลิงค์เป็นเมนูย่อย สำหรับสิ่งนี้ฉันหวังว่าจะสามารถเพิ่มเขตข้อมูลลงในแบบฟอร์มรายการลิงก์เมนูเป็นแบบเลื่อนลง เมื่อสร้างลิงก์ผู้ใช้สามารถใช้เมนูดรอปดาวน์นี้เพื่อ "PromotToMainMenuAsBigLink" หรือ "PromotToMainMenuAsSmallLink" หรือไม่เลือกที่จะไม่แสดงรายการในเมนูหลัก

ฉันกำลังมองหาโซลูชันที่คล้ายกันกับโซลูชันDrupal 7แต่สำหรับ Drupal 8

ฉันหวังว่าจะสามารถเพิ่มคอลัมน์ในตารางเมนู _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/ … ) นั่นหมายความว่าคุณต้องใช้ hook เพื่อเพิ่มฟิลด์ (อาจจะเป็น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-definitionsBaseFieldDefinitionสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ

หลังจากนั้นคุณจะต้องhook_form_menu_link_content_menu_link_content_form_alter()เพิ่มเขตข้อมูลลงในแบบฟอร์ม


5
คุณไม่จำเป็นต้องเพิ่มฟิลด์ผ่านการแก้ไขแบบฟอร์ม คุณก็สามารถใช้วิธีการ: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 ไม่ทำงานดังนั้นคอลัมน์จะไม่ถูก crated ฉันใช้ drush เพื่ออัปเดต db: drush updatedb --entity-updates
blastoise

1
คุณใส่อะไรลงใน hook_form_menu_link_content_menu_link_content_form_alter () เพื่อเพิ่มฟิลด์
Matt

3

น่าเสียดายที่ไม่มีฟิลด์ UI สำหรับลิงก์เมนูตามค่าเริ่มต้นใน Drupal 8 ตามที่ @MatthieuScarset กล่าว แต่menu_link_contentเป็นเอนทิตีเนื้อหาใน Drupal 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" และด้วย "เมนูรายการพิเศษ" ไม่ทำงาน เมนูจะไม่ปรากฏในส่วนหน้า (ปัญหาการแทนที่เทมเพลตบางอย่าง)

ตัวเลือกอื่น ๆ ที่ใช้งานได้กับ "We mega menu" คือ "ช่องเนื้อหารายการเมนู":

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

มีฟังก์ชั่นการใช้งานเดียวกันและไม่มีข้อขัดแย้งกับโมดูลเมนูของเรา


-2

น่าเสียดายที่นักพัฒนาหลักของ Drupal 8 ยังไม่ได้ทำให้ลิงก์เมนูเป็นฟิลด์ ดังนั้นจึงเป็นไปไม่ได้ที่จะเพิ่มเขตข้อมูลไปยังลิงก์เมนูในตอนนี้

เครื่องมือสร้างเว็บไซต์ "หลีกเลี่ยง" คือการสร้างคำศัพท์ที่กำหนดเองซึ่งสามารถมีฟิลด์ที่กำหนดเองได้


4
ไม่ถูกต้อง. MenuLinkContent เป็นเอนทิตีเนื้อหาที่ใช้ฟิลด์ได้
milkovsky

1
คุณจะเพิ่มฟิลด์ใหม่ใน MenuLinkContent ได้อย่างไร
MatthieuScarset

1
ดูคำตอบข้างต้น พวกเขาทั้งคู่อธิบายวิธีเพิ่มฟิลด์ใหม่ใน MenuLinkContent
milkovsky

2
รายการเมนูพิเศษทำอย่างนั้นdrupal.org/project/menu_item_extras
Mykhailo Gurei

1
ดังนั้นเพื่อให้ชัดเจน @milkovsky จริง MenuLinkContent ไม่ใช่เอนทิตีเนื้อหาที่สามารถทำงานได้
MatthieuScarset
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.