Поле, добавленное в кассу 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()
        }
    }
};

Надеюсь, я предоставил достаточно информации.

0 ответов

Другие вопросы по тегам