Bagaimana cara menerapkan "Tambahkan item lain" untuk formulir kustom?

9

Saya menulis modul yang pada dasarnya merupakan bentuk yang menciptakan hubungan antara dua titik akhir.

Saya ingin pengguna dapat membuat banyak hubungan sekaligus. Saya ingin menambahkan tombol yang mengatakan "tambahkan item lain" seperti bagaimana bidang memiliki ketika Anda memilih tidak terbatas dalam pengaturannya.

Apakah ada cara saya bisa melakukan ini pada formulir kustom juga?

Jayaram
sumber

Jawaban:

12

Salah satu cara untuk melakukan ini adalah dengan menyetel bidang formulir / set bidang dalam fungsi for. Buat fungsi terpisah untuk menambah nilai melalui tombol panggil balik misalnya dan membangun kembali formulir setelah Anda bertambah.

for($x=1; $x<=$variabletoincrement; $x++){
(insert form fields/field sets )
}

Berikut adalah kode dari form_example_tutorial_9 yang menunjukkan informasi tentang cara membuat bidang dinamis. Informasi ini jauh lebih menyeluruh daripada penjelasan saya:

http://api.drupal.org/api/examples/form_example!form_example_tutorial.inc/function/form_example_tutorial_9_add_name/7

http://api.drupal.org/api/examples/form_example%21form_example_tutorial.inc/function/form_example_tutorial_9/7

konsensus umum
sumber
8

Untuk memiliki contoh kode yang sederhana dan berfungsi:

function MYMODULE_MYFORM($form, &$form_state) {

  // #tree will ensure the HTML elements get named distinctively.
  // Not just name=[name] but name=[container][123][name].
  $form['#tree'] = TRUE;

  if (empty($form_state['number_names'])) {
    $form_state['number_names'] = 1;
  }

  for ($i = 1; $i <= $form_state['number_names']; $i++) {

    $form['container'][$i] = array(
      '#type' => 'container',
    );
    $form['container'][$i]['name'] = array(
      '#type' => 'textfield',
      '#attributes' =>array('placeholder' => t('Name')),
      '#size' => 20,
      '#required' => TRUE,
    );
  }

  $form['add_item'] = array(
    '#type' => 'submit',
    '#value' => t('Add another name'),
    '#submit' => array('MYMODULE_MYFORM_add_item'),
  );

  if ($form_state['number_names'] > 1) {

    $form['remove_item'] = array(
      '#type' => 'submit',
      '#value' => t('Remove latest name'),
      '#submit' => array('MYMODULE_MYFORM_remove_item'),
      // Since we are removing a name, don't validate until later.
      '#limit_validation_errors' => array(),
    );
  }

  // $form['submit'] = array(
  //   '#type' => 'submit',
  //   '#value' => 'Submit',
  // );

  return $form;
}

function MYMODULE_MYFORM_add_item($form, &$form_state) {

  // All we need is to increase the number used in our for loop above ...
  $form_state['number_names']++;
  // ... and rebuild our form.
  $form_state['rebuild'] = TRUE;
}

function MYMODULE_MYFORM_remove_item($form, &$form_state) {

  // Just the other way around until only one item is left ...
  if ($form_state['number_names'] > 1) {
    $form_state['number_names']--;
  }
  // ... and form rebuild again.
  $form_state['rebuild'] = TRUE;
}

Drupal 8

Lihat modul Contoh AjaxAddMore.php(klik tautan "Lihat sumber" kecil).

leymannx
sumber