Problema con dato ef_upload al utilizar set_obligatorio

Hola, tengo en un formulario un dato del tipo ef_upload el cual esta seteado como obligatorio, en el evento conf de ese formulario, según ciertos criterios tengo que poner dicho campo como no obligatorio para lo cual utilizo la función set_obligatorio pero dicha función no me esta funcionando bien, cuando se cumple la condición para poner al campo como no obligatorio el campo aparece visualmente sin la negrita pero al guardar me pide que lo ingrese puesto que sale un mensaje diciendo que si es obligatorio.

Para ejemplificar un poco mi problema, probe en el proyecto “toba_referencia” modificar la operacion que esta en “Componentes > Formularios > ef_upload” cambiando lo siguiente en el código del ci:


	function conf__formulario(toba_ei_formulario $componente)
	{
		$componente->ef('archivo')->set_obligatorio(false);
		if (isset($this->s__nombre_archivo)) {
			return array( 'archivo' => $this->s__nombre_archivo );
		}
	}

Al hacer click en el botón “Siguiente” aparece el mensaje “Imagen: El campo es obligatorio Más info…”.

Aclaro que estoy usando toba 2.1.0 en la revisión 5215.

Mi duda si es un posible bug para el tipo de dato ef_upload o es por alguna otra restricción?

Muchos saludos.

Hola José Luis,

