This commit is contained in:
merelendor 2024-06-27 21:53:35 +03:00
commit 604e2888ad
16 changed files with 1509 additions and 85 deletions

4
.gitignore vendored
View File

@ -12,6 +12,8 @@ vizitka/tmp/
vkteamssetup.exe
local/*.json
local/*.txt
local/*.xml
local/commands/
!local/sitemap.php
element*.txt
element*.txt
drom*.xml

View File

@ -3,6 +3,8 @@ require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_be
header('Content-Type: application/json; charset=utf-8');
use \Bitrix\Main\Service\GeoIp;
use \Bitrix\Main\Grid\Declension;
$httpClient = new \Bitrix\Main\Web\HttpClient();
$PARAM_1 = isset($_REQUEST["PARAM_1"]) ? $_REQUEST["PARAM_1"] : null;
@ -1360,6 +1362,40 @@ switch($PARAM_1)
$filter['><PROPERTY_MILEAGE'] = [ !empty($REQ['MILEAGE_FROM']) ? $REQ['MILEAGE_FROM'] : 0, !empty($REQ['MILEAGE_TO']) ? $REQ['MILEAGE_TO'] : 10000000 ];
}
if(!empty($REQ['RESERVED']))
{
if($REQ['RESERVED'] === "YES")
{
$filter['>=PROPERTY_RESERVE_DATE'] = date("Y-m-d");
}
else
{
array_push($filter, [ 'LOGIC' => 'OR', [ '=PROPERTY_RESERVE_DATE' => false ], [ '<PROPERTY_RESERVE_DATE' => date("Y-m-d") ]]);
}
//$filter['=PROPERTY_RESERVE_DATE'] = false;
}
if(!empty($REQ['PTS']))
{
$filter['PROPERTY_PTS_VALUE'] = $REQ['PTS'] === "DIGITAL" ? "ЭПТС" : "Бумажный ПТС";
}
if(!empty($REQ['RESTRICTIONS']))
{
$filter['PROPERTY_RESTRICTIONS_VALUE'] = $REQ['RESTRICTIONS'] === "YES" ? "Есть ограничения ФССП" : "Нет ограничений ФССП";
}
if(isset($REQ['KEYS']))
{
$filter['PROPERTY_KEY_COUNT'] = $REQ['KEYS'];
}
if(isset($REQ['AFTER_ACCIDENT']))
{
$filter['PROPERTY_AFTER_ACCIDENT_VALUE'] = $REQ['AFTER_ACCIDENT'] == "YES" ? "Да" : "Нет";
}
$total = CIBlockElement::GetList([ "SORT" => "ASC", "NAME" => "ASC" ], array_merge([ "IBLOCK_ID" => USED ? IBLOCK_ID_CATALOG_CARS_USED : IBLOCK_ID_CATALOG_CARS_NEW ], $filter), [], false, []);
$result = [
"total" => $total,
@ -1369,7 +1405,12 @@ switch($PARAM_1)
$vehicle_types = [];
$vehicle_subtypes = [];
$cities = [];
$restrictions = [];
$pts = [];
$keys = [];
$reserved = [];
$condition = [];
$brands = [];
$models = [];
$modifications = [];
@ -1397,6 +1438,21 @@ switch($PARAM_1)
if(USED)
{
$flags = [];
$flag_names = [ "PTS" => [], "RESTRICTIONS" => [], "AFTER_ACCIDENT" => [] ];
foreach($flag_names AS $k => $f)
{
$properties = CIBlockPropertyEnum::GetList([ "sort" => "asc", "name" => "asc" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_USED, "CODE" => $k ]);
while ($prop_fields = $properties->GetNext())
{
$flags[ $k ][ $prop_fields["ID"] ] = [
"value" => $prop_fields['XML_ID'],
"label" => $prop_fields['VALUE'],
];
}
}
//filter for types
$filter_vehicle_types = $filter;
unset($filter_vehicle_types['PROPERTY_VEHICLE_TYPE']);
@ -1494,9 +1550,112 @@ switch($PARAM_1)
//print_r($row[ PROPERTY_ID_CATALOG_CARS_USED_PARKING_CITY ]);
array_push($cities, $row[ PROPERTY_ID_CATALOG_CARS_USED_PARKING_CITY ]);
}
//print "\n\ncities\n\n";
//print_r($cities);
//die();
//filter for restrictions
$filter_restrictions = $filter;
unset($filter_restrictions['PROPERTY_RESTRICTIONS_VALUE']);
$restrictions_values = [];
$iterator = CIBlockElement::GetPropertyValues( IBLOCK_ID_CATALOG_CARS_USED, $filter_restrictions, true, [ 'ID' => [ PROPERTY_ID_CATALOG_CARS_USED_RESTRICTIONS ] ] );
while ($row = $iterator->Fetch())
{
array_push($restrictions_values, $row[ PROPERTY_ID_CATALOG_CARS_USED_RESTRICTIONS ]);
}
$restrictions_values = array_unique($restrictions_values);
foreach($restrictions_values AS $rv)
{
array_push($restrictions, $flags['RESTRICTIONS'][ $rv ]);
}
//filter for pts
$filter_pts = $filter;
unset($filter_pts['PROPERTY_PTS_VALUE']);
$pts_values = [];
$iterator = CIBlockElement::GetPropertyValues( IBLOCK_ID_CATALOG_CARS_USED, $filter_pts, true, [ 'ID' => [ PROPERTY_ID_CATALOG_CARS_USED_PTS ] ] );
while ($row = $iterator->Fetch())
{
array_push($pts_values, $row[ PROPERTY_ID_CATALOG_CARS_USED_PTS ]);
}
$pts_values = array_unique($pts_values);
foreach($pts_values AS $rp)
{
array_push($pts, $flags['PTS'][ $rp ]);
}
//filter for reserved
$filter_reserved = $filter;
unset($filter_reserved['PROPERTY_RESERVE_DATE_VALUE']);
unset($filter_reserved['>=PROPERTY_RESERVE_DATE']);
unset($filter_reserved['=PROPERTY_RESERVE_DATE']);
unset($filter_reserved['!=PROPERTY_RESERVE_DATE']);
unset($filter_reserved['<PROPERTY_RESERVE_DATE']);
$result['filter_reserved'] = [];
for($i = 0; $i < count($filter_reserved); $i++)
{
if(isset($filter_reserved[$i]['LOGIC']))
{
unset($filter_reserved[$i]);
}
}
$reserved_values = [];
$iterator = CIBlockElement::GetPropertyValues( IBLOCK_ID_CATALOG_CARS_USED, $filter_reserved, true, [ 'ID' => [ PROPERTY_ID_CATALOG_CARS_USED_RESERVE_DATE ] ] );
while ($row = $iterator->Fetch())
{
array_push($reserved_values, $row[ PROPERTY_ID_CATALOG_CARS_USED_RESERVE_DATE ]);
}
$reserved = [ [ "value" => "NO", "label" => "Не в резерве", ] ];
foreach($reserved_values AS $rv)
{
if($rv >= date("Y-m-d"))
{
array_push($reserved, [ "value" => "YES", "label" => "В резерве", ]);
break;
}
}
//filter for keys
$filter_key_count = $filter;
unset($filter_key_count['PROPERTY_KEY_COUNT']);
$key_count_values = [];
$iterator = CIBlockElement::GetPropertyValues( IBLOCK_ID_CATALOG_CARS_USED, $filter_key_count, true, [ 'ID' => [ PROPERTY_ID_CATALOG_CARS_USED_KEY_COUNT ] ] );
while ($row = $iterator->Fetch())
{
array_push($key_count_values, $row[ PROPERTY_ID_CATALOG_CARS_USED_KEY_COUNT ]);
}
$key_count_values = array_unique($key_count_values);
sort($key_count_values);
$dec = new Declension('ключ', 'ключа', 'ключей');
foreach($key_count_values AS $kc)
{
array_push($keys, [ "value" => $kc, "label" => $kc == 0 ? "Нет ключей" : $kc." ".$dec->get($kc), ]);
}
//filter for condition
$filter_condition = $filter;
unset($filter_condition['PROPERTY_AFTER_ACCIDENT_VALUE']);
$condition_values = [];
$iterator = CIBlockElement::GetPropertyValues( IBLOCK_ID_CATALOG_CARS_USED, $filter_condition, true, [ 'ID' => [ PROPERTY_ID_CATALOG_CARS_USED_AFTER_ACCIDENT ] ] );
while ($row = $iterator->Fetch())
{
array_push($condition_values, $row[ PROPERTY_ID_CATALOG_CARS_USED_AFTER_ACCIDENT ]);
}
$f = [ "NO" => "Кроме битых", "YES" => "Битые/не на ходу", ];
$condition_values = array_unique($condition_values);
foreach($condition_values AS $cv)
{
$option = $flags['AFTER_ACCIDENT'][ $cv ];
$option['label'] = $f[$option['value']];
array_push($condition, $option);
}
}
//filter for brands
@ -1723,6 +1882,13 @@ switch($PARAM_1)
$result["cities"] = $cities;
$result["years"] = $years;
$result["mileages"] = $mileages;
$result["pts"] = $pts;
$result["keys"] = $keys;
$result["restrictions"] = $restrictions;
$result['reserved'] = $reserved;
$result['condition'] = $condition;
if(USED)
{
$result["bitrix_mileages"] = $bitrix_mileages;

View File

@ -0,0 +1,634 @@
<?
class DromXMLGenerator
{
protected $types = [];
protected $dictionaries = [
"car" => [],
"bus" => [],
"motorhome" => [],
"mobile_crane" => [],
"bulldozer" => [],
"atv" => [],
"truck" => [],
"building" => [],
"misc" => [],
"municipal" => [],
"forestry" => [],
"loader" => [],
"semi_trailer" => [],
"trailer" => [],
"truck_tractor" => [],
"tractor" => [],
"excavator" => [],
];
protected $special_frames_mapping = [
"BUS" => "bus",
"TRUCK" => "truck",
"TRUCK_TRACTOR" => "truck_tractor",
"MOTORHOME" => "motorhome",
"BUILDING" => "building",
"CRANE" => "mobile_crane",
"LOADER" => "loader",
"TRAILER" => "trailer",
"SEMITRAILER" => "semi_trailer",
"EXCAVATOR" => "excavator",
"FARM" => "tractor",
"MISC" => "misc",
"FORESTRY" => "forestry",
"MUNICIPAL" => "municipal",
"ATV" => "atv",
"BULLDOZER" => "bulldozer",
"QUADBIKE" => "atv",
"SNOWMOBILE" => "atv",
"SCOOTER" => "misc",
];
protected $special_frames = [];
protected $xml_cars = null;
protected $xml_special = null;
protected $offers_cars = null;
protected $offers_special = null;
protected $total = 0;
protected $found_cars = 0;
protected $found_special = 0;
protected $valid_cars = 0;
protected $valid_special = 0;
protected $invalid_special = 0;
protected $not_found_special = 0;
protected $p1 = 0;
protected $p2 = 0;
protected $p3 = 0;
protected $p4 = 0;
protected $fuels = [
"БЕНЗИН" => "GASOLINE",
"ГАЗ" => "GAS",
"ДИЗЕЛЬ" => "DIESEL",
"ЭЛЕКТРИЧЕСКИЙ" => "ELECTRICITY",
];
protected $errors = "";
function __construct()
{
$this->xml_cars = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><avtoxml></avtoxml>");
$this->offers_cars = $this->xml_cars->addChild('Offers');
$this->xml_special = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><avtoxml></avtoxml>");
$this->offers_special = $this->xml_special->addChild('SpecOffers');
$this->loadTypes();
foreach($this->dictionaries AS $type => $v)
{
$structure = [
"brands" => [],
"models" => [],
"cities" => [],
"bodies" => [],
"colors" => [],
"transmissions" => [],
"engines" => [],
"wheels" => [],
"fuels" => [],
];
$url = "https://www.drom.ru/cached_files/autoload/files/";
if($type === "car")
{
$url = $url."ref.xml";
}
else
{
$url = $url."ref_".$type.".xml";
}
$response_xml = file_get_contents($url);
file_put_contents("/home/bitrix/www/local/ref_".$type.".xml", $response_xml);
$structure_object = new SimpleXMLElement($response_xml);
foreach($structure_object->MarksSpec->MarkSpec AS $mark)
{
$k = mb_strtoupper((string) $mark->sMarkSpec);
$n = (int) $mark->idMarkSpec;
$models = [];
foreach($structure_object->ModelsSpec->ModelSpec AS $model)
{
$mmn = (int) $model->idMarkSpec;
if($mmn === $n)
{
$km = mb_strtoupper((string) $model->sModelSpec);
$nm = (int) $model->idModelSpec;
$models[ $km ] = $nm;
$structure['models'][ $km ] = $nm;
}
}
$structure['brands'][ $k ] = [ "id" => $n, "models" => $models ];
}
foreach($structure_object->Marks->Mark AS $mark)
{
$k = mb_strtoupper((string) $mark->sMark);
$n = (int) $mark->idMark;
$models = [];
foreach($structure_object->Models->Model AS $model)
{
$mmn = (int) $model->idMark;
if($mmn === $n)
{
$km = mb_strtoupper((string) $model->sModel);
$nm = (int) $model->idModel;
$models[ $km ] = $nm;
}
}
$structure['brands'][ $k ] = [ "id" => $n, "models" => $models ];
}
foreach($structure_object->Cities->City AS $city)
{
$k = mb_strtoupper((string) $city->sCity);
$n = (int) $city->idCity;
$structure['cities'][ $k ] = $n;
}
foreach($structure_object->FrameTypes->FrameType AS $frame_type)
{
$k = mb_strtoupper((string) $frame_type->sFrameType);
$n = (int) $frame_type->idFrameType;
$structure['bodies'][ $k ] = $n;
}
foreach($structure_object->Colors->Color AS $color)
{
$k = mb_strtoupper((string) $color->sColor);
$n = (int) $color->idColor;
$structure['colors'][ $k ] = $n;
}
foreach($structure_object->WheelFormulaTypes->WheelFormulaType AS $wheel_type)
{
$k = mb_strtoupper((string) $wheel_type->sWheelFormulaType);
$n = (int) $wheel_type->idWheelFormulaType;
$structure['wheels'][ $k ] = $n;
}
foreach($structure_object->EngineTypesSpec->EngineTypeSpec AS $engine_type)
{
$k = mb_strtoupper((string) $engine_type->sEngineTypeSpec);
$n = (int) $engine_type->idEngineTypeSpec;
$structure['fuels'][ $k ] = $n;
}
$this->dictionaries[ $type ] = $structure;
}
}
function addOffer($entry)
{
$this->total++;
$type = $entry['PROPERTIES']['VEHICLE_SUBTYPE']['VALUE'];
//print $type."\n";
if($type === "Легковой автомобиль")
{
$this->found_cars++;
$this->buildOffer(false, [ 'group' => 'car' ], $entry);
/*
$idMark = $this->getDictionaryRecordId($this->dictionaries['car']['brands'], mb_strtoupper($entry['PROPERTIES']['BRAND']['RELATED']['NAME']));
//print $entry['CODE']." - ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." - ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']." - [".$idMark."] - [".$idModel."]\n";
//if(is_null($idMark)) { $this->errors .= "Не найдена марка ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']."\n"; continue; }
if($idMark !== null)
{
//* id марки авто (см. файл-справочник); если не можете указать id, то укажите название марки текстом в поле sMark
$offer['idMark'] = $idMark;
}
else
{
//* название марки авто (Toyota, Honda, BMW и т.п.); указывать обязательно только в том случае, если не можете указать idMark
$offer['sMark'] = $entry['PROPERTIES']['BRAND']['RELATED']['NAME'];
}
$idModel = $this->getDictionaryRecordId($this->dictionaries['car']['models'], mb_strtoupper($entry['PROPERTIES']['MODEL']['RELATED']['NAME']));
//if(is_null($idModel)) { $this->errors .= "Не найдена модель ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']." для ".".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']."."\n"; continue; }
if($idModel !== null)
{
//* id модели авто (см. файл-справочник); если не можете указать id, то укажите название модели текстом в поле sModel
$offer['idModel'] = $idModel;
}
else
{
//* название модели авто (Land Cruiser, Accord, X5 и т.п.); указывать обязательно только в том случае, если не можете указать idModel
$offer['sModel'] = $entry['PROPERTIES']['MODEL']['RELATED']['NAME'];
}
*/
/*
$payload = [
"idOffer" => $entry['CODE'], //* уникальный id объявления в вашей базе данных
"idMark" => "", //* id марки авто (см. файл-справочник); если не можете указать id, то укажите название марки текстом в поле sMark
"idModel" => "", //* id модели авто (см. файл-справочник); если не можете указать id, то укажите название модели текстом в поле sModel
"sMark" => "", //* название марки авто (Toyota, Honda, BMW и т.п.); указывать обязательно только в том случае, если не можете указать idMark
"sModel" => "", //* название модели авто (Land Cruiser, Accord, X5 и т.п.); указывать обязательно только в том случае, если не можете указать idModel
"idCountry" => "", //id страны, где находится авто (см. файл-справочник, по умолчанию — 0)
"idCity" => "", //id города, в котором находится авто (см. файл-справочник)
"sCity" => "", //название города, в котором находится авто (см. файл-справочник)
"YearOfMade" => "", //год выпуска ТС (только год, 4 цифры: 1995, 2003, 2018 и т.п.)
"VIN" => $entry['PROPERTIES']['VIN']['VALUE'], //* VIN или номер кузова, если VIN отсутствует
"Price" => $entry['PROPERTIES']['PRICE']['VALUE'], //цена в рублях
"NewType" => 0, //признак, что автомобиль новый; 1 — новый, 0 — не новый (с пробегом)
"Volume" => $entry['PROPERTIES']['ENGINE_VOLUME']['VALUE'], //объем двигателя в куб.см (пример: 599, 1300, 2631 и т.п.)
"FrameType" => "???", //тип кузова (см. файл-справочник)
"Color" => "???", //цвет кузова (см. файл-справочник)
"idTransmission" => "???", //id типа трансмиссии (см. файл-справочник)
"sTransmission" => "???", //название типа трансмиссии
"idEngineType" => "", //id типа двигателя (см. файл-справочник)
"sEngineType" => "", //название типа двигателя
"idHybridType" => "", //гибрид (см. файл-справочник)
"sHybridType" => "", //гибрид (да, нет)
"idGbo" => "", //ГБО (см. файл-справочник)
"sGbo" => "", //ГБО (да, нет)
"idDriveType" => "???", //id типа двигателя (см. файл-справочник)
"sDriveType" => "", //название типа двигателя
"sWheelType" => "", //положение руля (левый, правый)
"Haul" => "", //пробег (показания одометра в километрах)
"sComplectation" => "", //название комплектации (в соответствии с каталогом)
"idComplectation" => "", //id комплектации на Дроме (в соответствии с каталогом)
"Additional" => "", //текстовое описание ТС (комплектация, оснащение, тюнинг и т.п.), здесь можно указать сссылку на видео, размещенное на YouTube
"Photos" => "", //секция со списком фотографий (ниже есть подробное описание секции)
"Phone" => "", //номер телефона (поле не должно быть больше 20 символов)
"Whereabouts" => "", //авто в наличии или под заказ (см. файл-справочник)
"Power" => $entry['PROPERTIES']['ENGINE_POWER']['VALUE'], //мощность автомобиля в лошадиных силах
"idCertProgram" => "", //программа сертификации (см. файл-справочник)
"DamagedType" => "", //признак для поврежденных автомобилей (0 - небитые, 1 - битые или не на ходу)
"SOR" => "", //номер свидетельства о регистрации ТС для авто с пробегом (10 символов)
];
*/
}
else
{
$this->found_special++;
$frame = $this->getFrameType(mb_strtoupper($type), mb_strtoupper($entry['PROPERTIES']['MODEL']['RELATED']['NAME']));
if(!is_null($frame))
{
$this->buildOffer(true, $frame, $entry);
}
else
{
$this->invalid_special++;
print $this->invalid_special." НЕ УДАЛОСЬ ОПРЕДЕЛИТЬ ТИП: ".mb_strtoupper($type)." \t\t[ ".$entry['CODE']." ][ ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." ][ ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']." ]\n";
//$this->not_found_special++;
}
}
}
private function buildOffer($special = false, $frame, $entry)
{
//print $entry['CODE']." - ".$type."\n";
$payload = [
"idOffer" => $entry['CODE'], //* уникальный id объявления в вашей базе данных
"YearOfMade" => $entry['PROPERTIES']['YEAR']['VALUE'], //год выпуска ТС (только год, 4 цифры: 1995, 2003, 2018 и т.п.)
"VIN" => $entry['PROPERTIES']['VIN']['VALUE'], //* VIN или номер кузова, если VIN отсутствует
"Price" => $entry['PROPERTIES']['PRICE']['VALUE'], //цена в рублях
"NewType" => 0, //признак, что автомобиль новый; 1 — новый, 0 — не новый (с пробегом)
"Volume" => $entry['PROPERTIES']['ENGINE_VOLUME']['VALUE'], //объем двигателя в куб.см (пример: 599, 1300, 2631 и т.п.)
"Power" => $entry['PROPERTIES']['ENGINE_POWER']['VALUE'], //мощность автомобиля в лошадиных силах
];
if($special)
{
$payload['idFrameTypeSpec'] = $frame['id'];
$payload['idWheelType'] = 2;
if(in_array($frame['group'], [ "bus", "motorhome" ]))
{
$this->invalid_special++;
print $this->invalid_special." НЕВОЗМОЖНО УКАЗААТЬ DriveTypeSpec: ".$entry['CODE']." ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']."\n";
return;
}
if(in_array($frame['group'], [ "trailer", "semi_trailer" ]))
{
$this->invalid_special++;
print $this->invalid_special." НЕВОЗМОЖНО УКААЗАТЬ КОЛИЧЕСТВО ОСЕЙ Axles: ".$entry['CODE']." ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']."\n";
return;
}
if(in_array($frame['group'], [ "truck", "truck_tractor", "mobile_crane", "municipal", ]))
{
$item_name = str_replace("Х", "X", mb_strtoupper($entry['PROPERTIES']['MODEL']['RELATED']['NAME']));
preg_match('/\dX\d/', $item_name, $wheel_type_matches);
$idWheelFormulaType = $this->getDictionaryRecordId($this->dictionaries[ $frame['group'] ]['wheels'], $wheel_type_matches[0]);
if(!is_null($idWheelFormulaType))
{
$payload['idWheelFormulaType'] = $idWheelFormulaType;
}
else
{
$this->invalid_special++;
print $this->invalid_special." НЕТ КОЛЕСНОЙ ФОРМУЛЫ: ".$entry['CODE']." - ".$item_name." [".$wheel_type_matches[0]."]\n";
return;
}
}
if(in_array($frame['group'], [ "bus", "truck", "truck_tractor", "mobile_crane", "loader", "municipal", "atv", "motorhome" ]))
{
if(!empty($entry['PROPERTIES']['ENGINE_FUEL']['VALUE']))
{
$f = mb_strtoupper($entry['PROPERTIES']['ENGINE_FUEL']['VALUE']);
if(isset($this->fuels[$f]))
{
$idEngineTypeSpec = $this->getDictionaryRecordId($this->dictionaries[ $frame['group'] ]['fuels'], $this->fuels[$f]);
if(!is_null($idEngineTypeSpec))
{
$payload['idEngineTypeSpec'] = $idEngineTypeSpec;
}
}
}
}
}
if($special)
{
$patterns = array('/\s\dX\d/i', '/\s\dХ\d/i', '/САМОСВАЛ/i');
$replacements = array('', '', '');
$model_name = preg_replace($patterns, $replacements, mb_strtoupper($entry['PROPERTIES']['MODEL']['RELATED']['NAME']));
$model_name = ltrim(rtrim($model_name));
$model_name_chunks = explode(" ", $model_name);
array_unshift($model_name_chunks, implode('', $model_name_chunks));
$idModel = null;
foreach($model_name_chunks AS $c)
{
$idModel = $this->getDictionaryRecordId($this->dictionaries[ $frame['group'] ]['models'], $c);
if(!is_null($idModel))
{
break;
}
}
if(!is_null($idModel))
{
$payload['idModelSpec'] = $idModel;
}
else
{
$this->invalid_special++;
print $this->invalid_special." НЕВОЗМОЖНО ОПРЕДЕЛИТЬ МОДЕЛЬ ДЛЯ МАРКИ ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME'].": ".$entry['CODE']." - ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']."\n";
return;
}
}
else
{
$idMark = $this->findInDictionaryRecordId($this->dictionaries[ $frame['group'] ]['brands'], mb_strtoupper($entry['PROPERTIES']['BRAND']['RELATED']['NAME']));
//print $type." - ".$frame['group']." - ".$idMark['id']."\n";
if(!is_null($idMark))
{
if(!$special) { $payload['idMark'] = $idMark['id']; }
$this->p1++;
$patterns = array('/\s\dX\d/i', '/\s\dХ\d/i', '/САМОСВАЛ/i');
$replacements = array('', '', '');
$model_name = preg_replace($patterns, $replacements, mb_strtoupper($entry['PROPERTIES']['MODEL']['RELATED']['NAME']));
$model_name = ltrim(rtrim($model_name));
$model_name_chunks = explode(" ", $model_name);
array_unshift($model_name_chunks, implode('', $model_name_chunks));
$idModel = null;
foreach($model_name_chunks AS $c)
{
$idModel = $this->getDictionaryRecordId($this->dictionaries[ $frame['group'] ]['brands'][ mb_strtoupper($entry['PROPERTIES']['BRAND']['RELATED']['NAME']) ]['models'], $c);
if(!is_null($idModel))
{
$idModel = $this->findInDictionaryRecordId($this->dictionaries[ $frame['group'] ]['brands'][ mb_strtoupper($entry['PROPERTIES']['BRAND']['RELATED']['NAME']) ]['models'], mb_strtoupper($c));
if(!is_null($idModel))
{
break;
}
}
}
if(!is_null($idModel))
{
$payload['idModel'] = $idModel;
}
else
{
$payload['sModel'] = $model_name;
}
}
else
{
$this->p2++;
if(!$special)
{
$payload['sMark'] = $entry['PROPERTIES']['BRAND']['RELATED']['NAME'];
$payload['sModel'] = $entry['PROPERTIES']['MODEL']['RELATED']['NAME'];
}
else
{
$this->invalid_special++;
print $this->invalid_special." НЕВОЗМОЖНО ОПРЕДЕЛИТЬ МАРКУ: ".$entry['CODE']." (ТИП ".$frame['group'].") - ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']."\n";
return;
}
//print $entry['PROPERTIES']['BRAND']['RELATED']['NAME']."\n";
}
}
$idCity = $this->getDictionaryRecordId($this->dictionaries[ $frame['group'] ]['cities'], mb_strtoupper($entry['PROPERTIES']['PARKING_CITY']['VALUE']));
if($idCity !== null)
{
//* id города, в котором находится авто (см. файл-справочник)
$payload['idCity'] = $idCity;
}
else
{
if(!$special)
{
//* название города, в котором находится авто (см. файл-справочник)
$payload['sCity'] = $entry['PROPERTIES']['PARKING_CITY']['VALUE'];
}
else
{
$this->invalid_special++;
print $this->invalid_special." НЕВОЗМОЖНО ОПРЕДЕЛИТЬ ГОРОД: ".$entry['CODE']." ".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']." ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']."\n";
return;
}
//if(is_empty($idModel)) { $this->errors .= "Не найдена модель ".$entry['PROPERTIES']['MODEL']['RELATED']['NAME']." для ".".$entry['PROPERTIES']['BRAND']['RELATED']['NAME']."."\n"; continue; }
}
//"idCountry" => "", //id страны, где находится авто (см. файл-справочник, по умолчанию — 0)
//"idCity" => "", //id города, в котором находится авто (см. файл-справочник)
//"sCity" => "", //название города, в котором находится авто (см. файл-справочник)
if($special)
{
$this->valid_special++;
}
else
{
$this->valid_cars++;
}
$offer = $special ? $this->offers_special->addChild('SpecOffer') : $this->offers_cars->addChild('Offer');
foreach($payload AS $k => $v)
{
$offer->addChild($k, $v);
}
if(count($entry['PHOTOS_1080']) > 0)
{
$photos = $offer->addChild("Photos");
$photos->addAttribute('PhotoMain', "https://".SITE_SERVER_NAME.$entry['PHOTOS_1080'][0]);
foreach($entry['PHOTOS_1080'] AS $photo)
{
$photos->addChild("Photo", "https://".SITE_SERVER_NAME.$photo);
}
}
//print $type." MATCH"."\n";
}
private function normalize_string($str)
{
return str_replace(["Ё", "C"], ["Е", "С"], $str);
}
private function getFrameType($type, $model)
{
if($type === "ПРИЦЕП") { $type = "ДРУГИЕ ПРИЦЕПЫ"; }
if($type === "ТЯГАЧ") { $type = "СЕДЕЛЬНЫЙ ТЯГАЧ"; }
if(isset($this->special_frames[ $type ]))
{
return $this->special_frames[ $type ];
}
else
{
$found = [];
foreach($this->special_frames AS $k => $v)
{
if(strpos($this->normalize_string($model), $k) > -1)
{
$found[ strlen($k) ] = $this->special_frames[ $k ];
}
}
if(count($found) > 0)
{
krsort($found);
// print_r($found);
foreach($found AS $f)
{
return $f;
}
// return $found[0];
}
}
//print "[".$this->normalize_string(mb_strtoupper($k))."] <---\n";
return null;
}
private function getDictionaryRecordId($branch, $name)
{
if(isset($branch[ $name ]))
{
return $branch[ $name ];
}
return null;
}
private function findInDictionaryRecordId($branch, $name)
{
foreach($branch AS $k => $v)
{
if(strpos($name, $k) > -1)
{
return $v;
}
}
return null;
}
function save()
{
if($this->total > 0)
{
print "ИТОГО: валидно ".$this->valid_cars + $this->valid_special." из ".$this->total." - ".number_format(($this->valid_cars + $this->valid_special) / (($this->found_cars + $this->found_special) / 100), 2, ".")."%\n";
if($this->found_cars > 0)
{
print "ЛКТ: валидно ".$this->valid_cars." из ".$this->found_cars." - ".number_format($this->valid_cars / ($this->found_cars / 100), 2, ".")."%\n";
}
if($this->found_special > 0)
{
print "СПЕЦТЕХНИКА: валидно ".$this->valid_special." из ".$this->found_special." - ".number_format($this->valid_special / ($this->found_special / 100), 2, ".")."%\n";
}
file_put_contents("/home/bitrix/www/drom-offers.xml", $this->xml_cars->asXML());
file_put_contents("/home/bitrix/www/drom-offers-special.xml", $this->xml_special->asXML());
}
}
private function loadTypes()
{
$types_url = "https://www.drom.ru/cached_files/autoload/files/ref_frame_types.xml";
$response_types_xml = file_get_contents($types_url);
file_put_contents("/home/bitrix/www/local/ref_frame_types.xml", $response_types_xml);
$types_object = new SimpleXMLElement($response_types_xml);
foreach($types_object AS $group => $branch)
{
foreach($branch AS $spec)
{
$g = (string) $group;
$k = (string) $spec->sFrameTypeSpec;
$n = (int) $spec->idFrameTypeSpec;
//print $g." - ".$k."\n";
$this->special_frames[ mb_strtoupper($k) ] = [
"group" => $this->special_frames_mapping[ $g ],
"id" => $n,
];
}
}
}
}

