単純な製品価格を上書きするMagentoの構成可能な製品価格


21

私が知っている限りでは、同じようにセットアップされた製品があり、それらはすべてユニバーサルCSVテンプレートでインポートされました。

  • 設定可能な価格は29.99です
  • 関連するシンプル製品半袖は29.99です
  • 関連するシンプル製品の長袖は39.99です

請求書は、29.99の構成可能な製品価格で39.99の価格を持つ長袖製品(ZTWS-SBLS-XL)に最近請求しました。設定可能な製品価格を単純な製品価格で上書きするにはどうすればよいですか?以下の両方の製品は、親の構成可能な製品と同じように、単純な製品として設定されています。

請求書:

Item             Sku             Qty    Subtotal
Item one         ZLOB-SBLS-XL    1      $39.99
Item Two         ZTWS-SBLS-XL    1      $29.99

編集:まだこれを解決するために取り組んでいます。Magentoが、構成可能な製品価格または関連する製品属性価格よりも単純な製品価格を好む原因は何ですか?


ヘルプを入手できますかmagento.stackexchange.com/q/291238/57334 @TylersSN
zus

回答:


18

構成可能な製品を作成する場合、単純な製品の価格は関係ありません。これらの価格は完全に無視されます。したがって、価格が$ 29.99の単純な製品Aと単純な製品B($ 39.99)を販売する場合は、構成可能な製品を作成し、価格を$ 29.99に設定して[ 関連製品 ]タブを開く必要があります。この構成可能な製品に関連付ける製品を追加します。それらを追加すると、オプションと価格差を含むスーパー製品属性構成という名前のブロックが表示されます。製品Aの価格を空のままにして、製品Bの価格フィールドに10(+ $ 10)を入力してください。

実際には、価格差の代わりに単純な製品価格を使用できるようにする拡張機能がありますが、設定するのはちょっと面倒です。それは無料の拡張機能なので、誰も私にそのリンクを貼り付けることについて文句を言わないことを望みます:

https://github.com/organicinternet/magento-configurable-simple


あなたは私の問題を理解するのを助けてくれました。製品の価格が29.99に設定されるように価格体系を更新しました。関連する製品から、長袖属性に10ドル、2x以上の属性に2ドルを追加します。興味深いのは、これは一部の製品では機能するが、他の構成可能な製品では機能しないことです。
TylersSN

動作しない製品の場合、magentoは、製品自体または関連する製品属性の価格に設定されているかどうかにかかわらず、構成可能な価格よりも単純な製品価格を好みます。
タイラーズSN 14年

5
拡張機能はくだらないバグです。
アリレザファラー

構成可能な製品に関するヘルプを入手できますかmagento.stackexchange.com/q/291238/57334 @Pronto
zus

16

そこで、以下のコードを、オーガニックインターネットの簡単に構成可能な製品のような拡張機能と組み合わせて使用​​します。

以下のコードは、カート/チェックアウトプロセスを対象としています。本質的に、製品がカートに追加された場合に価格計算を単純な製品に渡す構成可能な価格モデルの更新です。このソリューションは価格を表示しません製品ページ上(ただし、既にそれを行う多くの拡張機能があります)。

app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.phpを更新します(理想的にはapp / code / localで拡張機能またはローカルオーバーライドを使用します)

メソッドを更新:getFinalPriceに変更

public function getFinalPrice($qty=null, $product)
{
    //Start edit
    $selectedAttributes = array();
    if ($product->getCustomOption('attributes')) {
        $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
    }
    //End edit
    if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);

    if (is_null($qty) && !is_null($product->getCalculatedFinalPrice())) {
        return $product->getCalculatedFinalPrice();
    }

    $basePrice = $this->getBasePrice($product, $qty);
    $finalPrice = $basePrice;
    $product->setFinalPrice($finalPrice);
    Mage::dispatchEvent('catalog_product_get_final_price', array('product' => $product, 'qty' => $qty));
    $finalPrice = $product->getData('final_price');

    $finalPrice += $this->getTotalConfigurableItemsPrice($product, $finalPrice);
    $finalPrice += $this->_applyOptionsPrice($product, $qty, $basePrice) - $basePrice;
    $finalPrice = max(0, $finalPrice);

    $product->setFinalPrice($finalPrice);
    return $finalPrice;
}

次に、getFinalPriceのすぐ下にこの関数を追加します。

public function getSimpleProductPrice($qty=null, $product)
    {
        $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        return Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
    }

ユーザーが製品をカスタマイズした場合(IE、選択した構成可能なオプション)、関連する単純な製品を決定し、価格モデルに制御を渡します。そうでない場合、製品が「カスタマイズ」されていない場合(IE、 「商品ページで閲覧しています)通常どおり続行します


