Ich habe das benutzerdefinierte Dropdown-Feld auf der Checkout-Seite mit benutzerdefinierten Werten hinzugefügt. Es funktioniert gut, auch Attributwerte in der Datenbank zu speichern, aber nicht in der Lieferadresse der Bestellung anzuzeigen. Irgendeine Idee, wie man es zeigt?
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;
}
}
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);
}
}
}
Das obige Plugin funktioniert einwandfrei und speichert die Werte in der Tabelle quote_address. Ich möchte auch benutzerdefinierte Attribute in der Bestellansicht und der E-Mail-Vorlage anzeigen. Jeder hat eine Idee, was mit dem Code nicht stimmt. Danke im Voraus
magento2
checkout
module
shipping-address
Magento2 Entwickler
quelle
quelle
Antworten:
Navigieren Sie zur Systemkonfiguration
Deaktivieren Sie unter Adressvorlagen, HTML-Abschnitt suchen das Kontrollkästchen Systemwert, und fügen Sie folgenden Code hinzu. Sie können bei Bedarf einen Attributcode ändern.
Für die E-Mail-Vorlage funktioniert dasselbe Adressformat [HTML-Adressformat].
Ausführen,
php bin/magento cache:clean
wenn nicht angezeigt.Ein Attribut wird auch auf der Bestellansichtsseite und der Bestell-E-Mail angezeigt.
Die obige Adresse wird in beiden Adressen angezeigt, aber wenn Sie nur im Versand anzeigen möchten, müssen Sie nur den SMS-Wert in die Versandadressentabelle (
sales_order_address and quote_address
) eingeben, damit die Abrechnung funktioniert. GenießenTabellenansicht -
Ergebnis -
quelle
Versuche es mit meinem Ansatz. Berücksichtigung Modul wie in der Frage beschrieben.
Verwendet das gleiche Modul wie in der Frage. Keine Änderung
Installierte Referenzerweiterung, auf die Sie verweisen (SMS-Erweiterung)
Navigieren Sie zur Systemkonfiguration
Deaktivieren Sie unter Adressvorlagen, HTML-Abschnitt suchen das Kontrollkästchen Systemwert, und fügen Sie folgenden Code hinzu. Sie können bei Bedarf einen Attributcode ändern.
Für die E-Mail-Vorlage funktioniert dasselbe Adressformat [HTML-Adressformat].
Möglicherweise muss der Cache geleert werden.
Ausführen,
php bin/magento cache:clean
wenn nicht angezeigtEin Attribut wird auch auf der Bestellansichtsseite und der Bestell-E-Mail angezeigt.
quelle
html_for_shipping
.Magento/sales/view/adminhtml/templates/order/view/info.phtml
finden Sie unter$block->getFormattedAddress( $order->getShippingAddress() );
Zeilenwechsel zu$block->getFormattedShippingAddress( $order->getShippingAddress() );
Ininfo.php
Datei. Sie können eine neue Methode nur für die Versandadressenformatierung erstellen. Sie können den Parameter der Formatmethode 'html' in 'html_for_shipping' ändern, wobei 'html_for_shipping' Ihr neuer Systemkonfigurationswert für das Versandadressenformat ist.Wenn das Attribut korrekt gespeichert wurde, müssen Sie das Attribut zu Adressvorlagen hinzufügen. Diese finden Sie in
Sie können am Ende etwas hinzufügen wie:
Abhängig vom Vorlagentyp können Sie
<br/>
neue Linien erstellen.quelle
Ich würde das so machen: Füge es dem
quote
und hinzusales_order
und bearbeite die Daten von dort mit dem folgenden CodeAKTUALISIEREN
Erstellen Sie ein Mixing wie folgt:
im
requirejs-config.js
das
set-shipping-information-mixin.js
Außerdem solltest du einen
extension_attributes.xml
inYour_Module/etc/
mit folgendem Code habenNehmen Sie bei Bedarf Änderungen vor (Attributcode, Typ usw.). Dadurch wird Ihr benutzerdefiniertes Attribut zu den Versandinformationen hinzugefügt
quelle
di.xml
Datei definiert hast ?getShippingAddress()
Funktion angezeigt, die alle Felder auf die Adresse selbst setzt. Deshalb habe ich diesen Code hinzugefügt. Er sollte Ihr Attribut der Versandadresse selbst hinzufügen