Скопіюйте власні дані з котирування на замовлення та замовлення, як тільки замовлення розміщено в magento2


15

Я будую користувальницький модуль в magento 2, на який є спеціальна знижка. Я намагаюся скопіювати знижку з котирування, пункту цитати на замовлення та замовлення. У магенто 1 я заявляю config.xmlтак:

<fieldsets>
    <sales_convert_quote_address>
        <custom_discount_amount><to_order>*</to_order></custome_discount_amount>
        <base_custom_discount_amount><to_order>*</to_order></base_custome_discount_amount>
    </sales_convert_quote_address>
    <sales_convert_quote_item>
        <custome_discount_amount><to_order_item>*</to_order_item></custome_discount_amount>
        <base_custom_discount_amount><to_order_item>*</to_order_item></base_custom_discount_amount>
    </sales_convert_quote_item>
</fieldsets> 

і моя власна сума знижок була скопійована в таблиці: sales_flat_orderі sales_flat_order_itemяк очікувалося.

У Magento 2 я створив ім'я файлу: fieldset.xmlз цим кодом:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
<scope id="global">
    <fieldset id="sales_convert_quote_item">
        <field name="custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
    </fieldset>         
      <fieldset id="sales_convert_quote_address">
        <field name="custom_discount_amount">
            <aspect name="to_order" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order" />
        </field>
    </fieldset>   
</scope>

але успіху немає. Що ще мені потрібно зробити в Magento 2, щоб він працював? Ви можете, будь ласка, допомогти мені?

Відповіді:


7

Здається, набори полів уже не є варіантом переміщення спеціальних полів даних. Не ясно, чи це навмисне чи побічна дія інших змін.

Я просто зіткнувся з тією ж проблемою з платежами. Я простежив це назад до \Magento\Quote\Model\Quote\Payment\ToOrderPayment::convert():

public function convert(Payment $object, $data = [])
{
    $paymentData = $this->objectCopyService->getDataFromFieldset(
        'quote_convert_payment',
        'to_order_payment',
        $object
    );

    $orderPayment = $this->orderPaymentFactory->create();
    $this->dataObjectHelper->populateWithArray(
        $orderPayment,
        array_merge($paymentData, $data),
        '\Magento\Sales\Api\Data\OrderPaymentInterface'
    );
    $orderPayment->setAdditionalInformation(
        array_merge(
            $object->getAdditionalInformation(),
            [Substitution::INFO_KEY_TITLE => $object->getMethodInstance()->getTitle()]
        )
    );
    // set directly on the model
    $orderPayment->setCcNumber($object->getCcNumber());
    $orderPayment->setCcCid($object->getCcCid());

    return $orderPayment;
}

Вона починається з обробки Fieldset для копіювання даних з $objectв $paymentDataмасив, але потім подає цей масив в \Magento\Framework\Api\DataObjectHelper::populateWithArray()фактично встановити значення на цільовому об'єкті (тут $orderPayment).

Замість того, щоб безпосередньо додавати масив даних до об'єкта, як у Magento 1, DataObjectHelperшукає методи 'set__' або 'setIs__', що відповідають кожній клавіші, а потім викликає ці методи зі значенням. Якщо такого методу не існує, ключ даних повністю пропускається.

Адреси та елементи цитат обробляються однаково, відповідно \Magento\Quote\Model\Quote\Address\ToOrderAddressі \Magento\Quote\Model\Quote\Item\ToOrderItemвідповідно.

Що це означає?

  1. Додавання ключа до набору полів недостатньо, якщо тільки на об'єкті, що відповідає цьому ключу, вже існує метод набору.
  2. Виявляється, що для копіювання користувальницьких полів з котирування на замовлення потрібно буде або переосмислити цільовий клас, щоб додати необхідний метод встановлення (через введення залежності), або використовувати спостерігачів, які sales_model_service_quote_submit_beforeхочуть копіювати дані вручну.

