管理者が SQL Server 上の DB に請求書を作成するたびに、イベント「sales_order_invoice_save_after」のオブザーバーを実行して、請求書と注文データをエクスポートしました。接続は成功です。しかし、私が何をしようとしても、イベントは常に 2 回発生します。DBにデータを2回保存しました。私はすべてを試しました:
1.- レジストリを使用してオブザーバにフラグを作成しましたが、機能しません。
public function exportInvoice(Varien_Event_Observer $observer){
try{
if(Mage::registry('sql_salvado')){
return $this;
}
//My code
Mage::register('sql_salvado',true,true);
}catch(Mage_Core_Exception $e){
Mage::log("No fue posible exportar pedidos a SQL Server " . $e->getMessage());
}
return $this;
2.- SQL Server DB を検証して請求書が既に登録されているかどうかを確認するメソッドもクラスに作成しました。登録されていない場合は、登録を続行するか停止しますが、機能しません。Magento は単純にイベントを 2 回発生させます。
if($this->_verifyInsertion($order['invoice']) == true){
Mage::log('Invoice ya existe no se va a repetir', null, 'escritura_sql.log');
return $this;
}else{
これはメソッドの例です:
protected function _verifyInsertion($invoice){
$_servidor = $this->_mssqlhost.':'.$this->_mssqlpuerto.$this->_mssqlinstancia;
$link = mssql_connect( $_servidor,$this->_mssqlusr,$this->_mssqlpsswd );
if (!$link || !mssql_select_db($this->_mssqlbd, $link)) {
die('No me pude conectar o seleccionar la BD!');
}
$query = mssql_query("SELECT id_order, invoice FROM [order] WHERE invoice LIKE '$invoice'");
$fila = mssql_fetch_object($query);
if($fila->invoice == $invoice){
Mage::log("$invoice ya existe no debes repetirte", null, 'escritura_sql.log');
return true;
}else{
Mage::log("$invoice no existe, escribelo...", null, 'escritura_sql.log');
return false;
}
3.- 「sales_order_invoice_save_before」と「sales_order_invoice_register」も試しましたが、成功しませんでした。何も機能していません。Magento はまだイベントを 2 回発生させています。
イベントが既に発生しているかどうかを確認し、2 回目に停止する方法があるかどうかを知りたいです。誰かが私を正しい方向に向けることができますか?.
クリストファー、まず第一に、あなたの親切な助けに感謝します.
ここにconfig.xmlがあります
<?xml version="1.0"?>
<config>
<modules>
<Cmm_Qad>
<version>0.1.0</version>
</Cmm_Qad>
</modules>
<global>
<models>
<qad>
<class>Cmm_Qad_Model</class>
<resourceModel>qad_mysql4</resourceModel>
</qad>
<qad_mysql4>
<class>Cmm_Qad_Model_Mysql4</class>
</qad_mysql4>
</models>
<events>
<sales_order_invoice_save_after>
<observers>
<cmm_qad_pedidos_exporta>
<type>singleton</type>
<class>Cmm_Qad_Model_Pedidos_Exporta</class>
<method>exportInvoice</method>
</cmm_qad_pedidos_exporta>
</observers>
</sales_order_invoice_save_after>
</events>
<blocks>
<qad>
<class>Cmm_Qad_Block</class>
</qad>
</blocks>
<helpers>
<qad>
<class>Cmm_Qad_Helper</class>
</qad>
</helpers>
</global>
<crontab>
<jobs>
<cmm_qad_stock>
<run>
<schedule><cron_expr>*/5 * * * *</cron_expr></schedule>
<model>cmm/qad::sincronizaInventario</model>
</run>
</cmm_qad_stock>
<cmm_qad_precios>
<run>
<schedule><cron_expr>*/5 * * * *</cron_expr></schedule>
<model>cmm/qad::sincronizaPrecios</model>
</run>
</cmm_qad_precios>
</jobs>
</crontab>
<admin>
<routers>
<qad>
<use>admin</use>
<args>
<module>Cmm_Qad</module>
<frontName>qad</frontName>
</args>
</qad>
</routers>
</admin>
<adminhtml>
<translate>
<modules>
<mage_adminhtml>
<files>
<qad>Cmm_Qad.csv</qad>
</files>
</mage_adminhtml>
</modules>
</translate>
<menu>
<catalog>
<children>
<qad_adminform translate="title" module="qad">
<title>Sincronizar con QAD</title>
<action>qad/adminhtml_qad</action>
</qad_adminform>
</children>
</catalog>
</menu>
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<qad_adminform>
<title>QAD ERP</title>
</qad_adminform>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
<!-- Segunda inserción por configuracion-->
<acl>
<resources>
<all>
<title>Allow Everything</title>
</all>
<admin>
<children>
<system>
<children>
<config>
<children>
<qad>
<title>QAD - All</title>
</qad>
</children>
</config>
</children>
</system>
</children>
</admin>
</resources>
</acl>
<!-- /Segunda inserción por configuración -->
<layout>
<updates>
<qad>
<file>qad.xml</file>
</qad>
</updates>
</layout>
</adminhtml>
そして、挿入の上のコードは次のとおりです。
require_once(Mage::getBaseDir('lib'). '/cmm/mssql.php');
/**
* Clase de escritura de Datos a SQL Server para CMM
*/
class Cmm_Qad_Model_Pedidos_Exporta{
private static $_conexion;
private static $_dateCreated;
private static $_dateUpdated;
private static $_mssqlhost;
private static $_mssqlpuerto;
private static $_mssqlinstancia;
private static $_mssqlusr;
private static $_mssqlpsswd;
private static $_mssqlbd;
//Variables para valores identitys
private static $_id_client;
private static $_id_address;
private static $_id_order;
private static $_id_detail;
/*
* We open the connection to SQL Server in the constructor
*
*/
public function __construct(){
ini_set("display_errors",1);
$this->_mssqlhost = Mage::getStoreConfig('qad/qad_group/mssql_host', Mage::app()->getStore());
$this->_mssqlpuerto = Mage::getStoreConfig('qad/qad_group/mssql_puerto', Mage::app()->getStore());
$this->_mssqlinstancia = Mage::getStoreConfig('qad/qad_group/mssql_instancia', Mage::app()->getStore());
$this->_mssqlusr = Mage::getStoreConfig('qad/qad_group/mssql_usr', Mage::app()->getStore());
$this->_mssqlpsswd = Mage::getStoreConfig('qad/qad_group/mssql_pass', Mage::app()->getStore());
$this->_mssqlbd = Mage::getStoreConfig('qad/qad_group/mssql_bd', Mage::app()->getStore());
$this->_dateCreated = Varien_Date::now();
$this->_dateUpdated = Varien_Date::now();
/*
* Open the connection with SQL Server
* */
$_servidor = $this->_mssqlhost.':'.$this->_mssqlpuerto.$this->_mssqlinstancia;
$this->_conexion = new mssqlClass();
$this->_conexion->connect($_servidor,$this->_mssqlusr,$this->_mssqlpsswd);
$this->_conexion->select($this->_mssqlbd);
}
/**
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
* protected $_eventPrefix = 'sales_order';
* protected $_eventObject = 'order';
* event: sales_order_save_after
*/
public function exportInvoice(Varien_Event_Observer $observer){
if(Mage::registry('sql_salvado') == 1){
Mage::unregister('sql_salvado');
return NULL;
}
$invoice = $observer->getInvoice();
$pedido = $invoice->getOrder();
$client = array();
$client_del_address = array();
$order = array();
$order_detail = array();
/*
* Recopilamos los datos
*/
//Client
$client['name'] = $pedido->getCustomerFirstname()." ".$pedido->getCustomerLastname();
$client['type'] = 1;
$client['rfc'] = "UWXU8609121O6";
$client['curp'] = "CMM";
$client['email'] = $pedido->getCustomerEmail();
$client['phone'] = $pedido->getCustomerTelephone();
$client['phone2'] = $pedido->getCustomerTelephone();
$client['clave_qad'] = "CLAVEQ";
$client['address'] = $pedido->getBillingAddress()->getStreet(); //Es otro array
$client['zipcode'] = $pedido->getBillingAddress()->getPostcode();
$client['colony'] = "Colonia";
$client['country'] = $pedido->getBillingAddress()->getCountry();
$client['id_state'] = 1;
$client['id_country'] = 2;
//Client_del_address
$client_del_address['address'] = $pedido->getShippingAddress()->getStreet(); //Es un array()
$client_del_address['zipcode'] = $pedido->getShippingAddress()->getPostcode();
$client_del_address['colony'] = "Colonia";
$client_del_address['country'] = $pedido->getShippingAddress()->getCountry();
$client_del_address['is_state'] = 1;
$client_del_address['id_country'] = 2;
//Order
$order['invoice'] = (int) $invoice->getIncrementId();
$order['status'] = 1;
$order['subtotal_notax'] = $invoice->getSubtotal();
$order['subtotal_tax'] = $invoice->getSubtotal() + $invoice->getTaxAmount();
$order['total_tax'] = $invoice->getTaxAmount();
$order['total'] = $invoice->getGrandTotal();
//Se abre la validación del semáforo
if($this->_verifyInsertion($order['invoice']) == true){
Mage::log('Invoice ya existe no se va a repetir', null, 'escritura_sql.log');
return NULL;
}else{
Mage::log('Invoice es nuevo', null, 'escritura_sql.log');
//Validamos que el cliente exista o no exista.
if($this->_existeCliente($client['email']) == true){
Mage::log('El cliente existe', null, 'escritura_sql.log');
if($this->_insertaDirEnvio($client_del_address, $client) == true){
//The rest of the code...
ログに表示されるのは、プロセスが 1 回しか実行されていないことです。実際、検証は機能しますが、レジストリは常に 2 回書き込まれます。これは、DB に挿入を行うメソッドの 1 つの例です。
/*
* Inserta clientes
*/
protected function _insertaCliente(array $client){
$sql_client="INSERT INTO [client] (name, type, rfc, curp, email, phone1, phone2, clave_qad, address, zipcode, colony, county, id_state, id_country, date_created, date_updated) VALUES ('".$client['name']."', '".$client['type']."', '".$client['rfc']."', '".$client['curp']."', '".$client['email']."', '".$client['phone1']."', '".$client['phone2']."', '".$client['clave_qad']."', '".$client['address'][0]."', '".$client['zipcode']."', '".$client['colony']."', '".$client['country']."', '".$client['id_state']."', '".$client['id_country']."', '".$this->_dateCreated."', '".$this->_dateUpdated."') SELECT LAST_INSERT_ID=@@IDENTITY";
if($this->_conexion->query($sql_client)){
$_identity = mssql_fetch_assoc($this->_conexion->query($sql_client));
$this->_id_client = $_identity['LAST_INSERT_ID'];
return true;
}else{
echo $this->_conexion->getLastErrorMessage()." Inserta Cliente";
return false;
}
}
すべての挿入で、別の選択「SELECT LAST_INSERT_ID=@@IDENTITY」を作成しています。これは、SQL サーバーには ID を自動インクリメントする ID フィールドがあるためです。次に、その ID を (コンストラクターで作成した) 他の変数に保存し、後で請求書や order_details などの挿入に再利用します。
あらゆる種類のヘルプを事前に感謝します!!