Magento 2: Bộ lọc giá điều hướng lớp không hoạt động sau khi áp dụng Giảm giá sản phẩm tùy chỉnh


13

Tôi làm việc trên một mô-đun giảm giá sản phẩm. Tôi đã làm điều đó thông qua plugin và quan sát viên. nó hoạt động tốt trên trang sản phẩm và trang danh sách. Nhưng bộ lọc giá không hoạt động theo giá sản phẩm cập nhật.

Đây là mã của tôi mà tôi đang sử dụng để tùy chỉnh giá.

VendorName / ModuleName / etc / di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Pricing\Price\FinalPrice">
        <plugin name="custom_discount_catalog_pricing_price_finalprice" type="VendorName\ModuleName\Plugin\FinalPrice" />
    </type>
</config>

VendorName / ModuleName / etc / event.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <event name='catalog_product_get_final_price'>
        <observer name='customdiscount_finalprice' instance='VendorName\ModuleName\Observer\ProcessFinalPrice'/>
    </event>
</config>

VendorName / ModuleName / Observer / ProcessFinalprice.php

<?php

namespace VendorName\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class ProcessFinalPrice implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $observer->getEvent()->getProduct();
        $old = $product->getData('final_price');
        $discountedPrice = $old - ($old * 0.20);
        $product->setData('final_price',$discountedPrice);
    }
}

VendorName / ModuleName / Plugin / Finalprice.php

<?php

namespace VendorName\ModuleName\Plugin;

class FinalPrice
{
    public function afterGetValue(\Magento\Catalog\Pricing\Price\FinalPrice $subject, $result)
    {
        $discountedPrice = $result - ($result * 0.20);
        return $discountedPrice;
    }
}

Áp dụng giảm giá 20%

Bộ lọc giá không hoạt động với giá chiết khấu

Lưu ý: Giá chiết khấu là ở cấp độ khách hàng


HI Nếu bạn muốn giảm giá. Vì vậy, tôi khuyên bạn nên sử dụng "Quy tắc giá danh mục"
Ravi Soni

@ravi Soni Chúng tôi đã tạo ra một mô-đun tùy chỉnh. chúng tôi không thể sử dụng quy tắc giá danh mục cho điều đó.
Dhairya Shah

@Rohan Sử dụng cùng một phiên bản và nó không hoạt động.
Priyank

Tôi đang tìm kiếm một giải pháp từ gần 4 năm mà không có giải pháp nào, tôi hy vọng bạn sẽ tìm thấy một giải pháp, vấn đề chính là giá cả trong điều hướng lớp được lấy trực tiếp từ bảng và bạn đang thay đổi giá một cách nhanh chóng
WISAM HAKIM

@WISAMHAKIM Không có giải pháp thích hợp. Hy vọng một số anh chàng trong nhóm Magento có thể xem xét điều này và đề xuất một số giải pháp :)
Priyank

Câu trả lời:


5

Đây không phải là một giải pháp, nhưng nó có thể là một lời giải thích về cách các bộ lọc giá hoạt động. Điều này có thể giúp xác định một giải pháp.

Giá hiển thị trong danh sách các sản phẩm đến từ catalog_product_index_pricebảng.
Nếu bạn nhìn vào phần chọn lấy danh sách sản phẩm, bạn sẽ thấy một cái gì đó như thế này:

SELECT 
  `e`.*, 
  `cat_index`.`position` AS `cat_index_position`, 
  `price_index`.`price`, 
  `price_index`.`tax_class_id`, 
  `price_index`.`final_price`, 
  IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, 
  `price_index`.`min_price`, 
  `price_index`.`max_price`, 
  `price_index`.`tier_price` 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `catalog_category_product_index_store1` AS `cat_index` ON cat_index.product_id=e.entity_id AND ....
INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND ...

trong trường hợp của bạn, nó không hoạt động vì bạn đang thay đổi giá cuối cùng của sản phẩm một cách nhanh chóng, khi sản phẩm bị phân tán. Nhưng trong bảng chỉ số giá bạn vẫn có giá gốc.

Việc lập chỉ mục thực tế xảy ra (ít nhất là đối với các sản phẩm đơn giản) trong Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex.
Tôi không thể giải thích đầy đủ những gì xảy ra trong đó, nhưng bạn có một cái gì đó để nối vào.

