#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