Как я могу сохранить данные в поле eav?

Я успешно установил атрибут EAV, выполнив $installer->addAttribute('order', 'field', etc). Я также успешно запускаю наблюдателя, когда заказ сохраняется в событии sales_order_save_before/sales_order_save_after. Теперь я пытаюсь ввести данные в свое поле на наблюдателе

$observer->getOrder()->setMyField('someuniquestring'); 

Я пытался сделать это до сохранения и после, и в этом случае я добавляю

$observer->getOrder()->getResource()->save($order);

После поиска по всей моей базе данных уникальная строка не существует ни в одной таблице. Кроме того, если я использую getMyField() и вывожу его на экран в наблюдателе, а die() показывает установленное мной значение.

Любая помощь в том, как сохранить это в БД?


person matthewdaniel    schedule 22.09.2011    source источник
comment
это странно, если getMyField() возвращает то, что вы ожидаете, это означает, что он сохранен в БД.   -  person OSdave    schedule 22.09.2011
comment
Вы уверены, что сохраняете правильный экземпляр заказа? Вы делаете setMyField() для экземпляра ордера наблюдателя, но ваш код сохранения сохраняет не этот экземпляр, а другой экземпляр ордера, полученный из переменной $order.   -  person Jürgen Thelen    schedule 22.09.2011
comment
@OSdave: getMyField() был эхом сразу после setMyField() и до завершения сохранения   -  person matthewdaniel    schedule 22.09.2011
comment
@JürgenThelen событие, вызванное функцией сохранения, передает $this-›_getEventData(), может ли это вызвать проблему?   -  person matthewdaniel    schedule 23.09.2011


Ответы (1)


Я нашел ответ на свой вопрос после долгой отладки.

В какой-то момент magento изменил способ добавления полей данных в модель заказа в базе данных. Раньше использовались поля EAV, но теперь magento просто изменяет саму плоскую таблицу. Итак, в моем сценарии установки я просто делаю

$installer->getConnection->addColumn($installer->getTable('sales_flat_order', 'site_license_id', 'int(1) ...');

Затем в моем наблюдателе перед сохранением я добавляю $observer->getEvent()->getOrder()->setMyField($myval);

Вот и все.

person matthewdaniel    schedule 22.09.2011
comment
Нет, на самом деле атрибуты eav добавляются индексатором в соответствующие плоские таблицы. - person Dmytro Zavalkin; 23.09.2011