Отправка / наблюдение / изменение отправленных объектов событий Magento

#php #magento

#php #magento

Вопрос:

Я пытаюсь решить проблему, но не добился никакого успеха. Мне нужно отправить некоторую дополнительную информацию с запросом информации о заказе API Magento. К сожалению, в 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' => amp;$result, 'order' => amp;$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

Комментарии:

1. Кстати, вызов «is_object ($ affiliate))» не требуется. Mage::getModel всегда должен возвращать экземпляр вашей модели, если ваша конфигурация не повреждена. Если вы хотите проверить, что это действительная запись, возможно, «if($affiliate-> getId())» — это то, что вам нужно.

Ответ №1:

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

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

// Dispatch - No need for amp; 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 по-прежнему будет разрешать доступ к массиву, поэтому ваш код прослушивателя вообще не должен меняться.

Ответ №2:

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

JMax