web-gelistirme-sc.com

Bir 'onay kutuları' FAPI öğesinde tek bir onay kutusunu nasıl devre dışı bırakabilirim?

Başlık temelde her şeyi söylüyor, bir onay kutuları tipi FAPI öğesinin tek bir onay kutusunu devre dışı bırakmak istiyorum.

JavaScript ile yapmak istemiyorum, ne de onay kutuları birden çok onay kutus öğeleri öğesi başka bir modül tarafından sağlanan gibi bir seçenek değiştiriyor.

Düşünceler?

31
Decipher

Temiz bir yol Drupal 7! Görünüşe göre, başına bu yazı , henüz belgelenmedi.

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
}

Başka bir örnek .

Onay kutusunu tamamen gizlemek için # access işlevini FALSE olarak da ayarlayabilirsiniz.

36
timofey.com

Ne yazık ki FAPI'de bunu yapmanın gerçekten temiz bir yolu yok. En iyi bahsiniz - eğer kararlıysanız - onay kutuları öğesine ek bir # işlem fonksiyon değiştirmek.

'Checkboxes' türündeki öğelere eklenen varsayılan işlev aslında bir işlevdir ( expand_checkboxes () ), tek bir öğeyi daha sonra tekrar birleştirilecek olan 'checkbox' türünde birden çok öğeye ayırır. İkinci işlem işlevinizi piggyback yaparsanız, genişletilmiş 'onay kutusu' öğeleri grubuna ulaşabilir ve söz konusu olanı devre dışı bırakabilir.

Aşağıdaki kod tamamen test edilmemiştir, bu nedenle uyarı emptoru:

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

Drupal 7, Kullanıcı Düzenle sayfasındaki Roller öğesini değiştirmek için kodum.

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

Onay kutularını "ata" ve "atamayı kaldır" olarak kullanıyorum. Müşteri "atamayı kaldır" ı devre dışı bırakmamı istedi, ancak yine de "atamayı" temsil etmek önemlidir. DEVRE DIŞI onay kutularının "yanlış" olarak gönderildiğini ve düzgün kullanılmazsa atamaların kaldırılacağını akılda tutarak, onay kutularımı "bunları işleme" ve "devre dışı bırakılanları yoksay" olarak ayırdım. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

// 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),
);

'Partner_assignments' öğesinin kendi dizisi/değişkeni olduğuna ve kullanım durumumda "atamayı kaldır" olarak işlenmeyeceğine dikkat edin. Gönderdiğiniz için teşekkürler. Beni bu çözüme götürdü.

3
texas-bronius

D7. Burada, bir düğüm eklerken belirli bir sınıflandırma terimi referans seçeneğinin her zaman kontrol edilemez olduğundan ve her zaman düğüme kaydedileceğinden emin olmamız gerekiyordu. Bu nedenle #after_build'e girdik ve belirli bir seçeneği devre dışı bıraktık, ancak sonunda belirli bir seçeneğin uygulanacağından emin olmak zorunda kaldık. Çünkü sadece devre dışı bırakmak, bu seçeneğin gelecekteki kancalara seyahatini durdururdu.

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

Devre dışı bırakılan seçenek şöyle görünür:

enter image description here

3
leymannx

Eaton'ın yazılı olarak yanıtını alamadım (#process geri çağrısı hiçbir şey döndürmez ve onay kutuları genişletilmeden önce çağrılır) ve ayrıca değerin devre dışı bırakılmış onay kutusundan döndürülmesini istedim (kalıcı olarak kontrol edilmesini istedim) ). Bu benim için çalıştı (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';
}

Herkes daha temiz bir yol bilirse, duymak isterim!

2
Andy

Drupal 7 içinde, çalışılabilir bir varlıktaki bir seçimdeki seçenekleri devre dışı bırakmak için bir #process işlevi. Ne yazık ki, bu yerleşik işlem işlevini devre dışı bıraktı, form_process_checkboxes, bu nedenle geri eklenmesi gerekir (veya işlem işlevinizden çağrılır). Ayrıca, önceden işaretlenmiş onay kutularını devre dışı bırakırken, yerleşik değer geri aramasının (form_type_checkboxes_value) girişten sonuçlar alınırken varsayılanları yok sayar.

$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';

Sonra böyle bir şey:

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

Ve sonunda:

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

Bu sayfadaki diğer cevapların hiçbirinin bu durumda işe yaradığını bulamadım.

1
Dan Chadwick

İşte benim örneğim (#after_build):

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

Ayrıca aşağıdaki işlev geri araması:

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

Drupal 6 üzerinde test edildi, ancak Drupal 7 için de çalışmalıdır.


Drupal 6

Aşağıdaki işlevi kullanabilirsiniz ( kaynak ):

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

Drupal 7, Kullanıcı Düzenle sayfasındaki Roller öğesini değiştirmek için kodum.

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

Metin alanını bağlayın ve veritabanından gelen bilgileri içeren dinamik bir metin kutusu oluşturun

1 ° Doç. veritabanından dizi ör.

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

2 ° hook_form_alter() uygular

/ ** * hook_form_alter () yöntemini uygular. * form id = görünümler-açıklayıcı 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,
      );
    }
}

3 ° birden fazla alan kontrol edilebilir!

0
Mathieu Dierckx

Kendi formunuzu oluşturuyorsanız, ayrı form_alter/# process/# pre_render işlevlerini kullanmak yerine 'onay kutularından' tek tek 'onay kutusu' öğeleri oluşturmaya geçebilirsiniz.

$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, $ Form_state ['değerleri'] dizisi doğrulama/gönderme/yeniden oluşturma işlemine geldiğinde onay kutusu sürümüyle aynı ağaç yapısını verir. Herhangi bir nedenle # ağaç kullanamıyorsanız veya istemiyorsanız, her onay kutusuna bir '#parents' => array('my_element', $key) özelliği verin ve değerler yapısındaki konumunu açıkça ayarlayın.

0
KingAndy

Bu kodu drupal 6: - kullanıyorum:

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

ve geri arama işlevi burada: -

/ ** * 'feture' yöntemini temel alan her onay kutusunu bir Alt etki alanı tarafından zaten kullanılıyor veya kullanmıyor. * @param Dizi $ öğe form onay kutusu dizisi * /

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

Etkilemeniz gereken önemli bir şey, devre dışı bırakılmış onay kutularının gönderilmemesidir, bu nedenle #value onay kutusunun işaretini de ekleyin. Örneğin:

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

Benim durumumda, bu olmadan, $form_state['values'] onay kutusu değerimi içermiyordu (varsayılan olarak etkindir, ancak devre dışıdır).

0
Nick