Как получить артикулы выбранных комплектных продуктов из элемента заказа?
Я вижу только названия продуктов продуктов, выбранных в свойстве product_options элемента заказа. Есть ли какой-либо способ получить идентификаторы или артикулы этих продуктов?
3 answers
Вместо использования $order->getAllItems()
используйте саму коллекцию товаров для продажи:
$collection = Mage::getResourceModel('sales/order_item_collection')->addFieldToFilter('order_id',array('eq'=>$order_id));
Где $order_id
- это идентификатор сущности заказа sales_.
Чтобы использовать эту коллекцию, повторите ее - доступны все элементы, даже дочерние элементы пакетов и конфигураций - например, не только видимые элементы:
foreach($collection as $_item){
var_dump($_item->getSku());
}
На самом деле, есть способ получить артикулы опций из элемента заказа - и без необходимости загружать какие-либо продукты. Наблюдайте!
foreach($order->getAllItems() as $item) {
$options = $item->getProductOptions();
$optionIds = array_keys($options['info_buyRequest']['bundle_option']);
$types = Mage_Catalog_Model_Product_Type::getTypes();
$typemodel = Mage::getSingleton($types[Mage_Catalog_Model_Product_Type::TYPE_BUNDLE]['model']);
$typemodel->setConfig($types[Mage_Catalog_Model_Product_Type::TYPE_BUNDLE]);
$selections = $typemodel->getSelectionsCollection($optionIds, $item);
$selection_map = array();
foreach($selections->getData() as $selection) {
if(!isset($selection_map[$selection['option_id']])) {
$selection_map[$selection['option_id']] = array();
}
$selection_map[$selection['option_id']][$selection['selection_id']] = $selection;
}
$chosen_skus = array();
foreach($options['info_buyRequest']['bundle_option'] as $op => $sel) {
$chosen_skus[] = $selection_map[$op][$sel]['sku'];
}
echo "Item ".Mage::getResourceModel('catalog/product')->
getAttributeRawValue($item->getProductId(), 'sku', $item->getStoreId()).
" has chosen SKUs: ".implode(', ', $chosen_skus)."\n";
}
Товары хранятся в таблице sales_flat_order_item в виде отдельных строк (товаров), для товаров в поле parent_item_id задан идентификатор строки продукта пакета.