View File

@ -680,4 +680,32 @@ function OnBeforeIBlockElementUpdateHandler(&$arFields)
return true;
}
AddEventHandler("search", "BeforeIndex", "OnBeforeIBlockElement");
function OnBeforeIBlockElement($arFields)
{
if($arFields['MODULE_ID'] == "iblock" && $arFields['PARAM2'] == IBLOCK_ID_CATALOG_CARS_USED)
{
file_put_contents($_SERVER['DOCUMENT_ROOT']."/element_index_".$arFields['PARAM2'].".txt", var_export($arFields, true)."\n", FILE_APPEND);
if(array_key_exists("BODY", $arFields))
{
preg_match("/CODE\=(\d+_\d+)/", $arFields['URL'], $matches);
$code = $matches[1];
if(!empty($code))
{
if(strpos($arFields["BODY"], $code) < 0)
{
$arFields["BODY"] .= " ".$code;
}
file_put_contents($_SERVER['DOCUMENT_ROOT']."/element_index_".$arFields['PARAM2'].".txt", "CODE = ".$code."\n", FILE_APPEND);
}
}
file_put_contents($_SERVER['DOCUMENT_ROOT']."/element_index_".$arFields['PARAM2'].".txt", "\n".str_repeat("-", 150)."\n\n", FILE_APPEND);
}
return $arFields;
}
?>

