Файл: plugins/google_map_location/bol/location_service.php
Строк: 610
<?php
final class GOOGLELOCATION_BOL_LocationService
{
const JQUERY_LOAD_PRIORITY = 100000000;
const STRIP_STR = '#$;?:';
const MAX_USERS_COUNT = 20;
const SESSION_VAR_ENTITY_LIST = 'googlelocation_userlist_session_var';
const DISTANCE_UNITS_KM = 'km';
const DISTANCE_UNITS_MILES = 'miles';
/**
* @var GOOGLELOCATION_BOL_LocationDao
*/
private $locationDao;
/**
* Class instance
*
* @var GOOGLELOCATION_BOL_LocationService
*/
private static $classInstance;
/**
* Class constructor
*/
private function __construct()
{
$this->locationDao = GOOGLELOCATION_BOL_LocationDao::getInstance();
}
/**
* Returns class instance
*
* @return GOOGLELOCATION_BOL_LocationService
*/
public static function getInstance()
{
if ( self::$classInstance === null )
{
self::$classInstance = new self();
}
return self::$classInstance;
}
public function save( GOOGLELOCATION_BOL_Location $dto )
{
$this->locationDao->save($dto);
}
public function findByUserId( $userId )
{
return $this->locationDao->findByUserId($userId);
}
public function getSearchInnerJoinSql( $prefix, $southWestLat, $southWestLng, $northEastLat, $northEastLng, $countryCode = null, $joinType = 'INNER' )
{
return $this->locationDao->getSearchInnerJoinSql($prefix, $southWestLat, $southWestLng, $northEastLat, $northEastLng, $countryCode, $joinType );
}
public function findByUserIdList( array $userIdList )
{
return $this->locationDao->findByUserIdList($userIdList);
}
public function getAllLocationsForUserMap()
{
return $this->locationDao->getAllLocationsForUserMap();
}
public function getAllLocationsForEntityType( $entityType )
{
return $this->locationDao->getAllLocationsForEntityType($entityType);
}
public function getLanguageCode()
{
$tag = BOL_LanguageService::getInstance()->getCurrent()->getTag();
$matches = array();
preg_match("/^([a-zA-Z]{2})-[a-zA-Z]{2}.*$/", $tag, $matches);
$language = 'en';
if ( !empty($matches[1]) )
{
$language = mb_strtolower($matches[1]);
}
return $language;
}
public function findUserListByCoordinates( $lat, $lon, $first, $count, $userIdList = array() )
{
return $this->locationDao->findUserListByCoordinates($lat, $lon, $first, $count, $userIdList);
}
public function findUserCountByCoordinates( $lat, $lon, $userIdList = array() )
{
return $this->locationDao->findUserCountByCoordinates($lat, $lon, $userIdList);
}
public function getLocationName( $lat, $lon )
{
return $this->locationDao->getLocationName($lat, $lon);
}
public function findByEntityIdAndEntityType( $entityId, $entityType )
{
return $this->locationDao->findEntityIdAndEntityType($entityId, $entityType);
}
public function deleteByEntityIdAndEntityType( $entityId, $entityType )
{
return $this->locationDao->deleteByEntityIdAndEntityType($entityId, $entityType);
}
public function deleteByEntityType( $entityType )
{
return $this->locationDao->deleteByEntityType($entityType);
}
public function getPointList( $locationList )
{
$pointList = array();
foreach ( $locationList as $location )
{
$entityId = $location['entityId'];
if ( !isset($pointList[$location['lat'] . "_" . $location['lng']]['count']) )
{
$pointList[$location['lat'] . "_" . $location['lng']]['location']['lat'] = $location['lat'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['lng'] = $location['lng'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['address'] = $location['address'];
$pointList[$location['lat'] . "_" . $location['lng']]['count'] = 0;
$pointList[$location['lat'] . "_" . $location['lng']]['location']['northEastLat'] = $location['northEastLat'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['northEastLng'] = $location['northEastLng'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['southWestLat'] = $location['southWestLat'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['southWestLng'] = $location['southWestLng'];
$pointList[$location['lat'] . "_" . $location['lng']]['location']['json'] = $location['json'];
}
if ( $pointList[$location['lat'] . "_" . $location['lng']]['count'] <= self::MAX_USERS_COUNT )
{
$pointList[$location['lat'] . "_" . $location['lng']]['entityIdList'][$entityId] = $entityId;
/* $pointList[$location['lat']."_". $location['lng']]['entityIdList'] = array(160,
159,
147,
144,
143,
139,
137,
136,
135,
132,
131,
130,
129,
125,
124,
120,
117,
1,
116,
114,
113,
112,
109,
107,
106,
96,
90,
89,
83,
81); */
$pointList[$location['lat'] . "_" . $location['lng']]['count']++;
}
//$pointList[$location['lat']."_". $location['lng']]['count'] = 32;
}
//printVar($pointList);
return $pointList;
}
public function getEntityListFromSession( $hash )
{
$list = PEEP::getSession()->get(self::SESSION_VAR_ENTITY_LIST);
return !empty($list[$hash]['data']) && is_array($list[$hash]['data']) ? $list[$hash]['data'] : array();
}
public function getEntityTypeFromSession( $hash )
{
$list = PEEP::getSession()->get(self::SESSION_VAR_ENTITY_LIST);
return !empty($list[$hash]['entityType']) ? $list[$hash]['entityType'] : null;
}
public function saveEntityListToSession( $entityIdList, $entityType = null )
{
$this->clearEntitylist();
$list = PEEP::getSession()->get(self::SESSION_VAR_ENTITY_LIST);
if ( empty($list) )
{
$list = array();
}
$hash = md5(json_encode($entityIdList));
$list[$hash]['data'] = $entityIdList;
$list[$hash]['entityType'] = $entityType;
$list[$hash]['time'] = time();
PEEP::getSession()->set(self::SESSION_VAR_ENTITY_LIST, $list);
return $hash;
}
private function clearEntitylist()
{
$list = PEEP::getSession()->get(self::SESSION_VAR_ENTITY_LIST);
if ( empty($list) )
{
return;
}
$timeLimit = 60 * 5;
foreach ( $list as $key => $item )
{
if( ($item['time'] + $timeLimit) < time() )
{
unset($list[$key]);
}
}
}
/*
* Return map component
* params mixed $userIdList
* $userIdList = array( 1, 2, 3 ) OR $userIdList = 'all'
* return GOOGLELOCATION_CMP_Map
*/
public function getUserListMapCmp( $userIdList, $backUri = null )
{
$map = new GOOGLELOCATION_CMP_Map();
$map->setHeight('600px');
$map->setZoom(2);
$map->setCenter(30, 10);
$map->setMapOption('scrollwheel', 'true');
$locationObjectList = array();
$hash = null;
if ( !empty($userIdList) && is_array($userIdList) )
{
$locationObjectList = $this->findByUserIdList($userIdList);
}
else if ( strtolower($userIdList) == 'all' )
{
$locationObjectList = $this->getAllLocationsForEntityType(GOOGLELOCATION_BOL_LocationDao::ENTITY_TYPE_USER);
}
$userList = array();
$userLocationList = array();
$locationList = array();
foreach ( $locationObjectList as $location )
{
if ( $location instanceof PEEP_Entity )
{
$userList[$location->entityId] = $location->entityId;
$locationList[] = get_object_vars($location);
}
if ( is_array($location) )
{
$userList[$location['entityId']] = $location['entityId'];
$locationList[] = $location;
}
}
$dtoList = BOL_UserService::getInstance()->findUserListByIdList($userList);
$userDtoList = array();
foreach( $dtoList as $userDto )
{
$userDtoList[$userDto->id] = $userDto;
}
$avatarList = BOL_AvatarService::getInstance()->getDataForUserAvatars($userList, true, true, true, false);
$userUrlList = BOL_UserService::getInstance()->getUserUrlsForList($userList);
$displayNameList = BOL_UserService::getInstance()->getDisplayNamesForList($userList);
$displayedFields = $this->getUserFields($userList);
$pointList = $this->getInstance()->getPointList($locationList);
foreach ( $pointList as $point )
{
if ( !empty($point['entityIdList']) )
{
$content = "";
if ( $point['count'] > 1 )
{
$listCmp = PEEP::getClassInstance('GOOGLELOCATION_CMP_MapUserList', $point['entityIdList'], $point['location']['lat'], $point['location']['lng'], $backUri);
$content .= $listCmp->render();
unset($listCmp);
}
else
{
$userId = current($point['entityIdList']);
$content = null;
if ( !empty($userDtoList[$userId]) )
{
$cmp = PEEP::getClassInstance('GOOGLELOCATION_CMP_MapItem');
$cmp->setAvatar($avatarList[$userId]);
$content = "<a href='{$userUrlList[$userId]}'>" . $displayNameList[$userId] . "</a>
<div>$displayedFields[$userId]</div>
<div>{$point['location']['address']}</div>";
$cmp->setContent($content);
$content = $cmp->render();
}
}
if ( !empty($content) )
{
$map->addPoint($point['location'], '', $content);
}
}
}
return $map;
}
public function getMobileUserListMapCmp( $userIdList, $backUri = null )
{
$map = $this->getUserListMapCmp( $userIdList, $backUri = null );
$map->setHeight('400px');
$map->setMapOption('overviewMapControl', 'true');
$map->setMapOption('panControl', 'true');
$map->setMapOption('rotateControl', 'true');
return $map;
}
private function getUserFields( $userIdList )
{
$fields = array();
$qs = array();
$qBdate = BOL_QuestionService::getInstance()->findQuestionByName('birthdate');
if ( $qBdate->onView )
{
$qs[] = 'birthdate';
}
$qSex = BOL_QuestionService::getInstance()->findQuestionByName('sex');
if ( $qSex->onView )
{
$qs[] = 'sex';
}
$questionList = BOL_QuestionService::getInstance()->getQuestionData($userIdList, $qs);
foreach ( $questionList as $uid => $question )
{
$fields[$uid] = '';
$age = '';
if ( !empty($question['birthdate']) )
{
$date = UTIL_DateTime::parseDate($question['birthdate'], UTIL_DateTime::MYSQL_DATETIME_DATE_FORMAT);
$age = UTIL_DateTime::getAge($date['year'], $date['month'], $date['day']);
}
$sexValue = '';
if ( !empty($question['sex']) )
{
$sex = $question['sex'];
for ( $i = 0; $i < 31; $i++ )
{
$val = pow(2, $i);
if ( (int) $sex & $val )
{
$sexValue .= BOL_QuestionService::getInstance()->getQuestionValueLang('sex', $val) . ', ';
}
}
if ( !empty($sexValue) )
{
$sexValue = substr($sexValue, 0, -2);
}
}
if ( !empty($sexValue) && !empty($age) )
{
$fields[$uid] = $sexValue . ' ' . $age;
}
}
return $fields;
}
/**
* bearing is 0 = north, 180 = south, 90 = east, 270 = west
*
*/
public function getNewCoordinates( $latitude, $longitude, $bearing, $distance )
{
$distance_unit = $this->getDistanseUnits();
if ( $distance_unit == "miles" )
{
// Distance is in miles.
$radius = 3963.1676;
}
else
{
// distance is in km.
$radius = 6378.1;
}
// New latitude in degrees.
$new_latitude = rad2deg(asin(sin(deg2rad($latitude)) * cos($distance / $radius) + cos(deg2rad($latitude)) * sin($distance / $radius) * cos(deg2rad($bearing))));
// New longitude in degrees.
$new_longitude = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad($bearing)) * sin($distance / $radius) * cos(deg2rad($latitude)), cos($distance / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($new_latitude))));
$coord = array();
$coord['lat'] = $new_latitude;
$coord['lng'] = $new_longitude;
return $coord;
}
public function getDistanseUnits()
{
$unit = PEEP::getConfig()->getValue('googlelocation', 'distance_units');
return in_array( $unit, array(self::DISTANCE_UNITS_MILES, self::DISTANCE_UNITS_KM) ) ? $unit : self::DISTANCE_UNITS_MILES;
}
public function setDistanseUnits( $value )
{
$unit = !empty($value) && in_array( $value, array(self::DISTANCE_UNITS_MILES, self::DISTANCE_UNITS_KM) ) ? $value : self::DISTANCE_UNITS_MILES;
PEEP::getConfig()->saveConfig('googlelocation', 'distance_units', $unit);
}
public function getListOrderedByDistance( $userIdList, $first, $count, $lat, $lon )
{
return $this->locationDao->getListOrderedByDistance( $userIdList, $first, $count, $lat, $lon );
}
function distance($lat, $lon, $lat1, $lon1, $unit = null)
{
$start = array($lat, $lon);
$finish = array($lat1, $lon1);
$theta = $start[1] - $finish[1];
$distance = (sin(deg2rad($start[0])) * sin(deg2rad($finish[0]))) + (cos(deg2rad($start[0])) * cos(deg2rad($finish[0])) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
if ( empty($unit) )
{
$unit = $this->getDistanseUnits();
}
if ( $unit == self::DISTANCE_UNITS_KM )
{
$distance *= 1.609344;
}
return round($distance, 2);
}
public function getCountryRestriction()
{
$reuslt = null;
$country = PEEP::getConfig()->getValue('googlelocation', 'country_restriction');
if ( !empty($country) )
{
$reuslt = $country;
}
return $reuslt;
}
public function getDefaultMarkerIcon()
{
return PEEP::getPluginManager()->getPlugin('googlelocation')->getStaticJsUrl().'images/marker_icon.png';
}
}