간단한 제품 가격을 대체하는 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로 설정 한 후 연관된 제품 탭을 열어야 합니다. 이 구성 가능한 제품과 연관시킬 제품을 추가하십시오. 이들을 추가하면 옵션 및 가격 차이가 포함 된 Super product attributes configuration 이라는 슈퍼 블록이 나타납니다. 제품 A 가격을 비워두고 제품 B 가격 필드와 짜잔에 10 (+ $ 10)을 넣으십시오. 다른 간단한 제품은 가격이 다릅니다.

실제로 가격 차이 대신 간단한 제품 가격을 사용할 수있는 확장 기능이 있지만 설정하기가 까다 롭습니다. 무료 확장 프로그램이므로 아무도 여기에 링크를 붙여 넣는 것에 대해 불평하지 않기를 바랍니다.

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


당신은 내가 내 문제를 이해하도록 도와주었습니다. 제품이 29.99 가격으로 설정되도록 가격 체계를 업데이트했습니다. 관련 제품에서 $ 10, 긴 소매 속성 및 $ 2> 속성의 경우 $ 2를 사용합니다. 흥미로운 것은 이것이 일부 제품에 대해서는 작동하지만 다른 구성 가능한 제품에는 작동하지 않는다는 것입니다.
TylersSN

작동하지 않는 제품의 경우, magento는 제품 자체에 설정되어 있거나 관련 제품 속성 가격에 설정되어 있든 구성 가능한 가격보다 단순한 제품 가격을 선호합니다.
TylersSN

5
확장은 엉망입니다.
Alireza Fallah 2016 년

구성 가능한 제품과 관련하여 도움을받을 수 있습니까? 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

마 젠토 버전 1.9.2.2 사용

약간 더 나은 해결책이 될 수 있습니다. 핵심을 해킹하거나 기본 모델 가격 클래스, 즉 app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php를 재정의하는 대신 'Observer'접근법을 사용하십시오.

새로 만든 Observer 내에서 Alan의 코드를 사용하기 만하면됩니다.

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를 청구하려는 단일 구성 가능 제품 (긴 소매)이 여전히 있습니다. 당신의 응답을 주셔서 감사합니다.
TylersSN

@ user1812580이 제품을 관리자 또는 프론트 엔드에서 볼 수 있습니까?
David Manners

구성 가능한 제품과 관련된 별도의 간단한 제품으로 볼 수 있습니다.
TylersSN

안녕하세요 David, @Pronto에 대한 답변 에 명시된대로 가격 체계를 업데이트했습니다 . 잘하면 그것이 나를 도울 수 있습니까?
TylersSN

@DavidManners 구성 가능한 제품의 Super Attributes Config 섹션을 통해 가격을 업데이트하려고했습니다. 그러나 변형을 클릭하면 TOP 가격 정보 상자 (sku, 제품 이름 등)에서만 가격이 업데이트됩니다. 저가 박스를 업데이트하는 방법에 대한 팁이 있습니까?
Elva Sandoval

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);

            }

관련 제품 가격이 제공되며 견적이 저장됩니다.


+ $item->setOriginalCustomPrice($sprice);및에 +1을 지정 $item->setOriginalPrice($price);하면 장바구니에서 같은 가격으로 다른 제품을 가리키는 여러 구성 가능한 항목을 허용합니다.
Niloct

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.