Вход Регистрация
Файл: 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 
saveGOOGLELOCATION_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(3010);
        
$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($userListtruetruetruefalse);
        
        
$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'] > )
                {
                    
$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($sexValue0, -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_MILESself::DISTANCE_UNITS_KM) ) ? $unit self::DISTANCE_UNITS_MILES;
    }
    
    public function 
setDistanseUnits$value )
    {
        
$unit = !empty($value) && in_array$value, array(self::DISTANCE_UNITS_MILESself::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($distance2);

    }
    
    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';
    }
    
    
}
Онлайн: 1
Реклама