Диспетчеризация событий Magento / Наблюдение / Модификация отправленных объектов - PullRequest
3 голосов
/ 28 октября 2011

Я пытаюсь решить проблему, но безуспешно. Мне нужно отправить дополнительную информацию с запросом информации о заказе Magento API. К сожалению, Magento, похоже, не имеет каких-либо событий, связанных с этим, поэтому я переписал этот класс и отправил событие. Это все хорошо, так как я изменяю массив $result новой информацией. Однако, что не очень хорошо, так это то, что измененный массив никогда не отображается обратно в исходном диспетчерском коде.

Вот отправка:

class Company_Module_Model_Order_Api extends Mage_Sales_Model_Order_Api {

    public function info($orderIncrementId) {
        $result = parent::info($orderIncrementId);
        $order = $this->_initOrder($orderIncrementId);

        Mage::dispatchEvent("company_api_order_info_add", 
                    array('result' => &$result, 'order' => &$order));
    // - I've tried with and without the ampersand

        Mage::log($result['affiliate_text']); // Debugging

        return $result;
    }
}

Вот код наблюдателя:

class Company_Other_Model_Api
{
    public function hookToSetAffiliate ($observer) {
        $result = $observer->getResult();
        $order = $observer->getOrder();

        if ($order->getAffiliateCode()) {
            $affiliate = Mage::getModel('affiliates/info')
                    ->load($order->getAffiliateCode());
            if (is_object($affiliate))
                $result['affiliate_text'] = $affiliate->getCode();
            }

            Mage::log($result['affiliate_text']); // Shows up here

            return $observer;
        }
    }
}

У вас есть идеи, почему $result не входит должным образом? В хуке он отображается правильно, однако 'affiliate_text' не виден, когда происходит следующая строка метода диспетчеризации.

Спасибо

JMax

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

Я бы посоветовал вам пойти по тому же маршруту, что и Magento.

// Wrap array in an object
$result = new Varien_Object($result);

// Dispatch - No need for & as $result and $order are both objects and passed by ref
Mage::dispatchEvent("company_api_order_info_add", array('result'=>$result, 'order'=>$order));

// Unwrap array from object
$result = $result->getData();

Varien_Object по-прежнему будет разрешать доступ к массиву, поэтому ваш код слушателя не должен изменяться вообще.

0 голосов
/ 28 октября 2011

Просто для справки, я понял это.Вот что произошло: ссылка на массив разорвалась, когда я назначил ее переменной в hookToSetAffiliate.Итак, я изменил код так, чтобы он ссылался на массив напрямую, как он был вставлен (и не использовал переменную для упрощения доступа), и это исправило его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...