自定义Magento签出摘要(Magento 2.x.x)
如何在签出的magento摘要中添加一些自定义字段和元素。据我所知,我需要覆盖一些knockout.js模板和html,正确的方法是什么,以及如何覆盖这些文件?(magento 2.3)您需要为此编写一个插件。创建一个模块,然后添加自定义Magento签出摘要(Magento 2.x.x),magento,magento2,magento-2.3,Magento,Magento2,Magento 2.3,如何在签出的magento摘要中添加一些自定义字段和元素。据我所知,我需要覆盖一些knockout.js模板和html,正确的方法是什么,以及如何覆盖这些文件?(magento 2.3)您需要为此编写一个插件。创建一个模块,然后添加 etc/di.xml带内容 <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSch
etc/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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
view/frontend/web/js/view/summary/item/details.js
带内容
<?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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
Plugin/Checkout/Model/DefaultConfigProvider.php
带内容
<?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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
需要考虑的两个想法:
databind属性必须适合输出,这意味着您可能需要替换“text”。
如果您查看下面的元素,就会解析json。如果您像我一样想要输出自定义产品属性,那么最好将其格式化为json,并让KO像解析选项一样解析它。您需要为此编写一个插件。创建一个模块,然后添加
etc/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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
view/frontend/web/js/view/summary/item/details.js
带内容
<?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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
Plugin/Checkout/Model/DefaultConfigProvider.php
带内容
<?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="checkoutAttribute" type="Vendor\Module\Plugin\Checkout\Model\DefaultConfigProvider" />
</type>
</config>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<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="cart_items" xsi:type="array">
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component"
xsi:type="string">Vendor_Module/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
define([
'uiComponent'
], function (Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/summary/item/details'
},
/**
* @param {Object} quoteItem
* @return {String}
*/
getValue: function (quoteItem) {
return quoteItem.name;
},
getCustomAttributes: function(parent) {
var item = _.find(products, function (product) {
return product.item_id == parent.item_id;
});
return item.items.custom_attributes;
},
});
});
<?php
namespace Vendor\Module\Plugin\Checkout\Model;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
class DefaultConfigProvider
{
/**
* @var CheckoutSession
*/
protected $checkoutSession;
protected $logger;
/**
* Constructor
*
* @param CheckoutSession $checkoutSession
*/
public function __construct(
CheckoutSession $checkoutSession,
QuoteItemRepository $quoteItemRepository,
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->checkoutSession = $checkoutSession;
$this->quoteItemRepository = $quoteItemRepository;
$this->_productRepository = $productRepository;
$this->logger = $logger;
}
public function afterGetConfig(
\Magento\Checkout\Model\DefaultConfigProvider $subject,
array $result
) {
$items = $this->getQuoteItemData();
foreach ($items as $index => $item) {
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($item->getProductId());
//your definition of the attributes
$result['quoteItemData'][$index]['items']['custom_attributes'] = $attributes;
}
return $result;
}
private function getQuoteItemData()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
return $quoteItems = $this->quoteItemRepository->getList($quoteId);
}
else{
return;
}
}
}
需要考虑的两个想法:
databind属性必须适合输出,这意味着您可能需要替换“text”。
如果您查看下面的元素,就会解析json。如果您像我一样希望输出自定义产品属性,那么最好将其格式化为json,并让KO像解析选项一样解析它