Acá agregué los siguientes directorios y archivos:
/cuadro_comprobantes/default.twig
controlador.php
pagelet_cuadro_comprobantes.php
template.twig
vista.php
Todo funciona perfecto y logré hacer lo que quiero, hasta ahora.
La duda que tengo, en el archivo /cuadro_comprobantes/default.twig escribí una tabla y con un for (twig) recorro los datos y la lleno perfectamente.
Al hacer click en cada fila, se abre un modal con un formulario que también lo escribí en html y lo lleno con datos utilizando el for de twig. (en el mismo default.twig)
La duda es a la hora de hacer click en el submit del form, quiero llamar a una acción del controlador y no puedo.
Cómo debería ser la llamada en el action del form?
Ví un pequeño ejemplo y para registrar el evento del form hay que hacer una serie de pasos que seguí y no me funcionan.
Puedo saltear la registración del form y la validación de cada campo y llamar al controlador desde el action? creo que sería más simple y se aplica bien a lo que quiero hacer.
Si es necesario, comparto el código. Muchas gracias.
Saludos.
La duda es a la hora de hacer click en el submit del form, quiero llamar a una acción del controlador y no puedo.
Cómo debería ser la llamada en el action del form?
Deberías hacer lo siguiente:
Crear la acción en el controlador, las mismas siempre deben tener el prefijo “accion__”, ej:
function accion__guardar()
{
// Código aquí....
}
En el pagelet crear la URL a esta acción para luego ponerla en el formulario, dentro de la función prepare (prepara datos para la vista):
function prepare()
{
.......
$operacion = kernel::ruteador()->get_id_operacion();
$this->data['url_guardar'] = kernel::vinculador()->crear($operacion, 'guardar'); // Si la acción se llamara "accion__procesar_solicitud", el segundo parámetro seria 'procesar_solicitud' en lugar de 'guardar'.
}
En el twig hacemos uso de esta URL en el action del form:
Te hago otra consulta acerca del catálogo y transacciones.
/**
* parametros: id
* cache: no
*/
function datos_comp($parametros)
{
$sql = "SELECT *FROM negocio_pers.comprobantes where id = {$parametros['id']}";
return kernel::db()->consultar($sql);
}
y en las transacciones tengo esto:
function datos__comprobante()
{
return catalogo::consultar('comprobantes', 'datos_comp', array('id' => '....'));
}
Ese parámetro me lo envío del formulario por post y llamo la consulta desde el controlador así:
En el catalogo, falta un espacio entre el “*” y el “FROM”, debería ser “SELECT * FROM”. Ademas siempre que agregas o modificas cosas en el catalogo debes correr el comando bin/guarani generar_catalogo en 3W. Luego debes versionar el archivo _info_catalogo.php.
Observo varias cosas en esta linea $comprobante = carga_comprobantes::datos__comp($_POST[‘id’]);:
a) Estas llamando de manera estática una función que no lo es. Tomemos como ejemplo el controlador src/siu/operaciones/solicitud_certificado/controlador.php, vas a ver que tiene una función llamada modelo la cual devuelve una instancia de la clase src/siu/modelo/transacciones/solicitud_certificados.php (singleton), y luego para llamar una función de dicha transacción hace como sigue:
$this->modelo()->nombre_funcion($parametos);
b) No es aconsejable acceder directamente a los datos de $_POST ($_POST[‘id’]). Tenemos funciones que obtienen datos del $_POST o $_GET, pero le aplican un proceso de sanitización previamente:
Gracias.
Te molesto con algo más, me comunico con un webservice y al obtener la respuesta de éxito o error, quiero mostrar un mensaje con el resumen de la operación.
$resultado tiene el mensaje y detalles de la operación. El problema que tengo es que no me mantiene los estilos y me muestra una pantalla en blanco con un par de datos que no sé de donde salen, además de mi párrafo mal formateado.
/cuadro_comprobantes/default.twig
controlador.php
pagelet_cuadro_comprobantes.php
template.twig
vista.php response.twig (este es el .twig que utilizo para el render_template).
Es correcto hacer esto o existe alguna otra forma ?
Gracias.
Hola Gonzalo, te paso un ejemplo de como se usa el render_template.
Si te fijas en la operación Plan de estudio (perfil alumno), vas a ver que si el alumno tiene correlativas aparece un botón que dice “Ver”. Dicho botón hace un AJAX para mostrar las correlativas de dicha actividad.
El Ajax lo hace en src/siu/operaciones/plan_estudio/info_plan/pagelet_info_plan.js función delegate_correlativas, esto lo termina atajando la función accion__correlativas de src/siu/operaciones/plan_estudio/controlador.php. Si te fijas al final de todo hace lo siguente:
function accion__correlativas()
{
.................
$this->render_template('correlativas.twig', $resultado);
}
Esto lo que devuelve es un JSON con la siguiente estructura:
Gracias, Leo.
El tema es que no mando nada por post, sólo quiero mostrar un mensaje de éxito o error que eso me lo dice el webservice.
Quizás no me expliqué bien, hice una nueva operación donde leo facturas para pagar y me conecto con todopago. Utiliza un webservice soap
El proceso está funcionando completo. Lo único que me falta es mostrar un mensaje de éxito de operación o error (lo marque en rojo donde debería mostrarlo).
En la acción del controlador a la hora de chequear si el pago fue exitoso, hago lo siguiente:
function accion_check()
{
.......
.......
........
........
$optionsGAA = array (
.....
.....
'RequestKey' => $_COOKIE['RequestKey'],
'AnswerKey' => $_GET['Answer']
);
$http_header = array(..........., 'user_agent' => 'PHPSoapClient');
$connector = new Sdk($http_header, 'test');
$rta = $connector->getAuthorizeAnswer($optionsGAA);
if ($rta['StatusCode'] == -1){
// significa que fue exitoso y acá debería hacer un redirect y mostrar el mensaje de éxito arriba de la tabla como indiqué en la imagen.
} else {
// hacer el mismo redirect pero con el mensaje de error
}
Lo único que me falta es el proceso del mensaje, después el resto está funcionando bien.
Gracias y perdonen las molestias.
Si lo que queres hacer es mostrar un mensaje de éxito/error podes hacer lo siguiente:
Si te fijas en la operación de Mensajes de 3W hace lo siguiente:
Si te fijas en la función accion__enviar_mensaje de la clase src/siu/operaciones/mensajes/controlador.php, vas a ver que guarda un mensaje en la sesión y luego redirige:
// Al finalizar de enviar el mensaje se lo redirija al inicio de la operación ('index'), ahora a enviados
$operacion = kernel::ruteador()->get_id_operacion();
kernel::sesion()->set('mensaje_enviado_ok', true);
$this->nuevo_request($operacion, 'enviados');
Luego en la función prepare de la clase src/siu/operaciones/mensajes/pagelet_lista_mensajes.php, si el mensaje esta seteado se lo pasa al JS para que lo muestre:
Luego en el JS muestra el mensaje si esta presente:
// Si hay mensaje de envío exitoso lo muestro
if(info.mensaje_enviado_ok){
kernel.ui.show_mensaje(info.mensajes.mensaje_enviado_ok_msj, {
tipo: 'alert-success',
timeout: 10000
});
}
Te hago una última consulta:
Agregué la operación en “Trámites” pero cuando ya estoy en la operación y hago click en los botones del navbar, ningún dropdown funciona (no se despliegan).
Reemplazar:
: por el nombre de la carpeta de personalización dentro de src/pers.
: por el nombre de la carpeta de la operación dentro de src/pers//operaciones
Buen día, retomando esta operación, no me arroja ningún error ya que me queda bloqueado el cursos al querer clickear la operación.
Estando en “Trámites → Pagos” el único botón que puedo clickear es “Inscripción a Materias”, el resto no funciona.
También probé dejando completo el archivo como el original y solo agregar mi operación.
El sistema de carpetas es este:
… /g3w3/src/pers/todopago/operaciones/pagos
En el archivo acc_Alumno.php cambio “pagos” por “todopago”, no funciona directamente.
Probé las personalizaciones en mi instalación local, y no tengo el problema que me decís de que no despliega el menú.
La personalización parece estar bien, algo que noto a mejorar es que pusieron los mensajes de la personalización todopago dentro de la personalización template, con lo cual la primera es dependiente de la segunda pero el resto esta bien!!!
Te voy a pedir lo siguiente, en el navegador hace un Inspeccionar elemento y anda la solapa Consola, luego trata de desplegar el menú y fíjate si muestra algún error JavaScript en consola.
También trata de no subir las credenciales de TodoPago en el código, lo mejor es poner “placeholders” y luego cuando haces la instalación se las cambias.