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


31

Başlık temel olarak her şeyi söylüyor, FAPI öğesi onay kutularının tek bir onay kutusunu devre dışı bırakmak istiyorum .

JavaScript ile yapmak istemiyorum, ya da onay kutularından birden fazla onay kutusu elemanına değiştirmek , eleman başka bir modül tarafından sağlanıyor.

Düşünceler?


Sorunuzda bir yazım hatası var: "disable"
FR6

Yanıtlar:


36

Drupal 7'de temiz bir yol var! Görünüşe göre, bu yayın başına , henüz belgelenmemiş.

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 .


3
Yazım hatası düzeltilmişken, bu kod kesinlikle D7'de benim için çalışıyor. Teşekkür ederim!
beth

1
Büyük yakalamak! Senin için çalışmasına sevindim.
timofey.com

2
#Access kullanıyorsanız, onay kutusu #default_values ​​içinde ayarlanmışsa, gönderim sırasında form durum değerlerinde ayarlanmaz.
Nick,

Bu güzel çalışıyor.
David Meister

AFAICT görünümlerinde Better Exposed Filters (BEF) kullanarak onay kutularıyla (birden fazla öğe seçebilir) çalışmaz.
1kenthomas,

22

Maalesef, FAPI’da bunu yapmanın gerçekten temiz bir yolu yok. En iyi bahisiniz - eğer kararınız varsa - onay kutularına ek # işlem işlevini değiştirmektir .

'Onay kutuları' türündeki öğelere eklenen varsayılan işlev aslında bir işlevdir ( expand_checkboxes () ), tek öğeyi daha sonra geri birleştirilen 'onay kutusu' türündeki birden çok öğeye ayırır. İkinci işlem işlevinizi azarlayacak olursanız, genişletilmiş 'onay kutusu' öğeleri grubuna ulaşabilir ve söz konusu olanı devre dışı bırakabilirsiniz.

Aşağıdaki kod tamamen denenmemiş, bu yüzden emptor emptor:

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

Yaklaştığım yaklaşımdan daha iyi, bu da elemente bir tema fonksiyonu eklemek preg_replace()ve çıktının üzerinden geçmek .
deşifre

Bir "ara" ekleyebilirsin; Aynı element anahtarını iki kez görmeyi beklemiyorsanız, yukarıdaki if ifadesinde biraz daha fazla etkinlik.
Chris Cohen

İyi yakalamalar Chris, kod pasajını değiştirdim. Teşekkürler!
Eaton

2
Kabul edilen cevap @ timofey'nin yanıtıyla karşılaştırıldığında biraz fazla görünüyor.
Citricguy

6

Kullanıcıyı Düzenle sayfasındaki Roller öğesini değiştirmek için Drupal 7 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;
}

3

"Atama" ve "Atama" olarak onay kutularını kullanıyorum. Müşteri, "atamam" ı devre dışı bırakmamı istedi, ancak "ödev" i göstermek hala önemlidir. DISABLED onay kutularının "false" olarak gönderildiğini ve uygun şekilde kullanılmadıklarının işaretlerinin kaldırılmayacağını unutmayın, onay kutularımı "bunları işle" ve "bu engelli olanları yoksay" olarak ayırdım. İşte nasıl:

// 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'ın kendi dizisi / değişkeni olduğuna ve benim kullanım durumumda "atamam" olarak işlenmeyeceğine dikkat edin. Mesajınız için teşekkürler. Beni bu çözüme götürdü.


3

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

// 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ılmış seçenek şöyle görünür:

görüntü tanımını buraya girin


2

Eaton'ın cevabının yazıldığı gibi çalışmasını sağlayamadım (#peri geri çağırma hiçbir şey döndürmez ve onay kutuları genişletilmeden önce aranır) ve değeri devre dışı bırakılmış onay kutusundan döndürmek 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';
}

Herhangi biri daha temiz bir yol biliyorsa, duymayı çok isterim!


Fatal error: Call to undefined function expand_checkboxes()
leymannx

1
@koivo Bu bir D6 cevabıydı, fonksiyon artık D7'de mevcut değil
Andy

1

Kullanıcıyı Düzenle sayfasındaki Roller öğesini değiştirmek için Drupal 7 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

Drupal 7'de, seçilebilir bir varlıktaki bir seçimdeki seçenekleri devre dışı bırakmak için, bir işlev kurmam gerektiğini öğrendim #process. Ne yazık ki, bu yerleşik işlem işlevini devre dışı bıraktı, bu form_process_checkboxesyüzden geri eklenmesi gerekiyor (veya işlem işlevinizden çağrılıyor). Ayrıca, önceden işaretlenmiş olan onay kutularını devre dışı bırakırken, yerleşik değer geri çağırma ( form_type_checkboxes_value) öğesinin girdiden sonuçları alırken varsayılanları yoksaydığını keşfettim .

$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 cevaplardan herhangi birinin bu durumda işe yaradığını bulamadım.


1

İşte benim örnek (kullanarak #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 çağrısı:

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'da test edildi ancak Drupal 7 için de çalışması gerekiyor.


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

D7: Aynı, #after_build kullanarak istediğiniz şekilde çalışıyor. Ayrıca #attribute kullanarak ayarın devre dışı bırakıldığını onaylayın.
SGhosh

0

Bu kodu drupal 6'da 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' temelinde her bir onay kutusunu işleyin zaten bir Alt etki alanı tarafından kullanılıyor veya kullanılmıyor. * @param Dizi $ öğe form onay kutusu dizileri * /

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

Drupal.stackexchange.com'a Hoşgeldiniz! Lütfen kod biçimlendirmenizi düzeltin. Legal_process_checkboxes () işlevinden önceki yorumlar "kod" biçiminin dışında bırakılmış. Teşekkür ederim.
ermannob

0

Dikkat edilmesi gereken önemli bir husus, engelli onay kutularının gönderilmemesidir, bu nedenle #valueonay kutusunu da zorlamanız gerekebilir. Örneğin:

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

Benim durumumda, bu olmadan, $form_state['values']onay kutumdaki değeri içermiyor (varsayılan olarak etkin, ancak devre dışı bırakılmış).


0

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

1 ° dolandır. veri tabanından dizi

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

2 ° Uygular hook_form_alter()

/ ** * hook_form_alter () öğesini uygular. * form kimliği = görünümlere maruz kalan 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 ° çoklu alanlar kontrol edilebilir!


0

Kendi formunuzu oluşturuyorsanız, ayrı form_alter / # process / # pre_render işlevlerini kullanmak yerine, sadece 'onay kutuları' ndan bireysel '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 ['value'] dizisi doğrulama / teslim / yeniden oluşturma işlemine ulaştığında size onay kutusu sürümüyle aynı ağaç yapısını verir. Herhangi bir nedenle #tree kullanmak istemiyorsanız veya istemiyorsanız, her onay kutusuna '#parents' => array('my_element', $key)değer yapısındaki konumunu açıkça belirlemek için bir özellik verin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.