この答えは天才、ブラボーです!
pixiemedia

5

Magentoバージョン1.9.2.2の使用

少し優れたソリューションかもしれません。コアをハックするか、デフォルトのモデル価格クラス、つまりapp / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.phpをオーバーライドする代わりに、「オブザーバー」アプローチを使用してください。

あなたがしなければならないのは、新しく作成されたオブザーバー内でアランのコードを使用することだけです

Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);

次のものに置き換えます。

$fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
return $product->setFinalPrice($fp);

この Observer.phpをフォローしてください

class YourFolderinLOCAL_YourModulename_Model_Observer 
{

     public function simpleProductPrice(Varien_Event_Observer $observer) {
        $event   = $observer->getEvent();
        $product = $event->getProduct();
        $qty     = $event->getQty();
        //Mage::log($observer, null, 'confPricing.log');
        // process percentage discounts only for simple products


            $selectedAttributes = array();
            if ($product->getCustomOption('attributes')) {
                Mage::log('yes-----', null, 'confPricing.log');
                $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
            }

            if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);



    }


    public function getSimpleProductPrice($qty=null, $product)
    {

        $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        //Mage::log(Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty), null, 'confPricing.log');
        //return 
        $fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
        return $product->setFinalPrice($fp);
    }


}

Config.xml

<?xml version="1.0"?>
<config> 
 <modules>
        <YourFolderinLOCAL_YourModulename>
            <version>0.0.1</version>
        </YourFolderinLOCAL_YourModulename>
    </modules>
    <global>
        <models>
            <YourFolderinLOCALYourModulename><!-- Al lovwercase in my case -->
                <class>Your_Model</class><!-- not needed in my case -->
            </YourFolderinLOCALYourModulename>
        </models>

    </global>
    <frontend>
    <events>
            <catalog_product_get_final_price>
                <observers>
                    <YourFolderinLOCAL_YourModulename_model_observer>
                        <type>singleton</type>
                        <class> YourFolderinLOCAL_YourModulename_Model_Observer</class>
                        <method>simpleProductPrice</method>
                    </YourFolderinLOCAL_YourModulenameg_model_observer>
                </observers>
            </catalog_product_get_final_price>

        </events>
        </frontend>
</config>

それが問題を解決することを願っています.. :)


2

単純な製品の価格が異なるが、価格設定(固定またはパーセンテージ)なしで構成可能な製品に対してセットアップされている場合、構成可能な製品の価格が使用されます。どの単純な製品を購入しても、その価格は考慮されていないようです。

これを更新するには、管理セクションの親製品に移動し、タブの下Associated Productsで各子製品の価格を更新して、親製品の価格に追加価格を追加できます。


こんにちはデビッド、私はこれを試しました。私の現在の取り組みは、構成可能な製品の価格を0.00ドルに設定し、「関連製品」セクションから、半袖属性で29.99ドル、長袖シャツで39.99ドルの固定価格を設定しようとしています。何らかの理由で、固定価格と単純な製品自体で設定されている価格にもかかわらず、29.99ドルを請求する単一の構成可能な製品(長袖)がまだあります。ご回答ありがとうございます。
タイラーズSN

@ user1812580この製品は管理者で見ることができますか、単にフロントエンドで見ることができますか?
デビッドマナーズ

構成可能な製品に関連付けられた別個のシンプルな製品として見ることができます。
タイラーズSN

こんにちはDavid、@ Prontoへの応答で述べたように、価格体系を更新しました。うまくいけば、あなたが私を助けるのを助けるでしょうか?
TylersSN 14年

@DavidManners構成可能な製品のSuper Attributes Configセクションで価格を更新しようとしました。ただし、バリエーションをクリックすると、価格はTOP価格情報ボックス(SKU、製品名など)でのみ更新されます。低価格ボックスを更新する方法に関するヒントもありますか?
エルバサンドバル

2

私も同じ問題を抱えており、以下のコードを使用して修正しました。あなたが管理者から注文する場合(電話での注文の場合)、管理側でも動作します

このイベントを観察し、

sales_quote_item_set_product 

Observer.phpに以下のコードを追加します

public function loadQuote(Varien_Event_Observer $observer)
            {

                $event      = $observer->getEvent();
                $quote_item = $event->getQuoteItem();
                $storeId    = $quote_item->getStoreId();
                $item       = $observer->getQuoteItem();
                $product    = $observer->getProduct();
                $sku        = $product->getSku();
                $productDetails     =  Mage::getModel('catalog/product')
                            ->setStoreId($storeId)
                            ->loadByAttribute('sku',$sku);

                $price      = $productDetails->getPrice();
                $sprice     = $productDetails->getFinalPrice();

                $item->setOriginalCustomPrice($sprice);
                $item->setOriginalPrice($price);

            }

