Bidang nilai tidak terbatas - cara menyembunyikan bidang tambahan pada edit simpul


9

Saat membuat simpul baru, saya memiliki bidang nilai tak terbatas ini dengan tombol "Tambahkan item baru".

Bidang Nilai Tidak Terbatas - Node Baru

Tidak apa-apa, bagus. Tetapi ketika saya mengedit simpul yang ada, saya mendapatkan nilai tambahan kosong yang belum DITAWARKAN untuk saya: Bidang Nilai Tidak Terbatas - Edit Node

Kasus nyata saya adalah dengan bidang senyawa besar, tetapi saya pikir menggunakan bidang kecil ini sebagai contoh akan lebih mudah dipahami.

Apakah ada cara untuk mencegah bidang "ekstra" ini ditambahkan secara intrusi?


2
Untuk memperjelas, Anda ingin tidak ada bidang kosong yang disajikan saat diedit? Jadi untuk menambahkan bidang lain, mereka akan dipaksa untuk menggunakan tombol "Tambahkan item lain"?
tim.plunkett

Ya, Anda memahaminya dengan sempurna.
Fidelix

@ Felelix, apakah Anda menemukan modul untuk melakukan ini, atau hanya kode khusus pada saat ini?
David Barratt

@ DavidvidBarratt hanya kode khusus, saya khawatir.
Fidelix

Jawaban:


10

Ini akan bekerja untuk semua bentuk edit simpul:

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}

Apakah mungkin untuk "Menambahkan" bidang kosong baru di hook ini?
Fidelix

Secara teoritis, Anda bisa. Sesuatu seperti $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];mungkin bekerja.
tim.plunkett

Ada masalah dalam solusi ini. Jika tidak ada nilai dan maks delta adalah 0 dan Anda mengklik menambahkan item lain, itu tidak akan menambah bidang tambahan. maka ketika Anda mengklik lagi pada tambahkan item lain maka itu akan menambah bidang tambahan. Ini berarti klik dua kali diperlukan untuk menambahkan item lain jika simpul tidak memiliki nilai terhadap bidang itu.
Ahmad

3

Ini akan bekerja untuk semua formulir edit simpul tanpa menentukan nama bidang.

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}

Saya hanya berpikir Anda dapat memeriksa kardinalitas membaca jawaban atas kemudian melihat Anda melakukannya!
jowan sebastian

Untuk menghindari penghapusan satu-satunya masukan bidang (jika bidang tidak diperlukan):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro

2

Anda dapat menulis modul Anda sendiri dengan hook_form_FORM_ID_alter untuk menghapus bidang yang tidak diinginkan. Sesuatu seperti...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}

0

jika dari perspektif backend tidak memungkinkan untuk saat ini, sebuah alternatif bisa menjadi Jquery berikut. Kode ini hanya akan menghapus target pertama saat dimuat halaman, dan hanya akan menghapus target ketika pengguna akan menambahkan file, sehingga Anda tidak akan memiliki masalah ketika Anda sudah memiliki file:

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

(taruh sebelum bodytag penutup page.tpl.php Anda)

Menurut pengujian saya, gambar diunggah tanpa masalah, dan ketika Anda mengedit simpul, semua file terdaftar.

catatan: untuk contoh ini 'field_test_file' adalah nama bidang CCK, jadi ingatlah untuk mengubah sesuai dengan nama bidang cck Anda.


Komentar saya tentang solusi CSS Anda masih berlaku: mengapa melakukan ini ketika Anda bisa melakukannya dengan PHP? Lihat drupal.stackexchange.com/questions/10481/…
tim.plunkett

Halo Tim, saya bisa mengerti sudut pandang Anda, dan saya setuju dalam beberapa kasus. Jika tidak salah, saya kira bidang file CCK menggunakan javascript untuk menampilkan bidang baru, dan merupakan solusi yang baik (Jika Anda menonaktifkan fitur ini, atau tidak memiliki javascript, cara backend / php dimungkinkan seperti alternatif kedua). Juga, saya pikir itu baik untuk mengetahui alternatif untuk menyelesaikan persyaratan yang sama.
cigotete
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.