magento가 구성 가능한 제품을 관련 제품의 최저 가격으로 얻는 방법은 무엇입니까?


11

보기 페이지에서 기본적으로 magento는 관련 제품의 최저 가격을 표시합니다.

관련 제품의 최고 가격을 표시해야합니다. 누구나 논리가 어디에 있는지 알고 있습니다.이 동작을 사용자 정의하는 방법.

최신 정보:

마 젠토 \ 구성 가능 제품 \ 가격 설정 \ 가격 \ 구성 가능 가격 해결 프로그램

/**
     * @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

세부 정보 페이지에 최대 가격을 표시하려면 플러그인을 만들어야합니다. 아래는 필요에 따라 단계별 모듈입니다.

파일 경로, 앱 / 코드 / 공급 업체 / 모듈 이름 /

등록 파일, app / code / Vendor / Modulename / 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>

앱 / 코드 / 공급 업체 / 모듈 이름 /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

이 파일 내에서 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;
    }

}

명령을 실행

PHP bin / magento 설정 : 업그레이드

var 폴더를 제거하고 프론트 엔드를 체크인하십시오.


어떻게이 현상금을받을 수 있습니까?
Rakesh Jesadiya

이미 정답으로 표시되었습니다. 현상금 기능이 제대로 수여되지 않는 경우가 있습니다 .100 점을 얻지 못했습니까?
sivakumar

아니, 나는 얻지 못했지만 현상금 기간이 만료 된 후에도 얻을 수 있습니다.
Rakesh Jesadiya

아니요. 정답으로 표시되었으므로 즉시 연락해야합니다.
sivakumar

@sivakumar 당신은 현상금을 수여하기 위해 "+100"을 클릭해야합니다, 당신은 여기에 더 많은 정보를 확인할 수 있습니다 : meta.stackexchange.com/questions/16065/…
Magento의 아기

4

참조하십시오 \Magento\ConfigurableProduct\Pricing\Price\ConfigurablePriceResolver::resolvePrice. 자식 가격을 기준으로 구성 가능한 제품의 가격을 계산할 수있는 방법입니다.

플러그인하고 알고리즘을 구현할 수 있습니다.


min 대신 max를 사용할 수 있습니까? 충분한가요?
sivakumar

나는 당신이 최대를 표시 할 수없는 최대 가격을 표시 할 수있는 경우, 항상 최소 가격을 표시,
Rakesh Jesadiya

@Rakesh 업데이트 된 질문을 한 번만 볼 수 있습니까?
sivakumar

@KAndy 나는 plugnize하려고 노력하고 있지만 자식 가격 배열을 얻는 방법. 전체 ConfigurablePriceResolver 클래스를 다시 작성해야한다고 생각합니까?
sivakumar

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.