Estou criando um novo método de envio e preciso adicionar uma nova coluna às taxas de envio da finalização da compra. Os dados viriam de configurações personalizadas do método de envio, por exemplo, descrição do método. Ou algum campo de entrada em que o cliente pode adicionar informações (os dados provavelmente seriam salvos em cotação e posteriormente em ordem).
Provavelmente, a parte mais fácil de tudo é implementar modelo usando
Magento_Checkout/web/template/shipping.html
Só precisa disso
<div data-bind="text: method.description"></div>
O problema é que não consigo descobrir como adicionar dados personalizados. Não basta adicionar isso:
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;
}
Os dados para html são provenientes de js rates (), que obtém dados da 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>
Depois disso, existem muitas etapas enquanto algo é coletado. eu encontrei
Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()
isso parecia o mais promissor, mas se eu tentar adicionar meu atributo a ele, nada acontece.
Então, minha pergunta é: se existe realmente uma maneira de adicionar novos dados às taxas de remessa? No M1 foi possível. Seria louco se M2 não fosse possível.
Existem muitas razões pelas quais isso deve ser possível. Por exemplo, se eu quisesse usar o método pick in store com várias lojas suspensas ou algo semelhante.
fonte
Respostas:
Você precisa fazer isso adicionando descrição como um atributo de extensão, como abaixo:
/etc/extension_attributes.xml deve ser assim:
No arquivo etc / di.xml, adicione um plug-in para substituir modelToDataObject () em Magento \ Quote \ Model \ Cart \ Shipping \ ShippingMethodConverter como abaixo:
O arquivo de plug-in Vendor \ module \ Plugin \ Carrier \ Description.php deve ser assim:
Depois de tudo isso, você receberá essa descrição como abaixo:
fonte
A resposta com a melhor classificação não funciona porque ele esqueceu de definir o valor "description" dentro da classe \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Se não criarmos um plug-in para definir o valor Descrição nessa classe, $ rateModel-> getMethodDescription () sempre retornará vazio. Aqui está uma versão completa da solução:
[Fornecedor] / [Módulo] /etc/extension_attributes.xml
[Fornecedor] / [Módulo] /etc/di.xml
[Fornecedor] / [Módulo] /Plugin/Carrier/Description.php
E finalmente:
[Fornecedor] / [Módulo] /Plugin/Quote/Address/Rate.php
Não se esqueça de executar o bin / magento setup: di: compile, caso contrário o atributo estendido não será gerado.
Você pode vincular os dados ao seu modelo usando este:
Ou como um comentário, como este:
Também não se esqueça de usar $ method-> setDescription ('Sua descrição personalizada aqui') ou $ method-> setData ('description', 'Sua descrição personalizada aqui') dentro de sua extensão de operadora personalizada (consulte a pergunta original para referência).
fonte
Você precisa declarar os nomes dos métodos no arquivo de interface, o caminho para este arquivo é
Exemplo:
declarar constante na parte superior
defina o método da seguinte maneira
Então você precisa atribuir valores ao seguinte arquivo
do seguinte modo
fonte