Я использую WebShopApps_MatrixRates модуль на сайте Magento 2, и модуль настроен с одним методом доставки для региона и двумя другими методами доставки для некоторых городов в этом регионе.
Я установил форму «Смета налогов и стоимости доставки» на странице корзины, чтобы отобразить поля региона и города. предпочтение:
Magento\Checkout\Block\Cart\LayoutProcessor
public function process($jsLayout)
{
$elements = [
'city' => [
'visible' => true,
'formElement' => 'select',
'label' => __('City'),
'options' => $this->bcCitiesOptionsArray,
],
'country_id' => [
'visible' => false, //Remove the country
'formElement' => 'select',
'label' => __('Country'),
'options' => [],
'value' => null
],
'region_id' => [
'visible' => true,
'formElement' => 'select',
'label' => __('State/Province'),
'options' => [],
'value' => null
],
'postcode' => [
'visible' => false, //Remove Postal Code
'formElement' => 'input',
'label' => __('Zip/Postal Code'),
'value' => null
]
];
if (!isset($jsLayout['components']['checkoutProvider']['dictionaries'])) {
$jsLayout['components']['checkoutProvider']['dictionaries'] = [
'country_id' => $this->countryCollection->loadByStore()->toOptionArray(),
'region_id' => $this->regionCollection->addAllowedCountriesFilter()->toOptionArray(),
];
}
if (isset($jsLayout['components']['block-summary']['children']['block-shipping']['children']
['address-fieldsets']['children'])
) {
$fieldSetPointer = &$jsLayout['components']['block-summary']['children']['block-shipping']
['children']['address-fieldsets']['children'];
$fieldSetPointer = $this->merger->merge($elements, 'checkoutProvider', 'shippingAddress', $fieldSetPointer);
$fieldSetPointer['region_id']['config']['skipValidation'] = true;
}
return $jsLayout;
}
и когда я выбираю город двумя способами, загружается форма доставки с правильными методами и ценами.
Но после выбора метода параметр $ addressInformation передается в метод Calculate () в классе:
Magento\Checkout\Model\TotalsInformationManagement
public function calculate(
$cartId,
\Magento\Checkout\Api\Data\TotalsInformationInterface $addressInformation
) {
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->cartRepository->get($cartId);
$this->validateQuote($quote);
if ($quote->getIsVirtual()) {
$quote->setBillingAddress($addressInformation->getAddress());
} else {
$quote->setShippingAddress($addressInformation->getAddress());
$quote->getShippingAddress()->setCollectShippingRates(true)->setShippingMethod(
$addressInformation->getShippingCarrierCode() . '_' . $addressInformation->getShippingMethodCode()
);
}
$quote->collectTotals();
return $this->cartTotalRepository->get($cartId);
}
, которая не содержит информации о городе.
Из-за этого модуль MatrixRates загружает неправильный метод доставки из базы данных, и мы получаем два различных кода $ this-> getShippingMethod () и $ rate-> getGode () здесь:
Magento\Quote\Model\Quote\Address
public function requestShippingRates(\Magento\Quote\Model\Quote\Item\AbstractItem $item = null)
{
/** @var $request \Magento\Quote\Model\Quote\Address\RateRequest */
$request = $this->_rateRequestFactory->create();
$request->setAllItems($item ? [$item] : $this->getAllItems());
$request->setDestCountryId($this->getCountryId());
$request->setDestRegionId($this->getRegionId());
$request->setDestRegionCode($this->getRegionCode());
$request->setDestStreet($this->getStreetFull());
$request->setDestCity($this->getCity());
$request->setDestPostcode($this->getPostcode());
$request->setPackageValue($item ? $item->getBaseRowTotal() : $this->getBaseSubtotal());
$packageWithDiscount = $item ? $item->getBaseRowTotal() -
$item->getBaseDiscountAmount() : $this->getBaseSubtotalWithDiscount();
$request->setPackageValueWithDiscount($packageWithDiscount);
$request->setPackageWeight($item ? $item->getRowWeight() : $this->getWeight());
$request->setPackageQty($item ? $item->getQty() : $this->getItemQty());
/**
* Need for shipping methods that use insurance based on price of physical products
*/
$packagePhysicalValue = $item ? $item->getBaseRowTotal() : $this->getBaseSubtotal() -
$this->getBaseVirtualAmount();
$request->setPackagePhysicalValue($packagePhysicalValue);
$request->setFreeMethodWeight($item ? 0 : $this->getFreeMethodWeight());
/**
* Store and website identifiers specified from StoreManager
*/
$request->setQuoteStoreId($this->getQuote()->getStoreId());
$request->setStoreId($this->storeManager->getStore()->getId());
$request->setWebsiteId($this->storeManager->getWebsite()->getId());
$request->setFreeShipping($this->getFreeShipping());
/**
* Currencies need to convert in free shipping
*/
$request->setBaseCurrency($this->storeManager->getStore()->getBaseCurrency());
$request->setPackageCurrency($this->storeManager->getStore()->getCurrentCurrency());
$request->setLimitCarrier($this->getLimitCarrier());
$baseSubtotalInclTax = $this->getBaseSubtotalTotalInclTax();
$request->setBaseSubtotalInclTax($baseSubtotalInclTax);
$result = $this->_rateCollector->create()->collectRates($request)->getResult();
$found = false;
if ($result) {
$shippingRates = $result->getAllRates();
foreach ($shippingRates as $shippingRate) {
$rate = $this->_addressRateFactory->create()->importShippingRate($shippingRate);
if (!$item) {
$this->addShippingRate($rate);
}
if($this->getShippingMethod() === "_" && $this->getShippingMethod() === null){
$this->setShippingMethod($rate->getCode());
}
if ($this->getShippingMethod() == $rate->getCode()) {
if ($item) {
$item->setBaseShippingAmount($rate->getPrice());
} else {
/** @var \Magento\Store\Api\Data\StoreInterface */
$store = $this->storeManager->getStore();
$amountPrice = $store->getBaseCurrency()
->convert($rate->getPrice(), $store->getCurrentCurrencyCode());
$this->setBaseShippingAmount($rate->getPrice());
$this->setShippingAmount($amountPrice);
}
$found = true;
}
}
}
Это состояние
if ($this->getShippingMethod() == $rate->getCode()) {
if ($item) {
$item->setBaseShippingAmount($rate->getPrice());
} else {
/** @var \Magento\Store\Api\Data\StoreInterface */
$store = $this->storeManager->getStore();
$amountPrice = $store->getBaseCurrency()
->convert($rate->getPrice(), $store->getCurrentCurrencyCode());
$this->setBaseShippingAmount($rate->getPrice());
$this->setShippingAmount($amountPrice);
}
$found = true;
}
не выполнено и функция возвращает false
Это вызывает метод collectShippingRates () в классе
Magento\Quote\Model\Quote\Address
установить стоимость способа доставки на 0:
$found = $this->requestShippingRates();
if (!$found) {
$this->setShippingAmount(0)->setBaseShippingAmount(0)->setShippingMethod('')->setShippingDescription('');
}
Итак, как я могу добавить город к переменной $ shippingInformation ?