Tengo cuatro campos de referencia de entidad para entidad de usuario en un formulario. El formulario de host es un formulario de edición de nodo. Tres de ellos son listas seleccionadas, el último es el formulario de entidad en línea .
Después de agregar una entidad de usuario a través de IEF, estoy tratando de actualizar los valores de las listas de selección:
function ebep_users_feature_users_list_ajax($form, $form_state) {
$ief = array_shift($form_state['inline_entity_form']);
$options = array('_node' => t('- None -'));
$commands = array();
foreach($ief['entities'] as $data) {
$options[$data['entity']->uid] = $data['entity']->name;
}
foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
$form[$fieldName]['und']['#options'] = $options;
$commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
}
return array('#type' => 'ajax', '#commands' => $commands);
}
Funciona, pero cuando intento agregar otro usuario a través de IEF obtengo:
Se ha detectado una elección ilegal. Por favor contacte al administrador del sitio.
Related
preguntas aquí enumeradas a la derecha resolvió esto?Respuestas:
--- Respuesta original. Está mal, verifique la actualización a continuación.
Solo establece
En la selección que se actualizará con AJAX.
Comprobación "Se ha detectado una elección ilegal"
--- Actualización 17 dic 2019 ---
En realidad no fue un buen consejo, eso fue hace mucho tiempo, ahora lo sé mejor.
Se supone que la función de devolución de llamada Ajax solo devuelve la parte de la forma que ha cambiado o algunos comandos ajax.
En este caso, la modificación del formulario debe realizarse en la función de formulario o en un enlace de alteración de formulario. Las funciones de creación y validación de formularios se ejecutan cada vez que se llama una devolución de llamada ajax. Simplemente marque $ form_state en su formulario de compilación o altere la función y ajuste los valores en consecuencia.
Consulte Resolver el error "Se ha detectado una elección ilegal ..."
fuente
Me he enfrentado a este problema varias veces en Drupal 6, cambiando los valores de la lista Seleccionar a través de Ajax.
Esto es lo que puedes hacer es
array_merge
Si la primera solución funciona para usted, ahorrará mucho tiempo codificando y probando cosas. PERO si la lista en el menú desplegable es dinámica y no tiene control sobre ella, es posible que deba elegir una segunda solución.
Publica si tienes problemas, he trabajado bastante en este problema para mi proyecto, y lo hice para ~ 50 formularios, ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ :)
fuente
He encontrado la mejor manera de evitar esto es establecer el
#value
en la lista de selección.Si tenemos el valor en formstate y está en nuestras opciones, no obtendremos un error. Si nuestro valor no está en las opciones, seleccione la primera opción en nuestras opciones y úsela.
fuente
Mi solución:
fuente
En su devolución de llamada ajax, agregue:
Como precaución de seguridad, la
_form_validate()
función principal verifica si la clave #options de un elemento ha cambiado de lo que se configuró en la compilación original (que tienen). Al llamardrupal_get_messages()
yform_get_errors()
básicamente le decimos a Drupal que ignore cualquier error / mensaje mientras ejecuta nuestra solicitud ajax. :)fuente