<?php
/**
* Пункты приема/отправки
*/
class Location extends ObjectModel {
const LOCATION_CITY = 0,
LOCATION_REGION = 1;
public $id = NULL,
$code = NULL,
$title = NULL,
$api = NULL,
$type = self::LOCATION_CITY;
public static $definition = array(
'table' => 'tcd_location',
'primary' => 'id_location',
'multilang' => false,
'fields' => array(
'code' => array( 'type' => self::TYPE_STRING, 'required' => true ),
'title' => array( 'type' => self::TYPE_STRING, 'required' => true ),
'api' => array( 'type' => self::TYPE_STRING, 'required' => true ),
'type' => array( 'type' => self::TYPE_INT )
)
);
/**
* Выборка локаций по названию города, опционально еще по API
*
* @param string $city наименование локации
* @param string $api наименование API
* @param bool $strict строгое совпадение по названию
*/
public static function GetByCity( $city, $api = NULL, $strict = true ) {
return self::GetByTitle( $city, self::LOCATION_CITY, $api, $strict );
}
/**
* Выборка по названию, типу и апи
*/
public static function GetByTitle( $title, $type, $api, $strict = true ) {
$ret = array( );
$db = Db::getInstance( );
$szQuery = 'SELECT `id_location` FROM `'._DB_PREFIX_.'tcd_location` WHERE `type`='.$type.' AND ';
if ( is_array( $title ) ) {
$tmp = array( );
foreach( $title as $value ) {
if ( $strict ) {
$tmp[ ] = 'LOWER(`title`)=\''.$db->escape( mb_strtolower( $value, 'UTF-8' ) ).'\'';
} else {
$tmp[ ] = '`title` LIKE \'%'.$db->escape( $value ).'%\'';
}
}
$szQuery .= join( ' AND ', $tmp );
} elseif ( $strict ) {
$szQuery .= 'LOWER(`title`)=\''.$db->escape( mb_strtolower( $title, 'UTF-8' ) ).'\'';
} else {
$szQuery .= '`title` LIKE \'%'.$db->escape( $title ).'%\'';
}
$szQuery .= 'AND `api`=\''.$db->escape( $api ).'\'';
$query = $db->query( $szQuery );
while( $obj = $query->fetchObject( ) ) {
$ret[ ] = new Location( ( int ) $obj->id_location );
}
return $ret;
}
/**
* Подготовка названия города к поиску локации
*
* формат города: город (регион)
*
* если для города задан регион, то локации надо искать по сочетанию города и региона
* если не найден по город+регион, то по городу (сначала точное совпадение, потом частичное)
* просто склеивать название города и региона
*/
public static function PrepareCityForAddress( $city, $region ) {
$regions = self::GetRegionsByCity( $city );
$lcRegion = mb_strtolower( $region );
foreach( $regions as $obj ) {
$currentRegion = mb_strtolower( trim( $obj->title_full ) );
if ( $currentRegion == $lcRegion ) {
return $city.' ('.trim( $obj->title_full ).')';
}
}
// в итоге, если не будет найден регион, то будет указан в ручную, если был введен
return $city.( empty( $region ) ? '' : ' ('.$region.')' );
}
/**
* Проверяет наличие города
*/
public static function CityExists( $title, $strict = false ) {
$db = Db::getInstance( );
return ( bool ) $db->getValue( 'SELECT COUNT(*) FROM `'._DB_PREFIX_.'tcd_ref_city` WHERE `title`'.( $strict ? '=\''.$db->escape( $title ).'\'' : ' LIKE \'%'.$db->escape( $title ).'%\'' ) );
}
/**
* Проверяет наличие региона
*/
public static function RegionExists( $title, $strict = false ) {
$db = Db::getInstance( );
return ( bool ) $db->getValue( 'SELECT COUNT(*) FROM `'._DB_PREFIX_.'tcd_ref_region` WHERE `title_full`'.( $strict ? '=\''.$db->escape( $title ).'\'' : ' LIKE \'%'.$db->escape( $title ).'%\'' ) );
}
public static function CityAndRegionExists( $cityTitle, $regionTitle, $strict = false ) {
$db = Db::getInstance( );
return ( bool ) $db->getValue(
'SELECT COUNT(*) FROM `'._DB_PREFIX_.'tcd_ref_city` c LEFT JOIN `'._DB_PREFIX_.'tcd_ref_region` r ON r.`id`=c.`region_id`'.
'WHERE c.`title`'.( $strict ? '=\''.$db->escape( $cityTitle ).'\'' : ' LIKE \'%'.$db->escape( $cityTitle ).'%\'' ).
' AND r.`title_full`'.( $strict ? '=\''.$db->escape( $regionTitle ).'\'' : ' LIKE \'%'.$db->escape( $regionTitle ).'%\'' )
);
}
/**
* Получение регионов, в которых встречается данный город
*/
public static function GetRegionsByCity( $title ) {
$ret = array( );
if ( self::CityExists( $title ) && ( $title != '' ) ) {
$db = Db::getInstance( );
$query = $db->query( 'SELECT r.* FROM `'._DB_PREFIX_.'tcd_ref_city` c LEFT JOIN `'._DB_PREFIX_.'tcd_ref_region` r ON r.`id`=c.`region_id` WHERE c.`title` LIKE \'%'.$db->escape( $title ).'%\' ORDER BY r.`title` ASC' );
while( $obj = $query->fetchObject( ) ) {
$ret[ ] = $obj;
}
}
return $ret;
}
/**
* Выборка первого региона из справочников
*/
public static function GetFirstRegion( ) {
$db = Db::getInstance( );
$query = $db->query( 'SELECT * FROM `'._DB_PREFIX_.'tcd_ref_region` ORDER BY `title` ASC LIMIT 1' );
return $query->fetchObject( );
}
/**
* Поиск столицы региона
*/
public static function GetRegionCapital( $title ) {
$db = Db::getInstance( );
$title = mb_strtolower( $title, 'UTF-8' );
$query = $db->query( 'SELECT c.* FROM `'._DB_PREFIX_.'tcd_ref_city` c LEFT JOIN `'._DB_PREFIX_.'tcd_ref_region` r ON r.`id`=c.`region_id` WHERE LOWER(r.`title_full`)=\''.$db->escape( $title ).'\' AND c.`is_capital`=1 LIMIT 1' );
return ( $query === false ) ? false : $query->fetchObject( );
}
/**
* Поиск региона по столице
*/
public static function GetRegionByCapital( $title ) {
$db = Db::getInstance( );
$title = mb_strtolower( $title, 'UTF-8' );
$query = $db->query( 'SELECT r.* FROM `'._DB_PREFIX_.'tcd_ref_city` c LEFT JOIN `'._DB_PREFIX_.'tcd_ref_region` r ON r.`id`=c.`region_id` WHERE LOWER(c.`title`)=\''.$db->escape( $title ).'\' AND c.`is_capital`=1 LIMIT 1' );
return ( $query === false ) ? false : $query->fetchObject( );
}
/**
* Поиск региона на названию
*/
public static function GetRegionByTitle( $title ) {
$db = Db::getInstance( );
$title = mb_strtolower( $title, 'UTF-8' );
$title = $db->escape( $title );
$query = $db->query( 'SELECT * FROM `'._DB_PREFIX_.'tcd_ref_region` WHERE LOWER(`title_full`)=\''.$title.'\' OR LOWER(`title_full`) LIKE \'%'.$title.'%\' LIMIT 1' );
return ( $query === false ) ? false : $query->fetchObject( );
}
/**
* Замена сокращений в названиях регионов
*/
public static function ReplaceShort( $value ) {
return preg_replace(
array( '/респ\./', '/обл\./' ),
array( 'республика', 'область' ),
$value
);
}
/**
* Вырезает регион из названия города
* возвращает оба значения
*/
public static function StripRegion( $title ) {
$city = $region = '';
if ( preg_match( '/^([^\)]*)\((.*)\)$/', $title, $matches ) ) {
$city = trim( $matches[ 1 ] );
$region = trim( $matches[ 2 ] );
} else {
$city = $title;
}
return array( $city, $region );
}
/**
* Поиск города по части названия
*/
public static function FindCity( $title, $limit = 100 ) {
$db = Db::getInstance( );
return $db->query(
//'SELECT c.`type`, c.`region_id`, c.`title` `title`, r.`title_full` `region`, CONCAT(a.`title`, \' \', a.`type`) `area` '.
'SELECT c.`type`, c.`region_id`, c.`title` `title`, r.`title_full` `region`, CONCAT(c.`region_code`, c.`title`) `pair`, '.
'CONCAT(c.`type`, c.`title`, r.`title_full`) `full`'.
'FROM `'._DB_PREFIX_.'tcd_ref_city` c '.
'LEFT JOIN `'._DB_PREFIX_.'tcd_ref_region` r ON r.`id`=c.`region_id` '.
//'LEFT JOIN `'._DB_PREFIX_.'tcd_ref_area` a ON a.`id`=c.`area_id` '.
'WHERE c.`title` LIKE \'%'.$db->escape( $title ).'%\' '.
'GROUP BY `pair` ORDER BY `full` ASC LIMIT '.$limit
);
}
}