Я недавно видел несколько вопросов о FedEx Magento и скорости.
Я не уверен, что задержка вызвана запросом FedEx, но чтобы помочь нам разобраться (и ответить на ваши вопросы):
Код, который отправляет запросы:
//file: app/code/core/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: _getQuotes()
protected function _getQuotes()
{
$this->_result = Mage::getModel('shipping/rate_result');
// make separate request for Smart Post method
$allowedMethods = explode(',', $this->getConfigData('allowed_methods'));
if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
$response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
$preparedSmartpost = $this->_prepareRateResponse($response);
if (!$preparedSmartpost->getError()) {
$this->_result->append($preparedSmartpost);
}
}
// make general request for all methods
$response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
$preparedGeneral = $this->_prepareRateResponse($response);
if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
$this->_result->append($preparedGeneral);
}
return $this->_result;
}
Итак, ОТВЕТ 1: да, Magento собирает все методы, независимо от того, какие методы вы разрешили через администратора. Он делает это двумя запросами, один для SMARTPOST и один для всех остальных методов.
ОТВЕТ 2: Если вы хотите запросить один тип службы, вы пытаетесь установить, например,
$ratesRequest['RequestedShipment']['ServiceType'] = 'INTERNATIONAL_ECONOMY';
Для тестирования* вы можете скопировать файл из
//file: app/code/core/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
to
//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
а затем измените код на:
//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: _getQuotes()
protected function _getQuotes()
{
$this->_result = Mage::getModel('shipping/rate_result');
// make separate request for Smart Post method
$allowedMethods = explode(',', $this->getConfigData('allowed_methods'));
//a little test code for me; you can omit it
//echo(nl2br(print_r($allowedMethods,true)));
//exit();
/*
Array<br />
(<br />
[0] => EUROPE_FIRST_INTERNATIONAL_PRIORITY<br />
[1] => FEDEX_1_DAY_FREIGHT<br />
[2] => FEDEX_2_DAY_FREIGHT<br />
[3] => FEDEX_2_DAY<br />
[4] => FEDEX_2_DAY_AM<br />
[5] => FEDEX_3_DAY_FREIGHT<br />
[6] => FEDEX_EXPRESS_SAVER<br />
[7] => FEDEX_GROUND<br />
[8] => FIRST_OVERNIGHT<br />
[9] => GROUND_HOME_DELIVERY<br />
[10] => INTERNATIONAL_ECONOMY<br />
[11] => INTERNATIONAL_ECONOMY_FREIGHT<br />
[12] => INTERNATIONAL_FIRST<br />
[13] => INTERNATIONAL_GROUND<br />
[14] => INTERNATIONAL_PRIORITY<br />
[15] => INTERNATIONAL_PRIORITY_FREIGHT<br />
[16] => PRIORITY_OVERNIGHT<br />
[17] => SMART_POST<br />
[18] => STANDARD_OVERNIGHT<br />
[19] => FEDEX_FREIGHT<br />
[20] => FEDEX_NATIONAL_FREIGHT<br />
)<br />
*/
//THIS IS THE NEW BIT (non core)
if(count($allowedMethods)==1){
//then there is only one method so use it
$response = $this->_doRatesRequest($allowedMethods[0]);
$preparedSingleRate = $this->_prepareRateResponse($response);
if (!$preparedSingleRate->getError() || ($this->_result->getError() && $preparedSingleRate->getError())) {
$this->_result->append($preparedSingleRate);
}
}else{
//revert to default treatment:
if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
$response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
$preparedSmartpost = $this->_prepareRateResponse($response);
if (!$preparedSmartpost->getError()) {
$this->_result->append($preparedSmartpost);
}
}
// make general request for all methods
$response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
$preparedGeneral = $this->_prepareRateResponse($response);
if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
$this->_result->append($preparedGeneral);
}
}
return $this->_result;
}
И отредактируйте конец функции _formRateRequest
в том же файле, чтобы справиться с конкретной целью запроса скорости:
//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: formRateRequest()
protected function _formRateRequest($purpose)
{
$r = $this->_rawRequest;
//...
//...
if ($purpose == self::RATE_REQUEST_GENERAL) {
$ratesRequest['RequestedShipment']['RequestedPackageLineItems'][0]['InsuredValue'] = array(
'Amount' => $r->getValue(),
'Currency' => $this->getCurrencyCode()
);
} else if ($purpose == self::RATE_REQUEST_SMARTPOST) {
$ratesRequest['RequestedShipment']['ServiceType'] = self::RATE_REQUEST_SMARTPOST;
$ratesRequest['RequestedShipment']['SmartPostDetail'] = array(
'Indicia' => ((float)$r->getWeight() >= 1) ? 'PARCEL_SELECT' : 'PRESORTED_STANDARD',
'HubId' => $this->getConfigData('smartpost_hubid')
);
} else { //THIS IS THE NEW BIT (non core)
$ratesRequest['RequestedShipment']['RequestedPackageLineItems'][0]['InsuredValue'] = array(
'Amount' => $r->getValue(),
'Currency' => $this->getCurrencyCode()
);
$ratesRequest['RequestedShipment']['ServiceType'] = $purpose;
}
return $ratesRequest;
}//end function _formRateRequest
это должно принести именно ту скорость, которую вы хотите. Но это может не решить ваши проблемы со скоростью.
Вы можете запустить временные тесты, добавив несколько таймеров и журналирование (в var/log/shipping_fedex.log
) следующим образом:
//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function:
protected function _getQuotes()
{
$this->_result = Mage::getModel('shipping/rate_result');
// make separate request for Smart Post method
$allowedMethods = explode(',', $this->getConfigData('allowed_methods'));
//THIS IS THE NEW BIT (non core)
if(count($allowedMethods)==1){
//then there is only one method so use it
$time_start = microtime(true);
$response = $this->_doRatesRequest($allowedMethods[0]);
$preparedSingleRate = $this->_prepareRateResponse($response);
if (!$preparedSingleRate->getError() || ($this->_result->getError() && $preparedSingleRate->getError())) {
$this->_result->append($preparedSingleRate);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$this->_debug('Polled '.$allowedMethods[0].' in '.$time.' seconds');
}else{
//revert to default treatment:
$time_start = microtime(true);
if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
$response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
$preparedSmartpost = $this->_prepareRateResponse($response);
if (!$preparedSmartpost->getError()) {
$this->_result->append($preparedSmartpost);
}
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$this->_debug('Polled SMART_POST in '.$time.' seconds');
// make general request for all methods
$time_start = microtime(true);
$response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
$preparedGeneral = $this->_prepareRateResponse($response);
if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
$this->_result->append($preparedGeneral);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$this->_debug('Polled all methods in '.$time.' seconds');
}
return $this->_result;
}
Я захожу в песочницу FedEx, но для того, чтобы это стоило, я записываю эти тайминги в файл журнала:
//file: var/log/shipping_fedex.log
Polled SMART_POST in 1.1807501316071 seconds
Polled SMART_POST in 1.3307409286499 seconds
Polled all methods in 0.78275394439697 seconds //returns warning 556 [Message] => There are no valid services available.
Polled all methods in 2.0135650634766 seconds //returns 8 valid shipping methods
Polled all methods in 1.3563330173492 seconds //returns INTERNATIONAL_ECONOMY and INTERNATIONAL_PRIORITY
//single service request results
Polled FEDEX_2_DAY in 3.1365180015564 seconds
Polled FEDEX_2_DAY in 3.6471431255341 seconds
Polled FEDEX_2_DAY in 2.1428818702698 seconds
Polled INTERNATIONAL_ECONOMY in 2.2340540885925 seconds
Polled INTERNATIONAL_ECONOMY in 2.9664940834045 seconds
Так что загрузите свои файлы с таймерами и дайте нам знать, что вы получите.
*для продакшна здесь, конечно, принято говорить "сделай свой собственный модуль, который расширяет класс Mage_Usa_Model_Shipping_Carrier_Fedex
".
**Примечания. Мне пришлось указать код валюты, отправленный в запросе на «USD
», чтобы заставить FedEx возвращать любые тарифы на доставку для типов услуг, отличных от SMART_POST, поэтому, если вы тестируете эту вещь, обратите внимание на это.
person
Malachy
schedule
09.04.2014