コード例 #1
0
ファイル: Shipping.php プロジェクト: pavelnovitsky/magento2
 /**
  * Collect rates of given carrier
  *
  * @param string $carrierCode
  * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
  * @return $this
  */
 public function collectCarrierRates($carrierCode, $request)
 {
     /* @var $carrier \Magento\Shipping\Model\Carrier\AbstractCarrier */
     $carrier = $this->_carrierFactory->createIfActive($carrierCode, $request->getStoreId());
     if (!$carrier) {
         return $this;
     }
     $carrier->setActiveFlag($this->_availabilityConfigField);
     $result = $carrier->checkAvailableShipCountries($request);
     if (false !== $result && !$result instanceof \Magento\Sales\Model\Quote\Address\RateResult\Error) {
         $result = $carrier->proccessAdditionalValidation($request);
     }
     /*
      * Result will be false if the admin set not to show the shipping module
      * if the delivery country is not within specific countries
      */
     if (false !== $result) {
         if (!$result instanceof \Magento\Sales\Model\Quote\Address\RateResult\Error) {
             if ($carrier->getConfigData('shipment_requesttype')) {
                 $packages = $this->composePackagesForCarrier($carrier, $request);
                 if (!empty($packages)) {
                     $sumResults = array();
                     foreach ($packages as $weight => $packageCount) {
                         $request->setPackageWeight($weight);
                         $result = $carrier->collectRates($request);
                         if (!$result) {
                             return $this;
                         } else {
                             $result->updateRatePrice($packageCount);
                         }
                         $sumResults[] = $result;
                     }
                     if (!empty($sumResults) && count($sumResults) > 1) {
                         $result = array();
                         foreach ($sumResults as $res) {
                             if (empty($result)) {
                                 $result = $res;
                                 continue;
                             }
                             foreach ($res->getAllRates() as $method) {
                                 foreach ($result->getAllRates() as $resultMethod) {
                                     if ($method->getMethod() == $resultMethod->getMethod()) {
                                         $resultMethod->setPrice($method->getPrice() + $resultMethod->getPrice());
                                         continue;
                                     }
                                 }
                             }
                         }
                     }
                 } else {
                     $result = $carrier->collectRates($request);
                 }
             } else {
                 $result = $carrier->collectRates($request);
             }
             if (!$result) {
                 return $this;
             }
         }
         if ($carrier->getConfigData('showmethod') == 0 && $result->getError()) {
             return $this;
         }
         // sort rates by price
         if (method_exists($result, 'sortRatesByPrice') && is_callable([$result, 'sortRatesByPrice'])) {
             $result->sortRatesByPrice();
         }
         $this->getResult()->append($result);
     }
     return $this;
 }