<?php
namespace w3des\SmsBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use w3des\SmsBundle\Text;
/**
* Słownik miejscowości dla formularza SMS i awarii.
*
* @ORM\Entity()
* @ORM\Table(
* name="sms_cities",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="sms_city_name_uniq", columns={"name"})
* }
* )
* @UniqueEntity(fields={"name"}, message="Ta miejscowość już istnieje.")
*/
class SmsCity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $name;
/**
* @ORM\OneToMany(targetEntity="SmsStreet", mappedBy="city", cascade={"persist"}, orphanRemoval=true)
*/
protected $streets;
public function __construct()
{
$this->streets = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name !== null ? Text::clean($name) : null;
return $this;
}
public function getStreets(): Collection
{
return $this->streets;
}
/**
* @return string[] nazwy ulic posortowane alfabetycznie
*/
public function getStreetNames(): array
{
$names = [];
foreach ($this->streets as $street) {
$names[] = $street->getName();
}
return Text::sort($names);
}
public function getStreetCount(): int
{
return $this->streets->count();
}
/**
* Skrót listy ulic do tabeli w panelu admina.
*/
public function getStreetsSummary(): string
{
$summary = \implode(', ', $this->getStreetNames());
if (\mb_strlen($summary) > 120) {
$summary = \mb_substr($summary, 0, 120) . '…';
}
return $summary;
}
/**
* Ustawia listę ulic: dodaje brakujące, usuwa nieobecne na liście.
* Porównanie bez względu na wielkość liter.
*
* @param string[] $names
*/
public function syncStreets(array $names): void
{
$wanted = [];
foreach ($names as $name) {
$name = Text::clean($name);
if ($name !== '' && !isset($wanted[\mb_strtolower($name)])) {
$wanted[\mb_strtolower($name)] = $name;
}
}
foreach ($this->streets->toArray() as $street) {
$key = \mb_strtolower($street->getName());
if (isset($wanted[$key])) {
$street->setName($wanted[$key]);
unset($wanted[$key]);
} else {
$this->streets->removeElement($street);
}
}
foreach ($wanted as $name) {
$this->streets->add((new SmsStreet())->setCity($this)->setName($name));
}
}
public function __toString()
{
return (string) $this->name;
}
}