Estoy haciendo un nuevo método de envío y necesito agregar una nueva columna para pagar las tarifas de envío. Los datos provendrían de la configuración del método de envío personalizado, por ejemplo, la descripción del método. O algún campo de entrada donde el cliente puede agregar información (los datos probablemente se guardarían entre comillas y luego en orden).
Probablemente la parte más fácil de todo es implementar una plantilla usando
Magento_Checkout/web/template/shipping.html
Solo necesita esto
<div data-bind="text: method.description"></div>
El problema es que no puedo entender cómo agregar datos personalizados. No es suficiente agregar esto:
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;
}
Los datos para html provienen de js rates (), que obtiene datos de 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>
Después de esto, hay muchos pasos mientras que algo realmente se recopila. encontré
Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()
parecía lo más prometedor, pero si trato de agregarle mi atributo, no pasa nada.
Entonces, mi pregunta es, si realmente hay una manera de agregar nuevos datos a las tarifas de envío. En M1 fue posible. Sería una locura si M2 no fuera posible.
Hay muchas razones por las cuales esto debería ser posible. Por ejemplo, si quisiera hacer un método de recoger en la tienda con múltiples tiendas desplegables o algo similar.
fuente
Respuestas:
Debe hacer esto agregando la descripción como un atributo de extensión como se muestra a continuación:
/etc/extension_attributes.xml debería ser así:
En el archivo etc / di.xml, agregue un complemento para anular modelToDataObject () en Magento \ Quote \ Model \ Cart \ ShippingMethodConverter como se muestra a continuación:
El archivo de complemento Vendor \ module \ Plugin \ Carrier \ Descripción.php debería ser así:
Después de todo esto, obtendrá esa descripción el viernes de la siguiente manera:
fuente
La respuesta mejor calificada no funciona porque olvidó establecer el valor de "descripción" dentro de la clase \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Si no creamos un complemento para establecer el valor de Descripción en esta clase, entonces $ rateModel-> getMethodDescription () siempre volverá vacío. Aquí hay una versión completa de la solución:
[Proveedor] / [Módulo] /etc/extension_attributes.xml
[Proveedor] / [Módulo] /etc/di.xml
[Proveedor] / [Módulo] /Plugin/Carrier/Description.php
Y finalmente:
[Proveedor] / [Módulo] /Plugin/Quote/Address/Rate.php
No olvide ejecutar bin / magento setup: di: compile, de lo contrario no se generará el atributo extendido.
Puede vincular los datos a su plantilla usando esto:
O como comentario, así:
Además, no olvide utilizar $ method-> setDescription ('Su descripción personalizada aquí') o $ method-> setData ('descripción', 'Su descripción personalizada aquí') dentro de su extensión Carrier personalizada (consulte la pregunta original para referencia).
fuente
Debe declarar los nombres de los métodos en el archivo de interfaz, la ruta para este archivo es
Ejemplo:
declarar constante en la parte superior
luego defina el método de la siguiente manera
Luego debe asignar valores al siguiente archivo
como sigue
fuente