crisgi Posted September 10, 2014 Share Posted September 10, 2014 Muy buenas! Os quiero explicar el problema en el que me encuentro: Actualmente, tengo configurado que cuando alguien realice un pedido, este pedido sea generado en XML y que el archivo XML se me suba al FTP para poder descargarlo en un programa externo. Hasta ahora todo funciona bien, pero el problema que tengo es que: yo quiero que el XML del pedido se genere cuando el estado del pedido sea "Pago aceptamos" (ya sea con PayPal como con transferencia bancaria). El archivo que le da la estructura al XML, es el que lo he denominado rr.php Ahora mismo lo tengo configurado, mi texto de programación, en el archivo Order-Confirmation.tpl y lo he dejado así: <meta http-equiv="refresh" content="3;URL=rr.php"> {capture name=path}{l s='Order confirmation'}{/capture} {include file="$tpl_dir./breadcrumb.tpl"} y en el archivo Order-confirmation.php tengo lo siguiente: require(dirname(__FILE__).'/config/config.inc.php'); Tools::displayFileAsDeprecated(); Tools::redirect('rr.php'); Así pues, yo creo que no es el sitio correcto ya que no me lo está generando con el Pago Aceptamos sino que lo que me está pasando es que cuando una persona hace un pedido y lo paga, no se sube hasta que la siguiente persona haga un pedido. Necesitaría averiguar en qué archivo sería correcto que yo le dijera: creame el XML del pedido. He intentado buscar el archivo dónde se establecen los estados de pedido y las acciones que deben realizar pero no he tenido éxito. Si alguien pudiera echarme una mano estaría más que agradecida. Y si alguien tiene una alternativa más fácil soy todo oídos! Muchas gracias de antemano! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 Para eso estan los hooks de acción de prestashop. actionPaymentConfirmation. Se ejecuta cuando hay un pago (la orden pasa a un estado Pagado) y se le pasa el identificador del pedido P.ej public function hookActionPaymentConfirmation($params){ $order=new Order($params["id_order"]); //when a valid purchase we change the value for customer to paid $customer = new Customer($order->id_customer); if (Validate::isLoadedObject($customer)){ $customer->pele_first_fee_paid =1; $customer->update(); } } Aunque también hay otros puntos como actionOrderStatusUpdate al cual se le pasa el id del pedido y el nuevo estado del pedido Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 Hola, primero gracias por responder e intentar ayudarme. Este hook que me comentas, el actionPaymentConfirmation, dónde lo puedo encontrar? Debo encontrarlo en el módulo de pago? (paypal y transferencia) o en algún archivo dónde se listen todos los hooks? Lo puedo modificar para llamar a un php que me hace el XML (el archivo rr.php que he nombrado antes)? Yo lo que quiero es que una vez Prestashop sepa que el Pago está realizado (bien por proceso automático de Paypal o bien por modificación manual del estado del pedido cuando es transferencia) automáticamente quiero que me ejecute el rr.php que es el que me genera y me sube el XML al FTP. Realmente agradecería si me pudieras guiar un poco. Muchas gracias! Link to comment Share on other sites More sharing options...
rafaelamargo Posted September 10, 2014 Share Posted September 10, 2014 (edited) Hola, primero gracias por responder e intentar ayudarme. Este hook que me comentas, el actionPaymentConfirmation, dónde lo puedo encontrar? Debo encontrarlo en el módulo de pago? (paypal y transferencia) o en algún archivo dónde se listen todos los hooks? Lo puedo modificar para llamar a un php que me hace el XML (el archivo rr.php que he nombrado antes)? Yo lo que quiero es que una vez Prestashop sepa que el Pago está realizado (bien por proceso automático de Paypal o bien por modificación manual del estado del pedido cuando es transferencia) automáticamente quiero que me ejecute el rr.php que es el que me genera y me sube el XML al FTP. Realmente agradecería si me pudieras guiar un poco. Muchas gracias! Si es individualmente por modulos, creo puedes hacerlo en el paypal.php (/modules/paypal/) y supongo que en el (/modules/bankwire/) bankwire.php. El hook o como queramos llamarlo lo ejecutas dentro del módulo, por eso lo de editar los ficheros comentados de los modulos, aunque no estoy seguro. Edited September 10, 2014 by rafaelamargo (see edit history) Link to comment Share on other sites More sharing options...
rafaelamargo Posted September 10, 2014 Share Posted September 10, 2014 (edited) Si es individualmente por modulos, creo puedes hacerlo en el paypal.php (/modules/paypal/) y supongo que en el (/modules/bankwire/) bankwire.php. El hook o como queramos llamarlo lo ejecutas dentro del módulo, por eso lo de editar los ficheros comentados de los modulos, aunque no estoy seguro. Añado, he visto este tema: http://www.prestashop.com/forums/topic/309976-solucionadocomo-hacer-llamadas-desde-prestashop-a-servicios-externos/ con el que quizas puedas orientarte tambien. (Tema comentado por Enrique Gomez) Edited September 10, 2014 by rafaelamargo (see edit history) 2 Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 (edited) Te recomiendo que eches un vistazo a la doc. referente a módulos y hooks http://doc.prestashop.com/display/PS16/Creating+a+PrestaShop+Module. En este hilo comente un poco el tema http://www.prestashop.com/forums/topic/309976-solucionadocomo-hacer-llamadas-desde-prestashop-a-servicios-externos/?p=1573231 Si no te aclaras puedes ir directamente al código del Core y donde llama a todos los módulos suscritos añades además tú código. Es decir buscas en la clase OrderHistory por actionPaymentConfirmation Añado, he visto este tema: http://www.prestashop.com/forums/topic/309976-solucionadocomo-hacer-llamadas-desde-prestashop-a-servicios-externos/ con el que quizas puedas orientarte tambien. (Tema comentado por Enrique Gomez) Vaya que coincidencia... Edited September 10, 2014 by Enrique Gómez (see edit history) Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 Te recomiendo que eches un vistazo a la doc. referente a módulos y hooks http://doc.prestashop.com/display/PS16/Creating+a+PrestaShop+Module. En este hilo comente un poco el tema http://www.prestashop.com/forums/topic/309976-solucionadocomo-hacer-llamadas-desde-prestashop-a-servicios-externos/?p=1573231 Si no te aclaras puedes ir directamente al código del Core y donde llama a todos los módulos suscritos añades además tú código. Es decir buscas en la clase OrderHistory por actionPaymentConfirmation Vaya que coincidencia... Por lo que has comentado de hacerlo directamente en el Core, he ido al documento OrderHistory.php y he modificado lo siguiente: // executes hook if (in_array($new_os->id, array(Configuration::get('PS_OS_PAYMENT'), Configuration::get('PS_OS_WS_PAYMENT')))) Hook::exec('actionPaymentConfirmation', array('id_order' => (int)$order->id)); <meta http-equiv="refresh" content="3;URL=rr.php"> Lo que yo he añadido es <meta http-equiv="refresh" content="3;URL=rr.php"> no he hecho nada más, simplemente he añadido esto y me peta. Realmente no sé ni si lo estoy escribiendo bien, pero así es como lo tenía para ejecutarlo en Order-Confirmation.tpl SOS!! Gracias Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 lo suyo sería que en el if pongas las comillas y llames al código que hace el trabajo que esta de alguna forma en rr.php El código para generar un xml del pedido y subirlo por ftp tienes que ponerlo tú.. if (in_array($new_os->id, array(Configuration::get('PS_OS_PAYMENT'), Configuration::get('PS_OS_WS_PAYMENT')))){ Hook::exec('actionPaymentConfirmation', array('id_order' => (int)$order->id)); //realizar el trabajo... incluir código rr.php ? } Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 lo suyo sería que en el if pongas las comillas y llames al código que hace el trabajo que esta de alguna forma en rr.php El código para generar un xml del pedido y subirlo por ftp tienes que ponerlo tú.. if (in_array($new_os->id, array(Configuration::get('PS_OS_PAYMENT'), Configuration::get('PS_OS_WS_PAYMENT')))){ Hook::exec('actionPaymentConfirmation', array('id_order' => (int)$order->id)); //realizar el trabajo... incluir código rr.php ? } Dos preguntas al respecto: 1. No puedo llamar directamente al rr.php? Si es así, cómo debería escribirlo? 2. En caso contrario, tengo que escribir todo el código tal cual lo tengo en el rr.php al hook actionPaymentConfirmation descrito en OrderHistoy.php? De ser así, como tengo que introducirlo? Puede ser copiar y pegar? si no es copiar y pegar, cómo debo introducirlo? Gracias de nuevo! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 (edited) Entiendo que antes te funcionaba, lo que no veo es como rr.php genera un xml del pedido si no le entra info.. estaría bien poder ver el código de rr.php (dentro substituye la información referente a la conexión a ftp-> passwords..etc) puedes incluir el código con un include. Si el rr.php esta en la raiz de la instalación es include(_PS_ROOT_DIR_.'/rr.php'); Edited September 10, 2014 by Enrique Gómez (see edit history) Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 Entiendo que antes te funcionaba, lo que no veo es como rr.php genera un xml del pedido si no le entra info.. estaría bien poder ver el código de rr.php (dentro substituye la información referente a la conexión a ftp-> passwords..etc) puedes incluir el código con un include. Si el rr.php esta en la raiz de la instalación es include(_PS_ROOT_DIR_.'/rr.php'); El documento rr.php está ubicado en httpdocs. Lo llama a ejecutarse en el Order-confirmation.tpl, con lo cual siempre me sube el último pedido que está como pagado siempre y cuando se haga un nuevo pedido después. No me lo está subiendo automáticamente cuando paso al estado Pago aceptado, que es dónde quiero que lo haga. Cómo sería el código para decirle al hook que me ejecute el rr.php Te pongo una parte del documento rr.php para que veas un poco de que tipo es y lo que contiene: $connection=mysql_connect ('localhost', $username, $password ); if (!$connection) { die('No conexion : ' . mysql_error());} $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ('Can\'t use db : ' . mysql_error()); } mysql_query("set names 'utf8'"); $query = "SELECT ps_customer.firstname, ps_cart.date_add, ps_address.address1, ps_address.city, ps_address.postcode, ps_cart.id_cart, ps_address.city, ps_state.name, ps_customer.lastname, ps_orders.reference, ps_state.id_state, ps_customer.email, ps_cpostales_provincia.Provincia FROM ps_order_payment, ps_orders, ps_cart, ps_customer, ps_address, ps_state, ps_cpostales_provincia WHERE ps_orders.reference = ps_order_payment.order_reference AND ps_orders.id_cart = ps_cart.id_cart AND ps_cart.id_customer = ps_customer.id_customer AND ps_address.id_address = ps_cart.id_address_delivery AND ps_state.id_state = ps_address.id_state AND ps_cpostales_provincia.CodigosPostales = '" . $postal . "' ORDER BY id_order_payment DESC LIMIT 1"; $result = mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } $row = mysql_fetch_row($result); //echo $row[0]; //echo "CODIGO POSTAL " . substr($row[4], 0, -3). "----". $row[4]; $a = "pedidos/PEDIDOS-"; $b = $a . $row[0] . " " . $row[9] . ".xml"; //echo $b; $dom = new DOMDocument("1.0"); $node = $dom->createElement("OnlineOrders"); $parnode = $dom->appendChild($node); $node = $dom->createElement("OrderHeader"); $newnode = $parnode->appendChild($node); $nombre = $row[0]. " " . $row[8]; //echo $row[8]; $dom->save($; $file = $b; $fp = fopen($file, "rb") or die("cannot open file"); $str = fread($fp, filesize($file)); $xml = new DOMDocument(); $xml->formatOutput = true; $xml->preserveWhiteSpace = false; $xml->loadXML($str) or die("Error"); // get document element $root = $xml->documentElement; $fnode = $root->firstChild; $snode = $root->lastChild; //add a node if ($row[10] == "314") { $emp = $xml->createElement("CustomerNo"); $empText = $xml->createTextNode("EMP-BCN"); $emp->appendChild($empText); } if ($row[10] == "315") { $emp = $xml->createElement("CustomerNo"); $empText = $xml->createTextNode("EMP-TOL"); $emp->appendChild($empText); } if ($row[10] == "313") { $emp = $xml->createElement("CustomerNo"); $empText = $xml->createTextNode("EMP-MAD"); $emp->appendChild($empText); } $ori = $fnode->childNodes->item(3); $id = $xml->createElement("Site"); $idText = $xml->createTextNode($row[7]); $id->appendChild($idText); $fecha2=date("d-m-Y",strtotime($row[1])); //$string = substr($row[2],0,14); $title = $xml->createElement("OrderDate"); $titleText = $xml->createTextNode($fecha2); $title->appendChild($titleText); $author = $xml->createElement("Discount"); $authorText = $xml->createTextNode("0"); $author->appendChild($authorText); //echo $string; $CustomerName = $xml->createElement("CustomerName"); $CustomerNameText = $xml->createTextNode($nombre); $CustomerName->appendChild($CustomerNameText); $Address = $xml->createElement("Address"); $AddressText = $xml->createTextNode($row[2]); $Address->appendChild($AddressText); $City = $xml->createElement("City"); $CityText = $xml->createTextNode($row[3]); $City->appendChild($CityText); $PostCode = $xml->createElement("PostCode"); $PostCodeText = $xml->createTextNode($row[4]); $PostCode->appendChild($PostCodeText); $County = $xml->createElement("County"); $CountyText = $xml->createTextNode($row[12]); $County->appendChild($CountyText); $Emails = $xml->createElement("Email"); $EmailsText = $xml->createTextNode($row[11]); $Emails->appendChild($EmailsText); //$fnode->insertBefore($Emails, $ori); De verdad, muchas gracias por la ayuda! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 Prueba a ver if (in_array($new_os->id, array(Configuration::get('PS_OS_PAYMENT'), Configuration::get('PS_OS_WS_PAYMENT')))){ Hook::exec('actionPaymentConfirmation', array('id_order' => (int)$order->id)); include(_PS_ROOT_DIR_.'/rr.php'); } Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 He probado introduciendo el código tal cual me lo has pasado, y una vez hago la prueba, cuando desde el back office intento poner el estado del pedido como pagado (en transferencia bancaria) me aparece una pantalla totalmente en blanco con el texto: cannot open file Qué es lo que no estoy haciendo bien? También tengo otra pregunta, el hook actionPaymentConfirmation, también tiene que estar puesto en el archivo paypal.php y bankwire.php? De ser que si, cómo debo escribirlo? Gracias! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 Supongo que es un tema de permisos.... ponle los mismos permisos al fichero rr.php que los demás para que lo pueda leer. También tengo otra pregunta, el hook actionPaymentConfirmation, también tiene que estar puesto en el archivo paypal.php y bankwire.php? De ser que si, cómo debo escribirlo? No hace falta que toques esos modulos.. ya están bien como vienen Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 Le he dado todos los permisos al documento rr.php y sigue sin funcionarme. Me estoy volviendo loca, no consigo saber porque pasa! Qué más puedo intentar? Gracias! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 Pasame el fichero por privado o mail y lo pruebo Link to comment Share on other sites More sharing options...
crisgi Posted September 10, 2014 Author Share Posted September 10, 2014 Te envío el rr.php? A qué e-mail debo enviartelo? a este [email protected] ? 1 Link to comment Share on other sites More sharing options...
Enrique Gómez Posted September 10, 2014 Share Posted September 10, 2014 si, mismamente Link to comment Share on other sites More sharing options...
conde00011100 Posted April 14, 2015 Share Posted April 14, 2015 Te envío el rr.php? A qué e-mail debo enviartelo? a este [email protected] ? Que tal me podrias pasar tu codigo para los xml, estoy haciendo unas pruebas igual pero no me resulta, gracias Link to comment Share on other sites More sharing options...
Recommended Posts