Değeri 0 olan bir onay kutusu ile bir drupal form gönderme ile ilgili sorunlar

3 Cevap php

Ben birçok onay kutularını içeren bir form içeren bir drupal modülü yazıyorum. Örneğin

$form['myform_checkboxes'] = array('#type' => 'checkboxes', ...)

Ben 0. Eg ile başlayan, bu onay kutularını Sayısal için anahtar yaptık

$form['myform_checkboxes']['#options'][0] = '0:00';
$form['myform_checkboxes']['#options'][1] = '1:00';

Myform_checkboxes_submit fonksiyonu uygulandıktan sonra, bunu kullanıcının giriş neydi yorumlamak zor olduğunu keşfettiler. Interwebs, ben gerekeni yaptım kod birkaç satır güzel buldum.

$checked = array_intersect(
  array_keys($form_state['values']['myform_checkboxes']),
  array_values($form_state['values']['myform_checkboxes'])
);

Bu büyük iş gibi görünüyor; $ kontrol değişkeni kontrol onay kutularını içeren bir dizidir. Tek sorun (0 onay kutusunu temsil eden) 0 değeri her zaman $ aslında veya teslim olup olmadığını, kontrol dahil olmasıdır.

De yararlı dikkat: sıfır onu kontrol edildi ise listenin ilk sırasında, ama son değil ise.

Ne onay kutularını endekslenmesini değişen söz dışında olduğunu varsayarak, bu durumu çözmek için en iyi yol olacağını? (İlgili Bonus soru: drupal form değişkenleri, kullanıcının kontrol kutuları almak için daha kolay bir yolu var mı?)

3 Cevap

Bir unchecked onay kutusunu tarafından döndürülen değeri 0 olduğu için, bu da için dönüş değeri olarak 0 kullanırsanız kontrol devletini tanıması için hiçbir yolu yoktur. Yani soruya hemen cevap oldukça karmaşık olacağını, Jeremy tarafından önerilen ayrı bir js çözüm gelen no yolu (çünkü orada hiçbir best yol olmasıdır basit soruna bir çözüm).

Eğer endeks 0 ile başlatmak için sonuç dizi gerekiyorsa Yani, sonuçlar çıkardıktan sonra geri koyarak, formu seçeneklerini oluştururken geçici 0 giriş kurtulmak gerekir. Bunu yapmanın kolay bir yolu kontrol değerleri çıkardıktan sonra tekrar yerine, 0 için bir yer tutucu olarak -1 (veya dizinin geri kalanında kullanılan herhangi başka bir değer) kullanmak olacaktır.

Jeremy tarafından belirtildiği gibi başka bariz çözüm, yeniden dizin olacaktır. Sizin örnekte baktığımızda, neden sadece ayrıca tuşları / dönüş değerleri olarak gösterge değerleri (0:00, 1:00, ...) kullanmak değil mi? Hayır orada belirsizlik ve ihtiyaç olması halinde, tamsayılar dönüştürmek kolay.

Aslında, ne yapıyor sona bu oldu.

if (in_array(0, $checked) && $checked[0] != 0) {
  unset($checked[count($checked) - 1]);
}

0 dizide olup olmadığını kontrol eder, ve ilk öğe değil ise, o zaman (kullanıcı 0'a karşılık gelen onay kutusunu değil bu olur) son olmalıdır. Bu yüzden kontrol değildi çünkü, diziden bu öğeyi kaldırır. İdeal ya da güzel, ama benim durum için mantıklı değil.

Işaret edildiği gibi diğer durumların çoğunda (ve belki de benim), yeniden indeksleme daha iyi olurdu.

EDIT: umurunda herkes için, bu kendim için (yorumlar dahil) oluşturarak sona erdi yardımcı fonksiyonudur.

function _mymodule_get_checked_checkboxes(&$form_state, $table) {

  // Discover which boxes were checked.
  $checked = array_intersect(array_keys($form_state['values'][$table]),
                          array_values($form_state['values'][$table]));

  // The key '0' is included in the first position if it was selected,
  //  and in the last if it was not.
  //  this is how checkboxes return their data.
  //  However, we don't want 0 to be in the array
  //  therefore, we remove it if 0 is found to be in the last position
  $num_checked = count($checked);
  if ($checked[0] != 0 && $checked[$num_checked - 1] == 0) {
    unset($checked[count($checked) - 1]);
  }
  // It also happens if nothing is selected.
  // In the case that only 0 is selected, assume otherwise.
  else if ($num_checked == 1 && $checked[0] == 0) {
    unset($checked[0]);
  }

  sort($checked);
  return $checked;
}

Sen onay kutularını kontrol durumunu kontrol etmek ve gizli bir alana değerleri koymak için bir JS işleyici göndermek kullanabilirsiniz.

Daha sonra diğer ucunda değerleri çözmek için bir Drupal form işleyicisi kullanmak gerekir.