Павел Реутов,не будет, "left_margin"=>"asc" задает порядок вложенности, а Вы все разделы сортируете по алфавиту, игнорируя вложенность разделов, ломая дерево.
12.09.2019 08:38:35
Павел Реутов,не будет, "left_margin"=>"asc" задает порядок вложенности, а Вы все разделы сортируете по алфавиту, игнорируя вложенность разделов, ломая дерево.
|
|
|
27.06.2016 08:54:32
Виктор Карионов, я выборку делал на странице детального просмотра элемента и сохранял в кеш, так же можно сделать на событие добавления элемента и сохранять в свойство этого элемента
result_modifier.php [CODE]// проверка, установлено ли расстояние для выборки элементов if ((int) $arParams["GPS_DIS"] > 0) { // $arParams["GPS_DIS"] радиус выборки в км // получаю координаты текущего элемента $arCoordCurItem = explode(",", $arResult["DISPLAY_PROPERTIES"]["COORD"]["VALUE"]); $gps_cur = array( "lat" => $arCoordCurItem[0], "lon" => $arCoordCurItem[1], "point_elevation" => 0 ); // выборка всех элементов $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM", "DETAIL_PAGE_URL", "PROPERTY_COORD", "PREVIEW_PICTURE"); $arFilter = Array( "IBLOCK_ID" => $arResult["IBLOCK_ID"], "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "!ID" => $arResult["ID"] ); $res = CIBlockElement::GetList(Array("name" => "desk", "sort" => "ask"), $arFilter, false, false, $arSelect); while ($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); if (isset($arFields["PROPERTY_COORD_VALUE"]) && strlen($arFields["PROPERTY_COORD_VALUE"]) > 0) { $arCoordItem = explode(",", $arFields["PROPERTY_COORD_VALUE"]); $gps_item = array( "lat" => $arCoordItem[0], "lon" => $arCoordItem[1], "point_elevation" => 0 ); // вычисляю расстояние между текущим местом и в выборке $distance = get_distance_between_2_points($gps_cur, $gps_item); // если растояние меньше или равно, то добавляю в массив if (($arParams["GPS_DIS"] * 1000) >= $distance) { $arResult["ITEMS"][] = $arFields; } } } } [/CODE]формула расчета расстояния между двумя точками на земном шаре [CODE]//Вычисления расстояние между двумя точками земли, в GPS координатах стандарта WGS84 define('COORDINATES_FORMAT', 'WGS84'); define('MAJOR_AXIS', 6378137.0); //meters define('MINOR_AXIS', 6356752.3142); //meters define('MAJOR_AXIS_POW_2', pow(MAJOR_AXIS, 2)); //meters define('MINOR_AXIS_POW_2', pow(MINOR_AXIS, 2)); //meters /* $gps_1['lat'] - latitude (широта) $gps_1['lon'] - longitude (долгота) $gps_1['point_elevation'] (высота точки) // == 0 if this is sea. but must be defined! */ //get arrays with gps coordinates, returns earth terrestrial distance between 2 points function get_distance_between_2_points($gps_1, $gps_2, $decart=false) { if(!$decart) { $true_angle_1 = get_true_angle($gps_1); $true_angle_2 = get_true_angle($gps_2); $point_radius_1 = get_point_radius($gps_1, $true_angle_1); $point_radius_2 = get_point_radius($gps_2, $true_angle_2); $earth_point_1_x = $point_radius_1 * cos(deg2rad($true_angle_1)); $earth_point_1_y = $point_radius_1 * sin(deg2rad($true_angle_1)); $earth_point_2_x = $point_radius_2 * cos(deg2rad($true_angle_2)); $earth_point_2_y = $point_radius_2 * sin(deg2rad($true_angle_2)); $x = get_distance_between_2_points(array('lat'=>$earth_point_1_x, 'lon'=>$earth_point_1_y), array('lat'=>$earth_point_2_x, 'lon'=>$earth_point_2_y), true); $y = pi() * ( ($earth_point_1_x + $earth_point_2_x) / 360 ) * ( $gps_1['lon'] - $gps_2['lon'] ); return sqrt( pow($x,2) + pow($y,2) ); } else { return sqrt(pow(($gps_1['lat'] - $gps_2['lat']), 2) + pow(($gps_1['lon'] - $gps_2['lon']), 2)); } } //returns degree's decimal measure, getting degree, minute and second function get_decimal_degree($deg=0, $min=0, $sec=0) { return ($deg<0) ? (-1*(abs($deg) + (abs($min)/60) + (abs($sec)/3600))) : (abs($deg) + (abs($min)/60) + (abs($sec)/3600)); } // get point, returns true angle function get_true_angle($gps) { return atan( ( (MINOR_AXIS_POW_2 / MAJOR_AXIS_POW_2) * tan(deg2rad( $gps['lat'])) ) ) * 180/pi(); } //get point and true angle, returns radius of small circle (radius between meridians) function get_point_radius($gps, $true_angle) { return (1 / sqrt((pow(cos(deg2rad($true_angle)), 2) / MAJOR_AXIS_POW_2) + (pow(sin(deg2rad($true_angle)), 2) / MINOR_AXIS_POW_2))) + $gps['point_elevation']; } function check_lat($lat) { if($lat>=0 && $lat<=90) { return 'north'; } else if($lat>=-90 && $lat<=0) { return 'south'; } return false; } function check_lon($lon) { if($lon>=0 && $lon<=180) { return 'east'; } else if($lon>=-180 && $lon<=0) { return 'west'; } return false; } [/CODE] |
|
|