Ajouter un attribut de produit personnalisé au résumé de paiement Magento 2

14

J'essaie d'ajouter un attribut de produit personnalisé à la liste des éléments de la section récapitulative de la caisse dans Magento 2. Le fichier de modèle se trouve Magento_Checkout/web/template/summary/item/details.htmlet cherche à afficher la valeur de l'attribut personnalisé avant le nom du produit. Une idée sur la façon dont cette valeur est ajoutée au modèle ko? Il semble qu'il y ait une autre question à ce sujet ici, mais n'a jamais reçu de réponse.

sudopratt
la source
1
@Arjun C'est différent. Cet article référencé montre vraiment que la page du panier n'est pas la caisse. Le panier est un simple modèle phtml. La caisse est une page ko et obtient sa source ailleurs que dans le mini-chariot. Je ne sais pas pourquoi tous les articles du panier affichés dans le mini-panier, le panier et la caisse sont tous construits de différentes manières. Mais le résumé de paiement réel est l'endroit où j'ai besoin de voir comment ajouter l'attribut personnalisé.
sudopratt
@sudopratt, avez-vous une idée à ce sujet, comment ajouter un attribut de produit personnalisé à la liste des articles dans la section récapitulative de la caisse dans Magento 2?
Sarfaraj Sipai

Réponses:

16

Vous devrez créer un plugin pour cela. Je voulais ajouter une saveur de produit au résumé de la commande. C'est ainsi que j'ai créé un plugin et obtenu ce que je voulais.

Vendeur = Sejal

Fichiers que vous devez créer:

  1. Registration.php: app\code\Sejal\Flavor\registration.php
  2. di.xml: app\code\Sejal\Flavor\etc\di.xml
  3. module.xml: app\code\Sejal\Flavor\etc\module.xml
  4. ConfigProviderPlugin.php: app\code\Sejal\Flavor\Plugin\ConfigProviderPlugin.php
  5. details.html: copie de vendor\magento\module-checkout\view\frontend\web\template\summary\item\details.html

vous pouvez remplacer ce fichier dans votre thème comme celui-ci

app\design\frontend\Vendor\themename\Magento_Checkout\web\template\summary\item\details.html

Code: registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Sejal_Flavor',
    __DIR__
);

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\Checkout\Model\DefaultConfigProvider">
        <plugin name="AddAttPlug" type="Sejal\Flavor\Plugin\ConfigProviderPlugin" />
    </type>
</config>

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="Sejal_Flavor" setup_version="1.0.0">
    </module>
</config>

ConfigProviderPlugin.php

<?php

namespace Sejal\Flavor\Plugin;

class ConfigProviderPlugin extends \Magento\Framework\Model\AbstractModel
{

    public function afterGetConfig(\Magento\Checkout\Model\DefaultConfigProvider $subject, array $result)
    {

        $items = $result['totalsData']['items'];

        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        for($i=0;$i<count($items);$i++){

            $quoteId = $items[$i]['item_id'];
            $quote = $objectManager->create('\Magento\Quote\Model\Quote\Item')->load($quoteId);
            $productId = $quote->getProductId();
            $product = $objectManager->create('\Magento\Catalog\Model\Product')->load($productId);
            $productFlavours = $product->getResource()->getAttribute('flavors')->getFrontend()->getValue($product);         
            if($productFlavours == 'No' || $productFlavours == 'NA'){
                $productFlavours = '';
            }
            $items[$i]['flavor'] = $productFlavours;
        }
        $result['totalsData']['items'] = $items;
        return $result;
    }

}

details.html

Copy vendor\magento\module-checkout\view\frontend\web\template\summary\item\details.html 

dans le thème et ajouter

<div class="product-item-flavor" data-bind="text: $parent.flavor"></div>

au dessous de

<strong class="product-item-name" data-bind="text: $parent.name"></strong>

C'est ça! J'espère que cela aide!

Sejal Shah
la source
J'ai essayé l'extension Aheadworks onestepcheck mais cela ne fonctionne pas. Comment puis-je faire ?
Manish Maheshwari
@Sejal Shah s'il vous plaît répondre magento.stackexchange.com/questions/279918/…
Shafeel Sha
@Sejal Shah comment ajouter une condition if ici
sumeet bajaj
1
Cela fonctionne très bien pour l'étape d'expédition, mais à l'étape de facturation .product-item-flavour reste vide
jonasG
Sejal a répondu à ma question ici: magento.stackexchange.com/questions/178398/…
jonasG
3

si vous souhaitez ajouter votre attribut personnalisé dans le résumé de la commande, vous devez remplacer: (Layouts) 1) checkout_cart_index:

<referenceBlock name="checkout.cart.totals">
        <arguments>
            <argument name="jsLayout" xsi:type="array">
                <item name="components" xsi:type="array">
                    <item name="block-totals" xsi:type="array">
                        <item name="children" xsi:type="array">
                            <item name="processingfee" xsi:type="array">
                                <item name="component"  xsi:type="string">Dedicated_Processingfee/js/view/checkout/cart/totals/processingfee</item>
                                <item name="sortOrder" xsi:type="string">20</item>
                                <item name="config" xsi:type="array">
                                    <item name="template" xsi:type="string">Dedicated_Processingfee/checkout/cart/totals/processingfee</item>
                                    <item name="title" xsi:type="string" translate="true">Processing Fee</item>
                                </item>
                            </item>
                        </item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>

2) checkout_index_index:

