Domanda

Sto sviluppando un modulo personalizzato in cui verrà creato un file XML dopo il completamento ordine per ogni ordine.

Ho chiamato una funzione exportOrder su verificano di un evento "sales_order_place_after". Di seguito è riportato il codice della mia funzione

public function exportOrder($order){
    $dirPath = Mage::getBaseDir('var').DS.'export';

    //if the export directory does not exist, create it
    if (!is_dir($dirPath)) {
         mkdir($dirPath, 0777, true);
    }

    $data = $order->getData();

    $xml = new SimpleXMLElement('<root/>');
    array_walk_recursive($data, array ($xml, 'addChild'));

    file_put_contents(
        $dirPath.DS.$order->getIncrementId().'.xml',
        $xml->asXML()
    );

Ora qui sulla linea n ° 12 e cioè: $data->getData(); Sto ottenendo un errore

Errore irreversibile: chiamata a una funzione membro getData () su un non-oggetto in /home/user_www/aliasgar/magentotesting/app/code/local/Meteorify/Observerexample/Model/Export.php sulla linea 12

Il mio config.xml è la seguente

<global>
<helpers>
    <orderexport>
        <class>Meteorify_Observerexample_Helper</class>
    </orderexport>
</helpers>
<models>
    <meteorify_observerexample>
         <class>Meteorify_Observerexample_Model</class>
    </meteorify_observerexample>
</models>
<events>
  <checkout_onepage_controller_success_action>
    <observers>
      <sales_order_place_after>
        <type>singleton</type>
        <class>Meteorify_Observerexample_Model_Observer</class>
        <method>exportOrder</method>
      </sales_order_place_after>
    </observers>
  </checkout_onepage_controller_success_action>     
</events>

Questo è come il mio aspetto di file Observer.php

class Meteorify_Observerexample_Model_Observer extends Varien_Object{

public function exportOrder($observer) {
    $order = $observer->getEvent()->getOrder();
    Mage::log($order);
    Mage::getModel('meteorify_observerexample/export')->exportOrder($order);
    return true;
}

}

Io non sono in grado di capire l'errore. Si prega di aiutarmi in questo

È stato utile?

Soluzione

Si utilizza l'evento in modo non corretto.

Nel caso in checkout_onepage_controller_success_action

l'ordine non viene inviato come oggetto, ma come l'ordine id. (Come order_ids)

Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));

(ref Mage_Checkout_OnepageController::successAction)

Così, nel vostro osservatore è necessario per ottenere l'id, come ad esempio:

$orderIds = $observer->getEvent()->getOrderIds(); // returns an array 
$orderId = array_shift($orderIds);

e istanziare l'oggetto ordine utilizzando

$order = mage::getModel('sales/order')->load($orderId);

(quanto sopra scritto fuori dalla parte superiore della mia testa, ma lo scherzo di esso dovrebbe essere corretto)

Altri suggerimenti

Nel vostro osservatore non si ottiene direttamente il $order, è necessario ottenere dal parametro di osservatore in questo modo:

public function exportOrder($observer){
    $order = $observer->getEvent()->getOrder();
    $data = $order->getData();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top