Hola. El título tiene la mismas vueltas que lo que quiero hacer!!!
Lo que necesitaba saber es si es posible guardar los datos de una operación A (filtro, formulario, cuadro), llamar a otra operación B pasándole como parámetro A (no los datos, el identificador), y luego volver a A desde B enviando de vuelta un resultado, que bien puede ser un parámetro por referencia.
Se me ocurrió:
utilizar toba::memoria, no se como, ni cuales métodos dentro de la clase,
llamar a B utilizando vinculos, los cuales no sé utilizar, pasándole parametros (se que hay 3 definidos en los ci, pero no se como ni donde utilizarlos), por ejemplo el parametro_a con el vinculo, y el parámetro_b por referencia (¿?) para retornar el valor?
volver a A, con el vínculo ofrecido en parametro_a
recuperar el valor devuelto… a través del parametro por referencia??? a través de una variable de sesión???
Comportamiento similar al ef_popup, pero no creo que me sirva. Tengo que llamarlo desde un evento (botón), no desde un ef del formulario.
MIL GRACIAS por cualquier sugerencia!!!
Las vueltas de su titulo han sobrepasado el limite de pila que posee el lector :P.
Lo que necesitaba saber es si es posible guardar los datos de una operación A (filtro, formulario, cuadro), llamar a otra operación B pasándole como parámetro A (no los datos, el identificador), y luego volver a A desde B enviando de vuelta un resultado, que bien puede ser un parámetro por referencia.
Este comportamiento es estrictamente necesario?... te lo pregunto porque me parece muy "desktop thinking" y no quiero que te compliques de gusto. De todas maneras.. respondiendo a tu pregunta... poder se puede.
Se me ocurrió:
1) utilizar toba::memoria, no se como, ni cuales métodos dentro de la clase,
2) llamar a B utilizando vinculos, los cuales no sé utilizar, pasándole parametros (se que hay 3 definidos en los ci, pero no se como ni donde utilizarlos), por ejemplo el parametro_a con el vinculo, y el parámetro_b por referencia (¿?) para retornar el valor?
3) volver a A, con el vínculo ofrecido en parametro_a
4) recuperar el valor devuelto... a través del parametro por referencia??? a través de una variable de sesión???
Comportamiento similar al ef_popup, pero no creo que me sirva. Tengo que llamarlo desde un evento (botón), no desde un ef del formulario.
MIL GRACIAS por cualquier sugerencia!!!
Efectivamente tenes que utilizar toba_memoria, que metodos? podria ser set_dato/get_dato, vas a tener que tener cuidado de que no se te pise el indice en que guardas los valores.
Mediante que pensas ir a la otra operacion?.. un boton en un componente?, un link entre el contenido, disparandolo mediante javascript de acuerdo a alguna condicion en el cliente?.
Lo que mencionas vos de los parametros a nivel de Ci deberias tomarlos mas como campos con info extra que estan para brindar mayor flexibilidad pero tene en cuenta que esos campos se llenan en tiempo de definicion y vos necesitas algo mas runtime.
Un ejemplo de agregado de parametros a un vinculo en runtime lo podes encontrar en toba_referencia, alli esta la operacion Componentes->Eventos->Vinculos->Control en Runtime y se muestra como agregar parametros a un vinculo en tiempo de ejecucion, tanto en PHP como en JS.
Para hacerlo bien dinamico tendrias que armar el vinculo en runtime… mediante toba::vinculador()->get_url(); y ahi le pasas el id de operacion que recibiste cuando llegaste.
Si el valor lo agregas como parametro al vinculo, podes recuperarlo con toba::memoria()->get_parametro(‘nombre’);
Mas alla de eso creo que tu mayor inconveniente va a radicar en saber cuando tenes que guardar los valores en sesion y cuando recuperarlos de la misma. Ademas tene en cuenta que esos valores deben limpiarse en cuanto la operacion termine… de lo contrario la proxima vez que vuelvas a entrar tendras los mismos valores cargados.
te lo pregunto porque me parece muy "desktop thinking"
No parece... es... no lo dudes, perdón...
Lo que quiero hacer, es buscarle la vuelta a desde un ABM que tienen un combo con datos secundarios, generar un nuevo dato y recargar el combo.
Por ejemplo ABM de localidades, con un combo donde elegís el país (que se carga desde un datos tabla)... agrego un icono de utileria que llame a un evento de PHP (la llamada la hago desde el evento, esto ya lo logro).
De ahi, llamo por un vinculo a la operacion de ALTA de PAIS (2 botones, cancelar/aceptar), envio como parametro el id la operacion de Localidades (como???, con el número de la misma???), hago el alta... y entonces tomo el resultado Aceptar(el id del nuevo pais) o Cancelar (null), y vuelvo al vinculo inicial.
Levanto la operación del ABM de nuevo, recalculo el combo (solito al cargarse nuevamente el CI), cargo los datos previos en el ABM y me paro en el pais nuevo en el combo del paises.
No puedo encontrarle la vuelta al tema dentro de web... (para que sea genérico) y que me quede prolijo.
El ALTA de PAIS debería ser general, para poder llamarlo desde cualquier lado donde haya paises involucrados. Igual que el mecanismo de llamada, para aplicarlo a cualquier dato de tipo secundario.
En otra consulta, intenté hacerlo a través de una pantalla asociada al mismo CI, pero no termino de volver con los datos originales.
Cualquier acercamiento es bueno, y una vez que le encuentre la vuelta, cierro con ese y listo.
Gracias!!!!
el tema es el siguiente, toba limpia la memoria cada vez que cambias de operacion y cada tantos pedidos de pagina hace un reciclado de la misma, lo que podrias hacer como metodo mas sencillo es desactivar ese reciclado de memoria para que no se pierda el estado actual de la operacion, la cosa seria mas o menos asi:
Generas un vinculo a la otra operacion.
En el metodo ini de la operacion destino haces una llamada a toba::memoria()->desactivar_reciclado();
Haces lo que tengas que hacer en dicha operacion y luego que grabaste el registro deberias hacer un nuevo vinculo que te envie nuevamente a la operacion inicial.
En teoria en ese momento se va a recuperar el estado interno que poseia la operacion de la que partiste y deberia seguir desde ahi.
Cuando hagas el vinculo mediante la llamada a toba::vinculador()->get_url(), asegurate que la opcion de menu no va, o si lo hace va en false.
De lo contrario toba pensara que cambiaste de operacion y te va a limpiar la memoria.
La alternativa a ese metodo es mas complicada, ya que tenes que guardar en la memoria de la instancia los datos que tenias en la operacion de partida como asi tambien su estado interno, pantallas, saber si tenias objetos de persitencia modificados, etc y luego acordarte de limpiarla cuando termines. Probemos con el metodo mas simple primero y si vemos que no funciona entonces recurrimos al complejo.
En realidad capaz… habría que buscarle la vuelta por ese lado.
Pero no me gusta que en el popup tenga que elegir, y que el componente sea un editable.
Es decir, quiero usar un combo con opciones que se cargan desde un datos_tabla… si no está el valor que se desea, poder acceder desde ahí a un formulario de alta de ese tipo de datos, y si se carga efectivamente ese dato, regresar a la operación original, recargar el combo y seleccionar esa nueva opción… (Esto es el resultado final de lo que busco… ya probé con otras alternativas y todavia nada que me convenza…)…
Como dije antes, es cosa de aplicaciones desktop, pero no se me ocurre como puede resolverse, o como lo han resuelto en web.
La alternativa que estoy analizando, es poner un combo al que le agrego una opción – NUEVO – al final. Si selecciono esa opción, se habilita un popup, que me permita llamar a la operación del alta y al aceptar “seleccione” ese valor. El tema, es que ocupa más… jeje… son 2 renglones de formulario, ya que no puedo poner el popup pegado al combo sin que quede el espacio de la etiqueta…
que se haria en “html básico” (ni tanto pero…)
1.- Poner un javascript asociado al combo que deseas modificar.
2.- Cuando se seleccione “Nuevo” que te abra una ventana popup con el formulario de carga, pasándole como parámetro el id de campo a modificar.
3.- La página que reciba el formulario deberá recibir el nombre del campo.
4.- Si el insert fue correcto que te muestre los datos que cargastes y aparezca un botón “volver”.
5.- Al clickear dicho boton, via javascript actualizas las opciones del campo original agregando el nuevo valor y cerras la ventana.
esto lo podes hacer llamando un php plano desde el toba.
Ahora, como hacerlo en toba…
Divago porque no se si se puede.
1.- igual anterior.
2.- Agregarle pasar un valor inexistente de la variable a dar de alta.
3.- Hacer un “abm simple” que contenga un filtro, un cuadro y un formulario. Tan solo tiene que permitir dar de alta
4.- Al cargarse la pagina que filtre por el valor inexistente.
5.- Cargar el dato y enviar.
6.- al volver poner el filtro el valor enviado y que aparezca en el cuadro.
7.- al seleccionar el valor, en lugar de editarlo que modifique el campo original.(5 del paso anterior)
Se podrá?
Hola gente (pensaba arrancar con algo asi como ‘aqui estoy para traerles luz’ pero suena muy pai umbanda xD)
ambos dos tienen parte de razon, Emilio efectivamente esto se puede hacer en un popup nada te lo impide, de lo unico que tenes que asegurarte es que cuando seleccionas el valor el combo en cuestion en la pantalla original se recargue desde el servidor, sino estarian en una situacion parecida a la que tenia Fernando Korol en otro hilo debido al chequeo de seguridad.
Haciendolo en la misma pantalla tiene sus beneficios y complicaciones tambien, por un lado te olvidas de que el usuario pueda dejar el popup abierto sin seleccionar nada, por otro lado cuando volves a la operacion original el valor que acabas de dar de alta ya deberia aparecer entre las opciones del combo. Lo malo es que tenes que asegurarte de conservar los valores que cargo hasta el momento dicho usuario, sino te van a querer matar, tambien esta el hecho de que ir de un lado para el otro del sistema puede llegar a confundir un poco y hacer engorroso saber que hace realmente la operacion.
Para hacer lo que queres Martin probablemente tengas que redefinir el layout del formulario, asi que ahi podes acomodar el html a tu antojo.
En definitiva cual de los metodos elijan depende finalmente de ustedes, cada uno tiene sus pro y contras. A mi los popups no me terminan de simpatizar del todo, aunque debo reconocer que a veces dan esa sensacion de contexto distinto que no se tiene navegando todo en la misma pantalla.
Volviendo sobre la alternativa que estoy analizando, tengo este código, pero no sé como regresar el valor del popup, siendo que no es algo automático (con una selección de un cuadro)… tampoco se cierra el popup!!!
El vínculo está hecho, tengo el popup, llama a la operación que contiene el siguiente código, pero no tengo regreso desde ahí!
<?php
class ci_nuevo_pais extends toba_ci
{
function evt__formulario__aceptar($datos)
{
$this->dep('paises')->set($datos);
$this->dep('paises')->sincronizar();
$this->dep('paises')->resetear();
//acá tendría que setear los datos de la "selección"... {id, nombre}, para recuperarse en el formulario principal
//cierro el popup
}
function evt__formulario__cancelar()
{
//cierro el popup y seteo {id,nombre} en {null, null}
}
}
?>
Tengo otra alternativa, que solucionaría el problema de ir y venir de operaciones/pantallas, y el problema de siempre con los popups (ventanas abiertas al gusto, no se cierran, no se usan, quedan fuera de sesión, etc)… Sería ejecutar la operación como si fuera una notificación… es decir, ejecutarla en forma modal dentro de la misma pantalla donde estoy (desktop thinking, si se puede considerar thinking… again!!!)… esto es posible?
Para mostrar el nuevo alta (que se dispararía desde un icono de utilería al lado del combo original) debería hacerse con una pantalla oculta? que muestro centrada en la pantalla cuando se hace click sobre el icono de utilería… si presiono Aceptar, entonces recargo el combo con un ajax (tendré que figurarme como… lejos aún de hacerlo), si presiono Cancelar, solo vuelvo a la pantalla original?
para hacer manualmente la llamada que regresa el valor del popup lo que tenes que hacer es enviar al cliente el codigo js que se utilizaria normalmente si fuera una seleccion de un cuadro.
Necesitas hacer entonces una llamada al metodo respuesta_ef_popup. Lo podrias colocar en un metodo aparte que puedas llamar tanto del evento aceptar como del evento cancelar.
Podria ser algo asi:
function devuelve_valores($datos)
{
$param = addslashes(str_replace('"',"'",$datos)); //Datos vendria como un string de la forma "id||nombre".
echo "respuesta_ef_popup('$param');";
}
Con el tema de la ventana modal se te va a complicar mucho me parece, tene en cuenta que no te podrias ir a otra operacion (como en el popup) sino que el alta tendria que ser parte de la operacion original, con lo cual perdes reutilizacion, en ese caso en lugar de una ventana modal lo enviaria a otra pantalla dentro de la misma operacion, al menos de esa manera no se haria tan engorroso el manejo del javascript.
Tene en cuenta que no solo es recargar mediante ajax el combo… en ese caso tenes que procesar todo el alta mediante js, eso es recuperar valores desde el servidor, pasar de pantallas etc.
Me parece que es complicarte la vida de gusto, sino tendrias que usar algun IFRAME ahi pero no se muy bien como se maneja el js en ese caso.
Este es el código del abm principal (localidades). Hay definido un método obtener_nuevo_pais que tomaría la respuesta del popup (¿?).
<?php
require_once('datos_estaticos/provincias_argentinas.php');
class ci_localidades extends toba_ci
{
function obtener_nuevo_pais($id,$nombre)
{
return $nombre;
}
//---- cuadro -----------------------------------------------------------------------
function conf__cuadro(toba_ei_cuadro $cuadro)
{
if (isset($this->s__where_filtro)) {
$cuadro->set_datos($this->dep('localidades')->get_listado($this->s__where_filtro));
} else {
$cuadro->set_datos($this->dep('localidades')->get_listado());
}
}
function evt__cuadro__seleccion($seleccion)
{
$this->dep('localidades')->cargar($seleccion);
}
//---- formulario -------------------------------------------------------------------
function conf__formulario(toba_ei_formulario $form)
{
if ($this->dep('localidades')->esta_cargada()) {
$datos = $this->dep('localidades')->get();
$provincias = provincias_argentinas::obtener_provincias_argentinas();
if (!in_array(array($datos['provincia'],$datos['provincia']), $provincias)) {
$datos['provincia_otra'] = $datos['provincia'];
$datos['provincia'] = provincias_argentinas::provincia_otra;
} else {
$datos['provincia_otra'] = null;
}
$form->set_datos($datos);
} else {
$cfg = dt_cfg_valores_por_defecto::get_configuracion();
$datos = array('provincia' => provincias_argentinas::provincia_defecto,
'id_pais' => $cfg['id_pais_argentina']
);
$form->set_datos_defecto($datos);
}
}
function evt__formulario__alta($datos)
{
$this->aceptar_datos($datos);
}
function evt__formulario__eliminar()
{
$this->dep('localidades')->eliminar_todo();
$this->resetear();
}
function evt__formulario__modificacion($datos)
{
$this->aceptar_datos($datos);
}
function evt__formulario__cancelar()
{
$this->resetear();
}
function resetear()
{
$this->dep('localidades')->resetear();
}
function aceptar_datos($datos)
{
if (isset($datos['provincia_otra']) && $datos['provincia'] == provincias_argentinas::provincia_otra) {
$datos['provincia'] = $datos['provincia_otra'];
}
$this->dep('localidades')->set($datos);
$this->dep('localidades')->sincronizar();
$this->resetear();
}
}
?>
Este es el código que dá de alta un nuevo país. Lo estoy llamando desde el popup de la figura1. En la figura2, está la definición del ef_popup.
<?php
class ci_nuevo_pais extends toba_ci
{
//---- formulario -------------------------------------------------------------------
function evt__formulario__aceptar($datos)
{
$this->dep('paises')->set($datos);
$this->dep('paises')->sincronizar();
$datos = $this->dep('paises')->get();
$this->dep('paises')->resetear();
$this->devuelve_valores($datos);
}
function evt__formulario__cancelar()
{
$this->devuelve_valores();
}
function devuelve_valores($datos=null)
{
if (!isset($datos)) {
$param = null;
} else {
$param = $datos['id'].'||'.$datos['nombre'];
}
echo "respuesta_ef_popup('$param');";
}
}
?>
El alta del nuevo país, se hace sin problemas… el regreso del popup, no es tal. No se cierra, y el echo con la llamada a respuesta_ef_popup, sale en la página! (obvio para muchos!!).
Como dato extra, al volver del popup con un valor, el combo de país debería hacerse de solo lectura (supongo que en el mismo método de obtener_nuevo_pais?), y en caso de limpiarse el popup, nuevamente debería de hacerse editable, pero recargado (como lo recargo??? con ajax… claro… pero como?).
Hola Martin (saque las partes de codigo para que no se haga tan largo el msg),
Nup… la idea es que obtener_nuevo_pais se llama luego de que vos haces $form->set_datos($datos), osea… vos en la etapa de configuracion al formulario le pasas un identificador para ese campo, cuando se llega a la etapa de servicios (donde se genera el HTML) ahi se busca la descripcion del campo mediante el metodo obtener_nuevo_pais y se le envia al cliente la pagina. Esto no esta relacionado con el valor que toma el ef_popup cuando terminas de procesar el alta… apenas vos seleccionas o le das guardar y se cierra el popup, se vuelve a la ventana padre y se le asigna al campo la clave y descripcion (provistas por la ventana popup mediante una callback), eso se hace todo en el cliente, no se viaja al servidor.
Este es el código que dá de alta un nuevo país. Lo estoy llamando desde el popup de la figura1. En la figura2, está la definición del ef_popup.
MUCHO CODIGO DE NUEVO! xd
El alta del nuevo país, se hace sin problemas… el regreso del popup, no es tal. No se cierra, y el echo con la llamada a respuesta_ef_popup, sale en la página! (obvio para muchos!!).
Eso es porque te falta sacar los tags de script, sino el browser lo va a interpretar como si fuera texto comun dentro del html.
Como dato extra, al volver del popup con un valor, el combo de país debería hacerse de solo lectura (supongo que en el mismo método de obtener_nuevo_pais?), y en caso de limpiarse el popup, nuevamente debería de hacerse editable, pero recargado (como lo recargo??? con ajax... claro... pero como?).
Me gusta complicarme…
Cuando te vuelva el valor luego de dar un alta se te va a disparar el onchange del elemento, en este caso el metodo procesar del ef. Ahi mismo podes setear solo lectura el otro campo (acordate que esto es todo JS en el cliente, el servidor no corta ni pincha aca).
Buenas tardes, revivo el tema porque no entiendo como resolver esto:
yo seguí los pasos que se indican a continuación y funk
Hasta ahí bárbaro, hasta que me tope con el 2do paso:
El alta del nuevo país, se hace sin problemas... el regreso del popup, no es tal. No se cierra, y el echo con la llamada a respuesta_ef_popup, sale en la página! (obvio para muchos!!).
Eso es porque te falta sacar los tags de script, sino el browser lo va a interpretar como si fuera texto comun dentro del html
mi pregunta es la siguiente: como saco los tags de script??