Cara menambahkan bidang ke item menu


11

Saya perlu membangun menu utama yang merupakan subset dari menu biasa. Tim desain berpendapat bahwa akan lebih baik bagi pengguna untuk hanya memiliki tautan terpenting di menu utama dan tidak memiliki segalanya. Beberapa tautan adalah menu tingkat atas dan beberapa lainnya adalah sub menu. Untuk ini saya berharap dapat menambahkan bidang ke formulir item tautan menu sebagai drop down. Saat membuat tautan, pengguna dapat menggunakan dropdown ini untuk "promotToMainMenuAsBigLink" atau "promotToMainMenuAsSmallLink" atau biarkan tidak ada yang tidak menampilkan item di menu utama.

Saya mencari solusi yang sama dengan solusi Drupal 7 ini tetapi untuk Drupal 8.

Saya berharap dapat menambahkan kolom di tabel menu_link_content_data di samping 'diperluas'. Saya berharap tidak harus mencatat informasi ini di tabel lain seperti yang ditunjukkan pada solusi d7.

Saya dapat menambahkan bidang ke formulir tautan dalam modul khusus yang saya buat, hanya untuk tujuan pengujian, saya hanya menambahkan bidang teks untuk memulai dengan:

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

Bidang memang ditampilkan dalam bentuk tautan tetapi tidak pernah direkam.

Adakah yang bisa membantu saya dengan ini?


Tidak seperti kedengarannya, item tautan menu khusus adalah entitas konten ( api.drupal.org/api/drupal/… ). Itu berarti Anda perlu menggunakan pengait untuk menambahkan bidang (mungkin api.drupal.org/api/drupal/… ) dan kemudian menjalankan fungsi pembaruan untuk memperbarui skema.
Eyal

Jawaban:



11

Anda bisa menggunakan hook_entity_base_field_infountuk menambahkan bidang tambahan ke menu_link_contententitas dengan kode berikut:

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

Lihat https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-field-definitions untuk rincian lebih lanjut tentang BaseFieldDefinition.

Setelah itu, Anda harus hook_form_menu_link_content_menu_link_content_form_alter()menambahkan bidang ke formulir.


5
Anda tidak perlu menambahkan bidang melalui formulir ubah. Anda hanya dapat menggunakan BaseFieldDefinition->setDisplayOptions()metode: ...->setDisplayOptions('form', [ ... ]).
milkovsky

1
Bagaimana saya bisa membuat bidang gambar? Saya tidak dapat menemukan contoh dengan tipe bidang ini dan saya membutuhkannya. Saya dapat melihat bidang unggah gambar saat menggunakan ini tetapi ketika saya mencoba menyimpan item menu yang saya dapatkan: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: Kolom tidak ditemukan: 1054 Kolom tidak dikenal 'field_menu_image__target_id' Juga ketika saya me-refresh halaman untuk menambahkan bentuk item menu yang saya lihat di log: Pemberitahuan: Indeks tidak terdefinisi: field_menu_image__height Pemberitahuan: Indeks tidak terdefinisi: field_menu_image__width dan sebagainya ... Contoh untuk jenis bidang gambar? Terima kasih
blastoise

5
Saya sudah memecahkan masalah ini. /update.php tidak berfungsi sehingga kolom tidak pernah dibuat. Saya telah menggunakan drush untuk memperbarui db: drush updatedb --entity-updates
blastoise

1
Apa yang Anda masukkan ke hook_form_menu_link_content_menu_link_content_form_alter () untuk menambahkan bidang?
Matt

3

Sayangnya memang tidak ada UI bidang untuk tautan menu secara default di Drupal 8 seperti yang dikatakan @MatthieuScarset. Tetapi menu_link_contentmerupakan entitas konten dalam Drupal 8, sehingga dimungkinkan untuk menambahkan bidang ke dalamnya.

Opsi # 1 Tentu saja Anda dapat melakukannya secara terprogram seperti yang disarankan @Decipher.

Opsi # 2 Tetapi ada solusi lain untuk mengaktifkan UI bidang untuk tautan menu sementara:

  1. Buka Drupal\menu_link_content\Entity\MenuLinkContent
  2. Tambahkan field_ui_base_route = "entity.menu.add_link_form"ke anotasi
  3. Bangun kembali cache
  4. Mengunjungi /admin/structure/menu/manage/main/add/fields
  5. Kelola semua bidang Anda, tampilan
  6. Ekspor konfigurasi situs Anda ( drush cex -y).
  7. Hapus field_ui_base_route = "entity.menu.add_link_form"dari anotasi diDrupal\menu_link_content\Entity\MenuLinkContent
  8. Bangun kembali cache.

Saya mencoba pendekatan ini. Pada awalnya terlihat bagus, tetapi ketika saya mencoba membuat bidang baru saya mendapatkan kesalahan: Ada masalah membuat bidang Gambar menu: Mencoba membuat bidang 'field_menu_image' tanpa bundel. Saya mencoba untuk mencapai ini secara terprogram sekarang, tetapi akan lebih baik jika ini bisa berhasil juga.
blastoise


0

"Ekstra item menu" adalah salah satu cara untuk mencapai ini, seperti yang disarankan @Mykhailo Gurei.

Tetapi dalam kasus saya, saya harus menambahkan bidang tambahan dan menggunakan modul menu Mega. Saya menggunakan "We mega menu" dan dengannya "Ekstra item menu" tidak berfungsi. Menu sederhana tidak ditampilkan di front-end (beberapa template menimpa masalah).

Jadi opsi lain yang berfungsi dengan "We mega menu" adalah "Bidang konten item menu":

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

Memiliki fungsi yang sama dan tidak memiliki konflik dengan modul menu mega Kami.


-2

Sayangnya, pengembang inti Drupal 8 belum membuat tautan Menu yang dapat dilepas. Jadi tidak mungkin untuk menambahkan bidang ke tautan menu untuk saat ini.

Pembuat situs "bekerja di sekitar" adalah untuk membuat kosakata khusus yang dapat memiliki bidang khusus.


4
Salah. MenuLinkContent adalah entitas konten yang bisa fieldable.
milkovsky

1
Bagaimana cara Anda menambahkan kolom baru ke MenuLinkContent?
MatthieuScarset

1
lihat jawaban di atas. Keduanya menjelaskan cara menambahkan bidang baru ke MenuLinkContent.
milkovsky

2
Item Menu Ekstra melakukannya drupal.org/project/menu_item_extras
Mykhailo Gurei

1
Jadi agar jelas @milkovsky Benar. MenuLinkContent BUKAN entitas konten yang bisa fieldable.
MatthieuScarset
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.