Dodałem rozwijane pole niestandardowe na stronie kasy z wartościami niestandardowymi. Działa dobrze, a także zapisuje wartości atrybutów w bazie danych, ale nie wyświetla się w adresie wysyłki zamówienia. Masz pomysł, jak to pokazać?
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();
Podłącz
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;
}
}
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\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);
}
}
}
Powyższa wtyczka działa dobrze i zapisuje wartości w tabeli quote_address. Chcę również wyświetlić niestandardowy atrybut w widoku strony i szablonie wiadomości e-mail. Każdy ma pojęcie, co jest nie tak z kodem. Z góry dziękuję
magento2
checkout
module
shipping-address
Magento2 Devloper
źródło
źródło
Odpowiedzi:
Przejdź do konfiguracji systemu
Z szablonów adresów, sekcji Znajdź HTML, odznacz wartość systemową pola wyboru, dodaj następujący kod. w razie potrzeby możesz zmienić kod atrybutu.
W przypadku szablonu wiadomości e-mail działa ten sam format adresu [Format adresu HTML].
Uruchom,
php bin/magento cache:clean
jeśli nie pokazuje.Atrybut pojawi się na stronie widoku zamówienia i e-mailu zamówienia.
powyższe jest wyświetlane w obu adresach, ale jeśli chcesz wyświetlać tylko w wysyłce, musisz wstawić tylko wartość SMS w tabeli adresów wysyłki (
sales_order_address and quote_address
), aby nie naliczać opłat, działa poprawnie. Cieszyć sięWidok tabeli -
Wynik -
źródło
Spróbuj z moim podejściem. Biorąc pod uwagę moduł opisany w pytaniu.
Użyłem tego samego modułu pokazanego w pytaniu. brak zmiany
Zainstalowane rozszerzenie referencyjne, którego dotyczysz (rozszerzenie SMS)
Przejdź do konfiguracji systemu
Z szablonów adresów, sekcji Znajdź HTML, odznacz wartość systemową pola wyboru, dodaj następujący kod. w razie potrzeby możesz zmienić kod atrybutu.
W przypadku szablonu wiadomości e-mail ten sam format adresu [format adresu HTML] będzie działał.
może być wymagane do wyczyszczenia pamięci podręcznej.
Uruchom,
php bin/magento cache:clean
jeśli nie pokazujeAtrybut pojawi się na stronie widoku zamówienia i e-mailu zamówienia.
źródło
html_for_shipping
.Magento/sales/view/adminhtml/templates/order/view/info.phtml
, znajdź poniżej$block->getFormattedAddress( $order->getShippingAddress() );
zmiany linii na$block->getFormattedShippingAddress( $order->getShippingAddress() );
Winfo.php
pliku, możesz utworzyć nową metodę tylko dla formatowania adresu wysyłki. Możesz zmienić parametr metody formatu „html” na „html_for_shipping”, gdzie „html_for_shipping” będzie nową wartością konfiguracji systemu dla formatu adresu wysyłki.Jeśli atrybut jest zapisany poprawnie, musisz dodać atrybut do szablonów adresów. Można je znaleźć w
Możesz dodać na końcu coś takiego:
W zależności od typu szablonu można użyć
<br/>
do utworzenia nowych linii.źródło
Zrobiłbym to w ten sposób: dodaj go do
quote
isales_order
działaj dane stamtąd użyj następującego kodu (spróbuj także użyć skryptów UpgradeSchema, jeśli chcesz zaktualizować istniejącą tabelę DB, w nowych tabelach DB należy użyć InstallSchema)AKTUALIZACJA
Utwórz mixin js w następujący sposób:
w
requirejs-config.js
set-shipping-information-mixin.js
Ponadto należy mieć
extension_attributes.xml
naYour_Module/etc/
z następującym kodemw razie potrzeby wprowadź zmiany (kod atrybutu, typ itp.), aby dodać niestandardowy atrybut do informacji o wysyłce
źródło
di.xml
pliku?getShippingAddress()
funkcją, która ustawia wszystkie pola ustawione na sam adres, dlatego dodałem ten kod, powinien on dodać twój atrybut do samego adresu wysyłki