Cómo mostrar el descuento de producto configurable en porcentaje en la lista de productos en Magento 2

10

En la página de detalles del producto, muestra un porcentaje de descuento. Cuando abro la página de la lista, no se puede mostrar el porcentaje del producto configurable.

Por favor, dame la solución para eso.

He utilizado el siguiente código para eso, pero no funciona para el producto 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
fuente
Hola, ¿obtuviste la solución?
Pregunte a Bytes el
@Ask Bytes todavía no
Meera
@AskBytes Avísame si aún no funciona. Probé mi código y funciona correctamente.
Rohan Hapani

Respuestas:

2

Puede agregar crear un archivo de precio separado para el producto configurable y el código dentro de él.

catalog_product_prices.xml

agregar código

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

ya que es producto configurable no es posible verificarlo por getFinalPrice()y getSpecialPrice().

agregue el siguiente código para el producto 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; ?>

Nota: puede obtener esto directamente cambiando el archivo app\design\frontend\Vendor\theme\Magento_Catalog\templates\product\price\final_price.phtml, solo tiene que poner la condición para el producto configurable

porcentaje se mostrará en la página de listado ingrese la descripción de la imagen aquí

Ketan Borada
fuente
1

Haría algo como esto

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

y llamarlo en plantilla

    if ($percentage = $helper->getPercentage($product)) {
        echo $percentage;
    }
Tsita
fuente
Su solución me ayuda. Solo muestra el menor descuento de muestra de producto. pero el precio de descuento no cambia al seleccionar diferentes opciones de muestra.
Pregunte Bytes el
1

Puede verificarlo sin anular ningún archivo. Necesitas usar afterPlugin para eso.

1) Cree el archivo di.xml en 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) Cree el archivo de complemento ProductList.php en 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;
        }
    }
}

Salida (en producto configurable):

ingrese la descripción de la imagen aquí

Espero, tal vez sea útil para ti.

Rohan Hapani
fuente
Debería usar else if ($ product-> getTypeId () == "configurable") {} porque la página se desglosa donde se agrupa o agrupa el producto. El método getUsedProducts no se utiliza para productos de paquete y grupo
HaFiz Umer el
1
Esta pregunta para producto configurable. Entonces, solo agrego una respuesta para eso.
Rohan Hapani
0

Por favor, intente con el siguiente código:

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

Espero que funcione para ti

Anas Mansuri
fuente