mirror of
https://github.com/werkraum-media/events.git
synced 2024-11-25 02:56:11 +01:00
Daniel Siepmann
00946af6ad
They sometimes use a different separator. The code is adjusted to always use same separator and precision. That will prevent the same location from showing up multiple times due to different latitude and longitude values.
186 lines
3.7 KiB
PHP
186 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace Wrm\Events\Domain\Model;
|
|
|
|
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
|
|
|
|
class Location extends AbstractEntity
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $name = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $street = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $zip = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $city = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $district = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $country = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $phone = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $latitude = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $longitude = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $globalId = '';
|
|
|
|
public function __construct(
|
|
string $name,
|
|
string $street,
|
|
string $zip,
|
|
string $city,
|
|
string $district,
|
|
string $country,
|
|
string $phone,
|
|
string $latitude,
|
|
string $longitude,
|
|
int $languageUid
|
|
) {
|
|
$this->name = $name;
|
|
$this->street = $street;
|
|
$this->zip = $zip;
|
|
$this->city = $city;
|
|
$this->district = $district;
|
|
$this->country = $country;
|
|
$this->phone = $phone;
|
|
$this->latitude = $this->normalizeGeocoordinate($latitude);
|
|
$this->longitude = $this->normalizeGeocoordinate($longitude);
|
|
$this->_languageUid = $languageUid;
|
|
|
|
$this->globalId = $this->generateGlobalId();
|
|
}
|
|
|
|
public function getName(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function getStreet(): string
|
|
{
|
|
return $this->street;
|
|
}
|
|
|
|
public function getZip(): string
|
|
{
|
|
return $this->zip;
|
|
}
|
|
|
|
public function getCity(): string
|
|
{
|
|
return $this->city;
|
|
}
|
|
|
|
public function getDistrict(): string
|
|
{
|
|
return $this->district;
|
|
}
|
|
|
|
public function getCountry(): string
|
|
{
|
|
return $this->country;
|
|
}
|
|
|
|
public function getPhone(): string
|
|
{
|
|
return $this->phone;
|
|
}
|
|
|
|
public function getLatitude(): string
|
|
{
|
|
return $this->latitude;
|
|
}
|
|
|
|
public function getLongitude(): string
|
|
{
|
|
return $this->longitude;
|
|
}
|
|
|
|
public function getGlobalId(): string
|
|
{
|
|
return $this->globalId;
|
|
}
|
|
|
|
public function updateFromLocation(self $location): void
|
|
{
|
|
// Only updates values not being part of global id.
|
|
$this->phone = $location->getPhone();
|
|
$this->longitude = $location->getLongitude();
|
|
$this->latitude = $location->getLatitude();
|
|
}
|
|
|
|
/**
|
|
* Validates the location.
|
|
*
|
|
* Holds the original logic that at least one property must be given.
|
|
*/
|
|
public function isValid(): bool
|
|
{
|
|
return $this->name !== ''
|
|
|| $this->street !== ''
|
|
|| $this->zip !== ''
|
|
|| $this->city !== ''
|
|
|| $this->district !== ''
|
|
|| $this->country !== ''
|
|
|| $this->phone !== ''
|
|
;
|
|
}
|
|
|
|
private function generateGlobalId(): string
|
|
{
|
|
return hash('sha256', implode(',', [
|
|
$this->name,
|
|
$this->street,
|
|
$this->zip,
|
|
$this->city,
|
|
$this->district,
|
|
$this->country,
|
|
]));
|
|
}
|
|
|
|
private function normalizeGeocoordinate(string $coordinate): string
|
|
{
|
|
$numberOfCommas = substr_count($coordinate, ',');
|
|
$numberOfPoints = substr_count($coordinate, '.');
|
|
|
|
if (
|
|
$numberOfCommas === 1
|
|
&& $numberOfPoints === 0
|
|
) {
|
|
$coordinate = str_replace(',', '.', $coordinate);
|
|
}
|
|
|
|
return number_format((float)$coordinate, 6, '.', '');
|
|
}
|
|
}
|