Jump to content

[Solucionado] INSERT en BBDD tras guardar el pedido en ps_orders


rmonclova

Recommended Posts

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

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

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

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

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 by rmonclova (see edit history)
Link to comment
Share on other sites

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 by rmonclova (see edit history)
Link to comment
Share on other sites

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

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

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

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

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

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

Guest
This topic is now closed to further replies.
×
×
  • Create New...