it-swarm-id.com

Bagaimana saya bisa menonaktifkan satu kotak centang di elemen FAPI 'kotak centang'?

Judul pada dasarnya mengatakan itu semua, saya ingin menonaktifkan satu kotak centang dari kotak centang ketik elemen FAPI.

Saya tidak ingin melakukannya jika dengan JavaScript, juga tidak mengubahnya dari kotak centang ke beberapa kotak centang elemen opsi sebagai elemen disediakan oleh modul lain.

Pikiran?

31
Decipher

Cara bersih memang ada di Drupal 7! Rupanya, per posting ini , belum didokumentasikan.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['checkboxes_element']['#disabled'] = TRUE; //disables all options
  $form['checkboxes_element'][abc]['#disabled'] = TRUE; //disables option, called abc
}

Lain contoh .

Anda juga dapat mengatur # access fungsi ke FALSE, untuk menyembunyikan kotak centang.

36
timofey.com

Sayangnya tidak ada cara yang benar-benar bersih untuk melakukannya di FAPI. Taruhan terbaik Anda - jika Anda bertekad - adalah mengubah fungsi proses # proses tambahan ke elemen kotak centang.

Fungsi default yang ditambahkan ke elemen tipe 'checkbox' sebenarnya adalah fungsi ( expand_checkboxes () ) membagi elemen tunggal menjadi beberapa elemen dari checkbox tipe ' 'Yang kemudian digabung kembali menjadi satu. Jika Anda ingin mendukung fungsi proses kedua Anda, itu bisa menjangkau ke dalam grup elemen 'kotak centang' yang diperluas dan menonaktifkan elemen yang dimaksud.

Kode berikut ini sama sekali belum diuji, jadi emptor peringatan:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['checkboxes_element']['#process'][] = 'mymodule_disable_element';
}

function mymodule_disable_element($element) {
  foreach (element_children($element) as $key) {
    if ($key == YOUR_CHECK_VALUE) {
      $element[$key]['#disabled'] = TRUE;
      return;
    }
  }
}
23
Eaton

Ini kode saya untuk Drupal 7, untuk mengubah elemen Peran di halaman Edit Pengguna.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['checkboxes_element']['#pre_render'][] = 'form_process_checkboxes'; // I had to add this one, or it will return the first role only with my callback bellow
  $form['checkboxes_element']['#pre_render'][] = 'mymodule_disable_element';
}

