Определение местоположения при оформления заказа

Рейтинг: 15.2815  
На голосовании
Предложил Пользователь 125664 22.09.2014 11:52:17

Определение местоположения при оформления заказа

Наиболее удобный компонент для оформления заказа bitrix:sale.order.ajax, он часто обновляется.
Часто стоит задача определять местоположение пользователя (по ip, по ИНН для юр. лиц, и т.п.). Но компонент не поддерживает на уровне API задание местоположения.
Изменить местоположение можно либо костылями на JS, или модифицировать компонент (= отказаться от его поддержки и обновлений)
Было бы удобно добавление параметра в компонент с заданием местоположения по умолчанию при оформлении заказа, или добавление API для текущего пользователя. В любом из этих вариантов было бы возможно задать нужное значение до загрузки компонента.

Рейтинг: 0  
Пользователь 19902 23.09.2015 22:25:18
вообще то это можно сделать без правок компонента

1. нужен вот этот модуль http://marketplace.1c-bitrix.ru/solutions/altasib.geoip/
2. локации 2.0
3.

AddEventHandler("sale", "OnSaleComponentOrderOneStepOrderProps", array("CMelcosoft", "OnSaleComponentOrderOneStepOrderPropsHandler"));

class CMelcosoft
{
    function OnSaleComponentOrderOneStepOrderPropsHandler(&$arResult, &$arUserResult, $arParams)
    {
        if (strlen($arUserResult["DELIVERY_LOCATION"]) == 0) {

            $arLocation = false;

            if(CModule::IncludeModule("altasib.geoip"))
            {
                $arData = ALX_GeoIP::GetAddr();

                if (isset($arData["city"]) && strlen($arData["city"])>0)
                {
                    $arFilter = array();

                    if (isset($arData["region"]) && strlen($arData["region"])>0)
                    {
                        $dbRegion = Bitrix\Sale\Location\LocationTable::getList(array("filter" => array("NAME.NAME" => $arData["region"])));
                        if ($arRegion = $dbRegion->fetch())
                        {
                            $arFilter[">=LEFT_MARGIN"] = $arRegion["LEFT_MARGIN"];
                            $arFilter["<=RIGHT_MARGIN"] = $arRegion["RIGHT_MARGIN"];
                        }
                    }

                    $arFilter["NAME.NAME"] = $arData["city"];

                    $cnt = 0;
                    $dbCity = Bitrix\Sale\Location\LocationTable::getList(array("filter" => $arFilter));
                    while ($arCity = $dbCity->fetch()) {
                        $arLocation = $arCity;
                        $cnt++;
                    }

                    if ($cnt != 1) {

                        AddMessage2Log("failed detect city : ".print_r(array(
                                "GEO"=>$arData,
                                "CNT"=>$cnt,
                                "LAST_LOCATION"=>$arLocation
                            ),true));

                        $arLocation = false;
                    }
                }
            }

            if (!$arLocation)
                $arLocation = CSaleLocation::GetByID(COption::GetOptionString("sale", "location"));

            foreach ($arResult["ORDER_PROP"]["USER_PROPS_Y"] as &$arProp) {
                if ($arProp["IS_LOCATION"] == "Y") {
                    $arProp["VALUE"] = $arLocation["ID"];
                    $arUserResult["ORDER_PROP"][$arProp["ID"]] = $arLocation["ID"];


                    foreach ($arProp["VARIANTS"] as &$arVariant) {
                        if ($arVariant["ID"] == $arLocation["ID"])
                            $arVariant["SELECTED"] = "Y"; else
                            unset($arVariant["SELECTED"]);
                    }

                    if (isset($arVariant))
                        unset($arVariant);
                }
            }

            foreach ($arResult["ORDER_PROP"]["USER_PROPS_N"] as &$arProp) {
                if ($arProp["IS_LOCATION"] == "Y") {
                    $arProp["VALUE"] = $arLocation["ID"];
                    $arUserResult["ORDER_PROP"][$arProp["ID"]] = $arLocation["ID"];


                    foreach ($arProp["VARIANTS"] as &$arVariant) {
                        if ($arVariant["ID"] == $arLocation["ID"])
                            $arVariant["SELECTED"] = "Y"; else
                            unset($arVariant["SELECTED"]);
                    }

                    if (isset($arVariant))
                        unset($arVariant);
                }
            }

            if (isset($arProp))
                unset($arProp);

            $arUserResult["DELIVERY_LOCATION"] = $arLocation["ID"];
        }
    }
}