Widget Taksonomi 'Tambah Lainnya'


8

Saya mencoba membuat widget bidang yang mirip dengan widget referensi istilah normal dengan satu perbedaan utama. Pengguna harus dapat menambahkan beberapa istilah taksonomi baru pada saat yang sama, ini mungkin menunjukkan lebih baik:

masukkan deskripsi gambar di sini

Saya sampai pada titik di mana fungsinya mirip dengan apa yang disediakan modul taksonomi / opsi / daftar (mis. Kotak centang / radio ditampilkan, hemat, dll.)

Inilah sedikit kode penting yang saya gunakan di hook_field_widget_form():

 $element += array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

Apa yang melempar saya ke sini adalah $ element bukan array form seperti biasa, jadi saya tidak yakin bagaimana menambahkan textfield dan dan tombol - terutama karena nilainya tidak dimaksudkan untuk disimpan. Apa cara terbaik untuk menambahkan bidang ini ke widget saya?

Sedangkan untuk menambahkan Javascript diperlukan, apakah saya benar berpikir saya harus menggunakan #ajax yang memanggil fungsi yang membangun kembali #options untuk kotak centang?

Terima kasih sebelumnya!

EDIT - Pertanyaan awal saya cukup samar, berikut beberapa detail lebih lanjut tentang apa yang saya coba:

  $element += array(
    '#type' => 'fieldset',
    '#delta' => $delta,
  );

  $element['value'] = array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

  $element['text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add another'),
    '#weight' => 5,
  );

Ini adalah penggabungan dari berbagai contoh yang pernah saya lihat, dan sepertinya membuat saya lebih dekat. Masalahnya adalah ketika saya mengirimkan formulir entitas saya mendapatkan kesalahan berikut:

Pemberitahuan: Indeks tidak terdefinisi: tid di taxonomy_field_is_empty () (baris 1402 dari modul \ taxonomy \ taxonomy.module).

Saya telah melihat lebih dekat fungsi ini dan berharap $itemmemiliki struktur $item = array('tid', 2). Ketika menggunakan kode di atas tampaknya ada delta yang datang dari suatu tempat dan struktur $itemakhirnya menjadi $item = array(0, array('tid', 2). Saya tidak tahu dari mana '0' berasal?

EDIT LAIN

Saya dapat memperbaiki kesalahan di atas dengan kode berikut dengan mengubah $ element seperti ini:

$element += array(
    '#type' => 'fieldset',
    '#process' => array('taxonomy_free_entry_ignore_parent'),
);

dan menambahkan fungsi:

function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
  array_pop($form['#parents']);
  return $form;
}

Ketika saya menyimpan entitas, saya menerima pesan yang mengatakan bahwa itu telah disimpan. Ketika saya memeriksa tabel untuk bidang, itu tidak disimpan. Apa yang saya lakukan salah?

Jawaban:


2

Saya yakin Anda bisa melakukan ini hook_field_widget_form()(yang saya duga adalah tempat kode Anda saat ini) dengan hanya menambahkan elemen turunan ke elemen yang ada, misalnya

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Jika itu tidak berhasil, saya tahu itu pasti akan berhasil jika Anda menggunakannya hook_field_widget_form_alter().

Misalnya, berikut ini adalah fungsi kecil yang memungkinkan altbidang untuk jenis bidang Gambar menggunakan widget Pemilih Media (karena beberapa alasan itu tidak diaktifkan secara default):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

Sejauh fungsi ajax berjalan, saya pikir Anda pasti akan mengikuti garis yang benar. Saya pikir modul Contoh Lapangan dalam Contoh memiliki beberapa kode sampel yang mungkin membantu.


Terima kasih atas jawabannya, saya telah memilihnya karena memberi saya beberapa informasi bagus untuk dilanjutkan tetapi belum menjawabnya! Lihat hasil edit saya yang memberikan beberapa informasi lebih lanjut tentang apa yang saya coba berkat jawaban Anda.
splatio

@plat apakah Anda sudah bisa mengimplementasikan widget yang berfungsi? Apakah Anda bersedia membagikannya?
Joe Beuckman

Maaf Joe, saya tidak bisa menyelesaikan ini dan akhirnya menggunakan pendekatan yang sangat berbeda! Jika Anda berhasil mempostingnya di sini karena saya akan tertarik bagaimana untuk masa depan. Saya juga dengan senang hati menerimanya sebagai jawabannya.
splatio

@splatio Bisakah Anda memberikan beberapa informasi tentang pendekatan alternatif Anda?
vfclists


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.