Я добавил раскрывающееся пользовательское поле на странице оформления заказа с пользовательскими значениями. Работает нормально, также сохраняет значения атрибутов в базе данных, но не отображает их в адресе доставки заказа. Есть идеи как это показать?
InstallSchema.php
$connection->addColumn(
$installer->getTable('quote_address'),
'mob_type',
[
'type' => \Magento\Framework\DB\Ddl\Table ::TYPE_TEXT,
'nullable' => true,
'default' => NULL,
'length' => 255,
'comment' => 'Mob Type'
]
);
$connection->addColumn(
$installer->getTable('sales_order_address'),
'mob_type',
[
'type' => \Magento\Framework\DB\Ddl\Table ::TYPE_TEXT,
'nullable' => true,
'default' => NULL,
'length' => 255,
'comment' => 'Mob Type'
]
);
$installer->endSetup();
Plugin
use Magento\Checkout\Block\Checkout\LayoutProcessor;
class MobPlugin
{
public function afterProcess(LayoutProcessor $subject, $jsLayout) {
$customAttributeCode = 'mob_type';
$customField = [
'component' => 'Magento_Ui/js/form/element/select',
'config' => [
'customScope' => 'shippingAddress.custom_attributes',
'template' => 'ui/form/field',
'elementTmpl' => 'ui/form/element/select',
'id' => 'drop-down',
],
'dataScope' => 'shippingAddress.custom_attributes.mob_type',
'label' => 'Mob Type',
'provider' => 'checkoutProvider',
'visible' => true,
'validation' => ['required-entry' => true],
'sortOrder' => 150,
'id' => 'drop-down',
'options' => [
[
'value' => 'local',
'label' => 'Local',
],
[
'value' => 'vip',
'label' => 'VIP',
]
]
];
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset']['children'][$customAttributeCode] = $customField;
return $jsLayout;
}
}
и т.д. / 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\ShippingInformationManagement">
<plugin name="save_custom_field" type="Namespace\CustomModule\Plugin\Checkout\SaveAddressInformation" />
</type>
</config>
SaveAddressInformation.php
class SaveAddressInformation
{
protected $quoteRepository;
public function __construct(
\Magento\Quote\Model\QuoteRepository $quoteRepository
) {
$this->quoteRepository = $quoteRepository;
}
/**
* @param \Magento\Checkout\Model\ShippingInformationManagement $subject
* @param $cartId
* @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
*/
public function beforeSaveAddressInformation(
\Magento\Checkout\Model\ShippingInformationManagement $subject,
$cartId,
\Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
) {
$shippingAddress = $addressInformation->getShippingAddress();
$shippingAddressExtensionAttributes = $shippingAddress->getExtensionAttributes();
if ($shippingAddressExtensionAttributes) {
$customField = $shippingAddressExtensionAttributes->getMobType();
$shippingAddress->setMobType($customField);
}
}
}
Выше плагин работает нормально и сохраняет значения в таблице quote_address. Я хочу отобразить пользовательский атрибут на странице просмотра заказа и шаблон электронной почты также. У каждого есть идея, что не так с кодом. заранее спасибо
magento2
checkout
module
shipping-address
Magento2 Devloper
источник
источник
Ответы:
Перейдите к Конфигурации системы
Из шаблонов адресов, раздела «Найти HTML», снимите флажок «системное значение» и добавьте следующий код. Вы можете изменить код атрибута, если это необходимо.
Для шаблона электронной почты будет работать тот же формат адреса [HTML Address format].
Беги
php bin/magento cache:clean
если не показывает.Атрибут будет отображаться на странице просмотра заказа и электронной почте заказа.
выше отображается в обоих адресах, но если вы хотите показать только при доставке, то вам нужно указать только значение SMS в таблице адресов доставки (
sales_order_address and quote_address
), не считая, что он работает нормально. наслаждатьсяПредставление таблицы -
Результат -
источник
Попробуйте с моим подходом. Принимая во внимание модуль, как описано в вопросе.
Использовал тот же модуль, показанный в вопросе. без изменений
Установленное ссылочное расширение, на которое вы ссылаетесь (расширение SMS)
Перейдите к Конфигурации системы
Из шаблонов адресов, раздела «Найти HTML», снимите флажок «системное значение» и добавьте следующий код. Вы можете изменить код атрибута, если это необходимо.
Для шаблона электронной почты будет работать тот же формат адреса [HTML Address format].
может потребоваться очистить кеш.
Беги
php bin/magento cache:clean
если не показываетАтрибут будет отображаться на странице просмотра заказа и электронной почте заказа.
источник
html_for_shipping
.Magento/sales/view/adminhtml/templates/order/view/info.phtml
, Найти ниже линии$block->getFormattedAddress( $order->getShippingAddress() );
изменения в$block->getFormattedShippingAddress( $order->getShippingAddress() );
Вinfo.php
файл, вы можете создать новый метод только для отправки адреса форматирования. Вы можете изменить параметр метода формата «html» на «html_for_shipping», где «html_for_shipping» будет вашим новым значением конфигурации системы для формата адреса доставки.Если атрибут сохранен правильно, вам нужно добавить атрибут в шаблоны адресов. Их можно найти в
Вы можете добавить в конце что-то вроде:
В зависимости от типа шаблона вы можете использовать
<br/>
для создания новых строк.источник
Я бы сделал это следующим образом: добавьте его в
quote
иsales_order
и обработайте данные оттуда, используя следующий код (также попробуйте использовать сценарии UpgradeSchema, если вам нужно обновить существующую таблицу БД, InstallSchema должна использоваться для новых таблиц БД)ОБНОВИТЬ
Создайте миксин js следующим образом:
в
requirejs-config.js
set-shipping-information-mixin.js
Также вы должны иметь
extension_attributes.xml
вYour_Module/etc/
со следующим кодомвносите изменения в случае необходимости (код атрибута, тип и т. д.), чтобы добавить пользовательский атрибут к информации о доставке
источник
di.xml
файле?getShippingAddress()
функцией, которая получает все поля, установленные для самого адреса, поэтому я добавил этот код, он должен добавить ваш атрибут к самому адресу доставки