構成可能な製品の最低価格と最高価格を入手する


8

利用可能なオプションに基づいて、特定の構成可能な製品の可能な最低価格と最高価格を取得するための良い方法は何でしょうか?

たとえば、Tシャツには次のサイズと価格があります。

Small - $10
Medium - $20
Large - $30

次のような配列を取得したい:

array(10, 30)

これまでの私の最高のアイデアは、構成可能な製品タイプのインスタンスをロードしてを使用しgetUsedProducts、価格の配列を作成し、並べ替えてスライスすることです。

これは機能するはずですが、これは製品リストテンプレートで実行する必要があるため、半効率的である必要があります。

他の誰かが以前にこの問題に直面しましたか?

編集-構成可能な価格設定値が必要なので、機能しません。つまり、magentoが構成可能な製品価格の上に追加する価格です。

回答:


13

このアプローチを試してください。属性ドロップダウンが構成可能な製品の価格を変更するために使用する構成配列を使用します。これ$productIdが構成可能製品のIDであると想定しましょう。

$product = Mage::getModel('catalog/product')->load($productId);
$block = Mage::app()->getLayout()->createBlock('catalog/product_view_type_configurable');
$block->setProduct($product);
$config = json_decode($block->getJsonConfig(), true);
$basePrice = $config['basePrice'];
$min = null;
$max = null;
foreach ($config['attributes'] as $aId=>$aValues){
    foreach ($aValues['options'] as $key=>$value){
        if (is_null($min) || $min>$value['price']){
            $min = $value['price'];
        }
        if (is_null($max) || $max<$value['price']){
            $max = $value['price'];
        }
    }
}
//until here we have the min and max price differences. Now just add the base price.
$min += $basePrice;
$max += $basePrice;

1
価格が複数の属性から構築されている場合、これは機能しないようです。たとえば、サイズ「XL」の追加価格と素材「シルバー」の追加価格がある場合、これはXLシルバー製品の価格にはなりません。
Laizer、2014年

@Laizer iは2つの属性を持つ製品でテストしましたが、動作するように縫い合わせています。この方法では機能しない構成を提供できますか?
マリウス

1
各属性が基本価格に追加される場合、このメソッドは2つの追加の組み合わせを取得しません。私は2つの価格に影響を与える属性を持つ構成可能な製品でそれをテストしたところ、最大価格を取得していませんでした。また、magento.stackexchange.com / questions / 9665 /…で提案する方法をテストしましたが、どちらもうまく機能し、両方の属性の影響が追加されました。
Laizer、2014年

私は同意します。これは複数の設定では機能しないようです。オプション。
グレッグニコロフ

10

より単純なもの。

if($_product->isConfigurable()) // check if the product is configurable (u may check this in for loop of products)
                {
                    //get associative (child) products
                    $childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$_product);
                    $childPriceLowest = "";    
                    $childPriceHighest = "";       
                    foreach($childProducts as $child){
                        $_child = Mage::getModel('catalog/product')->load($child->getId());

                        if($childPriceLowest == '' || $childPriceLowest > $_child->getPrice() )
                        $childPriceLowest =  $_child->getPrice();

                        if($childPriceHighest == '' || $childPriceHighest < $_child->getPrice() )
                        $childPriceHighest =  $_child->getPrice();

                    }
                    $price_array = array($childPriceLowest,$childPriceHighest); // array containing required values
                }

私はこれはうまくいくと信じていますが、単純な製品の価格が、構成可能アイテムの選択として購入されたときのその製品の価格と一致する場合のみです。それが一致する必要があることは私には明らかではありません。
Laizer、2014年

私たちの構成可能製品の価格は、構成可能要素を構成する単純な製品とまったく同じであるため、これは私にとって完璧に機能しました。つまり、構成可能な製品を、単純な製品を保持する単なるコンテナーとして扱うということです。Magento 1.9では、商品リストページの設定可能な商品に最低価格が表示されないため、このコードが役に立ちました(商品の通常の価格の代わりに「____という価格」のラベルを表示したかったのです)。
Aquarelle 2014年

5

同様の質問に対する@Mariusによるこの回答は、作業を始めるのに適した根拠です。これを使用して、価格を変更する複数の属性を持つ構成可能な製品の可能性を考慮したこの問題の解決策を次に示します。

