Wie magento erhält konfigurierbares Produkt niedrigsten Preis der zugehörigen Produkte?

11

In der Ansichtsseite zeigt Magento standardmäßig den niedrigsten Preis der zugehörigen Produkte an.

Ich muss den höchsten Preis der zugehörigen Produkte anzeigen. Jeder hat eine Idee, wo sich die Logik befindet. Wie kann man dieses Verhalten anpassen?

aktualisieren:

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

Ich versuche, diese Kerndatei zu überschreiben, aber es funktioniert nicht.

<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
quelle
Möchten Sie den Maximalpreis auf der Detailseite anzeigen?
Rakesh Jesadiya
ja im Detail & Auflistung auch. Wenn sie Optionen zu diesem Zeitpunkt wie gewohnt ändern.
Sivakumar
im Listenpreis werden nicht geändert, Haben Sie überprüft, nur ein Preis wird angezeigt
Rakesh Jesadiya
Das ist in Ordnung. Der Kunde sollte den Maximalpreis des konfigurierbaren Produkts sehen.
Sivakumar
funktioniert das für dich Ich habe unten ein Beispiel für Ihre Anforderungen gegeben
Rakesh Jesadiya

Antworten:

13

Sie müssen ein Plugin erstellen, damit der maximale Preis auf der Detailseite angezeigt wird. Unten finden Sie ein schrittweises Modul für Ihre Anforderungen.

Dateipfad, App / Code / Anbieter / Modulname /

Registrierungsdatei, app / code / Vendor / Modulename / register.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

Innerhalb dieser Datei müssen Sie pluginize resolveprice () Funktion

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

}

Führen Sie den Befehl aus

PHP Bin / Magento Setup: Upgrade

Entfernen Sie den var-Ordner und checken Sie das Frontend ein

Rakesh Jesadiya
quelle
Wie bekomme ich dieses Kopfgeld für mich?
Rakesh Jesadiya
Ich habe bereits als richtige Antwort markiert. Ich weiß nicht, ob die Bounty-Funktionalität manchmal nicht richtig vergeben wird. Habe ich nicht 100 Punkte bekommen?
Sivakumar
Nein, ich habe es nicht bekommen, aber es kann sein, dass sie nach Ablauf der Kopfgeldperioden bekommen. Sie haben keine Option dafür?
Rakesh Jesadiya
no.i als richtige Antwort markiert, daher sollten Sie sofort erhalten.
Sivakumar
@sivakumar Sie sollten auf "+100" klicken, um Kopfgeld zu vergeben. Weitere Informationen finden Sie hier: meta.stackexchange.com/questions/16065/…
Baby in Magento
3

Siehe \Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver::resolvePrice. Diese Methode ist für die Berechnung des Preises eines konfigurierbaren Produkts auf der Grundlage des Kinderpreises verantwortlich.

Sie können es einbinden und Ihren Algorithmus implementieren.

KAndy
quelle
anstelle von min kann ich max verwenden? reicht das?
Sivakumar
Ich habe überprüft, dass, wenn Sie max verwenden können, es nicht max Preis anzeigen, es immer min Preis anzeigen,
Rakesh Jesadiya
@ Rakesh kannst du dir die aktualisierte Frage einmal ansehen?
Sivakumar
@KAndy Ich versuche zu Plugnize, aber wie man Kinderpreise Array bekommen. Ich denke, ich muss die gesamte ConfigurablePriceResolver-Klasse neu schreiben?
Sivakumar