rmonclova Posted March 4, 2014 Share Posted March 4, 2014 Hola, Necesito hacer un INSERT en una nueva tabla tras la realización de un pedido (es decir, tras el INSERT del ORDER en ps_orders). Para todo esto, estoy haciendo un modulo y recupera un campo al principio del proceso de compra y lo guardo en un valor de Object Context para poder recuperarlo cuando vaya a realizar el insert. No sé donde se realiza el insert en ps_orders, pero necesito que me echeis una mano porque llevo varios días y no soy capaz de encontrar donde es. PD.: Estoy usando el theme default y el PS 1.5.6.2 Gracias Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 4, 2014 Share Posted March 4, 2014 Lo mejor es que uses el hook correspondiente p.ej cuando la orden pasa al estado pagado public function hookActionPaymentConfirmation($params){ $order=new Order($params["id_order"]); } También hay otro punto como actionOrderStatusUpdate al cual se le pasa el id del pedido y el nuevo estado del pedido En general para creación de objetos Prestashop usa en el método add Hook::exec('actionObject'.get_class($this).'AddBefore', array('object' => $this)); ........................ ....................... Hook::exec('actionObject'.get_class($this).'AddAfter', array('object' => $this)); Por lo que si tu tienes un hook actionObjectOrderAddBefore se ejecutara antes y otro hook actionObjectOrderAddAfter después de la creación de una orden (aunque supongo que es mejor usar el after por si falla la inserción) Algo de info http://blog.belvg.com/hooks-in-prestashop.html y en http://doc.prestashop.com/display/PS15/New+Developers+Features+In+PrestaShop+1.5#NewDevelopersFeaturesInPrestaShop1.5-Hooks Link to comment Share on other sites More sharing options...
rmonclova Posted March 4, 2014 Author Share Posted March 4, 2014 Lo mejor es que uses el hook correspondiente p.ej cuando la orden pasa al estado pagado public function hookActionPaymentConfirmation($params){ $order=new Order($params["id_order"]); } También hay otro punto como actionOrderStatusUpdate al cual se le pasa el id del pedido y el nuevo estado del pedido En general para creación de objetos Prestashop usa en el método add Hook::exec('actionObject'.get_class($this).'AddBefore', array('object' => $this)); ........................ ....................... Hook::exec('actionObject'.get_class($this).'AddAfter', array('object' => $this)); Por lo que si tu tienes un hook actionObjectOrderAddBefore se ejecutara antes y otro hook actionObjectOrderAddAfter después de la creación de una orden (aunque supongo que es mejor usar el after por si falla la inserción) Algo de info http://blog.belvg.com/hooks-in-prestashop.html y en http://doc.prestashop.com/display/PS15/New+Developers+Features+In+PrestaShop+1.5#NewDevelopersFeaturesInPrestaShop1.5-Hooks ¿¿Y cual de ellos me recomiendas por sencillez a la hora de programarlo?? el hookActionPaymentConfirmation o actionObjectOrderAddAfter?? Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 4, 2014 Share Posted March 4, 2014 Si quieres detectar cuando se ha creado cualquier orden independientemente de su estado el actionObjectOrderAddAfter (dentro coges el id con $params['object']->id). Piensa que hay ordenes que primero se crean con estado pendiente de pago o otro.. y luego pasan a estado pagado (o no). Si quieres detectar el paso concreto a pagado hookActionPaymentConfirmation y si en general esperas otro estado en "el ciclo de vida" de un Pedido hookActionOrderStatusUpdate (y dentro chequearías si el id del nuevo estado coincide con el que tu quieres) Link to comment Share on other sites More sharing options...
rmonclova Posted March 4, 2014 Author Share Posted March 4, 2014 gracias por tu respuestas. Lo voy a probar y mañana respondo si lo he conseguido o no. gracias Link to comment Share on other sites More sharing options...
rmonclova Posted March 5, 2014 Author Share Posted March 5, 2014 (edited) Tras los cambios realizados, ahora no me finaliza correctamente el finalizar el pedido. Me da el error siguiente: "NetworkError: 500 Internal Server Error - http://localhost/prestashop/index.php?fc=module&module=universalpay&controller=validation" (como ves, uso el modulo UniversalPay) Los cambios que he realizado son los siguientes: - En mimodulo.php: En funcion install() Db::getInstance()->Execute("CREATE TABLE `"._DB_PREFIX_."code_project` ( `id_code_project` INT(10) NOT NULL AUTO_INCREMENT, `id_code` TEXT(12), `id_order` INT(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id_code_project`) ) ENGINE="._MYSQL_ENGINE_." DEFAULT CHARSET=utf8"); if(parent::install() == false OR !$this->registerHook('actionObjectOrderAddAfter')) return false; La funcion para el hook: public function hookActionObjectOrderAddAfter($params) { require_once(dirname(__FILE__). '/Clase_MiModulo.php'); //Variable introducida previamente, validada y guardada para que no se pierda. $obj_mimodulo = new Clase_MiModulo($this->context->cookie->codproy); return $this->writeLog(get_class($params['object']), $this-> l('Add #').$params['object']->id); } - En Clase_MiModulo.php (está clase de MiModulo, la usaré en principio para insertar un registro en la tabla 'ps_code_project'. Dicha tabla estará formada por: un campo AUTO_INCREMENT, el campo 'id_code' --> que es el campo que ha introducido por pantalla previamente, y esta guardado en $this->context->cookie->codproy; y el campo 'id_order' --> que debe ser el id de la order que se insertar justo antes que este insert): <?php class Clase_MiModulo extends ObjectModel { public $id_code; public $id_order; public static $definition = array( 'table' => 'code_project', 'primary' => 'id_code_project', // campo auto-increment. 'multilang' => false, 'fields' => array( /* Classic fields */ 'id_code' => array('type' => self::TYPE_STRING, 'validate' => 'isString','required' => true), 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId','required' => true), ), ); public function __construct($id_code = NULL){ return parent::__construct($id_code); } public function addCode($id_code) { $row = array('id_code' => $id_code, 'id_order' => (int)$this->id); Db::getInstance()->insert('code_project', $row); } public function add($autodate = true, $null_values = false) { // @hook actionObjectOrderAddAfter $ret = parent::add($autodate, $null_values); $this->addCode($id_code); return $ret; } } ¿¿Alguien podria echarme una mano?? gracias Edited March 5, 2014 by rmonclova (see edit history) Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 5, 2014 Share Posted March 5, 2014 Pon el modo dev en on http://doc.prestashop.com/display/PS15/PrestaShop%27s+developer+tools Así verás el error en pantalla. Enabling it is quite easy: On your server, open the /config/defines.inc.php file. Find this line: define('_PS_MODE_DEV_', false); In this line, change "false" to "true". Save your changes. Link to comment Share on other sites More sharing options...
rmonclova Posted March 6, 2014 Author Share Posted March 6, 2014 (edited) gracias Enrique, he conseguido hacer el INSERT en mi tabla, pero el campo id_order se inserta vacio. Estoy probando en intentar recuperar el ID_ORDER que acaba de insert en ps_orders, pero no consigo almacenarlo para insertarlo en mi tabla. He probado en el mismo hookActionObjectOrderAddAfter($params), pero parece ser que no viene el id_order en los $params. He intentado recuperar como: $this->context->cookie->__set(id_order,intval($params['objOrder']->id)); Pero no me recupera nada. ¿que hago mal? Edited March 6, 2014 by rmonclova (see edit history) Link to comment Share on other sites More sharing options...
rmonclova Posted March 6, 2014 Author Share Posted March 6, 2014 Acabo de probar en recuperar el id_order en el hookOrderConfirmation, y si el id_order=46 en ps_orders, en mi tabla me inserta el id_order=43, ¿por qué? ¿que hago mal? public function hookOrderConfirmation($params) { $id_order = $params['id_order']; $this->context->cookie->__set(id_order,(int)$id_order); } Link to comment Share on other sites More sharing options...
rmonclova Posted March 6, 2014 Author Share Posted March 6, 2014 Acabo de probar esto: public function hookOrderConfirmation($params) { $this->context->cookie->__set('id_order',intval($params['objOrder']->id)); } Con este codigo, id_order=49 (ps_orders), id_order=48 (miTabla). No lo entiendooooooo!! ayuda please!! Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 6, 2014 Share Posted March 6, 2014 gracias Enrique, he conseguido hacer el INSERT en mi tabla, pero el campo id_order se inserta vacio. Estoy probando en intentar recuperar el ID_ORDER que acaba de insert en ps_orders, pero no consigo almacenarlo para insertarlo en mi tabla. He probado en el mismo hookActionObjectOrderAddAfter($params), pero parece ser que no viene el id_order en los $params. He intentado recuperar como: $this->context->cookie->__set(id_order,intval($params['objOrder']->id)); Pero no me recupera nada. ¿que hago mal? En hookActionObjectOrderAddAfter($params) debería venir $params['object']->id como el identificador del pedido Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 6, 2014 Share Posted March 6, 2014 Acabo de probar esto: public function hookOrderConfirmation($params) { $this->context->cookie->__set('id_order',intval($params['objOrder']->id)); } Con este codigo, id_order=49 (ps_orders), id_order=48 (miTabla). No lo entiendooooooo!! ayuda please!! Estas metiendo un valor en las cookies? donde esta el insert en base de datos? Hay muchas formas de hacerlo, mírate algún código P.ej Db::getInstance()->insert('product_attribute_combination', $row); Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`) VALUES ('.(int)$id_feature.', '.(int)$id_product.', '.(int)$id_feature_value.') ON DUPLICATE KEY UPDATE `id_feature_value` = '.(int)$id_feature_value ); Usas algún IDE con debug? (super recomendable si te metes en serio con estos temas) Saludos Link to comment Share on other sites More sharing options...
rmonclova Posted March 6, 2014 Author Share Posted March 6, 2014 El valor lo meto en las cookies para poder mantener el valor en la session. El INSERT esta en: public function hookActionObjectOrderAddAfter($params) { $insertData = array( 'id_sap_code' => $this->context->cookie->codproysap, 'id_order' => $this->context->cookie->id_order ); Db::getInstance()->insert('sap_code_project', $insertData); } Link to comment Share on other sites More sharing options...
Enrique Gómez Posted March 6, 2014 Share Posted March 6, 2014 Ponle un nombre al campo de la cookie mas específico porque quizás ya use id_order en otro sitio puedes usar para el set cookie->tuprefijo_id_order=$params['object']->id Si realmente estas en la misma petición http puedes probar de meter la variable en context context->tuprefijo_id_order. No se, es una idea (Context se creo para evitar usar variables globales). Pero lo de la cookie debería funcionar Link to comment Share on other sites More sharing options...
rmonclova Posted March 6, 2014 Author Share Posted March 6, 2014 Gracias Enrique, Me ha funcionado cambiandole el nombre en cookie por un poco mas especifico. Link to comment Share on other sites More sharing options...
nadie Posted March 8, 2014 Share Posted March 8, 2014 Como veo que el autor del tema ha dado el tema como solucionado, añado la palabra "Solucionado" al titulo del tema (http://www.prestasho...itulo-del-tema/) y procedo a cerrar el tema. Gracias a todos por colaborar con la Comunidad de Prestashop. Link to comment Share on other sites More sharing options...
Recommended Posts