関連する製品価格を取得し、見積書に保存します。


+1のため$item->setOriginalCustomPrice($sprice);$item->setOriginalPrice($price);、その異なる価格で、カートには、同じ製品にその時点複数設定可能な項目を可能にします。
ニロクト

2

以下の手順に従って、スーパー属性の価格を変更してください

最初にオブザーバー「catalog_product_get_final_price」を使用します。オブザーバーを次のようにします。

モジュールconfig.xmlを開き、以下のコードを使用します。

<events>
    <catalog_product_get_final_price>
        <observers>
            <Setblue_Banner_Model_Observer>
                <type>singleton</type>
                <class>Setblue_Banner_Model_Observer</class>
                <method>getFinalPrice</method>
            </Setblue_Banner_Model_Observer>
        </observers>
    </catalog_product_get_final_price>
</events>

Observer.phpファイルをモデルと過去のコードで作成します

<?php
class Setblue_Banner_Model_Observer
{

 public function getFinalPrice(Varien_Event_Observer $observer) {

  $event   = $observer->getEvent();
        $product = $event->getProduct();
        $qty     = $event->getQty();

  $selectedAttributes = array();
  if ($product->getCustomOption('attributes')) {
   Mage::log('yes-----', null, 'confPricing.log');
   $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
  }

  if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);

    }

 public function getSimpleProductPrice($qty=null, $product)
    {

  $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        //Mage::log(Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty), null, 'confPricing.log');
        //return
        $fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
        return $product->setFinalPrice($fp);
 }

}

?>

app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtmlを開き、ファイル内の任意の場所に以下のコードを貼り付けます

<ul class="productIds" style="display:none;">
    <?php
        $configurableProduct = Mage::getModel('catalog/product')->load($_product->getId());
        $childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$configurableProduct);
        foreach($childProducts as $child) {
            $_productObj = Mage::getModel('catalog/product')->load($child->getId());
            ?>
            <li id='simple_<?php echo $child->getId(); ?>'><?php echo Mage::helper('core')->currency($_productObj->getFinalPrice()); ?></li>
        <?php   
        }
    ?>
</ul>

js / varien / configurable.jsを開き、reloadPrice関数を以下のように変更するか、この関数全体を置き換えることもできます

reloadPrice: function(){
    if (this.config.disablePriceReload) {
        return;
    }
    var price    = 0;
    var oldPrice = 0;
    for(var i=this.settings.length-1;i>=0;i--){
        var selected = this.settings[i].options[this.settings[i].selectedIndex];
        if(selected.config){
            price    += parseFloat(selected.config.price);
            oldPrice += parseFloat(selected.config.oldPrice);
        }
    }

    /* Edit Code By Chandresh Rana*/

     //optionsPrice.changePrice('config', {'price': price, 'oldPrice': oldPrice});
     optionsPrice.reload();

     var existingProducts = new Object();
     for(var i=this.settings.length-1;i>=0;i--)
     {
         var selected = this.settings[i].options[this.settings[i].selectedIndex];
         if(selected.config)
         {
            for(var iproducts=0;iproducts<selected.config.products.length;iproducts++)
            {
                var usedAsKey = selected.config.products[iproducts]+"";
                if(existingProducts[usedAsKey]==undefined)
                {
                    existingProducts[usedAsKey]=1;
                }
                else
                {
                    existingProducts[usedAsKey]=existingProducts[usedAsKey]+1;
                }
             }
         }
     }

     for (var keyValue in existingProducts)
     {
        for ( var keyValueInner in existingProducts)
         {
            if(Number(existingProducts[keyValueInner])<Number(existingProducts[keyValue]))
            {
                delete existingProducts[keyValueInner];
            }
         }
     }

     var sizeOfExistingProducts=0;
     var currentSimpleProductId = "";
     for ( var keyValue in existingProducts)
     {
        currentSimpleProductId = keyValue;
        sizeOfExistingProducts=sizeOfExistingProducts+1
     }

     if(sizeOfExistingProducts==1)
     {
        if($('product-price-'+this.config.productId)){
            $('product-price-'+this.config.productId).innerHTML = jQuery("#simple_"+currentSimpleProductId).html();
        }

     }
    // End Code By Chandresh Rana

    return price;

    if($('product-price-'+this.config.productId)){
        $('product-price-'+this.config.productId).innerHTML = price;
    }
    this.reloadOldPrice();
},

取得元コード:http : //chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


構成可能な製品に関するヘルプを入手できますかmagento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.