toba::memoria()->desactivar_reciclado() e igual se limpia la memoria de operacio

Buenas, lo que estoy intentando hacer es que una operacion A vaya a una operacion B, procese algo y lo guarde en memoria, y que vuelva a la operacion A (con el estado antes de ir a la operacion B) y que continue el procesamiento de los datos guardados en memoria.

Me estuve basando en https://foro.comunidad.siu.edu.ar/index.php?topic=2243.msg7618

Para ir de operacion A → B seteo unos datos en memoria y despues redirijo a la operacion b usando document.location.href y el vinculador

Entre los datos seteo la operacion a la que tiene que “retornar”

OPERACION A

toba::memoria()->set_dato("datos", $datos);
echo toba_js::abrir();
echo "document.location.href='".
    toba::vinculador()->get_url(toba_proyecto::get_id(), $operacion_B, array(), array('menu', false))."'\n";
echo toba_js::cerrar();

Como no quiero que se pierda el estado de la operacion A, en la operacion B desactivo el reciclado dentro del ini

OPERACION B

function ini()
{
    parent::ini();
    toba::memoria()->desactivar_reciclado();
}

Y cuando quiero volver a la operacion A entiendo que el get_url del vinculador tiene que tener seteado menu => false
Tengo un evento para cerrar la operacion que te devuelve a la operacion A

OPERACION B

function evt__cerrar()
{
    $datos = toba::memoria()->get_dato('datos');
    $operacion_retorno = $datos['operacion_retorno'];
    echo toba_js::abrir();
    echo "document.location.href='".
        toba::vinculador()->get_url(toba_proyecto::get_id(), $operacion_retorno, array(), array('menu', false))."'\n";
    echo toba_js::cerrar();
}

Pero no importa que haga siempre en el log aparece

Se detecto cambio de operación. Se limpia la memoria de la operacion

Y cuando carga nuevamente la operacion A esta desde la pantalla del inicio y todo lo que estaba seteado en formularios, cuadros, etc se reinicia.
Como si se hubiera abierto desde el menu

Hola Lautaro,

te dejo un detalle que puede ser la causa de lo que estas viendo, el arreglo de opciones que recibe el metodo… es asociativo, no posicional.
Aca hay un metodo que replicaria (menos flexible obviamente) lo que intentas hacer fijate que el ultimo parametro es un arreglo asociativo.

Otra opcion que podes usar para intentar garantizar aun mas el aislamiento entre ambas operaciones es fijarle una celda de memoria distinta, eso lo haces mediante la opcion “celda_memoria”… la cual tiene un string como valor.

El resto de lo que hacias en B… esta correcto.

Y cuando quiero volver a la operacion A entiendo que el get_url del vinculador tiene que tener seteado menu => false Tengo un evento para cerrar la operacion que te devuelve a la operacion A

OPERACION B

function evt__cerrar()
{
    $datos = toba::memoria()->get_dato('datos');
    $operacion_retorno = $datos['operacion_retorno'];
    echo toba_js::abrir();
    echo "document.location.href='".
        toba::vinculador()->get_url(toba_proyecto::get_id(), $operacion_retorno, array(), array('menu', false))."'\n";
    echo toba_js::cerrar();
}

En este caso, desactivaria el menu pero no modificaria la celda de memoria.

Esto es medio un hackeo, ya que el mecanismo fue concebido primeramente para brindar la posibilidad de tener una navegacion alternativa para los popups… por lo que al cerrarse, la posicion de memoria de la operacion inicial aun es recordada en la URL… mientras que en tu caso eso no sucederia, aun asi es posible que funcione… si no lo hace, te diria que es mas sencillo usar algun metodo de toba_memoria que no dependa de la operacion y simplemente lo limpias manualmente.

Saludos

Uff, no me habia dado cuenta del error en el array asociativo.
Bueno, cambie a ‘menu’=>false y ademas hice que la operacion B utilice otra celda de memoria. Pero la unica forma que pude hacer que suceda algo fue asignandole a la operacion A otra celda de memoria tambien.

A la B le puse ‘popup’ y a la A le puse ‘asd’ y de esa forma cuando vuelve de la operacion B → A el log no dice que se detecto un cambio de operacion y por lo tanto no recarga la memoria.

Peeeero aun así en la operación A, en vez de cargar en la pantalla donde estaba y con todos los datos cargados, me carga la primer pantalla (que es un filtro y un cuadro con evento para seleccionar alumnos) y al menos me carga los datos del alumno en el filtro y en el cuadro. Pero como te decia, me hubiera servido si cargaba en la ultima pantalla.

Nosotros tenemos esta operacion donde elegis un alumno, guardas unos cambios y te aparece una pantalla que te debería llevar a la operacion B y luego volver a la misma pantalla en la que se habia quedado.

Habrá alguna otra forma de lograr lo que quiero?

Hay forma alguna con javascript de detectar si un Popup es cerrado? Porque si se puede detectar lo podría hacer usando un popup en vez redirigir a la otra operacion.

No deberia salvo que se haya excedido el limite de pedidos de pagina almacenados que si bien no es grande (para controlar el tamaño de la session), deberia alcanzar.

Nosotros tenemos esta operacion donde elegis un alumno, guardas unos cambios y te aparece una pantalla que te debería llevar a la operacion B y luego volver a la misma pantalla en la que se habia quedado.

Entiendo, otra opcion (asumiendo que el limite anterior no alcanza) podria ser un seteo explicito de la pantalla si es que existen ciertos datos en sesion comun.

Digamos la pantalla que lleva a la operacion B es conocida por lo que podria setearse explicitamente si en el metodo “conf__” del CI se detecta la presencia de un flag (y/o datos) en sesion, el cual obviamente se deberia liquidar en el acto.

Hay forma alguna con javascript de detectar si un Popup es cerrado? Porque si se puede detectar lo podría hacer usando un popup en vez redirigir a la otra operacion.

Hay manera de saber si un popup se cerro, aqui te dejo algunas, de todas maneras creo que podrias solucionarlo directamente en el servidor usando la memoria de la instancia en lugar de la operacion.

Saludos