Magento - Получить информацию о настраиваемом параметре из идентификатора параметра

У меня есть некоторые интригующие вопросы, связанные с пользовательскими опциями продукта: -

  • Есть ли разница между опциями и настраиваемыми параметрами? Это связано с тем, что я нашел два разных свойства для каждой информации о продукте, почти во всех связанных с продуктом модулях: -

    • options
    • custom_options

    Однако существует только один класс только для Варианта продукта, который, как правило, заботится о пользовательских параметрах. Пожалуйста, кто-нибудь уточнит этот вопрос.

  • Я пытаюсь получить пользовательские параметры заказанного элемента, включая пользовательский вариант цены и тип цены. Проблема заключается в том, что Magento сохраняет только значение параметра для соответствующего упорядоченного элемента, а не все его детали (например, таможня опционная цена и тип цены).
    Поэтому я создал объект этого класса Mage_Catalog_Model_Product_Option_Value, учитывая только drop_down Custom Option Type. Я предоставил свой код ниже, но он все еще напрасно и не дает желаемых результатов. Может кто-то исправить этот код и помочь мне?

Код для точки № 2: -

echo "<pre>";
// $collection contains the whole Order Collection
foreach ($collection as $order) {
    foreach ($order->getAllItems() as $item) {
        $customOptions = $item->getProductOptions();

        foreach ($customOptions['options'] as $_eachOption) {
            // Value ID is stored in this field "option_value"
            $objModel = Mage::getModel('catalog/product_option_value')->load($_eachOption['option_value']);

            // This should provide all the details of this particular Option Value as chosen by the Customer when ordering this Product, but unfortunately it doesn't
            print_r($objModel->getData());

            /**
             * This gives the output as, without any details on Price and Price Type:-
             * Array
             * {
             *     [option_type_id] => 13014
             *     [option_id] => 4921
             *     [sku] => XBPS22
             *     [sort_order] => 0
             * }
             */

            unset($objModel);
        }
    }
}
echo "</pre>";

После некоторой проверки я обнаружил, что цена, связанная с каждым значением параметра, хранится в таблице базы данных catalog_product_option_type_price, а цена, относящаяся к каждой опции, хранится в таблице базы данных catalog_product_option_price. Таким образом, должно быть каким-то образом, как Magento выбирает соответствующие цены пользовательских опционных цен. Пожалуйста, просветите меня и исправьте приведенный выше код?

Спасибо всем, заранее!

Ответ 1

Я знаю, что это старый вопрос, но ему не хватает ответа и яростно ищу ответ, имея ту же проблему. Я думал, что предоставил свой ответ здесь для других людей, которые могли бы найти это.

В этом коде я загружаю продукт по id, получаю коллекцию опций, которая в моих тестах содержит только настраиваемые параметры для продукта, а не атрибуты или другие параметры, перебирает параметры и загружает коллекцию значений для каждой опции, Этот демонстрационный код должен проверяться почти везде, пока у вас есть идентификатор продукта.

<?php

$productID = $this->getProductId(); //Replace with your method to get your product Id.

$product = Mage::getModel('catalog/product')->load($productID);
$options = Mage::getModel('catalog/product_option')->getProductOptionCollection($product);

foreach ($options as $option) {
    Mage::log('Name: ' . $option->getDefaultTitle());
    Mage::log('    Type: ' . $option->getType());
    Mage::log('    Class: ' . get_class($option));
    Mage::log('    Price/Type: ' . ($option->getPrice() ? $option->getPrice() : '0.00') . ' / ' . $option->getType());

    if ($option->getType() === 'drop_down') {
        $values = Mage::getSingleton('catalog/product_option_value')->getValuesCollection($option);
        Mage::log('    Values: (name/price/type)');

        foreach ($values as $value) {
            Mage::log('        ' . $value->getTitle() . ' / ' . $value->getPrice() . ' / ' . $value->getPriceType());;
        }
    }
}
?>

Пример вывода журнала:

2014-02-18T20:15:25+00:00 DEBUG (7): Name: Turtle Color
2014-02-18T20:15:25+00:00 DEBUG (7):     Type: drop_down
2014-02-18T20:15:25+00:00 DEBUG (7):     Class: Mage_Catalog_Model_Product_Option
2014-02-18T20:15:25+00:00 DEBUG (7):     Price/Type: 0.00 / drop_down
2014-02-18T20:15:25+00:00 DEBUG (7):     Values: (name/price/type)
2014-02-18T20:15:25+00:00 DEBUG (7):         Red / 0.0000 / fixed
2014-02-18T20:15:25+00:00 DEBUG (7):         White / 0.0000 / fixed
2014-02-18T20:15:25+00:00 DEBUG (7):         Blue / 0.0000 / fixed

