チェックボックスの値が 0 の Drupal フォーム送信に関する問題
-
20-09-2019 - |
質問
私は多くのチェックボックスを持つフォームを含む 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 フォーム変数からユーザーのチェックボックスを取得する簡単な方法はありますか?)
解決
で返される値として、のチェックを外すのチェックボックスが0である、あなたはまた、そのための戻り値として0を使用する場合はチェック状態を把握する方法はありません。だから、あなたの質問にすぐに答えが(離れてJSの回避策からだろうジェレミー、によって示唆されているように、の無の方法がないという理由だけで、何のの最高の方法がないことです簡単な問題にかなり複雑な解決策)。
あなたは結果の配列は、インデックス0で開始する必要がある場合に、、あなたは結果を抽出した後に戻ってそれを入れて、フォームのオプションを構築する際に、一時的に0エントリを取り除く必要があります。これを行う簡単な方法は、チェック値を抽出した後、再度それを置き換える、0のプレースホルダとして-1を使用(またはアレイの残りの部分で使用されていない任意の他の値)になります。
ジェレミーで述べたように、もう一つの明白な解決策は、インデックスの再作成されます。あなたの例を見ると、なぜあなたはちょうどまた、キー/戻り値としてご表示値(0時00分、午前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;
}
あなたは、チェックボックスのチェック状態をチェックし、隠しフィールドに値を入れて、ハンドラを提出JSを使用することができます。
これで、もう一方の端の値をデコードするDrupalのフォームハンドラを使用する必要があります。