Bagaimana cara Magento mendapatkan harga terendah produk yang bisa dikonfigurasi dari produk terkait?

11

Di halaman tampilan secara default magento menampilkan harga terendah dari produk terkait.

Saya perlu menampilkan harga tertinggi dari produk terkait. Ada yang tahu di mana logika berada. Bagaimana cara menyesuaikan perilaku ini.

memperbarui:

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

Saya mencoba untuk mengganti file inti ini, tetapi tidak berfungsi.

<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;
    }
}
sivakumar
sumber
Anda ingin menampilkan harga maks di halaman detail?
Rakesh Jesadiya
ya secara rinci & daftar juga. ketika mereka mengubah opsi pada waktu itu seperti biasa.
sivakumar
dalam daftar harga tidak berubah, Sudahkah Anda memeriksa, hanya satu harga yang ditampilkan
Rakesh Jesadiya
itu bagus. pelanggan harus melihat harga maksimal produk yang dapat dikonfigurasi.
sivakumar
apakah ini bekerja untukmu? Saya telah memberikan contoh di bawah ini untuk
permintaan

Jawaban:

15

Anda harus membuat plugin untuk itu untuk menampilkan harga maksimum di dalam halaman detail, Di bawah ini adalah modul langkah demi langkah untuk kebutuhan Anda,

Filepath, app / code / Vendor / Modulename /

File pendaftaran, aplikasi / kode / Vendor / Modulename / registrasi.php

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

app / code / Vendor / 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 / code / Vendor / Modulename / etc / frontend / 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 / code / Vendor / Modulename / Pricing / ConfigurablePrice.php

Di dalam file ini, Anda harus memasang fungsi resolveprice ()

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

}

jalankan perintah

setup php bin / magento: tingkatkan

hapus folder var dan periksa di frontend

Rakesh Jesadiya
sumber
bagaimana cara mendapatkan hadiah ini untuk saya?
Rakesh Jesadiya
sudah saya tandai sebagai jawaban yang tepat.saya tidak tahu beberapa kali fungsi karunia tidak memberikan dengan benar. Tidak mendapatkan 100 poin?
sivakumar
Tidak, saya tidak mendapatkan tetapi mungkin setelah periode hadiah berakhir, mereka bisa mendapatkan, Anda tidak punya pilihan untuk itu?
Rakesh Jesadiya
no.i ditandai sebagai jawaban yang benar, jadi Anda harus segera mendapatkannya.
sivakumar
@sivakumar Anda harus mengklik "+100" untuk memberi hadiah, Anda dapat memeriksa di sini untuk info lebih lanjut: meta.stackexchange.com/questions/16065/…
Baby in Magento
4

Lihat \Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver::resolvePrice. Metode ini bertanggung jawab untuk menghitung harga produk yang dapat dikonfigurasi berdasarkan harga anak.

Anda dapat menyambungkannya dan mengimplementasikan algoritma Anda.

KAndy
sumber
bukannya saya dapat menggunakan maks? apakah cukup?
sivakumar
Saya telah memeriksa bahwa, jika Anda dapat menggunakan max, tidak menampilkan harga max, selalu menunjukkan harga minimum,
Rakesh Jesadiya
@Rakesh dapatkah Anda melihat pertanyaan yang diperbarui sekali?
sivakumar
@KAndy saya mencoba plugnize, tapi bagaimana cara mendapatkan array harga anak. saya pikir saya perlu menulis ulang seluruh kelas ConfigurablePriceResolver?
sivakumar