no se trata de un bug, simplemente el ef no recuerda su estado de obligatoriedad entre pedidos de pagina, ya que quien lo determina es el formulario.
Para hacer eso tenes que usar el siguiente metodo (http://desarrollotoba.siu.edu.ar/toba_editor_trunk/doc/api/Componentes/Eis/toba_ei_formulario.html#methodset_efs_obligatorios)

Saludos

Aprovecho este hilo para exponer un problema similar:
Tengo un formulario ML con dos efs:

  • Un ef_editable: donde el usuario indica la descripción de “Qué es el archivo que está subiendo?”
  • Un ef_upload: donde el usuario selecciona el archivo que desea subir

El problema:
Cuando un usuario abre el formulario, y carga la cantidad de lineas que quiera (descripción y archivo) de una sola vez, el problema no se presenta. Puede guardar, salir y todo está bien. El problema ocurre cuando un usuario carga una linea (o dos, o la cantidad que sea), guarda, sale y vuelve a ingresar a la operación. En ese punto el ML le muestra correctamente el estado inicial (con la cantidad de lineas que haya cargado anteriormente), pero si el usuario agrega nuevas lineas y guarda, el evento JS de toba le exige como obligatorios los ef_upload que ya había subido, y que ya tienen estado (figura el checkbox con la leyenda ‘Cambiar archivo’), y además borra todo lo nuevo que el usuario haya agregado.
Alguien tuvo un problema similar?
Estoy usando Toba 2.7.9, y los formularios no tienen ninguna extensión JS definida. (es un comportamiento propio del núcleo de Toba)
Gracias.

Bueno, después de algunas horas de seguir el hilo de ejecución por el núcleo de Toba, encontré que, al utilizar ef_upload dentro de un formulario_ml, ocurre el error que les comenté antes debido a lo siguiente:
Al dispararse la validación (propia de Toba) del formulario_ml, se ejecuta la validación fila a fila de todos sus EFs. Al llegar al EF de tipo upload, se ejecuta un metodo llamado validar_estado(), en cuyas primeras lineas se encuentra el siguiente código:


padre = parent::validar_estado();
if ($padre !== true) {
	return $padre;	
}

El padre de este objeto es de clase toba_ef, el cual tiene (obviamente) el método en cuestión.
Al comentar estas líneas (evito la validación de la clase padre) y solo ejecutando la validación propia (resto del código del método validar_estado()) el comportamiento del ML con el EF de tipo Upload se normalizó.
Tengo que hacer algunas pruebas todavía, pero en un principio pude solucionar el problema.
Espero le sirva a alguien mas.
Saludos.

Hola Marcelo,

Comentar esas lineas, tiene el mismo efecto que quitarle el checkbox de obligatoriedad en el editor, dicho de otra forma… ese campo no es obligatorio porque no existe nada que este chequeando que asi sea.

Lo que habria que ver, es porque el metodo tiene_estado(), esta devolviendo false, si es que el formulario viajo con los datos cargados hacia el cliente.
Se esta utilizando la sesion para saber que efs fueron con valor al cliente y cuales no, por lo que si esta solicitando que traiga un valor… es porque no se guardo correctamente en sesion el id del ef… o porque no tenia valor realmente.

Si tenes el conf del form_ml a mano, subimelo por favor.
Saludos

Hola Richard, al contrario de lo que me comentás, Toba si hace la validación de “obligatorio” del campo (aunque comente esas lineas). Después de esas lineas comentadas, en el archivo toba/php/nucleo/componentes/interface/efs/toba_ef_upload.php, está el siguiente código:


if ($this->archivo_subido) {
			$id = $this->estado['error'];
			switch($id){
				case UPLOAD_ERR_OK:
					break;
				case UPLOAD_ERR_INI_SIZE:
					return "Se supero el tamaño máximo del archivo.";
				case UPLOAD_ERR_FORM_SIZE:
					return "Se supero el limite expresado en el FORM";
				case UPLOAD_ERR_NO_FILE:
					//Este caso lo maneja el obligatorio
					$this->archivo_subido = false;
					break;
				case UPLOAD_ERR_CANT_WRITE:
					return "No tiene permisos sobre la carpeta de upload";
				default:
					return "Ha ocurrido un error cargando el archivo ($id)";
			}
                        
			if (!$this->solo_lectura_modificacion && isset($this->extensiones_validas) && $this->archivo_subido && !$this->es_archivo_vacio()) {
				$rep = $_FILES[$this->id_form]['name'];
				$ext = substr($rep, strrpos($rep, '.') + 1);
				if (! in_array(strtolower($ext), $this->extensiones_validas)) {
					$extensiones = implode(', ', $this->extensiones_validas);
					$this->archivo_subido = false;
					$this->estado = null;
					return "No esta permitido subir este tipo de archivo. Solo se permiten extensiones $extensiones";
				}
			}
		}
		return true;

Si intento guardar, sin cargar archivo, me da el error correspondiente (“El Campo es obligatorio”)

Es el segundo proyecto en el que se presenta el mismo escenario.

Te paso el código del conf__form:


function conf__form_inscripcion(becas_ei_formulario $form)
	{
		$datos = $this->get_datos('inscripcion','inscripcion_conv_beca')->get();
		if($datos){
			//se bloquean las opciones de convocatorias para que el usuario no pueda modicarlos
			$form->set_solo_lectura(array('id_convocatoria','id_tipo_beca'));

			//asigno los datos al formulario
			$form->set_datos($datos);
		}else{
			//Se desactiva el tab con los datos del director de la beca
			$this->pantalla()->tab('pant_director')->desactivar();
		}
	}

Yo creo (humildemente) que es un bug de Toba. Como mencioné antes, en dos proyectos que tenían el mismo escenario (Formularios ML con uno de sus EF de tipo upload) se presentó el mismo problema.

Saludos y gracias!

Hola Marcelo,

Esa parte no valida obligatoriedad, solo entra si se subio un archivo… sino pasa de largo el IF y devuelve true, aun cuando no deberia.

Si intento guardar, sin cargar archivo, me da el error correspondiente ("El Campo es obligatorio")
Esto te lo esta devolviendo JS en el cliente, si bypaseas esa funcion con una redefinicion JS... el servidor no esta chequeando la obligatoriedad.. para eso estan las lineas que comentaste.
Yo creo (humildemente) que es un bug de Toba. Como mencioné antes, en dos proyectos que tenían el mismo escenario (Formularios ML con uno de sus EF de tipo upload) se presentó el mismo problema.

Ahi subi un fix a la rama 2.7 para lo que creo puede estar complicandote, aplicalo y si funciona correctamente para tu caso lo saco en una nueva version. Sino le hacemos ajustes.

Saludos

Ahi subi un fix a la rama 2.7 para lo que creo puede estar complicandote, aplicalo y si funciona correctamente para tu caso lo saco en una nueva version. Sino le hacemos ajustes.
Richard, nuevamente gracias! Funciona perfecto. Un abrazo!