<referenceBlock name="checkout.root">
        <arguments>
            <argument name="jsLayout" xsi:type="array">
                <item name="components" xsi:type="array">
                    <item name="checkout" xsi:type="array">
                        <item name="children" xsi:type="array">

                            <item name="sidebar" xsi:type="array">
                                <item name="children" xsi:type="array">
                                    <item name="summary" xsi:type="array">
                                        <item name="children" xsi:type="array">
                                            <item name="totals" xsi:type="array">
                                                <item name="children" xsi:type="array">
                                                    <item name="processingfee" xsi:type="array">
                                                        <item name="component"  xsi:type="string">Dedicated_Processingfee/js/view/checkout/cart/totals/processingfee</item>
                                                        <item name="sortOrder" xsi:type="string">20</item>
                                                        <item name="config" xsi:type="array">
                                                            <item name="template" xsi:type="string">Dedicated_Processingfee/checkout/cart/totals/processingfee</item>
                                                            <item name="title" xsi:type="string" translate="true">Processing Fee</item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                            <item name="cart_items" xsi:type="array">
                                                <item name="children" xsi:type="array">
                                                    <item name="details" xsi:type="array">
                                                        <item name="children" xsi:type="array">
                                                            <item name="subtotal" xsi:type="array">
                                                                <item name="component" xsi:type="string">Magento_Tax/js/view/checkout/summary/item/details/subtotal</item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>

3) sales_order_view:

<referenceContainer name="order_totals">
        <block class="Dedicated\Processingfee\Block\Sales\Order\ProcessingFee" name="processingfee"/>
    </referenceContainer>

puis ajoutez des js personnalisés pour obtenir votre valeur d'attribut personnalisé comme ceci dans votre module: à /view/frontend/web/js/view/checkout/cart/totals/processingfee.js:

define(
[
    'Dedicated_Processingfee/js/view/checkout/summary/processingfee'
],
function (Component) {
    'use strict';

    return Component.extend({

        /**
        * @override
        */
        isDisplayed: function () {
            return true;
        }
    });
}

);

ajoutez un autre js pour calculer la valeur avec le montant total de la facturation dans: /view/frontend/web/js/view/checkout/summary/processingfee.js

define(
[
    'Magento_Checkout/js/view/summary/abstract-total',
    'Magento_Checkout/js/model/quote',
    'Magento_Catalog/js/price-utils',
    'Magento_Checkout/js/model/totals'
],
function (Component, quote, priceUtils, totals) {
    "use strict";
    return Component.extend({
        defaults: {
            isFullTaxSummaryDisplayed: window.checkoutConfig.isFullTaxSummaryDisplayed || false,
            template: 'Dedicated_Processingfee/checkout/summary/processingfee'
        },
        totals: quote.getTotals(),
        isTaxDisplayedInGrandTotal: window.checkoutConfig.includeTaxInGrandTotal || false,
        isDisplayed: function() {
            return this.isFullMode();
        },
        getValue: function() {
            var price = 0;
            if (this.totals()) {
                price = totals.getSegment('processingfee').value;
            }
            return this.getFormattedPrice(price);
        },
        getBaseValue: function() {
            var price = 0;
            if (this.totals()) {
                price = this.totals().base_fee;
            }
            return priceUtils.formatPrice(price, quote.getBasePriceFormat());
        }
    });
}

);

Cet ensemble, vous trouverez votre attribut avec une valeur Merci :)

entrez la description de l'image ici

Ronak Chauhan
la source
1
Je ne pense pas que @sudopratt veuille ajouter une ligne dans les totaux plutôt qu'un attribut de produit sous le nom du produit comme une courte description.
Sunil Verma
@ Sunil Verma avez-vous une solution pour cela. Je dois faire exactement la même chose, mais je ne peux pas obtenir de référence
Rohit Goel
Oui, son attribut personnalisé s'affiche, mais lorsque vous passez à l'étape suivante pour #payment, l'attribut personnalisé disparaît. Pourquoi?
HaFiz Umer
1

Pour moi, $ result ['totalsData'] ['items'] était vide. J'ai plutôt utilisé l'implémentation suivante:

public function afterGetConfig(
    \Magento\Checkout\Model\DefaultConfigProvider $subject,
    array $result

) {
    foreach ($result['quoteItemData'] as $index => $itemData) {
        $product = $this->productRepository->getById($itemData['product_id']);
        $result['quoteItemData'][$index]['flavor'] = $product->getFlavor();
    }
    return $result;
}
ulzii
la source
0

Je dois afficher le nom de produit simple du configurable. J'ai donc utilisé le code ci-dessous. Mais le même nom simple s'affiche lorsque je choisis les mêmes options configurables dans le résumé de l'ordre de paiement. Alors, comment afficher les noms de produits simples et corrects?

public function afterGetConfig(\Magento\Checkout\Model\DefaultConfigProvider $subject, array $result)
{

    $items = $result['totalsData']['items'];

    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    for($i=0;$i<count($items);$i++){

        $quoteId = $items[$i]['item_id'];
        $quote = $objectManager->create('\Magento\Quote\Model\Quote\Item')->load($quoteId);
        $productId = $quote->getProductId();
        $product = $objectManager->create('\Magento\Catalog\Model\Product')->load($productId);
        $productTypeInstance = $product->getTypeInstance();
        $usedProducts = $productTypeInstance->getUsedProducts($product);

        foreach ($usedProducts  as $child) {
            $childName = $child->getName(); //Child Product Name
        }           

        $items[$i]['childname'] = $childName;
    }
    $result['totalsData']['items'] = $items;
    return $result;
}
Hasitha Anuruddha
la source