Comment afficher la remise de produit configurable en pourcentage sur la liste de produits dans Magento 2

10

Dans la page de détail du produit, il affiche un pourcentage de remise. lorsque j'ouvre la page de liste, il ne peut pas afficher le pourcentage du produit configurable.

Veuillez me donner la solution pour cela.

J'ai utilisé le code ci-dessous pour cela, mais cela ne fonctionne pas pour le produit configurable.

<div class="discount-p">
    <?php

    if($_product->getTypeId() == "simple") {
        $simplePrice = $_product->getPrice();
        } else {
            $_children = $_product->getTypeInstance()->getUsedProducts($_product);
            foreach ($_children as $child){
            $simplePrice = $child->getPrice();
            break;
        }
    }

    $_finalPrice =$_product->getFinalPrice();
    $_price = $simplePrice;
    if($_finalPrice < $_price) {
    $_savingPercent = 100 - round(($_finalPrice / $_price)*100);
    echo '('. $_savingPercent . '%off)';

    }
    ?>
</div>
Meera
la source
Salut, avez-vous trouvé la solution?
Ask Bytes
@Ask Bytes toujours pas
Meera
@AskBytes Faites-moi savoir si cela ne fonctionne toujours pas. J'ai testé mon code et cela fonctionne correctement.
Rohan Hapani

Réponses:

2

Vous pouvez ajouter créer un fichier de prix saperate pour le produit configurable et le code qu'il contient.

catalog_product_prices.xml

ajouter du code

<?xml version="1.0"?>

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="render.product.prices">
        <arguments>
            <argument name="default" xsi:type="array">
                <item name="prices" xsi:type="array">
                    <item name="final_price" xsi:type="array">
                        <item name="render_class" xsi:type="string">Vendor\Module\Pricing\Render\FinalPriceBox</item>
                        <item name="render_template" xsi:type="string">Vendor_Module::product/price/final_price.phtml</item>
                    </item>
                </item>
            </argument>
            <argument name="configurable" xsi:type="array">
                <item name="prices" xsi:type="array">
                    <item name="final_price" xsi:type="array">
                        <item name="render_class" xsi:type="string">Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox</item>
                        <item name="render_template" xsi:type="string">Vendor_Module::product/price/final_price_configurable.phtml</item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>
</layout>

comme c'est un produit configurable impossible de le vérifier par getFinalPrice()et getSpecialPrice().

ajoutez le code ci-dessous pour le produit configurable.

$priceModel = $block->getPriceType('regular_price');
$finalPriceModel = $block->getPriceType('final_price');

<?php if($finalPriceModel->getAmount() < $priceModel->getAmount()) : ?>
        <span class="old-price sly-old-price no-display config-old" style="text-decoration: line-through;">
            <?= $block->renderAmount($priceModel->getAmount(), [
                'price_id'          => $block->getPriceId('old-price-' . $idSuffix),
                'price_type'        => 'oldPrice',
                'include_container' => true,
                'skip_adjustments'  => true
            ]); ?>
        </span>
        <?php 

            $array = (array)$priceModel->getAmount();
            $prefix = chr(0).'*'.chr(0);
            $price = $array[$prefix.'amount'];

            $array = (array)$finalPriceModel->getAmount();
            $prefix = chr(0).'*'.chr(0);
            $finalPrice = $array[$prefix.'amount'];

            $percentage = 100 - round(($finalPrice / $price)*100);

            echo "<span class='percent-amt'>- ".$percentage."%</span>";
        ?>
    <?php endif; ?>

Remarque: vous pouvez l'obtenir directement en modifiant le fichier app\design\frontend\Vendor\theme\Magento_Catalog\templates\product\price\final_price.phtml, il vous suffit de mettre une condition pour le produit configurable

pourcentage apparaîtra dans la page de liste entrez la description de l'image ici

Ketan Borada
la source
1

Je ferais quelque chose comme ça

public function getPercentage(\Magento\Catalog\Model\Product $product)
{
    $baseprice = 0;
    $finalprice = 0;
    $percentage = 0;

    if ($product->getTypeId() == 'configurable') {
        $baseprice = $product->getPriceInfo()
            ->getPrice('regular_price')
            ->getValue();

        $finalprice = $product->getPriceInfo()
            ->getPrice('final_price')
            ->getValue();
    } else {
        $baseprice = $product->getPrice();
        $finalprice = $product->getFinalPrice();
    }

    if ($finalprice < $baseprice) {
        $percentage = round(-100 * (1 - ($finalprice / $baseprice)));
    }

    return $percentage;
}

et appelez-le dans le modèle

    if ($percentage = $helper->getPercentage($product)) {
        echo $percentage;
    }
Tsita
la source
Votre solution m'aide. Elle ne montre que la moindre remise de nuance de produit. mais le prix de remise ne change pas lors de la sélection des différentes options de nuance
Demandez à Bytes
1

Vous pouvez le vérifier sans remplacer aucun fichier. Vous devez utiliser afterPlugin pour cela.

1) Créez un fichier di.xml dans app / code / VendorName / ModuleName / etc / frontend

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Block\Product\ListProduct">
        <plugin name="block-product-list" type="VendorName\ModuleName\Plugin\ProductList"/>
    </type>
</config>

2) Créez le fichier du plugin ProductList.php dans app / code / VendorName / ModuleName / Plugin

<?php
namespace VendorName\ModuleName\Plugin;

class ProductList {

    public function afterGetProductDetailsHtml(
        \Magento\Catalog\Block\Product\ListProduct $subject,
        $result,
        \Magento\Catalog\Model\Product $product
    ) {
        if ($product->getTypeId() == "simple") {
            $simplePrice = $product->getPrice();
        } else {
            $_children = $product->getTypeInstance()->getUsedProducts($product);
            foreach ($_children as $child) {
                $simplePrice = $child->getPrice();
                break;
            }
        }

        $finalPrice = $product->getFinalPrice();
        $_price = $simplePrice;
        if ($finalPrice < $_price) {
            $discountPer = 100 - round(($finalPrice / $_price) * 100);
            return $result . 'Your save : ' . $discountPer . '%';
        } else {
            return $result;
        }
    }
}

Sortie (dans le produit configurable):

entrez la description de l'image ici

J'espère, cela peut vous être utile.

Rohan Hapani
la source
Vous devez utiliser else if ($ product-> getTypeId () == "configurable") {} car la page se décompose où regrouper ou grouper le produit. La méthode getUsedProducts n'est pas utilisée pour les produits
groupés
1
Cette question pour le produit configurable. Donc, j'ajoute juste une réponse à cela.
Rohan Hapani
0

Veuillez essayer avec le code ci-dessous:

<?php
    $item = $block->getSaleableItem();
    $_savePercent = 100 - round(((float)$item->getFinalPrice() / (float)$item->getPrice()) * 100);
    echo '<b style="color:#008000">'.$_savePercent . '% off </b>';
    ?>

J'espère que son travail pour vous

Anas Mansuri
la source