Пример доступных данных для $option Mage:: log ($ option- > toArray());

note: price и price_type доступны только по значениям опций для параметров типа drop_down.

2014-02-18T20:19:44+00:00 DEBUG (7): Array
(
    [option_id] => 135
    [product_id] => 80
    [type] => field
    [is_require] => 0
    [sku] =>
    [max_characters] => 25
    [file_extension] =>
    [image_size_x] =>
    [image_size_y] =>
    [sort_order] => 90
    [description] =>
    [default_title] => Turtle Name
    [store_title] =>
    [title] => Turtle Name
    [default_price] => 0.0000
    [default_price_type] => fixed
    [store_price] =>
    [store_price_type] =>
    [price] => 0.0000
    [price_type] => fixed
)

Пример доступных данных для значений $Mage:: log ($ values- > toArray());

2014-02-18T20:25:21+00:00 DEBUG (7): Array
(
    [totalRecords] => 2
    [items] => Array
        (
            [0] => Array
                (
                    [option_type_id] => 1149
                    [option_id] => 229
                    [sku] =>
                    [sort_order] => 10
                    [default_price] => 0.0000
                    [default_price_type] => fixed
                    [store_price] => 0.0000
                    [store_price_type] => fixed
                    [price] => 0.0000
                    [price_type] => fixed
                    [default_title] => 31"
                    [store_title] => 31"
                    [title] => 31"
                )
            [1] => Array
                (
                    [option_type_id] => 1150
                    [option_id] => 229
                    [sku] =>
                    [sort_order] => 20
                    [default_price] => 0.0000
                    [default_price_type] => fixed
                    [store_price] => 0.0000
                    [store_price_type] => fixed
                    [price] => 0.0000
                    [price_type] => fixed
                    [default_title] => 31.5"
                    [store_title] => 31.5"
                    [title] => 31.5"
                )
        )
)

Ответ 2

Сначала загрузите продукты из коллекции, затем выполните следующие шаги:

$product = 100; // product id, you should get first

foreach($product->getOptions() as $options)
{
    $options->getType(); // get option type

    $optionValues = $options->getValues();

    foreach($optionValues as $optVal)
    {
       print_r($optVal->getData());
       // or $optVal->getData('option_id')
    }
}

* Изменено *

$prdSku = 125; // sample sku  
$product = Mage::getModel('catalog/product');  
$prdId = $product->getIdBySku($prdSku);  
$product->load($prdId);  

if ($product->getId()) {  
  if ($product->hasCustomOptions()) {  
    foreach ($product->getOptions() as $opt) {  
      $optionType = $opt->getType();  

      if ($optionType == 'drop_down') {  
        $values = $opt->getValues();  

        foreach ($values as $k => $v) {  
          Mage::log("Array Key = $k;");  
          Mage::log("Array Value: $v");  
        }  
      }  
    }  
 }  

Ответ 3

$session= Mage::getSingleton('checkout/session');
$getotal = Mage::helper('checkout')->getQuote()->getGrandTotal();
foreach($session->getQuote()->getAllItems() as $item)
{
$options = Mage::getModel('catalog/product')->load($item->getProduct()->getId())->getProductOptionsCollection();
    foreach ($options as $o) 
    { 
        $title = $o->getTitle();
        $values = $o->getValues();

        foreach($values as $v)
        {
        $mydata = $v->getPrice();                           
        }

    }
}

Вы можете использовать этот код, чтобы получить цену, установленную для пользовательских опций для продуктов в корзине покупок.

Ответ 4

Здесь был задан аналогичный вопрос:

выберите выбранную цену опциона для простого продукта в обозревателе

Я дал следующий ответ:


Если у вас есть идентификатор значения параметра, вы также можете сделать запрос напрямую, чтобы получить цену опциона. Я знаю, что это не совсем путь Magento, и вам, возможно, придется делать некоторые пользовательские вычисления (например, для цен на акции), но вы можете сделать что-то вроде этого:

$optionValueId = 1234; // replace with you option value ID

$resource = Mage::getSingleton('core/resource');
$connection = $resource->getConnection('read');

$optionvaluePrice = $connection->fetchRow(
    sprintf('SELECT * FROM %1$s WHERE option_type_id = %2$d', 
        $resource->getTableName('catalog/product_option_type_price'), 
        $optionValueId
    )
);

К сожалению, Magento, похоже, не имеет модели для загрузки отдельной цены отдельно.