Поле, добавленное в кассу Magento 2.4, не сохраняется
Интернет-магазин, над которым я работаю, должен иметь дополнительный раскрывающийся список на кассе. Это раскрывающийся список представляет собой список магазинов / розничных продавцов (взаимозаменяемых), которые сохраняются в таблице, добавленной модулем. Он должен сохранить идентификатор выбранного магазина в заказе, чтобы данные магазина можно было искать по первичному ключу.
Пока что мне удавалось делать следующее:
- Добавьте поле (как целое число) в кавычки, sales_order, sales_order_grid с помощью InstallSchemaInterface.
- Показать раскрывающийся список при оформлении заказа, заполненный соответствующими значениями.
То, на чем я застрял, на самом деле правильно сохраняет выбранное значение. В настоящее время он записывается в базу данных как 0. Я пытался следить за этим сообщением из более раннего вопроса SO, который у меня не сработал. Поиск такого рода вещей возвращает несколько других руководств, которые очень похожи на то, которое я связал, но мне тоже не удалось заставить их работать.
Код, который у меня есть, выглядит следующим образом: (заменил название компании на "Company"; опущены LayoutProcessor и InstallSchema, поскольку они работают правильно, чтобы не загромождать проблему слишком сильно).
приложение / код / Компания /InhouseCheckout/etc/config.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
</default>
</config>
приложение / код / Компания /InhouseCheckout/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\Block\Checkout\LayoutProcessor">
<plugin name="add-retailer-field"
type="Company\InhouseCheckout\Plugin\Checkout\LayoutProcessor" sortOrder="10"/>
</type>
<type name="Magento\Checkout\Model\ShippingInformationManagement">
<plugin name="save_in_quote" type="Company\InhouseCheckout\Plugin\Checkout\ShippingInformationManagementPlugin" sortOrder="10"/>
</type>
</config>
приложение / код / Компания /InhouseCheckout/etc/events.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_model_service_quote_submit_before">
<observer name="custom_fields_sales_address_save" instance="Company\InhouseCheckout\Observer\SaveCustomFieldsInOrder" />
</event>
</config>
приложение / код / Компания /InhouseCheckout/etc/extension_attributes.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
<attribute code="retailer" type="int"/>
</extension_attributes>
<extension_attributes for="Magento\Checkout\Api\Data\ShippingInformationInterface">
<attribute code="retailer" type="int"/>
</extension_attributes>
</config>
приложение / код / Компания /InhouseCheckout/etc/fieldset.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:DataObject/etc/fieldset.xsd">
<scope id="global">
<fieldset id="sales_convert_quote">
<field name="retailer">
<aspect name="to_order"/>
</field>
</fieldset>
</scope>
</config>
приложение / код / Компания /InhouseCheckout/etc/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="Company_InhouseCheckout" setup_version="1.0.0">
<sequence>
<module name="Magento_Store"/>
</sequence>
</module>
</config>
приложение / код / Компания /InhouseCheckout/Observer/SaveCustomFieldsInOrder.php
<?php
namespace Company\InhouseCheckout\Observer;
/**
* Class SaveCustomFieldsInOrder
*/
class SaveCustomFieldsInOrder implements \Magento\Framework\Event\ObserverInterface {
/**
* @param \Magento\Framework\Event\Observer $observer
* @return $this
*/
public function execute(\Magento\Framework\Event\Observer $observer){
$order = $observer->getEvent()->getOrder();
$quote = $observer->getEvent()->getQuote();
$order->setData("retailer", $quote->getRetailer());
return $this;
}
}
приложение / код / Компания / InhouseCheckout / Плагин / Проверка / ShippingInformationManagementPlugin.php:
<?php
namespace Company\InhouseCheckout\Plugin\Checkout;
class ShippingInformationManagementPlugin
{
protected $quoteRepository;
public function __construct(\Magento\Quote\Model\QuoteRepository $quoteRepository)
{
$this->quoteRepository = $quoteRepository;
}
/**
* @param SIMModel $subject
* @param $cartId
* @param ShippingInformationInterface $addressInformation
*/
public function beforeSaveAddressInformation(
\Magento\Checkout\Model\ShippingInformationManagement $subject,
$cartId,
\Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
): void {
$extAttributes = $addressInformation->getExtensionAttributes();
$retailer = $extAttributes->getRetailer();
$quote = $this->quoteRepository->getActive($cartId);
$quote->setRetailer($retailer);
}
}
app / code / Company / InhouseCheckout / view / frontend / requirejs-config.js:(указано дважды, потому что тема, которую мы используем, также переопределяет файл. Я проверил, что наше переопределение загружено с помощью веб-инспектора)
var config = {
"map": {
"*": {
"Magento_Checkout/js/model/shipping-save-processor/default" : "Company_InhouseCheckout/js/shipping-save-processor-default-override",
"Rokanthemes_OpCheckout/js/model/shipping-save-processor/default" : "Company_InhouseCheckout/js/shipping-save-processor-default-override"
}
}
};
Наконец, app / code / Company / InhouseCheckout / view / frontend / web / js является копией файла default.js с
payload
блок изменен, чтобы выглядеть следующим образом:
payload = {
addressInformation: {
shipping_address: quote.shippingAddress(),
billing_address: quote.billingAddress(),
shipping_method_code: quote.shippingMethod().method_code,
shipping_carrier_code: quote.shippingMethod().carrier_code,
extension_attributes: {
retailer: jQuery('[name="retailer"]').val()
}
}
};
Надеюсь, я предоставил достаточно информации.