magento ได้รับผลิตภัณฑ์ที่กำหนดราคาต่ำสุดของผลิตภัณฑ์ที่เกี่ยวข้อง?


11

ในหน้าการดูโดยคุณภาพเยี่ยมเริ่มต้นแสดงราคาต่ำสุดของผลิตภัณฑ์ที่เกี่ยวข้อง

ฉันต้องการแสดงราคาสูงสุดของผลิตภัณฑ์ที่เกี่ยวข้อง คนใดคนหนึ่งมีความคิดที่ตรรกะอยู่ที่ไหนวิธีการปรับแต่งพฤติกรรมนี้

อัปเดต:

วีโอไอพี \ ConfigurableProduct \ ราคา \ ราคา \ ConfigurablePriceResolver

/**
     * @param \Magento\Framework\Pricing\SaleableInterface|\Magento\Catalog\Model\Product $product
     * @return float
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function resolvePrice(\Magento\Framework\Pricing\SaleableInterface $product)
    {
        $price = null;
        foreach ($this->configurable->getUsedProducts($product) as $subProduct) {
            $productPrice = $this->priceResolver->resolvePrice($subProduct);
            $price = $price ? min($price, $productPrice) : $productPrice;
        }
        if (!$price) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('Configurable product "%1" do not have sub-products', $product->getName())
            );
        }
        return (float)$price;
    }

ฉันพยายามแทนที่ไฟล์หลักนี้ แต่มันไม่ทำงาน

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <preference for="Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver" type="Kensium\Catalog\Pricing\Price\ConfigurablePriceResolver" />

<?php
namespace Kensium\Catalog\Pricing\Price;
class ConfigurablePriceResolver extends \Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver
{
    /**
     * @param \Magento\Framework\Pricing\SaleableInterface|\Magento\Catalog\Model\Product $product
     * @return float
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function resolvePrice(\Magento\Framework\Pricing\SaleableInterface $product)
    {
        $price = null;       
        $assPrice=array();
        foreach ($this->configurable->getUsedProducts($product) as $subProduct) {
            $productPrice = $this->priceResolver->resolvePrice($subProduct);
            $assPrice[]=$productPrice;
            $price = $price ? min($price, $productPrice) : $productPrice;
        }
        if (!$price) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('Configurable product "%1" do not have sub-products', $product->getName())
            );
        }
        return (float)(max($assPrice));
        //return (float)$price;
    }
}

คุณต้องการแสดงราคาสูงสุดในหน้ารายละเอียดหรือไม่?
Rakesh Jesadiya

ใช่ในรายละเอียดและรายชื่อยังเมื่อพวกเขาเปลี่ยนตัวเลือกในเวลานั้นตามปกติ
sivakumar

ในราคาในรายการจะไม่เปลี่ยนแปลง, คุณได้ตรวจสอบ, ราคาเดียวเท่านั้นที่แสดง
Rakesh Jesadiya

นั่นเป็นเรื่องปกติลูกค้าควรเห็นราคาสูงสุดของผลิตภัณฑ์ที่กำหนดค่าได้
sivakumar

มันใช้งานได้สำหรับคุณหรือไม่ ฉันได้ให้ตัวอย่างด้านล่างสำหรับความต้องการของคุณแล้ว
Rakesh Jesadiya

คำตอบ:


15

คุณต้องสร้างปลั๊กอินเพื่อแสดงราคาสูงสุดภายในหน้ารายละเอียดด้านล่างนี้คือโมดูลทีละขั้นตอนสำหรับความต้องการของคุณ

Filepath, แอป / รหัส / ผู้ขาย / Modulename /

ไฟล์การลงทะเบียน แอพ / รหัส / ผู้ขาย / Modulename / registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_Modulename',
    __DIR__
);

app / รหัส / ผู้ขาย / modulename / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_Modulename" setup_version="2.0.0">
    </module>
</config>

app / รหัส / ผู้ขาย / modulename / etc / ส่วนหน้า / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver">
            <plugin name="pricemaxindetail" type="Vendor\Modulename\Pricing\ConfigurablePrice"/>
    </type>
</config>

app / รหัส / ผู้ขาย / modulename / ราคา / ConfigurablePrice.php

ภายในไฟล์นี้คุณจะต้องปลั๊กอินfunctionprice ()ฟังก์ชั่น

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Vendor\Modulename\Pricing;

class ConfigurablePrice
{
    protected $_moduleManager;
    protected $_jsonEncoder;
    protected $_registry;


    public function __construct(
        \Magento\Framework\Module\Manager $moduleManager,
        \Magento\Framework\Json\EncoderInterface $jsonEncoder,
        \Magento\Framework\Registry $registry,           
        \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,         
        \Magento\Catalog\Api\Data\ProductInterfaceFactory $productFactory,    
        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType,
        \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
        \Magento\CatalogInventory\Api\StockStateInterface $stockState,
        array $data = [] 
    )
    {
        $this->_moduleManager = $moduleManager;
        $this->_jsonEncoder = $jsonEncoder;
        $this->_registry = $registry;
        $this->productFactory = $productFactory;      
        $this->productRepository = $productRepository;       
        $this->_configurableType = $configurableType;        
        $this->dataObjectHelper = $dataObjectHelper;   
        $this->stockState = $stockState; 
    }

    /**
     * @param \Magento\Framework\Pricing\SaleableInterface|\Magento\Catalog\Model\Product $product
     * @return float
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function aroundResolvePrice($subject, \Closure $proceed,\Magento\Framework\Pricing\SaleableInterface $product)
    {
        $price = null; 
        //get parent product id      
        $parentId = $product['entity_id'];
        $childObj = $this->getChildProductObj($parentId);
        foreach($childObj as $childs){
            $productPrice = $childs->getPrice();
            $price = $price ? max($price, $productPrice) : $productPrice;
        }
        return $price;        
        //return (float)$proceed($product['entity_id']);
    }

     public function getProductInfo($id){    
        //get product obj using api repository...          
        if(is_numeric($id)){           
            return $this->productRepository->getById($id); 
        }else{
            return;
        } 
    }

    public function getChildProductObj($id){
        $product = $this->getProductInfo($id);
        //if quote with not proper id then return null and exit;
        if(!isset($product)){
            return;
        }

        if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
            return [];
        }

        $storeId = 1;//$this->_storeManager->getStore()->getId();
        $productTypeInstance = $product->getTypeInstance();
        $productTypeInstance->setStoreFilter($storeId, $product);
        $childrenList = [];       

        foreach ($productTypeInstance->getUsedProducts($product) as $child) {
            $attributes = [];
            $isSaleable = $child->isSaleable();

            //get only in stock product info
            if($isSaleable){
                foreach ($child->getAttributes() as $attribute) {
                    $attrCode = $attribute->getAttributeCode();
                    $value = $child->getDataUsingMethod($attrCode) ?: $child->getData($attrCode);
                    if (null !== $value && $attrCode != 'entity_id') {
                        $attributes[$attrCode] = $value;
                    }
                }

                $attributes['store_id'] = $child->getStoreId();
                $attributes['id'] = $child->getId();
                /** @var \Magento\Catalog\Api\Data\ProductInterface $productDataObject */
                $productDataObject = $this->productFactory->create();
                $this->dataObjectHelper->populateWithArray(
                    $productDataObject,
                    $attributes,
                    '\Magento\Catalog\Api\Data\ProductInterface'
                );
                $childrenList[] = $productDataObject;
            }
        }

        $childConfigData = array();
        foreach($childrenList as $child){
            $childConfigData[] = $child;
        }

        return $childConfigData;
    }

}

