Цитата |
---|
А с какими обновлениями должно было исправиться? |
Обновления для этого вряд ли вышли. Если коротко, то вот что я сделал, предварительно создав копию обработчика Почты России в /bitrix/php_interface/delivery_russianpost.php
Было:
Код |
---|
if ($arLocationTo["IS_RUSSIAN"] == "Y")
{
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY."=".urlencode($arConfig["category"]["VALUE"]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY_NAME."=".urlencode(GetMessage("SALE_DH_RUSSIANPOST_CONFIG_CATEGORY_".$arConfig["category"]["VALUE"]));
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE."=".urlencode($arProfile[$profile]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE_NAME.'='.urlencode(GetMessage("SALE_DH_RUSSIANPOST_".strtoupper($profile)));
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY."=643";
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY_NAME.'='.urlencode($GLOBALS['APPLICATION']->ConvertCharset('Российская Федерация', LANG_CHARSET, 'utf-8'));
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_WEIGHT."=".urlencode($arOrder["WEIGHT"]);
// price does not affect on half of delivery types. others have 3% or 4% insurance tax which is ignored here for caching and used later.
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=0";
/*if (!in_array($arConfig["category"]["VALUE"], array(26, 36, 16)))
{
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=".urlencode(round($arOrder["PRICE"]));
}
else
{
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=0";
}*/
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_ZIP."=".urlencode($arLocationTo["ZIP"][0]);
}
else
{
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY."=".urlencode($arConfig["category"]["VALUE"]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY_NAME."=".urlencode(GetMessage("SALE_DH_RUSSIANPOST_CONFIG_CATEGORY_".$arConfig["category"]["VALUE"]));
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE."=".urlencode($arProfile[$profile]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE_NAME.'='.urlencode(GetMessage("SALE_DH_RUSSIANPOST_".strtoupper($profile)));
$arCountry = CDeliveryRUSSIANPOST::__GetCountry($arLocationTo);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY."=".urlencode($arCountry["ID"]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY_NAME."=".urlencode($GLOBALS['APPLICATION']->ConvertCharset($arCountry["NAME"], LANG_CHARSET, 'utf-8'));
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_WEIGHT."=".urlencode($arOrder["WEIGHT"]);
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=0";
$arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_ZIP."=0";
}
|
А стало:
Код |
---|
$url = "http://".DELIVERY_RUSSIANPOST_SERVER.DELIVERY_RUSSIANPOST_SERVER_PAGE."?".implode("&", $arQuery);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$data1 = curl_exec($ch);
curl_close($ch);
$pattern = "/value=\"([0-9]+)\"/i";
preg_match_all($pattern,$data1,$arOut);
$post_data = "key=".$arOut[1][0];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
$data = curl_exec($ch); |
То есть, я через CURL подтягиваю ту же страницу, в ней приходится выполнять парсинг выдаваемой автозаполняемой формы и отправка её данных на прежний же URL
Ну и если не исправится - нужно проверить строки, используемые для парсинга и точной проверки данных (в самой шапке скрипта):
Код |
---|
define('DELIVERY_RUSSIANPOST_VALUE_CHECK_STRING', '<span id="TarifValue">');
define(
'DELIVERY_RUSSIANPOST_VALUE_CHECK_REGEXP_RUS',
'/<sup>\*<\/sup><\/td><td align="Right">*([0-9,]+)<\/td>/i'
);
define(
'DELIVERY_RUSSIANPOST_VALUE_CHECK_REGEXP',
'/<span id="TarifValue">*([0-9,]+)<\/span>/i'
);
|
Ибо код страницы на сайте Почты России несколько видоизменился.