View File

@ -702,6 +702,227 @@ function updateCounter(parameters, reset = false)
$(".filter_mileage_to").append('<option value="" disabled="" selected="">Пробег</option>');
$(".filter_mileage_to").attr("disabled", "disabled");
}
if(response.pts !== undefined)
{
if(response.pts.length > 0)
{
var current = $(".filter_pts").val();
$(".filter_pts").empty();
if(!reset && current !== "" && current !== null)
{
$(".filter_pts").append('<option value="">Не важно</option>');
}
else
{
$(".filter_pts").append('<option value="" disabled="" selected="">Вид ПТС</option>');
}
for(let i in response.pts)
{
$(".filter_pts").append('<option value="'+response.pts[i].value+'">'+response.pts[i].label+'</option>');
}
if(!loaded)
{
if(selected['PTS'] !== undefined && selected['PTS'] !== null && selected['PTS'] !== "")
{
$(".filter_pts").val(selected['PTS']);
$(".filter_pts").find("option").first().text("Не важно").attr("disabled", false);
}
}
else
{
$(".filter_pts").val(reset ? "" : current);
}
}
else
{
$(".filter_pts").empty();
$(".filter_pts").append('<option value="" disabled="" selected="">Вид ПТС</option>');
$(".filter_pts").attr("disabled", "disabled");
}
}
//updateSelectFromArray({ dom_node: "restrictions", option: "RESTRICTIONS", default: "Ограничения", reset: "Не важно", });
if(response.restrictions !== undefined)
{
if(response.restrictions.length > 0)
{
var current = $(".filter_restrictions").val();
$(".filter_restrictions").empty();
if(!reset && current !== "" && current !== null)
{
$(".filter_restrictions").append('<option value="">Не важно</option>');
}
else
{
$(".filter_restrictions").append('<option value="" disabled="" selected="">Ограничения</option>');
}
for(let i in response.restrictions)
{
$(".filter_restrictions").append('<option value="'+response.restrictions[i].value+'">'+response.restrictions[i].label+'</option>');
}
if(!loaded)
{
if(selected['RESTRICTIONS'] !== undefined && selected['RESTRICTIONS'] !== null && selected['RESTRICTIONS'] !== "")
{
$(".filter_restrictions").val(selected['RESTRICTIONS']);
$(".filter_restrictions").find("option").first().text("Не важно").attr("disabled", false);
}
}
else
{
$(".filter_restrictions").val(reset ? "" : current);
}
}
else
{
$(".filter_restrictions").empty();
$(".filter_restrictions").append('<option value="" disabled="" selected="">Ограничения</option>');
$(".filter_restrictions").attr("disabled", "disabled");
}
}
//if(selected['RESERVED'] === "YES")
//{
// console.log(selected);
// $(".filter_reserved").empty();
// $(".filter_reserved").append('<option value="">Не важно</option>');
// $(".filter_reserved").append('<option value="YES" selected="">В резерве</option>');
//}
if(response.reserved !== undefined)
{
if(response.reserved.length > 0)
{
var current = $(".filter_reserved").val();
$(".filter_reserved").empty();
if(!reset && current !== "" && current !== null)
{
$(".filter_reserved").append('<option value="">Не важно</option>');
}
else
{
$(".filter_reserved").append('<option value="" disabled="" selected="">Резерв</option>');
}
for(let i in response.reserved)
{
$(".filter_reserved").append('<option value="'+response.reserved[i].value+'">'+response.reserved[i].label+'</option>');
}
if(!loaded)
{
if(selected['RESERVED'] !== undefined && selected['RESERVED'] !== null && selected['RESERVED'] !== "")
{
$(".filter_reserved").val(selected['RESERVED']);
$(".filter_reserved").find("option").first().text("Не важно").attr("disabled", false);
}
}
else
{
$(".filter_reserved").val(reset ? "" : current);
}
}
else
{
$(".filter_reserved").empty();
$(".filter_reserved").append('<option value="" disabled="" selected="">Резерв</option>');
$(".filter_reserved").attr("disabled", "disabled");
}
}
if(response.keys !== undefined)
{
if(response.keys.length > 0)
{
var texts = filter_texts_resize();
var current = $(".filter_keys").val();
$(".filter_keys").empty();
if(!reset && current !== "" && current !== null)
{
$(".filter_keys").append('<option value="">Не важно</option>');
}
else
{
$(".filter_keys").append('<option value="" class="keys_count" disabled="" selected="">'+texts.filter_keys+'</option>');
}
for(let i in response.keys)
{
$(".filter_keys").append('<option value="'+response.keys[i].value+'">'+response.keys[i].label+'</option>');
}
if(!loaded)
{
if(selected['KEYS'] !== undefined && selected['KEYS'] !== null && selected['KEYS'] !== "")
{
$(".filter_keys").val(selected['KEYS']);
$(".filter_keys").find("option").first().text("Не важно").attr("disabled", false);
}
}
else
{
$(".filter_keys").val(reset ? "" : current);
}
}
else
{
$(".filter_keys").empty();
$(".filter_keys").append('<option value="" class="keys_count" disabled="" selected="">'+texts.filter_keys+'</option>');
$(".filter_keys").attr("disabled", "disabled");
}
}
if(response.condition !== undefined)
{
if(response.condition.length > 0)
{
var current = $(".filter_condition").val();
$(".filter_condition").empty();
if(!reset && current !== "" && current !== null)
{
$(".filter_condition").append('<option value="">Не важно</option>');
}
else
{
$(".filter_condition").append('<option value="" disabled="" selected="">Состояние</option>');
}
for(let i in response.condition)
{
$(".filter_condition").append('<option value="'+response.condition[i].value+'">'+response.condition[i].label+'</option>');
}
if(!loaded)
{
if(selected['AFTER_ACCIDENT'] !== undefined && selected['AFTER_ACCIDENT'] !== null && selected['AFTER_ACCIDENT'] !== "")
{
$(".filter_condition").val(selected['AFTER_ACCIDENT']);
$(".filter_condition").find("option").first().text("Не важно").attr("disabled", false);
}
}
else
{
$(".filter_condition").val(reset ? "" : current);
}
}
else
{
$(".filter_condition").empty();
$(".filter_condition").append('<option value="" disabled="" selected="">Состояние</option>');
$(".filter_condition").attr("disabled", "disabled");
}
}
}
$(".catalog_filter_spinner").hide();
@ -840,11 +1061,6 @@ function loadModifications(uid)
}, "json");
}
$(function()
{
setTimeout(init_filter, 100);
});
function handle_small_filter_brands(element, event)
{
$(used ? ".filter_brands_used" : ".filter_brands").val(event.target.value);
@ -987,6 +1203,53 @@ function handle_filter_models(element)
}
}
function filter_texts_resize()
{
if(window.innerWidth >= 1280)
{
return {
"filter_keys": "Кол-во ключей",
"filter_pts": "Бумажный ПТС",
};
}
else if(window.innerWidth >= 1080 && window.innerWidth < 1280)
{
return {
"filter_keys": "Количество ключей",
"filter_pts": "Бумажный ПТС",
};
}
else if(window.innerWidth >= 960 && window.innerWidth < 1080)
{
return {
"filter_keys": "Количество ключей",
"filter_pts": "Бумажный ПТС",
};
}
else if(window.innerWidth >= 768 && window.innerWidth < 960)
{
return {
"filter_keys": "Кол-во ключей",
"filter_pts": "Бум. ПТС",
};
}
else if(window.innerWidth >= 500)
{
return {
"filter_keys": "Количество ключей",
"filter_pts": "Бумажный ПТС",
};
}
else
{
return {
"filter_restrictions": "Огр. ФССП",
"filter_keys": "Кол-во ключей",
"filter_pts": "Бумажный ПТС",
};
}
}
function init_filter()
{
$(".catalog_filter_select").attr("disabled", true);
@ -1124,7 +1387,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Привод").attr("disabled", "disabled"); }
selected['DRIVE'] = $(this).val();;
selected['DRIVE'] = $(this).val();
updateCounter(selected);
});
@ -1135,7 +1398,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Двигатель").attr("disabled", "disabled"); }
selected['ENGINE_FUEL'] = $(this).val();;
selected['ENGINE_FUEL'] = $(this).val();
updateCounter(selected);
});
@ -1146,11 +1409,11 @@ function init_filter()
else
{ $(this).find("option").first().text("Коробка").attr("disabled", "disabled"); }
selected['GEAR'] = $(this).val();;
selected['GEAR'] = $(this).val();
updateCounter(selected);
});
//used ? ".filter_models_used" : ".filter_models"
//used ? ".filter_models_used" : ".filter_models"
$(".catalog_filter_search_button").on("click", function(e)
{
@ -1228,7 +1491,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Объем, от").attr("disabled", "disabled"); }
selected['ENGINE_VOLUME_FROM'] = $(this).val();;
selected['ENGINE_VOLUME_FROM'] = $(this).val();
updateCounter(selected);
});
@ -1239,7 +1502,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Объем, до").attr("disabled", "disabled"); }
selected['ENGINE_VOLUME_TO'] = $(this).val();;
selected['ENGINE_VOLUME_TO'] = $(this).val();
updateCounter(selected);
});
@ -1250,7 +1513,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Год, от").attr("disabled", "disabled"); }
selected['YEAR_FROM'] = $(this).val();;
selected['YEAR_FROM'] = $(this).val();
updateCounter(selected);
});
@ -1261,7 +1524,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Год, до").attr("disabled", "disabled"); }
selected['YEAR_TO'] = $(this).val();;
selected['YEAR_TO'] = $(this).val();
updateCounter(selected);
});
@ -1272,7 +1535,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Пробег, от").attr("disabled", "disabled"); }
selected['MILEAGE_FROM'] = $(this).val();;
selected['MILEAGE_FROM'] = $(this).val();
updateCounter(selected);
});
@ -1283,7 +1546,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Пробег, до").attr("disabled", "disabled"); }
selected['MILEAGE_TO'] = $(this).val();;
selected['MILEAGE_TO'] = $(this).val();
updateCounter(selected);
});
@ -1294,7 +1557,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Город").attr("disabled", "disabled"); }
selected['PARKING_CITY'] = $(this).val();;
selected['PARKING_CITY'] = $(this).val();
updateCounter(selected);
});
@ -1305,7 +1568,7 @@ function init_filter()
else
{ $(this).find("option").first().text("Тип").attr("disabled", "disabled"); }
selected['VEHICLE_TYPE'] = $(this).val();;
selected['VEHICLE_TYPE'] = $(this).val();
updateCounter(selected);
});
@ -1316,10 +1579,76 @@ function init_filter()
else
{ $(this).find("option").first().text("Уточнить тип").attr("disabled", "disabled"); }
selected['VEHICLE_SUBTYPE'] = $(this).val();;
selected['VEHICLE_SUBTYPE'] = $(this).val();
updateCounter(selected);
});
$(".filter_reserved").on("change", function()
{
if($(this).val() !== "")
{ $(this).find("option").first().text("Не указано").attr("disabled", false); }
else
{ $(this).find("option").first().text("Резерв").attr("disabled", "disabled"); }
selected['RESERVED'] = $(this).val();
updateCounter(selected);
});
$(".filter_pts").on("change", function()
{
if($(this).val() !== "")
{ $(this).find("option").first().text("Не указано").attr("disabled", false); }
else
{ $(this).find("option").first().text("Вид ПТС").attr("disabled", "disabled"); }
selected['PTS'] = $(this).val();
updateCounter(selected);
});
$(".filter_restrictions").on("change", function()
{
if($(this).val() !== "")
{ $(this).find("option").first().text("Не указано").attr("disabled", false); }
else
{ $(this).find("option").first().text("Ограничения").attr("disabled", "disabled"); }
selected['RESTRICTIONS'] = $(this).val();
updateCounter(selected);
});
$(".filter_keys").on("change", function()
{
if($(this).val() !== "")
{ $(this).find("option").first().text("Не указано").attr("disabled", false); }
else
{
var texts = filter_texts_resize();
$(this).find("option").first().text(texts['filter_keys']).attr("disabled", "disabled");
}
selected['KEYS'] = $(this).val();
updateCounter(selected);
});
$(".filter_condition").on("change", function()
{
if($(this).val() !== "")
{ $(this).find("option").first().text("Не указано").attr("disabled", false); }
else
{ $(this).find("option").first().text("Состояние").attr("disabled", "disabled"); }
selected['AFTER_ACCIDENT'] = $(this).val();
updateCounter(selected);
});
$(window).on("resize", function()
{
var texts = filter_texts_resize();
$(".filter_keys").find(".keys_count").first().text(texts['filter_keys']);
$(".filter_pts").find(".pts_paper").first().text(texts['filter_pts']);
});
$(".sort_option").on("click", function()
{
// console.log("path", path);
@ -1369,4 +1698,14 @@ function init_filter()
//$(this).parent().parent().css("display", "none");
$("#catalog_small_filter").css("display", "block");
});
}
var texts = filter_texts_resize();
$(".filter_keys").find(".keys_count").first().text(texts['filter_keys']);
$(".filter_pts").find(".pts_paper").first().text(texts['filter_pts']);
}
$(function()
{
setTimeout(init_filter, 100);
});