เรียกใช้คำสั่ง

php bin / magento setup: upgrade

ลบโฟลเดอร์ var และตรวจสอบส่วนหน้า


วิธีรับเงินนี้สำหรับฉัน
Rakesh Jesadiya

ฉันทำเครื่องหมายแล้วว่าเป็นคำตอบที่ถูกต้องฉันไม่ทราบว่าฟังก์ชั่นการรับรางวัลบางครั้งไม่ได้รับรางวัลอย่างเหมาะสมหรือไม่ได้รับ 100 คะแนน
sivakumar

ไม่ฉันไม่ได้รับ แต่อาจหลังจากครบกำหนดระยะเวลาของรางวัลพวกเขาจะได้รับคุณไม่มีทางเลือกสำหรับสิ่งนั้นใช่ไหม
Rakesh Jesadiya

ไม่ได้ฉันทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องดังนั้นคุณควรได้รับทันที
sivakumar

@sivakumar คุณควรคลิกที่ "100" เพื่อมอบรางวัลคุณสามารถตรวจสอบข้อมูลเพิ่มเติมได้ที่นี่: meta.stackexchange.com/questions/16065/…
Baby in Magento

4

\Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver::resolvePriceดู มันเป็นวิธีการที่รับผิดชอบในการคำนวณราคาของผลิตภัณฑ์ที่กำหนดค่าได้ตามราคาลูก

คุณสามารถปลั๊กอินมันและใช้อัลกอริทึมของคุณ


ฉันสามารถใช้ max แทนนาทีได้หรือไม่ มันเพียงพอหรือไม่
sivakumar

ฉันได้ตรวจสอบแล้วว่าถ้าคุณสามารถใช้ max ไม่แสดงราคาสูงสุดมันก็จะแสดงราคาขั้นต่ำเสมอ
Rakesh Jesadiya

@Rakesh คุณสามารถดูคำถามที่ปรับปรุงครั้งเดียวได้หรือไม่
sivakumar

@KAndy ฉันพยายามที่จะ plugnize แต่วิธีการได้รับอาร์เรย์ราคาเด็ก ฉันคิดว่าฉันต้องเขียนคลาส ConfigurablePriceResolver ใหม่ทั้งหมดหรือไม่
sivakumar

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.