<?php
namespace Aqarmap\Bundle\ListingBundle\Entity;
use Aqarmap\Bundle\ExchangeBundle\Entity\ExchangeRequest;
use Aqarmap\Bundle\ListingBundle\Constant\ListingStatus;
use Aqarmap\Bundle\UserBundle\Entity\UserInterest;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;
use JMS\Serializer\Annotation as Serializer;
/**
* Section.
*
* @ORM\Cache
*
* @ORM\Table(name="sections")
*
* @ORM\Entity(repositoryClass="Aqarmap\Bundle\ListingBundle\Repository\SectionRepository")
*
* @Gedmo\TranslationEntity(class="Aqarmap\Bundle\ListingBundle\Entity\SectionTranslation")
*
* @Serializer\ExclusionPolicy("all")
*/
class Section implements Translatable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
*
* @ORM\Id
*
* @ORM\GeneratedValue(strategy="AUTO")
*
* @Serializer\Groups({"MyListings", "Default", "Search", "DefaultV4", "SearchV4", "SlugResolver", "listingDetails"})
*
* @Serializer\Expose
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=100)
*
* @Gedmo\Translatable
*
* @Serializer\Groups({"Default", "Search", "DefaultV4", "SlugResolver", "listingDetails", "MyListings", "MyLeads"})
*
* @Serializer\Expose
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="description", type="text", length=512, nullable=true)
*
* @Gedmo\Translatable
*
* @Serializer\Groups({"Default", "DefaultV4"})
*
* @Serializer\Expose
*/
private $description;
/**
* @var string
*
* @ORM\Column(name="meta_title", type="string", length=100)
*
* @Gedmo\Translatable
*
* @Serializer\Groups({"Default"})
*
* @Serializer\Expose
*/
private $metaTitle;
/**
* @var string
*
* @ORM\Column(name="meta_description", type="text", length=512, nullable=true)
*
* @Gedmo\Translatable
*
* @Serializer\Groups({"Default", "DefaultV4"})
*
* @Serializer\Expose
*/
private $metaDescription;
/**
* @var bool
*
* @ORM\Column(name="main", type="boolean")
*
* @Serializer\Groups({"Default"})
*
* @Serializer\Expose
*/
private $main = false;
/**
* @var bool
*
* @ORM\Column(name="searchable", type="boolean")
*
* @Serializer\Groups({"Default"})
*
* @Serializer\Expose
*/
private $searchable = false;
/**
* @Gedmo\Slug(fields={"title"}, updatable=false)
*
* @Serializer\Groups({"Default", "DefaultV4", "SlugResolver" , "SearchV4", "listingDetails"})
*
* @Serializer\Expose
*
* @ORM\Column(length=128, unique=true)
*/
private $slug;
/**
* @ORM\OneToMany(
* targetEntity="SectionTranslation",
* mappedBy="object",
* cascade={"persist", "remove"}
* )
*/
private $translations;
/**
* @ORM\OneToMany(targetEntity="Listing", mappedBy="section", fetch="EXTRA_LAZY")
*/
protected $listings;
/**
* @ORM\OneToMany(targetEntity="\Aqarmap\Bundle\NeighborhoodBundle\Entity\LocationStatistics",
* mappedBy="section", fetch="EXTRA_LAZY")
*/
protected $locationStatistics;
/**
* @ORM\OneToMany(targetEntity="PriceFilter", mappedBy="section", fetch="EXTRA_LAZY")
*/
protected $priceFilter;
/**
* @ORM\OneToMany(targetEntity="Rule", mappedBy="section", fetch="EXTRA_LAZY")
*/
protected $rules;
/**
* @ORM\OneToMany(targetEntity="Aqarmap\Bundle\UserBundle\Entity\UserInterest", mappedBy="section")
*/
protected $interests;
/**
* @ORM\OneToMany(targetEntity="\Aqarmap\Bundle\ExchangeBundle\Entity\ExchangeRequest",
* mappedBy="section", fetch="EXTRA_LAZY")
*/
protected $exchangeRequests;
/**
* @Gedmo\Locale
* Used locale to override Translation listener`s locale
* this is not a mapped field of entity metadata, just a simple property
*/
private $locale;
/**
* @ORM\Column(name="synced", type="boolean")
*/
private $synced = false;
/**
* @ORM\Column(name="reference_id", type="integer", nullable=true)
*/
private $referenceId;
/**
* @var string
*
* @ORM\Column(name="meta_search_description", type="text", length=512, nullable=true)
*
* @Gedmo\Translatable
*/
private $metaSearchDescription;
/**
* @var array
*/
private $v4Translations = [];
/**
* Constructor.
*/
public function __construct()
{
$this->translations = new ArrayCollection();
$this->listings = new ArrayCollection();
$this->locationStatistics = new ArrayCollection();
$this->priceFilter = new ArrayCollection();
$this->rules = new ArrayCollection();
$this->interests = new ArrayCollection();
$this->exchangeRequests = new ArrayCollection();
}
// ---------------------------------------------------------------------
/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}
// ---------------------------------------------------------------------
/**
* Set title.
*
* @param string $title
*
* @return Section
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title.
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
// ---------------------------------------------------------------------
/**
* Set description.
*
* @param string $description
*
* @return Section
*/
public function setDescription($description)
{
$this->title = $description;
return $this;
}
/**
* Get description.
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
// ---------------------------------------------------------------------
/**
* Set main.
*
* @param bool $main
*
* @return Section
*/
public function setMain($main)
{
$this->main = $main;
return $this;
}
/**
* Get main.
*
* @return bool
*/
public function getMain()
{
return $this->main;
}
// ---------------------------------------------------------------------
/**
* Set searchable.
*
* @param bool $searchable
*
* @return Section
*/
public function setSearchable($searchable)
{
$this->searchable = $searchable;
return $this;
}
/**
* Get searchable.
*
* @return bool
*/
public function getSearchable()
{
return $this->searchable;
}
/**
* @Serializer\VirtualProperty()
*
* @Serializer\Groups({"DefaultV4"})
*
* @Serializer\Expose
*
* @return bool
*/
public function isSearchable()
{
return (bool) $this->searchable;
}
/**
* @Serializer\VirtualProperty()
*
* @Serializer\Groups({"DefaultV4"})
*
* @Serializer\Expose
*
* @return bool
*/
public function isMain()
{
return (bool) $this->main;
}
/**
* @Serializer\VirtualProperty()
*
* @Serializer\Groups({"DefaultV4"})
*
* @Serializer\SerializedName("inheritanceType")
*
* @Serializer\Expose
*
* @return string
*/
public function getInheritanceType()
{
return str_replace('-', '_', $this->getSlug());
}
// ---------------------------------------------------------------------
/**
* Set slug.
*
* @param string $slug
*
* @return Section
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Get slug.
*
* @return string
*/
public function getSlug()
{
return $this->slug;
}
// ---------------------------------------------------------------------
/**
* Get translations.
*
* @return ArrayCollection
*/
public function getTranslations()
{
return $this->translations;
}
public function getTranslatableLocale()
{
return $this->locale;
}
/**
* Add translation.
*
* @return Section
*/
public function addTranslation(SectionTranslation $translation)
{
if (!$this->translations->contains($translation)) {
$this->translations->add($translation);
$translation->setObject($this);
}
return $this;
}
/**
* Remove translation.
*
* @return Section
*/
public function removeTranslation(SectionTranslation $translation)
{
if ($this->translations->contains($translation)) {
$this->translations->removeElement($translation);
}
return $this;
}
// ---------------------------------------------------------------------
/**
* Add listings.
*
* @return Section
*/
public function addListing(Listing $listings)
{
$this->listings[] = $listings;
return $this;
}
/**
* Remove listings.
*/
public function removeListing(Listing $listings): void
{
$this->listings->removeElement($listings);
}
/**
* Get listings.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getListings()
{
return $this->listings;
}
/**
* @param array $locations
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getLocationListings($locations)
{
$criteria = Criteria::create()
->where(Criteria::expr()->in('location', $locations))
->andWhere(Criteria::expr()->eq('status', ListingStatus::LIVE))
->orderBy(['featured' => Criteria::DESC, 'publishedAt' => Criteria::DESC])
->setMaxResults(6);
return $this->getListings()->matching($criteria);
}
// ---------------------------------------------------------------------
/**
* Add priceFilter.
*
* @return Section
*/
public function addPriceFilter(PriceFilter $priceFilter)
{
$this->priceFilter[] = $priceFilter;
return $this;
}
/**
* Remove priceFilter.
*/
public function removePriceFilter(PriceFilter $priceFilter): void
{
$this->priceFilter->removeElement($priceFilter);
}
/**
* Get priceFilter.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getPriceFilter()
{
return $this->priceFilter;
}
// ---------------------------------------------------------------------
/**
* Add rules.
*
* @return Section
*/
public function addRule(Rule $rules)
{
$this->rules[] = $rules;
return $this;
}
/**
* Remove rules.
*/
public function removeRule(Rule $rules): void
{
$this->rules->removeElement($rules);
}
/**
* Get rules.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getRules()
{
return $this->rules;
}
// ---------------------------------------------------------------------
/**
* Add locationStatistic.
*
* @return Section
*/
public function addLocationStatistic(\Aqarmap\Bundle\NeighborhoodBundle\Entity\LocationStatistics $locationStatistic)
{
$this->locationStatistics[] = $locationStatistic;
return $this;
}
/**
* Remove locationStatistic.
*/
public function removeLocationStatistic(\Aqarmap\Bundle\NeighborhoodBundle\Entity\LocationStatistics $locationStatistic): void
{
$this->locationStatistics->removeElement($locationStatistic);
}
/**
* Get locationStatistics.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getLocationStatistics()
{
return $this->locationStatistics;
}
/**
* Add interest.
*
* @return Section
*/
public function addInterest(UserInterest $interest)
{
$this->interests[] = $interest;
return $this;
}
/**
* Remove interest.
*/
public function removeInterest(UserInterest $interest): void
{
$this->interests->removeElement($interest);
}
/**
* Get interests.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getInterests()
{
return $this->interests;
}
public function setTranslatableLocale($locale): void
{
$this->locale = $locale;
}
/**
* Add exchangeRequest.
*
* @return Section
*/
public function addExchangeRequest(ExchangeRequest $exchangeRequest)
{
$this->exchangeRequests[] = $exchangeRequest;
return $this;
}
/**
* Remove exchangeRequest.
*/
public function removeExchangeRequest(ExchangeRequest $exchangeRequest): void
{
$this->exchangeRequests->removeElement($exchangeRequest);
}
/**
* Get exchangeRequests.
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getExchangeRequests()
{
return $this->exchangeRequests;
}
public function __toString()
{
return $this->title;
}
/**
* @return string
*/
public function getMetaDescription()
{
return $this->metaDescription;
}
/**
* @param string $metaDescription
*/
public function setMetaDescription($metaDescription): void
{
$this->metaDescription = $metaDescription;
}
/**
* @return string
*/
public function getMetaTitle()
{
return $this->metaTitle;
}
/**
* @param string $metaTitle
*
* @return $this
*/
public function setMetaTitle($metaTitle)
{
$this->metaTitle = $metaTitle;
return $this;
}
/**
* @return self
*/
public function setSynced(bool $synced = false)
{
$this->synced = $synced;
return $this;
}
/**
* @return bool|null
*/
public function getSynced()
{
return $this->synced;
}
/**
* @return string|null
*/
public function getMetaSearchDescription()
{
return $this->metaSearchDescription;
}
/**
* @return Section
*/
public function setMetaSearchDescription(string $metaSearchDescription)
{
$this->metaSearchDescription = $metaSearchDescription;
return $this;
}
/**
* @Serializer\VirtualProperty
*
* @Serializer\Groups({"Default"})
*
* @Serializer\Expose
*
* @return int|null
*/
public function getReferenceId()
{
return $this->id;
}
/**
* @return self
*/
public function setReferenceId(?int $referenceId)
{
$this->referenceId = $referenceId;
return $this;
}
/**
* @Serializer\VirtualProperty
*
* @Serializer\SerializedName("referenceId")
*
* @Serializer\Expose()
*
* @Serializer\Groups({"DefaultV4"})
*/
public function getReferencedV4Id()
{
return $this->getId();
}
/**
* @param array $translations
*
* @return self
*/
public function setV4Translations($translations = [])
{
$this->v4Translations = $translations;
return $this;
}
/**
* Get translations.
*
* @Serializer\VirtualProperty
*
* @Serializer\Groups({"DefaultV4", "MyListing"})
*
* @Serializer\SerializedName("translations")
*
* @Serializer\Expose
*
* @return array
*/
public function getV4Translations()
{
return $this->v4Translations;
}
}