Je crée une nouvelle méthode d'expédition et je dois ajouter une nouvelle colonne pour vérifier les tarifs d'expédition. Les données proviendraient de paramètres de méthode d'expédition personnalisés, par exemple la description de la méthode. Ou un champ de saisie où le client peut ajouter des informations (les données seront probablement enregistrées dans le devis et plus tard dans l'ordre).
Probablement la partie la plus simple de tous est d'implémenter un modèle en utilisant
Magento_Checkout/web/template/shipping.html
Il a juste besoin de ça
<div data-bind="text: method.description"></div>
Le problème est que je ne peux pas comprendre comment ajouter des données personnalisées. Il ne suffit pas d'ajouter ceci:
public function collectRates(RateRequest $request)
{
if (!$this->isActive()) return false;
$method = $this->rateMethodFactory->create();
$method->setData('carrier', $this->getCarrierCode());
$method->setData('carrier_title', $this->getConfigData('title'));
$method->setData('method_title', $this->getConfigData('title'));
$method->setData('method', $this->getCarrierCode());
$method->setPrice($this->_price);
$method->setData('cost', $this->_price);
// custom
$method->setData('description', $this->getConfigData('description'));
$result = $this->rateResultFactory->create();
$result->append($method);
return $result;
}
Les données html proviennent de js rates (), qui obtient les données de l'API:
<route url="/V1/carts/:cartId/shipping-methods" method="GET">
<service class="Magento\Quote\Api\ShippingMethodManagementInterface" method="getList"/>
<resources>
<resource ref="Magento_Cart::manage" />
</resources>
</route>
Après cela, il y a de nombreuses étapes pendant que quelque chose est collecté. j'ai trouvé
Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()
qui avait l'air le plus prometteur mais si j'essaye d'y ajouter mon attribut, rien ne se passe.
Ma question est donc la suivante: s'il existe réellement un moyen d'ajouter de nouvelles données aux tarifs d'expédition? En M1, c'était possible. Ce serait fou si M2 ce n'était pas possible.
Il existe de nombreuses raisons pour lesquelles cela devrait être possible. Par exemple, si je voulais faire la méthode de ramassage en magasin avec plusieurs magasins déroulants ou quelque chose de similaire.
Réponses:
Vous devez le faire en ajoutant la description en tant qu'attribut d'extension comme ci-dessous:
/etc/extension_attributes.xml devrait ressembler à ceci:
Dans le fichier etc / di.xml, ajoutez un plugin pour remplacer modelToDataObject () dans Magento \ Quote \ Model \ Cart \ ShippingMethodConverter comme ci-dessous:
Le fichier du plugin Vendor \ module \ Plugin \ Carrier \ Description.php devrait être comme ceci:
Après tout cela, vous obtiendrez cette description sur fronend comme ci-dessous:
la source
La réponse la mieux notée ne fonctionne pas car il a oublié de définir la valeur "description" à l'intérieur de la classe \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Si nous ne créons pas de plugin pour définir la valeur Description sur cette classe, alors $ rateModel-> getMethodDescription () sera toujours retourné vide. Voici une version complète de la solution:
[Fournisseur] / [Module] /etc/extension_attributes.xml
[Fournisseur] / [Module] /etc/di.xml
[Fournisseur] / [Module] /Plugin/Carrier/Description.php
Et enfin:
[Fournisseur] / [Module] /Plugin/Quote/Address/Rate.php
N'oubliez pas d'exécuter la configuration bin / magento: di: compile, sinon l'attribut étendu ne sera pas généré.
Vous pouvez lier les données à votre modèle en utilisant ceci:
Ou comme un commentaire, comme ceci:
N'oubliez pas non plus d'utiliser $ method-> setDescription ('Your Custom Description Here') ou $ method-> setData ('description', 'Your custom Description Here') à l' intérieur de votre extension Carrier personnalisée (regardez la question d'origine pour référence).
la source
Vous devez déclarer les noms de méthode dans le fichier d'interface, le chemin de ce fichier est
Exemple:
déclarer une constante en haut
puis définissez la méthode comme suit
Ensuite, vous devez attribuer des valeurs au fichier suivant
comme suit
la source