railpage/railpagecore

View on GitHub
lib/Images/Utility/Geoplace.php

Summary

Maintainability
B
6 hrs
Test Coverage
<?php

/**
 * Geoplace utility
 * @since Version 3.9.1
 * @package Railpage
 * @author Michael Greenhill
 */

namespace Railpage\Images\Utility;

use Exception;
use InvalidArgumentException;
use DateTime;
use DateTimeZone;
use Railpage\AppCore;
use Railpage\Images\ImageFactory;
use Railpage\Images\Images;
use Railpage\Images\Image;
use Railpage\Place;
use Railpage\Locations\Country;
use Railpage\Locations\Region;

class Geoplace {
    
    /**
     * Get photo neighbourhoods including photo counts
     * @since Version 3.9.1
     * @return array
     * @param string|null $country
     * @param string|null $region
     */
    
    public static function getNeighbourhoods($country = NULL, $region = NULL) {
        
        $params = array(); 
        
        if (!is_null($country)) {
            $params[] = strtoupper($country);
            $country = " AND country_code = ?";
        }
        
        if (!is_null($region)) {
            $params[] = strtoupper($region);
            $region = " AND region_code = ?";
        }
        
        $Database = (new AppCore)->getDatabaseConnection(); 
        
        $query = "SELECT g.country_code, g.country_name, g.region_code, g.region_name, g.neighbourhood, g.id, 
                X(g.point) AS lat, Y(g.point) AS lon, g.timezone, COUNT(*) AS count,
                GROUP_CONCAT(i.id) AS image_ids, CONCAT('/place?lat=', X(g.point), '&lon=', Y(g.point)) AS url
            FROM image AS i
            LEFT JOIN geoplace AS g ON i.geoplace = g.id
            WHERE i.geoplace != 0
            " . $country . "
            " . $region . "
            GROUP BY g.id
            ORDER BY g.country_code, g.region_code, g.neighbourhood";
        
        $result = $Database->fetchAll($query, $params); 
        
        foreach ($result as $key => $val) {
            $result[$key]['image_ids'] = array_slice(explode(",", $val['image_ids']), 0, 5);
            //$result[$key]['photos'] = ImageFactory::GetThumbnails($result[$key]['image_ids']);
            //$result[$key]['photos_html'] = implode("", array_column($result[$key]['photos'], "html"));
        }
        
        return $result;

    }
    
    /**
     * Get regions
     * @since Version 3.9.1
     * @return array
     * @param string|null $country
     */
    
    public static function getRegions($country = NULL) {
        
        $params = []; 
        $where = [];
        
        if (!is_null($country)) {
            $where[] = " country_code = ?";
            $params[] = strtoupper($country); 
        }
        
        $query = "SELECT DISTINCT region_code, region_name, country_code, country_name FROM geoplace";
        
        if (count($where)) {
            $query .= " WHERE " . implode(" AND ", $where); 
        }
        
        $query .= " ORDER BY country_code, region_code";
        
        $Database = (new AppCore)->getDatabaseConnection(); 
        
        $return = array(); 
        
        foreach ($Database->fetchAll($query, $params) as $row) {
            if (!isset($return[$row['country_code']])) {
                $return[$row['country_code']] = array(
                    "country_code" => $row['country_code'],
                    "country_name" => $row['country_name'],
                    "regions" => []
                );
            }
            
            $return[$row['country_code']]['regions'][$row['region_code']] = array(
                "region_code" => $row['region_code'],
                "region_name" => $row['region_name']
            );
        }
        
        return $return;
        
    }
}