comment magento obtient-il un produit configurable au prix le plus bas des produits associés?

11

Dans la page d'affichage par défaut, magento affiche le prix le plus bas des produits associés.

Je dois afficher le prix le plus élevé des produits associés. N'importe qui a une idée de l'emplacement de la logique. Comment personnaliser ce comportement.

mise à jour:

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

J'essaie de remplacer ce fichier principal, mais cela ne fonctionne pas.

<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
la source
voulez-vous afficher le prix maximum dans la page de détails?
Rakesh Jesadiya
oui en détail et liste également. quand ils changent les options à ce moment-là comme d'habitude.
sivakumar
dans le prix d'inscription ne sont pas modifiés, avez-vous vérifié, un seul prix est affiché
Rakesh Jesadiya
c'est bien. le client devrait voir le prix maximum du produit configurable.
sivakumar
est-ce que cela fonctionne pour vous? j'ai donné l'exemple ci-dessous pour vos demandes
Rakesh Jesadiya

Réponses:

15

Vous devez faire un plugin pour cela pour afficher le prix maximum à l'intérieur de la page de détail, ci-dessous est un module étape par étape pour votre besoin,

Chemin de fichier, application / code / Fournisseur / Nom du module /

Fichier d'enregistrement, application / code / fournisseur / nom de module / registration.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>

application / code / fournisseur / nom de module / prix / ConfigurablePrice.php

Dans ce fichier, vous devez pluginize resolveprice () fonction

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

}

exécuter la commande

configuration de php bin / magento: mise à niveau

supprimer le dossier var et archiver le frontend

Rakesh Jesadiya
la source
comment obtenir cette prime pour moi?
Rakesh Jesadiya
J'ai déjà marqué comme une bonne réponse.Je ne sais pas parfois la fonctionnalité de prime n'attribue pas correctement.N'obtiens pas 100 points?
sivakumar
Non, je n'ai pas obtenu mais peut être après l'expiration des périodes de prime, ils peuvent obtenir, vous n'avez aucune option pour cela?
Rakesh Jesadiya
non.i marqué comme une bonne réponse, vous devriez donc obtenir immédiatement.
sivakumar
@sivakumar vous devez cliquer sur "+100" pour attribuer une prime, vous pouvez consulter ici pour plus d'informations: meta.stackexchange.com/questions/16065/…
Baby in Magento
4

Tu vois \Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver::resolvePrice. C'est la méthode resposible pour le calcul du prix du produit configurable basé sur le prix enfant.

Vous pouvez le pluginiser et implémenter votre algorithme.

KAndy
la source
au lieu de min, puis-je utiliser max? est-ce suffisant?
sivakumar
J'ai vérifié que, si vous pouvez utiliser max, il n'affiche pas le prix max, il affiche toujours le prix min,
Rakesh Jesadiya
@Rakesh pouvez-vous regarder une fois la question mise à jour?
sivakumar
@KAndy j'essaye de faire du plugin, mais comment obtenir le tableau des prix pour les enfants. je pense que je dois réécrire toute la classe ConfigurablePriceResolver?
sivakumar