القضايا مع تقديم النموذج دروبال مع مربع التي تقدر قيمتها 0

StackOverflow https://stackoverflow.com/questions/1745869

  •  20-09-2019
  •  | 
  •  

سؤال

وأنا أكتب وحدة نمطية دروبال التي تنطوي على شكل مع العديد من خانات. منها مثلا.

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

ولقد جعلت المفتاح لهذه خانات رقمية، بدءا 0. منها مثلا.

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

وعند تنفيذ وظيفة myform_checkboxes_submit، لقد اكتشف أنه من الصعب تفسير ما كان إدخال المستخدم. على interwebs، وجدت بضعة أسطر لطيفة من التعليمات البرمجية التي فعلت ما احتاجه.

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

وهذا يبدو رائعا العمل؛ المتغير $ فحص صفيف بما في ذلك مربعات فحص فقط. المشكلة الوحيدة هي أن قيمة 0 (الذي يمثل مربع 0TH) يتم تضمين دائما في $ التحقق، سواء تم التحقق فعلا أم لا.

وأيضا من المفيد ملاحظة: ويظهر الصفر لأول مرة في قائمة إذا تم التحقق من ذلك، ولكن الماضي إذا لم يكن

وماذا سيكون أفضل وسيلة لحل هذا الوضع، على افتراض أن تغيير فهرسة خانات كانت غير وارد؟ (ذات الصلة مسألة المكافأة: هناك أسهل طريقة للحصول على مربعات التحقق من المستخدم من متغيرات النموذج دروبال)

هل كانت مفيدة؟

المحلول

وبما أن القيمة التي تم إرجاعها من قبل لحالها مربع 0، لا توجد وسيلة للاعتراف بالدولة التحقق إذا كنت تستخدم 0 كقيمة مقابل ذلك أيضا. هكذا كان الجواب فورية لسؤالك هو أن لا <م> أفضل الطريق، وذلك ببساطة لأن هناك <م> لا طريقة (وبصرف النظر عن شبيبة الحل على النحو الذي اقترحه جيريمي، التي من شأنها أن تكون هناك معقدة جدا حل لمشكلة بسيطة).

وحتى إذا كنت تحتاج مجموعة نتيجة لبدء مع مؤشر 0، سيكون لديك للتخلص من دخول 0 مؤقتا عند بناء خيارات النموذج، إعادته في بعد استخراج النتائج. وهناك طريقة سهلة للقيام بذلك هو استخدام -1 (أو أي قيمة أخرى لا تستخدم في بقية مجموعة) كعنصر نائب ل0، والاستعاضة عنها مرة أخرى بعد استخراج فحص القيم.

والحل واضح آخر سيتم إعادة الفهرسة، كما ذكر جيريمي. النظر في المثال الخاص بك، لماذا لا مجرد استخدام القيم الخاصة بك العرض (0:00، 1:00، ...) كقيم مفاتيح / عودة أيضا؟ لا غموض هناك، وسهلة لتحويل إلى أعداد صحيحة، إذا اقتضى الأمر.

نصائح أخرى

في الواقع، ما انتهى بي الأمر كان يفعل ذلك.

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

واذا تحقق 0 في المصفوفة، وإذا كان ليس العنصر الأول، ثم يجب أن تكون الأخيرة (يحدث هذا عندما لا يتحقق المستخدم المربع المقابل ل0). لذلك يزيل هذا البند من مجموعة، حيث لم تأكدت منه. ليست مثالية أو جميلة، ولكن كان من المنطقي لوضعي.

وفي معظم الحالات الأخرى (وربما في منجم)، كما أشار

والخروج، فإن إعادة فهرسة يكون أفضل.

وتحرير: لمن يهتم، هذه هي وظيفة مساعد انتهى بي المطاف خلق لنفسي (وتضمنت تعليقات)

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

هل يمكن استخدام JS تقدم مناول للتحقق من حالة التحقق من خانات ووضع القيم في حقل مخفي.

وأنت بعد ذلك تحتاج إلى استخدام معالج النموذج دروبال لفك القيم على الطرف الآخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top