I'm making new shipping method and I need to add new column to checkout shipping rates. Data would come from custom shipping method settings, for example method description. Or some input field where customer can add info (data probably would be saved in quote and later in order).
Probably the easiest part of all is implement template by using
Magento_Checkout/web/template/shipping.html
It just needs this
<div data-bind="text: method.description"></div>
Problem is I can't figure out how to add custom data. It's not enough to add this:
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;
}
Data for html comes from js rates(), which gets data from 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>
After this there are many steps while something actually gets collected.
I found
Magento\Quote\Model\Cart\ShippingMethodConverter modelToDataObject()
that looked the most promising but if I try to add my attribute to it, nothing happens.
So my question is, if there actually is a way to add new data to shipping rates? In M1 it was possible. It would be crazy if M2 it wasn't possible.
There are many reasons why this should be possible. For example if I wanted to make pick up in store method with multiple stores drop down or something similar.
Best Answer
The top-rated answer doesn't work because he forgot to set the "description" value inside of the \Magento\Quote\Model\Quote\Address\Rate class. If we do not create a Plugin to set the Description value on this class, then $rateModel->getMethodDescription() will always return empty. Here is a full-working version of the solution:
[Vendor]/[Module]/etc/extension_attributes.xml
[Vendor]/[Module]/etc/di.xml
[Vendor]/[Module]/Plugin/Carrier/Description.php
And finally:
[Vendor]/[Module]/Plugin/Quote/Address/Rate.php
Do not forget to run bin/magento setup:di:compile, otherwise the extended attribute won't be generated.
You can bind the data to your template using this:
Or as a comment, like this:
Also do not forget to use $method->setDescription('Your Custom Description Here') or $method->setData('description', 'Your custom Description Here') inside of your custom Carrier extension (look at the original question for reference).