View File

@ -2,6 +2,10 @@
.catalog_filter_used *[data-desktop-order] {
width: calc(33.333% - 21px) !important;
}
.catalog_filter_used .filter_form_group_hidden {
display: block;
}
}
@media all and (max-width: 1279px) and (min-width: 769px) {
@ -9,6 +13,10 @@
width: calc(50% - 15px) !important;
}
.catalog_filter_used .filter_form_group_hidden {
display: none;
}
.catalog_filter_used div[data-desktop-order]:not(.fieldgroup)>.form_field {
width: 100% !important;
}

View File

@ -66,6 +66,65 @@ return <<<HTML
HTML;
}
function render_reserve()
{
return <<<HTML
<div class="form_field">
<select class="filter_reserved catalog_filter_select">
<option value="" disabled selected>Резерв</option>
<option value="NO">Не в резерве</option>
<option value="YES">В резерве</option>
</select>
</div>
HTML;
}
function render_pts()
{
return <<<HTML
<div class="form_field">
<select class="filter_pts catalog_filter_select">
<option value="" disabled selected>Вид ПТС</option>
</select>
</div>
HTML;
}
function render_restrictions()
{
return <<<HTML
<div class="form_field">
<select class="filter_restrictions catalog_filter_select">
<option value="" disabled selected>Ограничения</option>
<option value="YES" class="with_restrictions">Есть ограничения ФССП</option>
<option value="NO" class="without_restrictions">Без ограничения ФССП</option>
</select>
</div>
HTML;
}
function render_keys()
{
return <<<HTML
<div class="form_field">
<select class="filter_keys catalog_filter_select">
<option value="" class="keys_count" disabled selected>Количество ключей</option>
</select>
</div>
HTML;
}
function render_condition()
{
return <<<HTML
<div class="form_field">
<select class="filter_condition catalog_filter_select">
<option value="" class="filter_condition_title" disabled selected>Состояние</option>
</select>
</div>
HTML;
}
?>
<script>
$(function()
@ -164,6 +223,17 @@ HTML;
<?= render_select("mileage_from", "Пробег, от"); ?>
<?= render_select("mileage_to", "Пробег, до"); ?>
</div>
<div class="fieldgroup" data-desktop-order="7" data-tablet-order="7" data-sm-order="7">
<?= render_reserve(); ?>
<?= render_pts(); ?>
</div>
<div data-desktop-order="8" data-tablet-order="8" data-sm-order="8">
<?= render_restrictions(); ?>
</div>
<div class="fieldgroup" data-desktop-order="9" data-tablet-order="9" data-sm-order="9">
<?= render_keys(); ?>
<?= render_condition(); ?>
</div>
</div>
</div>
</div>

View File

@ -34,28 +34,28 @@ if($this->StartResultCache(60*60*24, md5(var_export($_POST, true))))
$query = null;
$query_arr = [];
$sort = Array("SORT" => "DESC", "ID" => "DESC");
$sort = Array("active" => "DESC", "propertysort_AFTER_ACCIDENT" => "ASC", "SORT" => "DESC", "ID" => "DESC", );
if(isset($arParams['SORT']))
{
if($arParams['SORT'] === "name")
{
$sort = Array("SORT" => "DESC", "NAME" => "ASC");
$sort = Array("SORT" => "DESC", "NAME" => "ASC", "propertysort_AFTER_ACCIDENT" => "DESC");
$arResult['SCROLL'] = true;
}
if($arParams['SORT'] === "date")
{
$sort = Array("SORT" => "DESC", "ID" => "DESC");
$sort = Array("active" => "DESC", "propertysort_AFTER_ACCIDENT" => "ASC", "SORT" => "DESC", "ID" => "DESC", );
$arResult['SCROLL'] = true;
}
if($arParams['SORT'] === "low")
{
$sort = Array("SORT" => "DESC", "PROPERTY_PRICE" => "ASC");
$sort = Array("SORT" => "DESC", "PROPERTY_PRICE" => "ASC", "propertysort_AFTER_ACCIDENT" => "DESC");
$query_arr['SORT'] = $arParams['SORT'];
$arResult['SCROLL'] = true;
}
if($arParams['SORT'] === "high")
{
$sort = Array("SORT" => "DESC", "PROPERTY_PRICE" => "DESC");
$sort = Array("SORT" => "DESC", "PROPERTY_PRICE" => "DESC", "propertysort_AFTER_ACCIDENT" => "DESC");
$query_arr['SORT'] = $arParams['SORT'];
$arResult['SCROLL'] = true;
}
@ -383,6 +383,69 @@ if($this->StartResultCache(60*60*24, md5(var_export($_POST, true))))
$query_arr['PARKING_CITY'] = $arParams['PARKING_CITY'];
}
if(!empty($arParams['RESERVED']))
{
$arResult['EXTENDED'] = true;
$arResult['BY_OPTIONS'] = true;
$arResult['SCROLL'] = true;
$arResult['SELECTED']['RESERVED'] = $arParams['RESERVED'];
if($arParams['RESERVED'] === "YES")
{
$filter['>=PROPERTY_RESERVE_DATE'] = date("Y-m-d");
}
else
{
array_push($filter, [ 'LOGIC' => 'OR', [ '=PROPERTY_RESERVE_DATE' => false ], [ '<PROPERTY_RESERVE_DATE' => date("Y-m-d") ] ]);
//$filter['!=PROPERTY_RESERVE_DATE'] = false;
}
$query_arr['RESERVED'] = $arParams['RESERVED'];
}
if(!empty($arParams['PTS']))
{
$arResult['EXTENDED'] = true;
$arResult['BY_OPTIONS'] = true;
$arResult['SCROLL'] = true;
$arResult['SELECTED']['PTS'] = $arParams['PTS'];
$filter['PROPERTY_PTS_VALUE'] = $arParams['PTS'] === "DIGITAL" ? "ЭПТС" : "Бумажный ПТС";
$query_arr['PTS'] = $arParams['PTS'];
}
if(!empty($arParams['RESTRICTIONS']))
{
$arResult['EXTENDED'] = true;
$arResult['BY_OPTIONS'] = true;
$arResult['SCROLL'] = true;
$arResult['SELECTED']['RESTRICTIONS'] = $arParams['RESTRICTIONS'];
$filter['PROPERTY_RESTRICTIONS_VALUE'] = $arParams['RESTRICTIONS'] === "YES" ? "Есть ограничения ФССП" : "Нет ограничений ФССП";
$query_arr['RESTRICTIONS'] = $arParams['RESTRICTIONS'];
}
if(!empty($arParams['AFTER_ACCIDENT']))
{
$arResult['EXTENDED'] = true;
$arResult['BY_OPTIONS'] = true;
$arResult['SCROLL'] = true;
$arResult['SELECTED']['AFTER_ACCIDENT'] = $arParams['AFTER_ACCIDENT'];
$filter['PROPERTY_AFTER_ACCIDENT_VALUE'] = $arParams['AFTER_ACCIDENT'] === "YES" ? "Да" : "Нет";
$query_arr['AFTER_ACCIDENT'] = $arParams['AFTER_ACCIDENT'];
}
if(isset($arParams['KEYS']))
{
$arResult['EXTENDED'] = true;
$arResult['BY_OPTIONS'] = true;
$arResult['SCROLL'] = true;
$arResult['SELECTED']['KEYS'] = $arParams['KEYS'];
$filter['PROPERTY_KEY_COUNT'] = $arParams['KEYS'];
$query_arr['KEYS'] = $arParams['KEYS'];
}
if(count($query_arr) > 0)
{
$query = http_build_query($query_arr);
@ -396,9 +459,9 @@ if($this->StartResultCache(60*60*24, md5(var_export($_POST, true))))
while ($obElement = $res->GetNextElement())
{
print "<!-- MODEL RELATED";
print_r($ar_res['PROPERTIES']['MODEL']['VALUE']);
print "-->";
// print "<!-- MODEL RELATED";
// print_r($ar_res['PROPERTIES']['MODEL']['VALUE']);
// print "-->";
$ar_res = $obElement->GetFields();
$ar_res['PROPERTIES'] = $obElement->GetProperties();
if(!empty($ar_res['PROPERTIES']['BRAND']['VALUE']))

View File

@ -23,6 +23,9 @@ if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();
$catalog_positions_ids = [];
$catalog_positions = [];
$used_positions_ids = [];
$used_positions = [];
$special_offers_ids = [];
$special_offers = [];
@ -35,6 +38,10 @@ $news = [];
$services_ids = [];
$services = [];
//print "<pre>";
//print_r($arResult['SEARCH']);
//print "</pre>";
foreach($arResult['SEARCH'] AS $arItem)
{
if($arItem['PARAM2'] == IBLOCK_ID_CATALOG_CARS_NEW)
@ -42,6 +49,11 @@ foreach($arResult['SEARCH'] AS $arItem)
array_push($catalog_positions_ids, $arItem['ITEM_ID']);
}
if($arItem['PARAM2'] == IBLOCK_ID_CATALOG_CARS_USED)
{
array_push($used_positions_ids, $arItem['ITEM_ID']);
}
if($arItem['PARAM2'] == IBLOCK_ID_NEWS)
{
array_push($news_ids, $arItem['ITEM_ID']);
@ -173,6 +185,42 @@ if(count($catalog_positions_ids) > 0)
}
}
if(count($used_positions_ids) > 0)
{
$res_catalog = CIBlockElement::GetList([ 'NAME' => 'ASC' ], [ 'IBLOCK_ID' => IBLOCK_ID_CATALOG_CARS_USED, 'ID' => $used_positions_ids ], false, [
/*
"NAME",
"DETAIL_PAGE_URL",
"BRAND",
"MODEL",
"BODY",
"MODIFICATION",
"ENGINE_FUEL",
"GEAR",
"ENGINE_POWER",
"PRICE",
"IMAGE_URL",
*/
]);
while ($ob_element_catalog = $res_catalog->GetNextElement())
{
$ar_res_catalog = $ob_element_catalog->GetFields();
$ar_res_catalog['PROPERTIES'] = $ob_element_catalog->GetProperties();
$ar_res_catalog['PROPERTIES']['BRAND']['RELATED'] = get_related(IBLOCK_ID_BRANDS_USED, $ar_res_catalog['PROPERTIES']['BRAND']['VALUE']);
$ar_res_catalog['PROPERTIES']['MODEL']['RELATED'] = get_related(IBLOCK_ID_MODELS_USED, $ar_res_catalog['PROPERTIES']['MODEL']['VALUE']);
$ar_res_catalog['CALCULATION'] = [];
$ar_res_catalog['CALCULATION']['MONTHLY'] = number_format((($ar_res_catalog['PROPERTIES']['PRICE']['VALUE'] / 100) * 10), 0, ".", " ");
$ar_res_catalog['PREVIEW_PICTURE'] = CFile::GetPath($ar_res_catalog['PROPERTIES']['PHOTO']['VALUE']);
$used_positions[$ar_res_catalog['ID']] = $ar_res_catalog;
//print $ar_res_catalog['ID']." - ".$ar_res_catalog['NAME']."\n";
}
}
foreach($arResult['SEARCH'] AS $key => $item)
{
if($item['PARAM2'] == IBLOCK_ID_CATALOG_CARS_NEW)
@ -183,6 +231,14 @@ foreach($arResult['SEARCH'] AS $key => $item)
}
}
if($item['PARAM2'] == IBLOCK_ID_CATALOG_CARS_USED)
{
if(isset($used_positions[$item['ITEM_ID']]))
{
$arResult['SEARCH'][$key]['USED'] = $used_positions[$item['ITEM_ID']];
}
}
if($item['PARAM2'] == IBLOCK_ID_NEWS)
{
if(isset($news[$item['ITEM_ID']]))

View File

@ -27,7 +27,7 @@
<? foreach($arResult["SEARCH"] as $arItem): ?>
<? if($arItem['PARAM2'] == IBLOCK_ID_CATALOG_CARS_NEW): ?>
<div class="search_item" data-type="auto">
<span class="category">Легковые автомобили</span>
<span class="category">Легковые автомобили и ЛКТ</span>
<img src="<?= $arItem['CAR']['PROPERTIES']['IMAGE_URL']['VALUE']; ?>" alt="<?= $arItem['CAR']['NAME']; ?>">
<a href="<?= $arItem['CAR']['DETAIL_PAGE_URL']; ?>" class="item_link" area-label="<?= $arItem['CAR']['NAME']; ?>">
<p class="item_class"><?= $arItem['CAR']['PROPERTIES']['BRAND']['RELATED']['NAME']; ?> <?= $arItem['CAR']['PROPERTIES']['MODEL']['RELATED']['NAME']; ?> <?= $arItem['CAR']['PROPERTIES']['BODY']['VALUE']; ?></p>
@ -58,6 +58,46 @@
</div>
</a>
</div>
<? elseif($arItem['PARAM2'] == IBLOCK_ID_CATALOG_CARS_USED): ?>
<div class="search_item" data-type="auto">
<span class="category">Техника с пробегом</span>
<img src="<?= !empty($arItem['USED']['PREVIEW_PICTURE']) ? $arItem['USED']['PREVIEW_PICTURE'] : "/images/no_image_500x300.png"; ?>" alt="<?= $arItem['USED']['NAME']; ?>">
<a href="<?= $arItem['USED']['DETAIL_PAGE_URL']; ?>" class="item_link" area-label="<?= $arItem['USED']['NAME']; ?>">
<p class="item_class"><?= $arItem['USED']['PROPERTIES']['BRAND']['RELATED']['NAME']; ?> <?= $arItem['USED']['PROPERTIES']['MODEL']['RELATED']['NAME']; ?> <?= $arItem['USED']['PROPERTIES']['MODIFICATION']['VALUE']; ?></p>
<p class="item_model">
<b>Артикул: <?= $arItem['USED']['CODE']; ?></b>
<? /*<b>VIN: <?= $arItem['USED']['PROPERTIES']['VIN']['VALUE']; ?></b>*/ ?>
<?
/*
<?= $arItem['CAR']['PROPERTIES']['ENGINE_FUEL']['VALUE']; ?>, <?= $arItem['CAR']['PROPERTIES']['GEAR']['VALUE']; ?>, <?= $arItem['CAR']['PROPERTIES']['ENGINE_POWER']['VALUE']; ?> л.с.
*/
?>
</p>
<ul>
<li class="pay">
<p>Ежемесячный платёж (от)</p>
<p><?= $arItem['USED']['CALCULATION']['MONTHLY']; ?> р.</p>
</li>
<li>
<p>Стоимость автомобиля</p>
<? if($arItem['USED']['PROPERTIES']['PRICE_WITH_DISCOUNT']['VALUE'] > 0): ?>
<p style="text-decoration: line-through;"><?= number_format($arItem['USED']['PROPERTIES']['PRICE']['VALUE'], 0, ".", " "); ?> р.</p>
<? else: ?>
<p><?= number_format($arItem['USED']['PROPERTIES']['PRICE']['VALUE'], 0, ".", " "); ?> р.</p>
<? endif; ?>
</li>
<? if($arItem['USED']['PROPERTIES']['PRICE_WITH_DISCOUNT']['VALUE'] > 0): ?>
<li>
<p>Стоимость со скидкой</p>
<p><?= number_format($arItem['USED']['PROPERTIES']['PRICE_WITH_DISCOUNT']['VALUE'], 0, ".", " "); ?> р.</p>
</li>
<? endif; ?>
</ul>
<div class="item_footer">
<span class="button button-transparent">Подробнее</span>
</div>
</a>
</div>
<? elseif($arItem['PARAM2'] == IBLOCK_ID_NEWS): ?>
<div class="search_item" data-type="news">
<span class="category">Новости</span>

View File

@ -2252,7 +2252,7 @@ main #order .container {
}
.model_container .col .model_desc {
margin-top: 0;
margin-right: 30px;
width: calc(100% - 265px);
}
.model_container .col .model_desc p {
margin-bottom: 10px;

View File

@ -2315,7 +2315,7 @@ main {
.model_desc {
margin-top: 0;
margin-right: 30px;
width: ~"calc(100% - 265px)";
p {
margin-bottom: 10px;

View File

@ -23,6 +23,8 @@ use Bitrix\Seo\SitemapRuntimeTable;
Main\Loader::includeModule('seo');
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/php_interface/classes/drom/DromXMLGenerator.php');
ob_get_clean();
error_reporting(E_ERROR);
@ -41,20 +43,22 @@ file_put_contents("get_catalog_izt.json", $content);
$json = json_decode($content, true);
$flags = [];
$flag_names = [ "SPECIAL_OFFER", "LEASING_AVAILABLE", "AFTER_ACCIDENT", "ADVERTISING" ];
$flag_names = [ "SPECIAL_OFFER" => [], "LEASING_AVAILABLE" => [], "AFTER_ACCIDENT" => [], "ADVERTISING" => [], "PTS" => [], "RESTRICTIONS" => [], "PUBLISH_ON_DROM" => [], ];
foreach($flag_names AS $f)
foreach($flag_names AS $k => $f)
{
$properties = CIBlockPropertyEnum::GetList([ "sort" => "asc", "name" => "asc" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_USED, "CODE" => $f ]);
$properties = CIBlockPropertyEnum::GetList([ "sort" => "asc", "name" => "asc" ], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_USED, "CODE" => $k ]);
while ($prop_fields = $properties->GetNext())
{
$flags[ $f ] = $prop_fields["ID"];
// print $k." => ".$prop_fields["ID"]."\n";
// print_r($prop_fields);
// print "\n\n";
$flags[ $k ][ $prop_fields['XML_ID'] ] = $prop_fields["ID"];
}
}
print "flags\n";
print_r($flags);
print "\n\n";
foreach($json as $car)
@ -442,10 +446,14 @@ foreach($json as $car)
"PRICE_WITH_DISCOUNT" => isset($car['price_with_discount']) && !empty($car['price_with_discount']) ? $car['price_with_discount'] : 0,
"RESERVE_DATE" => $car['reserve_date'],
"SPECIAL_OFFER" => $car['special_offer'] ? $flags['SPECIAL_OFFER'] : null,
"LEASING_AVAILABLE" => $car['leasing_available'] ? $flags['LEASING_AVAILABLE'] : null,
"AFTER_ACCIDENT" => $car['after_accident'] ? $flags['AFTER_ACCIDENT'] : null,
"ADVERTISING" => $car['special_offer'] ? $flags['ADVERTISING'] : null,
"SPECIAL_OFFER" => $car['special_offer'] ? $flags['SPECIAL_OFFER']['YES'] : null,
"LEASING_AVAILABLE" => $car['leasing_available'] ? $flags['LEASING_AVAILABLE']['YES'] : null,
"AFTER_ACCIDENT" => $car['after_accident'] ? $flags['AFTER_ACCIDENT']['YES'] : $flags['AFTER_ACCIDENT']['NO'],
"ADVERTISING" => $car['special_offer'] ? $flags['ADVERTISING']['YES'] : null,
"KEY_COUNT" => $car['key_count'],
"PTS" => $car['pts_info'] == "Электронный" ? $flags['PTS']['DIGITAL'] : ($car['pts_info'] == "Бумажный. В наличии" ? $flags['PTS']['PAPER'] : null ),
"RESTRICTIONS" => $car['arest_info'] == "Есть ограничения" ? $flags['RESTRICTIONS']['YES'] : ($car['arest_info'] == "Нет ограничений" ? $flags['RESTRICTIONS']['NO'] : null),
"PUBLISH_ON_DROM" => $car['publish_on_drom'] ? $flags['PUBLISH_ON_DROM']['YES'] : null,
];
$used_car_element = new CIBlockElement;
@ -496,6 +504,8 @@ foreach($json as $car)
CIBlockElement::SetPropertyValuesEx($new_used_car_id, IBLOCK_ID_CATALOG_CARS_USED, $arFields['PROPERTY_VALUES'], []);
}
print $new_used_car_id['ID']." NEW\n";
print "\n";
}
else
@ -515,6 +525,7 @@ foreach($json as $car)
$el = new CIBlockElement;
$el->Update($car_existed['ID'], [ "ACTIVE" => "Y", "NAME" => $name, "DETAIL_TEXT" => $car['description'], "SORT" => 500 ]);
print $car_existed['ID']." UPDATED\n";
CIBlockElement::SetPropertyValuesEx($car_existed['ID'], IBLOCK_ID_CATALOG_CARS_USED, $PROPERTY_VALUES, []);
}
}
@ -556,4 +567,35 @@ foreach($bitrix_existed_models AS $model_id)
$el = new CIBlockElement;
$el->Update($model_id, ["ACTIVE" => "N"]);
}
}
}
/* search reindex start -------------------------------------------------------------*/
$reindex_handler = false;
$reindex_handler = CSearch::ReIndexAll(false, 60, $reindex_handler);
while(is_array($reindex_handler))
{
$reindex_handler = CSearch::ReIndexAll(false, 60, $reindex_handler);
}
/* search reindex end -------------------------------------------------------------*/
$drom = new DromXMLGenerator();
$used_res = CIBlockElement::GetList( [], [ "IBLOCK_ID" => IBLOCK_ID_CATALOG_CARS_USED, "ACTIVE" => "Y", "PROPERTY_PUBLISH_ON_DROM_VALUE" => "Да" ], false, [], [] );
while($used_ob = $used_res->GetNextElement())
{
$used = $used_ob->GetFields();
$used['PROPERTIES'] = $used_ob->GetProperties();
$used['PROPERTIES']['BRAND']['RELATED'] = get_related(IBLOCK_ID_BRANDS_USED, $used['PROPERTIES']['BRAND']['VALUE']);
$used['PROPERTIES']['MODEL']['RELATED'] = get_related(IBLOCK_ID_MODELS_USED, $used['PROPERTIES']['MODEL']['VALUE']);
$used['PHOTOS_1080'] = [];
foreach($used['PROPERTIES']['PHOTOS_1080']['VALUE'] AS $photo_id)
{
array_push($used['PHOTOS_1080'], CFile::GetPath($photo_id));
}
$drom->addOffer($used);
}
$drom->save();

