Magento Giá sản phẩm có thể cấu hình ghi đè Giá sản phẩm đơn giản


21

Tôi có các sản phẩm được thiết lập giống hệt nhau (theo như tôi có thể nói) và tất cả chúng đều được nhập với một mẫu CSV phổ quát.

  • Giá cấu hình là 29,99
  • Liên kết sản phẩm đơn giản ngắn tay là 29,99
  • Liên kết sản phẩm đơn giản dài tay là 39,99

Một hóa đơn gần đây đã lập hóa đơn cho một sản phẩm dài tay ( ZTWS-SBLS-XL ) có giá 39,99 với giá sản phẩm có thể định cấu hình là 29,99. Làm cách nào tôi có thể buộc giá sản phẩm đơn giản ghi đè giá sản phẩm có thể định cấu hình? Cả hai sản phẩm dưới đây đều được thiết lập giống hệt với sản phẩm có thể định cấu hình chính và các sản phẩm đơn giản.

Hóa đơn:

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

EDIT: Vẫn đang làm việc để giải quyết điều này. Điều gì sẽ khiến Magento thích giá sản phẩm đơn giản hơn giá sản phẩm có thể định cấu hình hoặc giá thuộc tính sản phẩm được liên kết?


Tôi có thể nhận trợ giúp magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Câu trả lời:


18

Khi bạn tạo một sản phẩm có thể định cấu hình, giá của các sản phẩm đơn giản không quan trọng - giá này bị bỏ qua hoàn toàn. Vì vậy, nếu bạn muốn bán một sản phẩm đơn giản A có giá 29,99 đô la và một sản phẩm đơn giản B (39,99 đô la) thì bạn phải tạo một sản phẩm có thể định cấu hình, đặt giá của nó thành 29,99 đô la và mở tab Sản phẩm liên kết . Thêm sản phẩm bạn muốn liên kết với sản phẩm cấu hình này. Sau khi thêm chúng, một khối có tên Cấu hình thuộc tính siêu sản phẩm xuất hiện có chứa các tùy chọn và chênh lệch giá. Để sản phẩm A giá trống và đặt 10 (+ $ 10) vào trường giá sản phẩm B và voila: sản phẩm đơn giản khác nhau có giá khác nhau.

Thực sự có một phần mở rộng cho phép bạn sử dụng giá sản phẩm đơn giản thay vì chênh lệch giá, nhưng thật khó để thiết lập. Vì nó là phần mở rộng miễn phí, tôi hy vọng không ai phàn nàn về việc tôi dán liên kết của nó ở đây:

https://github.com/organici Internet/magento-configurable-simple


Bạn đã giúp tôi hiểu vấn đề của tôi. Tôi đã cập nhật sơ đồ giá của mình để các sản phẩm được đặt ở mức giá 29,99. Từ các sản phẩm được liên kết, chúng tôi giải quyết các thuộc tính dài hạn $ 10 đến các thuộc tính dài tay và $ 2 cho các thuộc tính> = 2x. Điều thú vị là điều này hoạt động đối với một số sản phẩm trong khi nó không hoạt động trên các sản phẩm có cấu hình khác.
TylersSN

Đối với các sản phẩm không hoạt động, magento thích giá sản phẩm đơn giản hơn giá có thể định cấu hình cho dù được đặt trên chính sản phẩm hoặc trong giá thuộc tính của sản phẩm được liên kết.
TylersSN

5
Phần mở rộng là tào lao và lỗi.
Alireza Fallah

Tôi có thể nhận trợ giúp về các sản phẩm có thể định cấu hình magento.stackexchange.com/q/291238/57334 @Pronto
zus

16

Vì vậy, tôi sử dụng mã dưới đây kết hợp với một phần mở rộng như các sản phẩm cấu hình đơn giản trên internet hữu cơ.

Mã dưới đây có nghĩa là cho quá trình thanh toán / giỏ hàng, về cơ bản, đó là bản cập nhật cho mô hình giá có thể định cấu hình để chuyển tính toán giá cho một sản phẩm đơn giản trong trường hợp sản phẩm đã được thêm vào giỏ hàng --- giải pháp này KHÔNG hiển thị giá trên chính trang sản phẩm (tuy nhiên đã có nhiều tiện ích mở rộng đã làm điều đó).

Cập nhật ứng dụng / mã / lõi / Pháp sư / Danh mục / Mô hình / Sản phẩm / Loại / Cấu hình / Giá.php (lý tưởng nhất là bạn sử dụng tiện ích mở rộng hoặc ghi đè cục bộ trong ứng dụng / mã / cục bộ)

Cập nhật phương thức: getFinalprice, thay đổi thành

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

Sau đó thêm chức năng này ngay bên dưới 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);
    }

Bạn có thể thấy, trong trường hợp người dùng đã "tùy chỉnh" sản phẩm (IE, các tùy chọn có thể định cấu hình được chọn), chúng tôi xác định sản phẩm đơn giản được liên kết và chuyển điều khiển sang mô hình định giá của sản phẩm, nếu không thì sản phẩm không được "tùy chỉnh" (IE, chúng tôi đang duyệt trên trang sản phẩm) chúng tôi tiến hành như bình thường


