1

我正在编写一个涉及带有许多复选框的表单的drupal模块。例如

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

我已将这些复选框的键设为数字,从 0 开始。例如

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

在实现 myform_checkboxes_submit 函数后,我发现很难解释用户的输入是什么。在互联网上,我发现了几行很好的代码,可以满足我的需要。

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

这似乎很好用;$checked 变量是一个仅包含选中复选框的数组。唯一的问题是值 0(代表第 0 个复选框)总是包含在 $checked 中,无论它是否实际被选中。

还需要注意的是:如果选中,则零出现在列表中的第一个,但如果没有选中,则最后出现。

假设更改复选框的索引是不可能的,那么解决这种情况的最佳方法是什么?(相关的额外问题:有没有更简单的方法可以从 drupal 表单变量中获取用户的复选框?)

4

3 回答 3

3

由于未选中复选框的返回值为 0,因此如果您也使用 0 作为返回值,则无法识别选中状态。所以你的问题的直接答案是没有最好的方法,仅仅因为没有办法(除了 Jeremy 建议的 js 解决方法,这将是一个简单问题的非常复杂的解决方案)。

因此,如果您需要结果数组以索引 0 开始,则在构建表单选项时必须暂时摆脱 0 条目,在提取结果后将其放回。一种简单的方法是使用 -1(或未在数组的其余部分中使用的任何其他值)作为 0 的占位符,在提取检查值后再次替换它。

正如 Jeremy 所提到的,另一个明显的解决方案是重新索引。看看你的例子,你为什么不把你的显示值 (0:00, 1:00, ...) 也用作键/返回值?那里没有歧义,如果需要,很容易转换为整数。

于 2009-11-17T18:10:15.010 回答
1

实际上,我最终做的就是这个。

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;
}
于 2009-11-17T23:12:44.577 回答
0

您可以使用 JS 提交处理程序来检查复选框的选中状态并将值放入隐藏字段中。

然后,您需要使用 Drupal 表单处理程序来解码另一端的值。

于 2009-11-17T16:57:49.120 回答