構成可能な製品IDを受け取り、最小価格から最大価格の文字列を返す関数として作成しました。必要なコンテキストにそれを組み込む方法はかなり明確でなければなりません。

function getPriceRange($productId) {

 $max = '';
 $min = '';

 $pricesByAttributeValues = array();

 $product = Mage::getModel('catalog/product')->load($productId); 
 $attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product);
 $basePrice = $product->getFinalPrice();

 foreach ($attributes as $attribute){
    $prices = $attribute->getPrices();
    foreach ($prices as $price){
        if ($price['is_percent']){ //if the price is specified in percents
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'] * $basePrice / 100;
        }
        else { //if the price is absolute value
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'];
        }
    }
 }


 $simple = $product->getTypeInstance()->getUsedProducts();

 foreach ($simple as $sProduct){
    $totalPrice = $basePrice;

    foreach ($attributes as $attribute){

        $value = $sProduct->getData($attribute->getProductAttribute()->getAttributeCode());
        if (isset($pricesByAttributeValues[$value])){
            $totalPrice += $pricesByAttributeValues[$value];
        }
    }
    if(!$max || $totalPrice > $max)
        $max = $totalPrice;
    if(!$min || $totalPrice < $min)
        $min = $totalPrice;
 }

 return "$min - $max";

}

4

これはトリックを実行しますが、最良の例ではありません

<?php $_configurable = $_product->getTypeInstance()->getUsedProductIds(); ?>
<?php $price_array = array(); $i=0; ?>
<?php foreach ($_configurable as $_config): ?>
    <?php $_simpleproduct = Mage::getModel('catalog/product')->load($_config); ?>
    <?php array_push($price_array, $_simpleproduct->getPrice()); ?>
<?php $i++; endforeach; ?>
<?php if(min($price_array) != max($price_array)): ?>
    <div class="price-box">
        <span id="product-price-<?php echo $_product->getId(); ?>" class="regular-price">
            <?php echo Mage::helper('core')->currency(min($price_array)); ?>
            <span class="price" style="padding: 0 5px; color: black;">-</span>
            <span class="final"><?php echo Mage::helper('core')->currency(max($price_array)); ?></span>
        </span>
    </div>
    <?php else: ?>
        <?php echo $this->getPriceHtml($_product, true); ?>
<?php endif; ?>

1
これは、単純な製品の価格が構成されたオプションの価格と同じであると仮定するという誤りを犯します-保証ではありません。
Laizer、2014年

1

EE 1.14を使用して、何らかの理由で上記で提案された方法を使用して「おかしい」番号を取得していました。$childPriceLowestそして$childPriceHighest、真の最小値と最大値のすべての時間を返していませんでした。時々、複数の設定オプションなどで、中間値を見ました。

私はこれを使ってしまいました:

//get associated (child) products
$childProducts = Mage::getModel('catalog/product_type_configurable')
    ->getUsedProducts(null,$_product);

//cycle through child products, dump prices in an array.... 
foreach($childProducts as $child){  
   $_child = Mage::getModel('catalog/product')->load($child->getId());
   $childPrices[] = $_child->getPrice();
}

// concentrate the array to unique values and sort ascending....
$childPrices = array_unique($childPrices, SORT_NUMERIC);
sort($childPrices);     // array containing required values

その後、これは範囲をエコーし​​ます:

<?php echo Mage::helper('core')->currency( $childPrices[0], true, false); ?>
<span class="config-price-divider"> - </span>
<?php echo Mage::helper('core')->currency( end($childPrices), true, false)?>

(例:「$ 10.00-$ 30.00」)


0

この簡単なコードを試して、必要に応じて最高/最低の価格を取得することもできます

$childPriceHighest = '';
         $product = Mage::getModel('catalog/product')->load($productId);
        $childProducts = Mage::getSingleton('catalog/product_type_configurable')->getUsedProducts( null, $product );

        if ($childProducts) {
            foreach ($childProducts as $child) {
                $_child = Mage::getSingleton('catalog/product')->load($child->getId());
                if ($childPriceHighest == '' || $childPriceHighest < $_child->getPrice()) {
                    $childPriceHighest = $_child->getPrice();
                }
            }
        } else {
            $childPriceHighest = $product->getPrice();
        }

        return $childPriceHighest;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.