Problemas con el envío de formularios de Drupal con una casilla de verificación cuyo valor es 0

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

  •  20-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un módulo de Drupal que implica una forma con muchas casillas de verificación. Por ejemplo.

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

he hecho la clave para estas casillas numérico, comenzando con 0. por ejemplo.

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

Después de implementar la función myform_checkboxes_submit, he descubierto que es difícil interpretar lo que era la entrada del usuario. En la interwebs, me encontré con un par de líneas agradables de código que hice lo que necesitaba.

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

Esto parece un gran trabajo; la variable $ comprobado es una matriz que incluye sólo las casillas marcadas. El único problema es que el valor 0 (que representa la casilla 0 ª) se incluye siempre en $ comprueba si en realidad fue marcada o no.

También es útil tener en cuenta:. Aparece el punto primero de la lista si se fue comprobado, pero la última si no es

¿Cuál sería la mejor manera de resolver esta situación, en el supuesto de que el cambio de la indexación de las casillas de verificación estaban fuera de la cuestión? (Pregunta extra relacionado: ¿hay una manera más fácil de conseguir que el usuario de cajas controladas de las variables de formulario de Drupal)

¿Fue útil?

Solución

A medida que el valor devuelto por un controla casilla de verificación es 0, no hay manera de reconocer el estado de activación si se utiliza 0 como valor de retorno para que también. Así que la respuesta inmediata a su pregunta es que no hay mejor manera, simplemente porque no hay no forma (aparte de una solución js como se sugiere por Jeremy, lo que sería una solución bastante complicado a un problema simple).

Así que si usted necesita su matriz resultante a comenzar con el índice 0, tendrá que deshacerse del 0 entrada temporalmente en la construcción de las opciones del formulario, poner de nuevo en después de extraer los resultados. Una manera fácil de hacer esto sería utilizar -1 (o cualquier otro valor no utilizado en el resto de la matriz) como un marcador de posición para 0, en sustitución de nuevo después de la extracción de los valores controladas.

Otra solución obvia sería la indexación, como se ha mencionado por Jeremy. En cuanto a su ejemplo, ¿por qué no sólo tiene que utilizar sus valores de indicación (0:00, 1:00, ...) como valores claves / retorno también? No hay ambigüedad, y fácil de convertir a números enteros, si es necesario.

Otros consejos

En realidad, lo que terminó haciendo era esto.

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

Comprueba si 0 es en la matriz, y si no es el primer elemento, entonces debe ser la última (esto ocurre cuando el usuario no comprueba la casilla correspondiente a 0). Por lo tanto, elimina ese elemento de la matriz, ya que no se comprobó. No es ideal o bonito, pero tenía sentido para mi situación.

En la mayoría de otras situaciones (y tal vez en la mía), como se ha señalado, re-indexación sería mejor.

EDIT: para cualquier persona que le importa, esta es la función auxiliar que terminé creando por mí mismo (incluidos los comentarios)

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

Se puede usar un controlador de JS presentar para comprobar el estado de activación de las casillas de verificación y poner los valores en un campo oculto.

A continuación, tendría que utilizar un controlador de formulario de Drupal para decodificar los valores en el otro extremo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top