function mymodule_disable_element(($element) {
  foreach (element_children($element) as $key) {
    if ($key == YOUR_CHECK_VALUE) {
      $element[$key]['#attributes']['disabled'] = 'disabled';
    }
  }
  return $element;
}
6
aFeijo

Saya menggunakan kotak centang sebagai "assign" dan "unassign". Klien telah meminta saya menonaktifkan "membatalkan tugas", tetapi masih penting untuk mewakili "tugas." Perlu diingat bahwa kotak centang DISABLED mengirimkan sebagai "salah" dan jika tidak ditangani dengan benar akan membatalkan penetapan, saya membagi kotak centang saya menjadi "proses ini" dan "abaikan yang dinonaktifkan ini." Begini caranya:

// Provide LIVE checkboxes only for un-assigned Partners
$form['partner']['partners'] = array(
  '#type' => 'checkboxes',
  '#options' => array_diff($partners, $assignments),
  '#title' => t($partnername),
);
// Provide DISABLED checkboxes for assigned Partners (but with a different variable, so it doesn't get processed as un-assignment)
$form['partner']['partner_assignments'] = array(
  '#type' => 'checkboxes',
  '#options' => $assignments,
  '#default_value' => array_keys($assignments),
  '#disabled' => TRUE,
  '#title' => t($partnername),
);

Perhatikan bahwa 'partner_assignments' adalah array/variabelnya sendiri dan tidak akan diproses sebagai "tidak ditetapkan," dalam kasus penggunaan saya. Terima kasih telah memposting - itu menuntun saya ke solusi ini.

3
texas-bronius

D7. Di sini kami harus memastikan bahwa ketika menambahkan sebuah node, satu opsi referensi istilah taksonomi tertentu selalu tidak dapat diperiksa dan akan selalu disimpan ke node tersebut. Jadi kami masuk ke #after_build dan menonaktifkan opsi tertentu itu, tetapi harus memastikan bahwa pada akhirnya opsi tertentu akan diteruskan. Karena hanya menonaktifkan itu akan menghentikan perjalanan opsi itu ke kait masa depan.

// a constant
define('MYTERM', 113);

/**
 * Implements hook_form_alter().
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'MYCONTENTTYPE_node_form') {
    $form['#after_build'][] = 'MYMODULE_MYCONTENTTYPE_node_form_after_build';
    }
}

/**
 * Implements custom after_build_function()
 */
function MYMODULE_MYCONTENTTYPE_node_form_after_build($form, &$form_state) {
  foreach (element_children($form['field_MYFIELD'][LANGUAGE_NONE]) as $tid) {
    if ($tid == MYTERM) {
      $element = &$form['field_MYFIELD'][LANGUAGE_NONE][$tid];
      $element['#checked'] = TRUE;
      $element['#attributes']['disabled'] = 'disabled';
    }
  }
  // here's ensured the term's travel goes on
  $form['field_MYFIELD'][LANGUAGE_NONE]['#value'] += drupal_map_assoc(array(MYTERM));
  return $form;
}

Seperti itulah tampilan opsi yang dinonaktifkan:

enter image description here

3
leymannx

Saya tidak bisa mendapatkan jawaban Eaton untuk bekerja seperti yang tertulis (# proses callback tidak mengembalikan apa pun, dan itu dipanggil sebelum kotak centang diperluas) dan saya juga ingin memiliki nilai yang dikembalikan dari kotak centang dinonaktifkan (saya ingin itu diperiksa secara permanen ). Ini bekerja untuk saya (D6).

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['checkboxes_element']['#process'][] = 'mymodule_disable_element';
}

function mymodule_disable_element($element) {
  $expanded = expand_checkboxes($element);
  $checkbox =& $expanded[YOUR_CHECK_VALUE];
  $checkbox['#disabled'] = TRUE;
  $checkbox['#value_callback'] = 'mymodule_element_value_callback';
  return $expanded;
}

function mymodule_element_value_callback($element, $edit = FALSE) {
  // Return whatever value you'd like here, otherwise the element will return
  // FALSE because it's disabled.
  return 'VALUE';
}

Jika ada yang tahu cara yang lebih rapi, saya ingin mendengarnya!

2
Andy

Dalam Drupal 7, untuk menonaktifkan opsi di pilih di entitas yang dapat fieldable, saya menemukan bahwa saya harus menginstal #process fungsi. Sayangnya, ini menonaktifkan fungsi proses bawaan, form_process_checkboxes, sehingga perlu ditambahkan kembali (atau dipanggil dari fungsi proses Anda). Selain itu, ketika menonaktifkan kotak centang yang sudah dicentang, saya menemukan bahwa callback nilai bawaan (form_type_checkboxes_value) mengabaikan default saat mengambil hasil dari input.

$field_lang_form = &$your_form[$field][LANGUAGE_NONE];
$field_lang_form['#process'][] = 'form_process_checkboxes';
$field_lang_form['#process'][] = 'YOURMODULE_YOURFUNCTION_process';
$field_lang_form['#value_callback'] = 'YOURMODULE_form_type_checkboxes_value';

Maka sesuatu seperti ini:

function YOURMODULE_YOURFUNCTION_process($element) {
  // Disallow access YOUR REASON, but show as disabled if option is set.
  foreach (element_children($element) as $field) {
    if (REASON TO DISABLE HERE) {
      if (!empty($element[$field]['#default_value'])) {
        $element[$field]['#disabled'] = TRUE;
      } else {
        $element[$club]['#access'] = FALSE;
      }
    }
  }
  return $element;
}

Dan akhirnya:

function YOURMODULE_form_type_checkboxes_value($element, $input = FALSE) {
  if ($input !== FALSE) {
    foreach ($element['#default_value'] as $value) {
      if (THIS OPTION WAS SET AND DISABLED - YOUR BUSINESS LOGIC) {
        // This option was disabled and was not returned by the browser. Set it manually.
        $input[$value] = $value;
      }
    }
  }
  return form_type_checkboxes_value($element, $input);
}

Saya tidak menemukan bahwa ada jawaban lain di halaman ini yang berfungsi dalam kasus ini.

1
Dan Chadwick

Ini adalah contoh saya (menggunakan #after_build):

$form['legal']['legal_accept']['#type'] = 'checkboxes';
$form['legal']['legal_accept']['#options'] = $options;
$form['legal']['legal_accept']['#after_build'][] = '_process_checkboxes';

Ditambah fungsi callback berikut:

function _process_checkboxes($element) {
  foreach (element_children($element) as $key) {
    if ($key == 0) { // value of your checkbox, 0, 1, etc.
      $element[$key]['#attributes'] = array('disabled' => 'disabled');
      // $element[$key]['#theme'] = 'hidden'; // hide completely
    }
  }
  return $element;
}

Diuji pada Drupal 6, tetapi harus bekerja untuk Drupal 7 juga.


Drupal 6

Anda dapat menggunakan fungsi berikut ( sumber ):

/*
 * Change options for individual checkbox or radio field in the form
 * You can use this function using form_alter hook.
 * i.e. _set_checkbox_option('field_tier_level', 'associate', array('#disabled' => 'disabled'), $form);
 *
 * @param $field_name (string)
 *    Name of the field in the form
 * @param $checkbox_name (string)
 *    Name of checkbox to change options (if it's null, set to all)
 * @param $options (array)
 *    Custom options to set
 * @param $form (array)
 *    Form to change
 *
 * @author kenorb at gmail.com
 */
function _set_checkbox_option($field_name, $checkbox_name = NULL, $options, &$form) {
    if (isset($form[$field_name]) && is_array($form[$field_name])) {
        foreach ($form[$field_name] as $key => $value) {
            if (isset($form[$field_name][$key]['#type'])) {
                $curr_arr = &$form[$field_name][$key]; // set array as current
                $type = $form[$field_name][$key]['#type'];
                break;
            }
        }
        if (isset($curr_arr) && is_array($curr_arr['#default_value'])) {
            switch ($type) { // changed type from plural to singular
                case 'radios':
                    $type = 'radio';
                    break;
                case 'checkboxes':
                    $type = 'checkbox';
                    break;
            }

            foreach ($curr_arr['#default_value'] as $key => $value) {
                foreach($curr_arr as $old_key => $old_value) { // copy existing options for to current option
                    $new_options[$old_key] = $old_value;
                }
                $new_options['#type'] = $type;  // set type
                $new_options['#title'] = $value;  // set correct title of option
                $curr_arr[$key] = $new_options; // set new options

                if (empty($checkbox_name) || strcasecmp($checkbox_name, $value) == 0) { // check name or set for 
                    foreach($options as $new_key => $new_value) {
                        $curr_arr[$key][$new_key] = $value;
                    }
                }
            }
            unset($curr_arr['#options']); // delete old options settings
        } else {
            return NULL;
        }
    } else {
        return NULL;
    }
}

/*
 * Disable selected field in the form(whatever if it's textfield, checkbox or radio)
 * You can use this function using form_alter hook.
 * i.e. _disable_field('title', $form);
 *
 * @param $field_name (string)
 *    Name of the field in the form
 * @param $form (array)
 *    Form to change
 *
 * @author kenorb at gmail.com
 */
function _disable_field($field_name, &$form) {
    $keyname = '#disabled';

    if (!isset($form[$field_name])) { // case: if field doesn't exists, put keyname in the main array
        $form[$keyname] = TRUE;
    } else if (!isset($form[$field_name]['#type']) && is_array($form[$field_name])) { // case: if type not exist, find type from inside of array
        foreach ($form[$field_name] as $key => $value) {
            if (isset($form[$field_name][$key]['#type'])) {
                $curr_arr = &$form[$field_name][$key]; // set array as current
                break;
            }
        }
    } else {
        $curr_arr = &$form[$field_name]; // set field array as current
    }

    // set the value
    if (isset($curr_arr['#type'])) {
        switch ($curr_arr['#type']) {
            case 'textfield':
            default:
                $curr_arr[$keyname] = TRUE;
        }
    }
}
1
kenorb

Ini kode saya untuk Drupal 7, untuk mengubah elemen Peran di halaman Edit Pengguna.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $form['checkboxes_element']['#pre_render'][] = 'form_process_checkboxes'; // I had to add this one, or it will return the first role only with my callback bellow
  $form['checkboxes_element']['#pre_render'][] = 'mymodule_disable_element';
}

function mymodule_disable_element(($element) {
  foreach (element_children($element) as $key) {
    if ($key == YOUR_CHECK_VALUE) {
      $element[$key]['#attributes']['disabled'] = 'disabled';
      return $element;
    }
  }
  return $element;
}
1
jrockowitz

Kaitkan bidang teks dan buat kotak teks dinamis dengan info dari basis data

1 ° dapatkan assoc. array dari database misalnya

$blah = array('test1' => 'Choose for test1', 'test2' => 'Choose for test2', ...)

2 ° Implements hook_form_alter()

/ ** * Menerapkan hook_form_alter (). * form id = views-exposed-form * /

function test_form_alter(&$form, &$form_state, $form_id)
{
  //only for this particular form
  if ($form['#id'] == "views-exposed-form-advanced-search-page-2")
    {
       $form['phases'] = array(
           '#type' => 'checkboxes',
           '#options' => $blah,
      );
    }
}

Beberapa bidang 3 ° akan dapat diperiksa!

0
Mathieu Dierckx

Jika Anda sedang membangun formulir Anda sendiri, alih-alih menjalankan fungsi form_alter/# proses/# pre_render yang terpisah, Anda bisa beralih dari 'kotak centang' ke menghasilkan elemen 'kotak centang' individual.

$options = array(
   1 => t('Option one'),
   2 => t('Option two'),
);

// Standard 'checkboxes' method:
$form['my_element'] = array(
  '#type' => 'checkboxes',
  '#title' => t('Some checkboxes'),
  '#options' => $options,
);

// Individual 'checkbox' method:
$form['my_element'] = array(
  '#type' => 'container',
  '#attributes' => array('class' => array('form-checkboxes')),
  '#tree' => TRUE,
  'label' => array('#markup' => '<label>' . t('Some checkboxes') . '</label>',
);
foreach ($options as $key => $label) {
  $form['my_element'][$key] = array(
    '#type' => 'checkbox',
    '#title' => $label,
    '#return_value' => $key,
  );
}
// Set whatever #disabled (etc) properties you need.
$form['my_element'][1]['#disabled'] = TRUE;

'#tree' => TRUE Memberi Anda struktur pohon yang sama dengan versi kotak centang ketika array $ form_state ['values'] tiba di validasi/kirim/bangun kembali. Jika Anda tidak dapat atau tidak ingin menggunakan #tree karena alasan tertentu, berikan setiap kotak centang properti '#parents' => array('my_element', $key) untuk secara eksplisit mengatur posisinya dalam struktur nilai.

0
KingAndy

Saya menggunakan kode berikut ini di drupal 6: -

$form['statuses'] = array(
    '#type' => 'checkboxes',
    '#options' => $statuses,
    '#default_value' => $status_val,
    '#after_build' => array('legal_process_checkboxes')
    );

dan fungsi panggilan balik ada di sini: -

/ ** * Memproses setiap kotak centang berdasarkan 'feture' sudah digunakan oleh Sub-domain atau tidak. * @param Array $ array elemen dari checkbox form * /

function legal_process_checkboxes($element) {

  foreach (element_children($element) as $key) {

    $feature_id = $key;
    $res_total = '';

    $total = feature_used($feature_id) ;

    if ($total) {
      $element[$key]['#attributes'] = array('disabled' => 'disabled');
    }
  }
  return $element;
}
0
Sandip Ghosh

Satu hal penting yang harus diperhatikan adalah bahwa kotak centang yang dinonaktifkan tidak dapat dikirim, jadi Anda mungkin harus memaksa #value dari kotak centang juga .. Misalnya:

$element['child1']['#disabled'] = TRUE;
$element['child1']['#value'] = 'child1';

Dalam kasus saya, tanpa ini, $form_state['values'] tidak mengandung nilai kotak centang saya (yang diaktifkan secara default, tetapi dinonaktifkan).

0
Nick