Також зауважте, що модуль цитування має свої власні набори полів, включаючи quote_convert_addressта quote_convert_item. Не видається, що набори sales_convert_quote * вже використовуються.


: - Я заплутався у вашій відповіді, я щойно під стоячи переміщенням даних від цитати до замовлення було видалено в magebnto2, то як це зробити для моїх користувацьких полів? Чи можете ви опублікувати код, у своїй відповіді я дав виправлення основної проблеми magento (перевірте мою відповідь вище), чи є у вас якесь інше рішення для цього питання?
Pradeep Kumar

Ви отримали якесь рішення
jibin george

5

Перетворення продажів Magento2 з котирування на замовлення, і його товар не працює
цитата Перетворити модель на пропозицію, і її товар переміщено з модуля продажу в модуль котирування в Magento2, але його не працює

<fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset> 

конвертувати з замовлення та замовлення на рахунок-фактуру, відвантаження та Creditmemo працює добре в Magento2

нижче - виправлення конвертування котирування на замовлення в magento2. Ще потрібно записати подію, щоб перемістити все подане значення з цитати до таблиці замовлення magento2a \ app \ code \ Sugarcode \ Test \ тощо \ fieldset.xml

    <?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset>         
        <fieldset id="sales_convert_order">
            <field name="custom_field">
                <aspect name="to_quote" />
                <aspect name="to_invoice" />
                <aspect name="to_shipment" />
                <aspect name="to_cm" />
            </field>
        </fieldset>        
        <fieldset id="sales_convert_order_item">
            <field name="custom_sku">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>            
        </fieldset>
    </scope>
</config>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php (рядок № 428)

раніше

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

у функції submitQuote () додати код нижче

$order=$this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData);

зміна додатка \ код \ Magento \ Цитата \ Модель \ Цитата \ Елемент \ ToOrderItem.php (посилання немає біля 78)

після

$orderItem = $this->orderItemFactory->create();

у функцію convert () додати код нижче

$this->objectCopyService->copyFieldsetToTarget('quote_convert_item', 'to_order_item', $item, $orderItem);

це буде добре працювати, але
переконайтесь, що я згадую вище fieldset.xml повинен бути там у вашому користувальницькому модулі, а також ви повинні написати подію, щоб встановити атрибут продукту, як тільки продукт буде доданий у кошик, як у magento1.x, а також слід встановити власні подані у таблиці цін, тоді вона копіюватиме з цитати та предмета на замовлення та його товар


Прадепі. Це все ще не підтримується?
awavi

0

Я розглядав це, і в модулі Magento \ GiftMessage також відбувається перетворення полів (fieldset.xml):

<fieldset id="sales_convert_quote_address">
    <field name="gift_message_id">
        <aspect name="to_order" />
    </field>
</fieldset>

Те, як вони додають його до замовлення, відбувається через спостерігач (Observer / SalesEventQuoteSubmitBeforeObserver.php, зареєстрований у etc / frontend / events.xml):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

Отже, я думаю, це є можливим варіантом для розгляду.


Можливо, щоб Magento 2 автоматично копіював значення для замовлень, платежів тощо, використовуючи атрибути розширення. Однак для створення атрибутів розширення для order_items потрібні спеціальні спостерігачі, щоб обробляти завантаження та збереження даних до об'єктів quo_item та order_item. Через це набагато простіше дотримуватися запропонованого вище підходу, щоб додати стовпець до відповідних таблиць і використовувати єдиний метод спостерігача для копіювання даних поперек. На жаль, Magento намагаються зробити розширюваність у v2 настільки гнучкою, що для того, щоб зробити це вартим нашого часу, потрібно занадто багато котла.
Роберт Еггінтон

@ epson121: чи можете ви поділитися своїми подіями.xml у цьому випадку?
Ipsita Rout

@IpsitaRout ви можете перевірити код Magento за замовчуванням (додаток / код / ​​Magento / GiftMessage / тощо / frontend / events.xml) або перевірити цей уривок: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.