Controlar datos obligatorios

Buenas. Un usuario consulto esto, pero no se como hacerlo.

Estoy trabajando con un Tab horizontal que contiene 4 pantallas, las cuales poseen formularios. La carga se va haciendo por partes. Al finalizar, todos los datos tienen que estar cargados. Se me ocurren varias ideas, pero no se como encararlas

  • Deshabilitar las pantallas y que se puedan acceder a medida que se van completando los datos
  • Deshabilitar el botón guardar hasta que se completen todos los datos
  • Al presionar el botón guardar, validar que estén cargados todos los datos

Mi gran problema es controlar que se estén cargados todos los datos de los formularios

Esta es la consulta que estuve viendo y es lo que necesito


http://foro.comunidad.siu.edu.ar/index.php?topic=2366.0

Saludos

Hola Mariano,

la respuesta que dio Rodrigo hace 7 años sigue siendo la mas acertada.

  • Deshabilitar las pantallas y que se puedan acceder a medida que se van completando los datos

Esto fuerza a que la persona deba seguir un orden estricto, no siempre va a tener los datos ordenados por lo que darle la posibilidad de ir cargando cosas aunque sea fuera de orden, es algo que le suma capacidad de trabajo.

  • Deshabilitar el botón guardar hasta que se completen todos los datos

Como realizaria entonces los guardados parciales? Es necesario que pueda guardar parcialmente para evitar la perdida de datos.

  • Al presionar el botón guardar, validar que estén cargados todos los datos

Esto podes hacerlo… pero tene en cuenta que los guardados parciales siempre van a tener faltantes, si te completa unicamente la primer pestaña vas a vivir reclamandole las que siguen. Por ahí se puede volver un poco tedioso.

Lo ideal seria que existiera un pasaje explicito de ‘estado’ si se quiere, donde realizarias todos los controles necesarios. La otra opción es ir por la última que mencionaste y avisar de la falta de los otros datos, si no tenes que reclamar todas las pestañas puede ser util.

Saludos

Yo lo encaré, primero, de la siguiente manera:
En el evento del CI padre, configuré un evento (por ejemplo) “Guardar”, que contenía lo siguente:


...
foreach($this->dep('ci_edicion')->get_dependencias_clase('form') as $formulario){
	$this->dep('ci_edicion')->dep($formulario)->validar_estado();
}
...

El problema, es que todos los formularios obtenidos por ese bucle, están vacíos, sin estado (aún cuando los formularios tienen datos), y esto no se porque sucede (Si alguien lo puede explicar, sería un golazo al ángulo).

Lo que hice entonces fue, en el ci_edicion (CI hijo), en su método conf() coloqué el siguiente código:


//esto va fuera del conf (se define la variable de sesión)
public $s__estado_forms;
//esto va dentro del conf() del CI
if(!isset($this->s__estado_forms)){
			$this->s__estado_forms = array();
			foreach($this->get_dependencias_clase('form') as $formulario){
				$this->s__estado_forms[$formulario] = false;
			}
		}

Una vez hecho eso, en cada evt__formulario_x__modificacion(), agrego como última línea lo siguiente:

$this->s__estado_forms['formulario_actual'] = true;

Entonces, por cada evento implicito que se va disparando para cada formulario, se va a guardar el valor TRUE (si es que ya se pasó por ese formulario)

Al final, en el CI padre, el evento evt__guardar() queda así:


function evt__cerrar()
	{
		foreach($this->dep('ci_edicion')->s__estado_forms as $formulario => $valido){
			if(!$valido){
				$nombre_form = $this->dep('ci_edicion')->dep($formulario)->get_titulo();
				throw new toba_error("Debe completar los datos del formulario $nombre_form");
			}
		}
	}

Espero sirva de ayuda.
Saludos

Hola Marcelo,

ninguna dependencia mantiene un “estado” en el servidor (salvo los componentes de persistencia), para eso se entregan los datos mediante el disparo de los eventos, la idea es que no se consulte las dependencias directamente sino que se reciban los datos en el Ci y se los manipule desde alli.

Si hay que hacer controles sobre el “estado” de los datos, eso se realiza en el Ci… o en alguna clase de negocio, sino le metes al formulario una logica que luego va a complicar su reuso.

Saludos