9
readme.md Normal file
View File

@ -0,0 +1,9 @@
# Константы /bitrix/php_interface/dbconn.php
```
API_HOST - адрес CRM
SELF_IP - публичный IPv4 адрес сервера
MODE_PRODUCTION - включен ли production режим
DEBUG_IBLOCK_CYCLE - позволять ли сохранять дамп структуры элемента инфоблока при Add/Update операциях на подверженных рекламе инфоблоках
ADVERTISING_IBLOCK_ARRAY - Массив идентификаторов инфоблоков, формата КОНСТАНТА => строковое значение из проекта evolution-advertiser
```

View File

@ -33,7 +33,7 @@ $APPLICATION->SetTitle("Поиск");
"RESTART" => "Y",
"NO_WORD_LOGIC" => "N",
"USE_LANGUAGE_GUESS" => "N",
"CHECK_DATES" => "Y",
"CHECK_DATES" => "N",
"USE_TITLE_RANK" => "Y",
"DEFAULT_SORT" => "rank",
"FILTER_NAME" => "",
@ -74,45 +74,6 @@ $APPLICATION->SetTitle("Поиск");
); ?>
</aside>
</div>
<?
/*
<h2>Вам может быть интересно</h2>
<div class="news_static_wrapper">
<div class="news_list">
<div class="news_item">
<p class="news_date">07 декабря 2021</p>
<p class="news_title">Новый сайт и Личный кабинет</p>
<img src="/upload/iblock/3e6/odjkvqz7q4658e1a395cwmj5phwjhfwf.jpg" width="234px" height="234px" alt="">
<p class="news_description">Постоянно работая над сервисной составляющей, Лизинговая компания
Эволюция запустила новый фирменный сайт с Личным кабинетом.</p>
<p class="news_link">Подробнее</p>
<a href="/about/news/novyy-sayt-i-lichnyy-kabinet/"></a>
</div>
<div class="news_item">
<p class="news_date">07 декабря 2021</p>
<p class="news_title">Нижневартовск</p>
<img src="/upload/iblock/06b/yr66xh9or600h1yqfe91aox1dq31xta7.jpg" width="234px" height="234px" alt="">
<p class="news_description">Открыли представительство в одном из крупнейших центров российской
нефтяной промышленности.</p>
<p class="news_link">Подробнее</p>
<a href="/about/news/nizhnevartovsk/"></a>
</div>
<div class="news_item">
<p class="news_date">27 октября 2021</p>
<p class="news_title">FOX Trailer Лизинг</p>
<img src="/upload/iblock/123/9lr32e2n3jdh89ibv2ae3pl4d5limoys.jpg" width="234px" height="234px" alt="">
<p class="news_description"></p>
<p>
Совместная программа производителя <b>Fox Trailer</b> и <b>Лизинговой компании Эволюция.</b>
</p>
<p></p>
<p class="news_link">Подробнее</p>
<a href="/about/news/fox-trailer-lizing/"></a>
</div>
</div>
</div>
*/
?>
</div>
</section>
<?

View File

@ -42,6 +42,12 @@ $APPLICATION->SetPageProperty("keywords", "Лизинг бу автомобил
"YEAR_FROM" => $_REQUEST['YEAR_FROM'],
"YEAR_TO" => $_REQUEST['YEAR_TO'],
"RESERVED" => $_REQUEST['RESERVED'],
"PTS" => $_REQUEST['PTS'],
"RESTRICTIONS" => $_REQUEST['RESTRICTIONS'],
"KEYS" => $_REQUEST['KEYS'],
"AFTER_ACCIDENT" => $_REQUEST['AFTER_ACCIDENT'],
"SORT" => $_REQUEST['SORT'],
"PATH" => "/used/",
"PROGRAM" => null,