J'ai ajouté le champ personnalisé déroulant sur la page de paiement avec des valeurs personnalisées. Cela fonctionne bien également enregistrer les valeurs d'attribut dans la base de données mais ne pas afficher dans l'adresse de livraison de la commande. Une idée comment le montrer?
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();
Brancher
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);
}
}
}
Le plugin ci-dessus fonctionne correctement et enregistre les valeurs dans la table quote_address. Je veux également afficher l'attribut personnalisé dans la page de vue de la commande et le modèle d'e-mail.Tout le monde a une idée du problème avec le code. Merci d'avance
magento2
checkout
module
shipping-address
Magento2 Devloper
la source
la source
Réponses:
Accédez à la configuration du système
Dans Modèles d'adresse, section Rechercher HTML, décochez la valeur système de la case à cocher, ajoutez le code suivant. vous pouvez changer un code d'attribut si besoin.
Pour le modèle d'e-mail, le même format d'adresse [format d'adresse HTML] fonctionnera.
Exécutez
php bin/magento cache:clean
sinon affiche.Un attribut s'affichera également sur la page d'affichage de la commande et dans l'e-mail de commande.
ci-dessus est affiché dans les deux adresses, mais si vous ne souhaitez afficher que les frais de port, vous devez mettre uniquement la valeur SMS dans le tableau des adresses de livraison (
sales_order_address and quote_address
) sans facturation, cela fonctionne correctement. Prendre plaisirVue de tableau -
Résultat -
la source
Essayez avec mon approche. Prise en compte du module tel que décrit dans la question.
Utilisé le même module affiché dans la question. pas de changement
Extension de référence installée à laquelle vous faites référence (extension SMS)
Accédez à la configuration du système
Dans Modèles d'adresse, section Rechercher HTML, décochez la valeur système de la case à cocher, ajoutez le code suivant. vous pouvez changer un code d'attribut si besoin.
Pour le modèle d'e-mail, le même format d'adresse [format d'adresse HTML] fonctionnera.
peut être nécessaire pour vider le cache.
Exécuter
php bin/magento cache:clean
sinon afficheUn attribut s'affichera également sur la page d'affichage de la commande et dans l'e-mail de commande.
la source
html_for_shipping
.Magento/sales/view/adminhtml/templates/order/view/info.phtml
, recherchez la$block->getFormattedAddress( $order->getShippingAddress() );
modification de la ligne ci-dessous$block->getFormattedShippingAddress( $order->getShippingAddress() );
dansinfo.php
Fichier, vous pouvez créer une nouvelle méthode uniquement pour le formatage de l'adresse de livraison. Vous pouvez changer le paramètre de la méthode de format 'html' en 'html_for_shipping', où 'html_for_shipping' sera votre nouvelle valeur de configuration système pour le format d'adresse d'expédition.Si l'attribut est enregistré correctement, vous devez ajouter l'attribut aux modèles d'adresse. Ceux-ci peuvent être trouvés dans
Vous pouvez ajouter à la fin quelque chose comme:
Selon le type de modèle, vous pouvez utiliser
<br/>
pour créer de nouvelles lignes.la source
Je ferais cela comme ceci: ajoutez-le à
quote
etsales_order
et travaillez les données à partir de là, utilisez le code suivant (essayez également d'utiliser des scripts UpgradeSchema si vous avez besoin de mettre à jour une table de base de données existante, InstallSchema devrait être utilisé pour de nouvelles tables de base de données)MISE À JOUR
Créez un mixin js comme suit:
dans
requirejs-config.js
le
set-shipping-information-mixin.js
Vous devriez également avoir un
extension_attributes.xml
inYour_Module/etc/
avec le code suivantapporter des modifications si nécessaire (code d'attribut, type, etc. cela ajoutera votre attribut personnalisé aux informations d'expédition
la source
di.xml
fichier?getShippingAddress()
fonction qui obtient tous les champs définis à l'adresse elle-même, c'est pourquoi j'ai ajouté ce code, il devrait ajouter votre attribut à l'adresse de livraison elle