Phương thức prepareFinalPriceDataForTypetừ cùng một lớp được gọi khi bắt đầu quá trình lập chỉ mục.
Phương thức này kết thúc bằng $this->modifyPriceIndex($finalPriceTable);
Đây là thứ bạn có thể mua để tạo ra một lớp điều chỉnh giá và gắn nó vào danh sách điều chỉnh giá.
Bạn có thể tạo một công cụ điều chỉnh giá như thế này:

<?php
namespace Vendor\Module\Indexer\Price;

use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceModifierInterface;
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\IndexTableStructure;

class CustomPriceModifier implements PriceModifierInterface
{
     public function modifyPrice(IndexTableStructure $priceTable, array $entityIds = []) : void
     {
         //code here that modifies your price.
     }
}

Bạn có thể tìm thấy một ví dụ về sửa đổi giá trong Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter. Điều này sẽ loại bỏ các sản phẩm chứng khoán khỏi chỉ số giá nếu bạn đặt để ẩn sản phẩm chứng khoán của mình.

Bạn đã tạo công cụ sửa đổi giá của mình, bây giờ bạn cần đính kèm nó vào danh sách các công cụ điều chỉnh giá hiện có.

Bạn có thể làm điều đó từ tệp di.xml của bạn với

<type name="Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceInterface">
    <arguments>
        <argument name="priceModifiers" xsi:type="array">
            <item name="customPriceModifier" xsi:type="object">Vendor\Module\Indexer\Price\CustomPriceModifier</item>
        </argument>
    </arguments>
</type>

Bây giờ bạn sẽ có thể sửa đổi giá trong bảng chỉ mục khi bạn thấy phù hợp bằng cách thực hiện phương thức modifyPricetrong lớp ở trên.

Đó là tất cả những gì tôi có.


Giải thích tuyệt vời. nhưng nó không làm việc cho tôi vì giá chiết khấu ở cấp độ khách hàng.
Dhairya Shah

1
vâng magento không chơi tốt với giá ở cấp độ khách hàng. Mặt khác, bạn có thể sử dụng các nhóm khách hàng. Điều này có thể có nghĩa là bạn nhận được rất nhiều nhóm sẽ khiến việc lập chỉ mục chậm hơn. Thật không may, tôi không có một giải pháp sạch. Hoặc một cái bẩn cho vấn đề đó.
Marius

Din't có giải pháp tôi đang tìm kiếm. Nhưng vì bạn là người đầu tiên trả lời với một số giải thích về dòng chảy muốn cung cấp cho bạn các điểm thưởng.
Priyank

2

Theo tôi hiểu cấu trúc dòng chảy Magento 2, Khi chúng tôi tạo quy tắc giá danh mục và lưu và áp dụng quy tắc đó. Sau đó, chúng ta phải reindex dữ liệu cho giá cập nhật. Vào thời điểm đó, giá sẽ được cập nhật trên sản phẩm phù hợp và lưu trong catalog_product_index_pricebảng.

Nhưng, theo tôi hiểu cấu trúc dòng mô-đun này, nó không sửa đổi bộ sưu tập sản phẩm được kết xuất cho bộ lọc điều hướng lớp. Bạn có thể kiểm tra ở đây vendor/magento/module-catalog/Model/Layer.php hàm get SẢNtCollection () . Vì vậy, theo logic của plugin, bạn chỉ cần cập nhật giá trị hiển thị ở mặt trước. Tuy nhiên, bạn không cập nhật final_priceMIN_PRICE giá trị trường trong đó bộ sưu tập sản phẩm ( getProductCollection () dữ liệu chức năng ).

Bạn cũng có thể kiểm tra giá hiển thị mà giảm giá tùy chỉnh của bạn. Nhưng, sản phẩm không thêm vào giỏ hàng với giá chiết khấu. Vì vậy, tôi nghĩ rằng nó không phải là một giải pháp đầy đủ.

Vì vậy, bạn cần phải cập nhật final_priceMIN_PRICE của đối tượng bộ sưu tập như như catalô cai trị giá cập nhật đó.

Hy vọng, nó sẽ hữu ích cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.