Ir al contenido



Foto

llamar a un script php desde otro

ajax jaquery php funcion

  • Por favor identifícate para responder
No hay respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.257 mensajes
  • LocationArgentina

Escrito 14 diciembre 2017 - 05:30

Buenos días,

 

Hoy vengo a que me ayuden a pensar y encontrar alguna forma de como encarar un problema que me tiene un tanto loco.

La pregunta, para introducirlos en el tema, es: ¿Cómo puedo invocar/llamar/ a un script php desde otro?

 

Les doy el contexto, no puedo decir que seré breve, pero trataré de brindar la info necesaria que se me permite, y espero que se me entienda.

 

En donde trabajo tenemos un sistema web funcionando en varios clientes que funciona relativamente bien. Pero para un nuevo cliente nos planteamos alterar un poco su diseño e "invertir" el orden de como se invocan algunos módulos. Y resulta ser que aquí es donde se presenta el dilema.

 

La forma de trabajar el sistema es así: el script confeccionarA.php se encarga de generar una interfaz con el que el cliente va a operar. En éste se cuenta con una rutina AJAX que invoca a un script llamemosle invocarB.php. Este script invocarB.php se encarga de hacer algunas operaciones externas y se comunica con el organismo fiscal de control estatal. Y si todo está bien se procede mediante un submit/POST a guardar todo a una DB mediante un script procesarA.php.

 

El AJAX en cuestión se invoca dentro de un .dialog({}) . En pocas líneas, lo que interesa, sería algo así:


php
  1. $.ajax({
  2. type: "GET",
  3. url: "carpeta/invocarB.php",
  4. data: strdata,
  5. cache: false,
  6. async:false,
  7.  
  8. success: function(data){
  9. dat = $.parseJSON(data);
  10.  
  11. // trabajamos con dat
  12. // y luego hacemos un submit del form
  13. form.submit();
  14.  
  15. }
  16.  
  17. });

strdata es la serialización del contenido de un table con inputs hidden, y que se obtiene antes de invocar a este ajax:


php
  1. var strdata=$('#form #tabla input').serialize();

form.submit() lo que hace es digirse a procesarA.php gracias a algo como esto:


php
  1. <form id="form" method="post" action="procesarA.php">

procesarA.php no es un script del lado del cliente. es todo lado servidor, en resumidas guarda todo en la base de datos.

 

invocarB.php por su parte, como dije antes, se encarga de interactuar con servicios externos, guarda algunas cosas en una tablas que mantenemos como "contendo temporal" que luego leemos para continuar con el ciclo de trabajo. Y por último genera contenido JSON que recuperamos en el AJAX. Al final de todo de invocarB.php veremos un:


php
  1. echo json_encode($salida);

Siendo $salida un vector con los datos que recuperamos eln el AJAX.

 

Esto es como funciona tradicionalmente.

 

Pero ahora para este nuevo cliente necesitamos alterar un poco la cosa. La ejecución de invocarB.php debe hacerse a posteriori, postergarse. La intención es ejecutar procesarA.php, y desde éste mandar a ejecutar invocarB.php (el cual también es only server side como se sobre entiende) y en base a la respuesta que se obtiene continuar con el proceso de A. En pseudocódigo, sería así:

 

Script: procesarA.php:

----------------------------

1. Guardar data en tablaA

2. Rta = llamarA(invocarB.php)

3. Si Rta.Resultado = TodoOK entonces Actualizar en TablaA con Rta.Datos

 

Ahora bien, invocarB.php nos devuelve contenido que nos interesa mostrar al usuario. Y es por eso que fue planteado hacerse vía AJAX. Para este nuevo esquema, como entramos por medio de procesarA.php y es server side nos perdemos de esta posibilidad.

 

