Frage

Ich schreibe ein Drupal-Modul, das eine Form mit vielen Kontrollkästchen beinhaltet. Z.

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

Ich habe den Schlüssel für diese Kontrollkästchen gemacht numerisch, beginnend mit 0 z.

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

Bei der myform_checkboxes_submit Funktion implementiert, habe ich entdeckt, dass es schwierig ist, zu interpretieren, was die Eingabe des Benutzers war. Auf dem interwebs, fand ich ein paar netten Zeilen Code, der tat, was ich brauchte.

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

Das scheint zu funktionieren groß; die $ geprüft Variable ist ein Feld, das nur die geprüften Kontrollkästchen. Das einzige Problem ist, dass der Wert 0 (für die 0-te Checkbox) ist immer enthalten in $ überprüft, ob es tatsächlich geprüft wurde oder nicht.

Auch nützlich. Hinweis: Die Null erscheint zuerst in der Liste, wenn es wurde überprüft, aber zuletzt, wenn es nicht

Was wäre der beste Weg, um diese Situation zu lösen, unter der Annahme, dass die Indizierung der Kontrollkästchen Ändern der Frage war aus? (Verwandte Bonus-Frage: gibt es einen einfacheren Weg des Benutzers angekreuzte Kästchen aus der Drupal-Formularvariablen zu erhalten)

War es hilfreich?

Lösung

Da der Wert zurückgegeben durch eine nicht markiert Checkbox 0 ist, gibt es keine Möglichkeit, den Überprüfungsstatus zu erkennen, wenn Sie 0 als Rückgabewert verwenden für das auch. So ist die unmittelbare Antwort auf Ihre Frage ist, dass es keine am besten Art und Weise, einfach weil es nicht Art und Weise (abgesehen von js von Jeremy wie vorgeschlagen zu umgehen, das eine sei, ziemlich komplizierte Lösung für ein einfaches Problem).

Also, wenn Sie Ihr Ergebnis Array müssen mit dem Index 0 zu starten, wird vorübergehend der 0 Eintrag loswerden müssen, wenn das Formular Optionen bauen, es wieder einsetzen, nachdem die Ergebnisse zu extrahieren. Eine einfache Möglichkeit, dies zu tun für 0 als Platzhalter zu verwenden wäre -1 (im Rest des Feldes oder jeder anderer Wert nicht verwendet), sie zu ersetzen wieder nach dem Extrahieren der Werte überprüft.

Eine weitere offensichtliche Lösung wäre reindexing, wie Jeremy erwähnt. Mit Blick auf Ihrem Beispiel, warum Sie verwenden einfach nicht Ihre Anzeigewerte (00.00, 01.00, ...) als Schlüssel / Rückgabewert auch? Keine Zweideutigkeit gibt, und einfach zu konvertieren auf ganze Zahlen, wenn es sein muss.

Andere Tipps

Eigentlich, was ich am Ende dabei war.

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

Es wird überprüft, ob 0 im Array ist, und wenn es nicht das erste Element ist, dann muss es das letzte Mal sein (dies geschieht, wenn der Benutzer das Feld auf 0 entspricht nicht überprüft). So entfernt er das Element aus dem Array, da es nicht überprüft wurde. Nicht ideal oder schön, aber es machte Sinn für meine Situation.

In den meisten anderen Situationen (und vielleicht in mir), wie erwähnt wurde, Neuindexierung besser wäre.

EDIT: für alle, die Sorgen, das ist die Hilfsfunktion die ich mir am Ende zu schaffen (Kommentare enthalten)

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

könnten Sie verwenden einen JS einreichen Handler den Überprüfungsstatus der Kontrollkästchen zu überprüfen und die Werte in einem versteckten Feld setzen.

Sie würden dann eine Drupal Form Handler verwenden, müssen Sie die Werte am anderen Ende zu entschlüsseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top