Câu trả lời này là thiên tài, bravo!
pixiemedia

5

Sử dụng Magento Phiên bản 1.9.2.2

Có thể là giải pháp tốt hơn một chút, sử dụng phương pháp 'Người quan sát' thay vì hack lõi hoặc thậm chí ghi đè lớp Giá mẫu mặc định, ví dụ như ứng dụng / mã / lõi / Mage / Danh mục / Mô hình / Sản phẩm / Loại / Cấu hình / Giá.php

Tất cả những gì bạn phải làm là sử dụng mã của Alan trong Trình quan sát mới tạo của bạn, sự khác biệt duy nhất là thay vì trả về

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

Thay thế nó bằng cách sau:

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

Thực hiện theo Observer.php này

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


}

Cấu hình

<?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>

Hy vọng nó giải quyết được vấn đề .. :)


2

Nếu các sản phẩm đơn giản có giá khác nhau nhưng được thiết lập so với sản phẩm có thể định cấu hình mà không có cài đặt giá, cố định hoặc tỷ lệ phần trăm, thì giá của sản phẩm có thể định cấu hình sẽ được lấy. Bất kể sản phẩm đơn giản nào được mua, giá của chúng dường như không được tính đến.

Để cập nhật điều này, chỉ cần đi vào sản phẩm gốc trong phần quản trị viên, sau đó trong tab Associated Productsbạn có thể cập nhật giá của từng sản phẩm con để thêm giá bổ sung vào giá sản phẩm của cha mẹ.


Xin chào David, tôi đã thử điều này. Nỗ lực hiện tại của tôi bao gồm đặt giá sản phẩm có thể định cấu hình thành 0,00 đô la và từ phần Sản phẩm liên kết, tôi đang cố gắng đặt giá cố định là 29,99 đô la cho các thuộc tính tay áo ngắn và 39,99 đô la cho áo sơ mi dài tay. Vì bất kỳ lý do gì, vẫn có một sản phẩm có thể định cấu hình duy nhất (dài tay) muốn tính phí 29,99 đô la mặc dù giá cố định VÀ giá được đặt trong chính sản phẩm đơn giản. Cảm ơn bạn đã phản hồi của bạn.
TylersSN

@ user1812580 bạn có thể thấy sản phẩm này trong quản trị viên hay đơn giản là ở giao diện người dùng?
Phong tục David

Tôi có thể xem nó như một sản phẩm đơn giản riêng biệt gắn liền với sản phẩm có thể cấu hình.
TylersSN

Xin chào David, tôi đã cập nhật sơ đồ giá như đã nêu trong phản hồi của tôi với @Pronto. Hy vọng rằng sẽ giúp bạn giúp tôi?
TylersSN

@DavidManners Tôi đã thử cập nhật giá của mình thông qua phần Cấu hình siêu thuộc tính trên sản phẩm có thể định cấu hình. Tuy nhiên, giá chỉ cập nhật trên hộp thông tin giá TOP (Trong đó sku, tên sản phẩm, v.v.) khi bạn nhấp vào biến thể. Bất kỳ lời khuyên về làm thế nào để có được hộp giá thấp hơn để cập nhật quá?
Elva Sandoval

2

Tôi cũng gặp vấn đề tương tự và tôi đã khắc phục bằng cách sử dụng mã bên dưới. Nó cũng sẽ hoạt động ở phía quản trị nếu bạn đặt hàng từ quản trị viên (đối với đặt hàng qua điện thoại)

Quan sát sự kiện này,

sales_quote_item_set_product 

và thêm mã dưới đây vào Observer.php của bạn

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

            }

Nó sẽ nhận được giá sản phẩm liên quan và lưu trong báo giá.


+1 cho $item->setOriginalCustomPrice($sprice);$item->setOriginalPrice($price);, cho phép nhiều mặt hàng có thể định cấu hình trỏ đến cùng một sản phẩm, trong giỏ hàng, với các mức giá khác nhau.
Niloct

2

Vui lòng làm theo các bước dưới đây để thay đổi giá siêu thuộc tính

Người quan sát sử dụng đầu tiên "catalog_product_get_final_price". Làm cho những người quan sát như thế này:

Mở mô-đun cấu hình của bạn và sử dụng mã dưới đây:

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

Bây giờ tạo tệp Observer.php theo mô hình và qua mã bên dưới

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

}

?>

Bây giờ hãy mở ứng dụng / thiết kế / frontend / default / yourtheme / template / catalog / sản phẩm / view / type / Options / configureable.phtml và dán mã bên dưới bất cứ nơi nào trong tệp

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

Bây giờ hãy mở js / varien / configureable.js và thay đổi hàm reloadprice như bên dưới hoặc bạn có thể thay thế toàn bộ chức năng này.

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();
},

Mã được lấy từ: http://framreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


Tôi có thể nhận trợ giúp về các sản phẩm có thể định cấu hình magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.