Tengo un ci con dos pantallas con tipo de navegación tab horizontal, necesito saber que parámetros recibe el evento evt__edicion__cambiar_tab_x porque cuando veo en el logger me dice que el metodo evt__edicion__cambiar_tab_x no existe.
Y necesito saber que pongo en el método evt__cambiar_tab_x.
Permitanme aclarar que este ci depende de una pantalla de otro ci que además tiene una pantalla con un cuadro y un filtro.
Desde ya muchas gracias por su respuesta.
Ahí descubrí cual era el problema, tenía que declarar el método en el ci con el cuadro y el filtro, pero ahora me da este error: Too few arguments to function ci_recibos::evt__edicion__cambiar_tab_aportes(), 0 passed in D:\wamp64\www\framework\php\nucleo\componentes\interface\toba_ci.php on line 344 and exactly 1 expected.
Este es el código del método evt__edicion__cambiar_tab_aportes:
function evt__edicion__cambiar_tab_aportes($datos)
{
if(!$this->get_relacion()->esta_cargada() && !empty($datos["id_empresa"])) {
$this->s__id_empresa = $datos["id_empresa"];
$id_empresa = quote($datos["id_empresa"]);
$sql = "select t_ap.id_aporte, t_ap.id_concepto, t_ap.importe from pendientes t_p "
."inner join aportes_pendientes t_ap on t_p.id_pendiente=t_ap.id_pendiente where "
."id_empresa=$id_empresa order by t_ap.id_aporte, t_ap.id_concepto";
$datos = consultar_fuente($sql);
return $datos;
}
return false;
}
¿Cómo puedo solucionar este error?
Ya no me da más el error, le saqué el parámetro datos, pero ahora quiero obtener los datos del formulario que está en la pantalla de origen y me trae valores nulos.
Este es el código de evt_cambiar_tab_aportes:
function evt__cambiar_tab_aportes()
{
$this->s__datos_recibo = $this->dep('formulario')->get_datos();
if(!empty($this->s__datos_recibo))
toba::memoria()->set_dato_instancia("datos_recibo", $this->s__datos_recibo);
}
¿Cómo hago para obtener los datos de un formulario sin hacer envío post?
Buenas tardes, necesito en la medida de lo posible que por favor me contesten esta pregunta, necesito resolverlo con urgencia para poder vender este sitio y no lo puedo terminar por este y otros errores que no se como solucionar.
Hola Matias,
el problema que veo ahi es que esos metodos solo se invocan cuando el tipo de navegacion del CI es wizard
… no sirven para una navegacion por Tabs… para ello podes hacer uso de los metodos:
evt__idPantalla__entrada
evt__idPantalla__salida
En gral esos metodos suelen ser utiles cuando se necesita asegurar algun orden o agregar controles especificos mientras se navega por los Tabs.
Supongo que dicho formulario tiene eventos declarados, por tanto deberias poder recibirlos en los correspondientes metodos que atienden esos eventos. Por ej:
evt__formNombre__modificacion($datos)
evt__formNombre__eventoNombre($datos)
Recuerda cuando definas el evento indicar que Maneja datos
.
Si no haces un POST, los datos nunca van a viajar al server… lisa y llanamente es el mecanismo HTTP que usa un formulario para enviar los datos.
Saludos
Sí, eso lo se, pero necesito algo así como una cascada del ef_combo_editable llamado id_empresa y que en vez de un ef el que recibe la cascada sea el formulario_ml del tab derecho, lo estoy haciendo con ajax y funciona, pero el ajax no envía ninguna respuesta el método js que está en la extensión del formulario, lo único que hace es esto: $this->s__id_empresa = $parametros["id_empresa"]
.
Ok, aqui hay dos temas separados estimo.
-
El combo editable devuelve una key… y calculo que necesitas un conjunto de datos
-
El formulario se encuentra en otro frame, con lo cual no puedes directamente apuntarlo via JS para enviarle los mismos. Si no fuera asi, tendrias que poder llegar a el via los objetos JS .
Si estas en 2 frames distintos, tendrias que forzar una recarga del frame derecho una vez que recibes la respuesta del ajax. Revisa que estas retornando en dicho metodo si es que necesitas una respuesta distinta de vacio.
No, el ajax no envía ninguna respuesta, este es el código de la función ajax en el ci:
function ajax__cargar_empresa($parametros, toba_ajax_respuesta $respuesta)
{
$this->s__id_empresa = $parametros['id_empresa'];
}
Este es el código de la extensión del formulario:
<?php
class form_recibo extends sindicato_ei_formulario
{
//-----------------------------------------------------------------------------------
//---- JAVASCRIPT -------------------------------------------------------------------
//-----------------------------------------------------------------------------------
function extender_objeto_js()
{
echo "
//---- Procesamiento de EFs --------------------------------
{$this->objeto_js}.evt__id_empresa__procesar = function(es_inicial)
{
var id_empresa = this.ef('id_empresa').get_estado();
if(id_empresa != apex_ef_no_seteado)
{
var parametros = {'id_empresa': id_empresa};
this.controlador.ajax('cargar_empresa', parametros, this, this.atender_respuesta);
}
}
{$this->objeto_js}.atender_respuesta = function(data)
{
}
";
}
}
?>
Y este es el código de la función de entrada al tab del formulario_ml:
function evt__aportes__entrada()
{
if(!$this->get_relacion()->esta_cargada() && !empty($this->s__id_empresa)) {
$id_empresa = quote($this->s__id_empresa);
$sql = "select t_ap.id_aporte, t_ap.id_concepto, t_ap.importe from pendientes t_p "
."inner join aportes_pendientes t_ap on t_p.id_pendiente=t_ap.id_pendiente where "
."t_p.id_empresa=$id_empresa order by t_ap.id_aporte, t_ap.id_concepto";
$pendientes = consultar_fuente($sql);
$this->dep("formulario_ml")->set_datos($pendientes);
}
}
Y todo eso funciona perfecto.
Hay alguna forma de hacerlo sin ajax?
Hola Matias,
Esto es porque asi lo generaste, no porque no se pueda… la clase tiene metodos para enviar respuestas.
No puedo darte una respuesta a eso sin saber que requerimientos tiene la operacion basado unicamente en 2 snippets, si te puedo decir que:
-
forzar la carga y configuracion del formulario (
$this->dep("formulario_ml")
) durante la etapa de eventos no es sano y te va a traer problemas con los datos del mismo en algun momento. -
usar el DR como bandera pero obtener los datos via una SQL en lugar de usar el registro cargado tampoco tiene mucho sentido, si estas editando algo lo sacas del mismo DT/DR.
Por otro lado, te dejo lo siguiente para darle mas claridad al primer punto:
-
la etapa de eventos es de “recepcion” de datos desde el cliente, si mezclas eso con carga de datos para envio vas a terminar teniendo que agregar parches para que no se te mezclen las cosas.
-
la etapa de configuracion de componentes (metodo
conf__formulario_ml
en este caso) es justamente para que hagas lo que incluiste en elevt__aportes__entrada
. Si el formulario se encuentra en la pantalla a visualizar el metodoconf
se va a ejecutar y te ahorras el posible problema de datos sobre escritos.
Recorda que en la ejecucion el framework sigue esta logica de etapas
Saludos
Lo que pasa es que no estoy editando, en este caso estoy queriendo insertar un nuevo registro, cómo puedo hacer con ajax para obtener la respuesta en js y enviarla a php?
Si no estas editando no tiene sentido que hagas esta invocacion
ya que ese metodo solo tiene sentido cuando levantas la data desde la bd. Quizas seria mas practico preguntar por la tabla “padre” en la relacion e invocar $tabla->get_cantidad_filas() > 0 para saber si hay algo ya o no.
fijate que en el link que te pase mas arriba hay un ejemplo muy basico sobre como enviar una respuesta desde el metodo que atiende el pedido ajax (en tu caso seria ajax__cargar_empresa).
Los datos devueltos los podrias haber asignado en el formulario dentro del metodo JS atender_respuesta, era el lugar si ibas a cargar datos “default”
Si queres hacerlo en el server, lo que te sugeria es que lo hicieras dentro de un metodo conf__formulario_ml en lugar de evt__aportes__entrada
Primero: dejame explicarte que en esa operación hago las dos cosas: insertar registros nuevos y modificar los existentes, por eso necesito verificar si está cargada o no, segundo: cuando quiero insertar nuevos registros uso la consulta a una tabla pendientes que no tiene relación con la tabla recibos, en la tabla pendientes tengo los comprobantes que no han sido abonados y cuando registro el recibo modifico el valor del campo importe de la tabla pendientes restandole el importe que estoy registrando en la tabla recibos, tercero: ya logré armar el formulario_ml en el método conf_formulario_ml, en el método ajax asigno la consulta a la tabla pendientes a la variable $this->s__aportes
y después hago $form->set_datos($this->s__aportes)
en el método conf_formulario_ml.
Bien, barbaro entonces.
Un detalle, en el caso que la relacion no esta cargada (osea estas agregando) podes setear lo que recuperas de la tabla pendientes con
- $form_ml->set_datos_defecto($this->s__aportes)
Y en el caso que si estas editando usas
- $form_ml->set_datos($this->s__aportes)
La diferencia es sutil pero en un caso el ML al volver al server te va a reportar el registro como nuevo y en el otro como modificado en la columna del analisis de eventos.
Saludos
Otra vez consultando sobre este asunto, a otro proyecto le hice exactamente lo mismo, le pongo $form_ml->set_datos_defecto($array)
pero cuando le doy guardar hago un ei_arbol($datos)
y el atributo apex_ei_analisis_fila es igual a M y obviamente da error de que no existe la fila porque estoy agregando un registro nuevo.
¿Cómo puedo solucionarlo?
Por favor respondanme esta pregunta, necesito resolverlo con urgencia, gracias.
Hola Matias,
depende como tengas hecho el CI de la operacion del otro proyecto, esa regla vale mientras la estructura del codigo sea medianamente pareja.. si tenes codigo distinto (y logica probablemente tambien), puede que tengas interacciones distintas y hay que hacer ajustes.
Subite el codigo del CI que te falla a ver como se puede ajustar… y no solo los 2 metodos en cuestion.
Saludos
Hola @richard, gracias por la respuesta, este es el código completo del ci:
<?php
class ci_edicion extends matger_ci
{
protected $s__datos_conceptos;
protected $s__id_cliente;
protected $s__cuit;
function get_relacion()
{
return $this->controlador->get_relacion();
}
//-----------------------------------------------------------------------------------
//---- formulario -------------------------------------------------------------------
//-----------------------------------------------------------------------------------
function ajax__cargar_cliente($parametros, toba_ajax_respuesta $respuesta)
{
$this->s__id_cliente = $parametros['id_cliente'];
$pendientes = toba::tabla('pendientes');
$datos = $pendientes->get_listado($this->s__id_cliente);
foreach($datos as $key => $value)
{
$fecha = date("d/m/Y", strtotime($value["fecha"]));
$datos[$key]["referencia"] = "COBRANZA ".$fecha;
$datos[$key]["feccom"] = $value["fecha"];
}
$this->s__datos_conceptos = $datos;
$respuesta->set($datos);
}
function conf__formulario(toba_ei_formulario $form)
{
if ($this->get_relacion()->esta_cargada()) {
$form->set_datos($this->get_relacion()->tabla('recibos')->get());
} else {
$sql = "select * from paramet";
$paramet = consultar_fuente($sql);
$numrec = $paramet[0]["numrec"] + 1;
$this->s__cuit = $paramet[0]["cuit"];
$array_paramet = array("fecha"=>$paramet[0]["fecha"],"tiprec"=>'REC',"fijrec"=>$paramet[0]["fijrec"],"numrec"=>$numrec);
$form->set_datos($array_paramet);
}
}
function evt__formulario__modificacion($datos)
{
$datos["anula"] = false;
if (!$this->get_relacion()->esta_cargada()) {
$timezone = new DateTimeZone('America/Argentina/Cordoba');
$fecha = new DateTime("now", $timezone);
$datos["fecalt"] = $fecha->format('Y-m-d H:i:s');
}
$this->get_relacion()->tabla('recibos')->set($datos);
}
//-----------------------------------------------------------------------------------
//---- formulario_ml ----------------------------------------------------------------
//-----------------------------------------------------------------------------------
function conf__formulario_ml(matger_ei_formulario_ml $form_ml)
{
if ($this->get_relacion()->esta_cargada()) {
$form_ml->set_datos($this->get_relacion()->tabla('conceptos_recibos')->get_filas());
} elseif(!empty($this->s__datos_conceptos)) {
$form_ml->set_datos_defecto($this->s__datos_conceptos);
}
}
function evt__formulario_ml__modificacion($datos)
{
$this->get_relacion()->tabla('conceptos_recibos')->procesar_filas($datos);
$this->get_relacion()->sincronizar();
$conceptos_recibos = $this->get_relacion()->tabla('conceptos_recibos')->get_filas(null, true);
$total = 0;
$pendientes = toba::tabla('pendientes');
$conceptos_pendientes = toba::tabla('conceptos_pendientes');
foreach($conceptos_recibos as $key => $value) {
if(!$this->get_relacion()->esta_cargada()) {
$array_pendiente = array("id_cliente"=>$this->s__id_cliente,"fecha"=>$datos[$key]["feccom"]);
$pendientes->cargar($array_pendiente);
$pendiente = $pendientes->get();
if(!empty($pendiente)) {
$id_pendiente = $pendiente["id_pendiente"];
$array_concepto_pendiente = array("id_pendiente" => $id_pendiente, "id_concepto" => $value["id_concepto"]);
$conceptos_pendientes->cargar($array_concepto_pendiente);
$concepto_pendiente = $conceptos_pendientes->get();
if(!empty($concepto_pendiente)) {
$concepto_pendiente["importe"] -= $value["importe"];
$conceptos_pendientes->set($concepto_pendiente);
$conceptos_pendientes->sincronizar();
}
}
}
$total += $value["importe"];
}
$recibo = $this->get_relacion()->tabla('recibos')->get();
$recibo["total"] = $total;
$this->get_relacion()->tabla('recibos')->set($recibo);
$fecha = date("d/m/Y", strtotime($recibo["fecha"]));
$referencia = "COBRANZA ".$fecha;
$timezone = new DateTimeZone('America/Argentina/Cordoba');
$ahora = new DateTime("now", $timezone);
$fecalt = $ahora->format("Y-m-d H:i:s");
$array_ctacte = array("id_cliente"=>$recibo["id_cliente"],"fecha"=>$recibo["fecha"],
"tipo"=>$recibo["tiprec"],"fijcom"=>$recibo["fijrec"],"comprob"=>$recibo["numrec"]);
$array_guardar = array("id_cliente"=>$recibo["id_cliente"],"fecha"=>$recibo["fecha"],
"tipo"=>$recibo["tiprec"],"fijcom"=>$recibo["fijrec"],"comprob"=>$recibo["numrec"],
"referencia"=>$referencia,"importe"=>$total,"fecalt"=>$fecalt);
$array_modificar = array("importe"=>$total);
$ctacte = toba::tabla('ctacte');
$ctacte->cargar($array_ctacte);
$datos_ctacte = $ctacte->get();
if(empty($datos_ctacte)) $ctacte->set($array_guardar);
else $ctacte->set($array_modificar);
$ctacte->sincronizar();
$array_paramet = array("cuit"=>$this->s__cuit);
$paramet = toba::tabla('paramet');
$paramet->cargar($array_paramet);
$datos_p = $paramet->get();
$datos_p["fecha"] = $recibo["fecha"];
$datos_p["fijrec"] = $recibo["fijrec"];
$datos_p["numrec"] = $recibo["numrec"];
$paramet->set($datos_p);
$paramet->sincronizar();
}
}
?>
Dejame aclarar que este ci lo uso con tipo de navegación tab horizontal, en un tab tengo un formulario con los datos del recibo (id_cliente, fecha, tipo y número de comprobante) y en el otro tab tengo un formulario_ml con el detalle de facturas que voy a pagar con este recibo.
Y este es el código del ci donde muestro el cuadro con los recibos guardados:
<?php
class ci_registro_de_recibos extends matger_ci
{
protected $s__datos_filtro;
function get_relacion()
{
return $this->dependencia('datos');
}
//---- Filtro -----------------------------------------------------------------------
function conf__filtro(toba_ei_formulario $filtro)
{
if (isset($this->s__datos_filtro)) {
$filtro->set_datos($this->s__datos_filtro);
}
}
function evt__filtro__filtrar($datos)
{
if (array_no_nulo($datos)) {
$this->s__datos_filtro = $datos;
} else {
toba::notificacion()->agregar('El filtro no posee valores');
}
}
function evt__filtro__cancelar()
{
unset($this->s__datos_filtro);
}
//---- Cuadro -----------------------------------------------------------------------
function conf__cuadro(toba_ei_cuadro $cuadro)
{
if (isset($this->s__datos_filtro)) {
$cuadro->set_datos($this->dep('datos')->tabla('recibos')->get_listado($this->s__datos_filtro));
}
}
function evt__cuadro__eliminar($datos)
{
$this->dep('datos')->resetear();
$this->dep('datos')->cargar($datos);
$this->dep('datos')->eliminar_todo();
$this->dep('datos')->resetear();
}
function evt__cuadro__seleccion($datos)
{
$this->dep('datos')->cargar($datos);
$this->set_pantalla('pant_edicion');
}
//---- Formulario -------------------------------------------------------------------
function resetear()
{
$this->dep('datos')->resetear();
$this->set_pantalla('pant_seleccion');
}
//---- EVENTOS CI -------------------------------------------------------------------
function evt__agregar()
{
$this->set_pantalla('pant_edicion');
}
function evt__volver()
{
$this->resetear();
}
function evt__eliminar()
{
$this->dep('datos')->eliminar_todo();
$this->resetear();
}
function evt__guardar()
{
$this->dep('datos')->sincronizar();
$this->resetear();
}
//-----------------------------------------------------------------------------------
//---- Configuraciones --------------------------------------------------------------
//-----------------------------------------------------------------------------------
function conf__pant_edicion(toba_ei_pantalla $pantalla)
{
if(!$this->get_relacion()->esta_cargada())
{
$pantalla->eliminar_evento('eliminar');
}
}
}
?>