¿Porqué ahora cambiamos la metodología? Lo cierto es que hemos detectado que en ocasiones el servicio externo con el que interactúa invocarB.php falla, y nos deja con datos a medias y por consiguiente los clientes nos llaman diciendo que las cosas no andan bien. Nos planteamos primero guardar en TablaA todo, y recién usar los servicios para que si se obtiene respuesta proceder a actualizar y continuar con el proceso, o bien (cuando falla) dejarlo como "pendiente" para poder volver a intentarlo en otra oportunidad.

 

La alternativa que yo encontré es en lugar de proceder de forma submit, es llamar a procesarA.php por la vía AJAX. Similar a como se hace con invocarB.php en la forma tradicional. Por tanto a mi botón Aceptar (un input type submit) (y aquí ya no habrá un dialog intermedio) lo pasé a hacer input type buttom y diseñar mi rutina AJAX así:


php
  1. $(#boton_aceptar).on('click', function({
  2. // codigo AJAX
  3. $.ajax({
  4. //...
  5. });
  6. });

¿Se va entendiendo?

 

Ahora sería mi procesarA.php el que se encargue de devolverme un vector con los resultados y datos necesarios a mostrar. Además de hacer todo el procesamiento de guardar el contenido.

 

Ahora bien, mi duda es ¿Cómo hago para llamar dentro y en el "medio" de procesarA.php a invocarB.php?

 

Al comienzo yo me imaginaba algo como tener una funtion:

 

Script: procesarA.php


php
  1. // codigo previo
  2. $rta = llamar_invocarB();
  3. // codigo que sigue

Esta function la tenía pensando tenerla declarada al comienzo de mi procesarA.php.

 

Pero... se me quemaron los cables... invocarB.php fue pensado para usarlo AJAX, es un script que actúa de fachada a otros scripts que hizo un tercero al que ya no tenemos contacto y la idea es en lo posible no tocarla demasiado.

 

¿Es posible llamar mediante un function a este script? ¿Cómo? ¿Y sabiendo que espera los datos serializados? En parte se que a los datos ya los tiene y recibe procesarA.php... ¿pero como se los pasaría a invocarB.php? ¿Y la salida, que me genera invocarB.php que es un JSON tendría que parsearla que no?

 

Una vía, que me estuve imaginando, para salir del problema es hacer una versión alternativa, y "paralela" de invocarB.php. Esta versión paralela, para no alterar el original, tendría todo el código de invocarB.php pero dentro de una function que podría llamar desde procesarA.php. Y al comienzo de procesarA.php simplemente hacer un include(invocarBalternativo.php) y de esa forma ya poder llamarla (y por tanto esta function ya no estaría declarada en procesarA.php).

Pero nuevamente mi pregunta, ¿cómo se tendría que pasar los parámetros, que en resumen, serían los mismos que ya de por si recibe procesarA.php cuando se hace la serialización?

 

[EDITO]

Ahora que lo pienso, si mi script invocarBalternativo.php fuera algo como:


php
  1. <?
  2. /////////
  3. // includes necesarios
  4. /////////
  5. include(script1.php);
  6. // ...
  7. include(scriptN.php);
  8.  
  9. function invocarB(){
  10. // aquí todo el código original de invocarB.php
  11. }
  12.  
  13. ?>

$salida ya no necesita ser encode en JSON sino simplemente armo un vector $salida[] común y tradicional con lo que necesite y se lo regreso:


php
  1. function invocarB(){
  2. // aqui todo el trabajo
  3. // ej. de como se va armando el vector $salida
  4. $salida['resultado'] = $algo;
  5. // más codigo ...
  6. $salida['data1'] = $data1;
  7. // etc.
  8.  
  9. return $salida;
  10. }

Pero sigue mi dilema en como debería hacer para darle todos los parámetros que necesita, y/o si hay otra forma de hacerlo.

 

[/EDITO]

 

Espero que se me entienda mi dilema. No encuentro la forma de "enganchar" invocarB.php ¿Cómo lo harían ustedes?

 

Cualquier ayuda se agredecería.

 

Saludos,


  • 0





Etiquetado también con una o más de estas palabras: ajax, jaquery, php, funcion