Files
2025-08-02 16:30:27 +02:00

1171 lines
24 KiB
PHP

<?php
namespace KupShop\CatalogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use KupShop\KupShopBundle\Config;
use KupShop\KupShopBundle\Util\StringUtil;
use Query\Operator;
/**
* Sections.
*
* @ORM\Table(name="sections", indexes={@ORM\Index(name="sections_ibfk_1", columns={"id_slider"})})
*
* @ORM\Entity
*/
class Section implements \ArrayAccess, \JsonSerializable
{
private const DISPLAY_PRODUCTS_FROM_SUBSECTIONS = 2;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
*
* @ORM\Id
*
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="id_block", type="integer")
*/
private $idBlock;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50, nullable=false)
*/
private $name = '';
/**
* @var string
*
* @ORM\Column(name="name_short", type="string", length=50, nullable=true)
*/
private $nameShort;
/**
* @var string
*
* @ORM\Column(name="descr", type="text", length=16777215, nullable=false)
*/
private $descr;
/**
* @var string
*
* @ORM\Column(name="figure", type="string", nullable=false)
*/
private $figure = 'Y';
/**
* @var string
*/
private $show_in_search = 'Y';
/**
* @var string
*
* @ORM\Column(name="behaviour", type="string", nullable=false)
*/
private $behaviour = '1';
/**
* @var string
*
* @ORM\Column(name="orderby", type="string", nullable=false)
*/
private $orderby;
/**
* @var string
*
* @ORM\Column(name="orderdir", type="string", nullable=false)
*/
private $orderdir = 'ASC';
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date", nullable=false)
*/
private $date_updated = '0000-00-00';
/**
* @var string
*
* @ORM\Column(name="list_variations", type="string", nullable=false)
*/
private $listVariations = 'N';
/**
* @var string
*
* @ORM\Column(name="lead_figure", type="string", nullable=false)
*/
private $leadFigure = 'N';
/**
* @var string
*
* @ORM\Column(name="lead_text", type="text", length=16777215, nullable=false)
*/
private $leadText;
/**
* @var string
*
* @ORM\Column(name="lead_products", type="string", length=50, nullable=false)
*/
private $leadProducts = '';
/**
* @var string
*
* @ORM\Column(name="photo", type="string", length=50, nullable=true)
*/
private $photo;
private $photos;
/**
* @var string
*
* @ORM\Column(name="meta_title", type="string", length=70, nullable=true)
*/
private $metaTitle;
/**
* @var string
*
* @ORM\Column(name="meta_description", type="string", length=250, nullable=true)
*/
private $metaDescription;
/**
* @var string
*
* @ORM\Column(name="meta_keywords", type="string", length=100, nullable=true)
*/
private $metaKeywords;
/**
* @var int
*
* @ORM\Column(name="feed_heureka", type="integer", nullable=true)
*/
private $feedHeureka;
/**
* @var int
*
* @ORM\Column(name="feed_heureka_sk", type="integer", nullable=true)
*/
private $feedHeurekaSk;
/**
* @var int
*
* @ORM\Column(name="feed_google", type="integer", nullable=true)
*/
private $feedGoogle;
/**
* @var int
*
* @ORM\Column(name="feed_glami", type="integer", nullable=true)
*/
private $feedGlami;
/**
* @var array
*
* @ORM\Column(name="flags", type="simple_array", nullable=false)
*/
private $flags;
/**
* @var int
*
* @ORM\Column(name="feed_seznam", type="integer", nullable=true)
*/
private $feedSeznam;
/**
* @var int|null
*
* @ORM\Column(name="id_slider", type="integer", nullable=true)
*/
private $idSlider;
/**
* @var string
*
* @ORM\Column(name="producers_filter", type="string", nullable=true)
*/
private $producersFilter = 'Y';
private ?string $producersToTitle = null;
private ?string $producersIndexing = null;
private ?string $labelsFilter = null;
/**
* @var string
*
* @ORM\Column(name="url", type="string", nullable=true, length=50)
*/
private $url;
/**
* @var string
*
* @ORM\Column(name="redirect_url", type="string", nullable=true, length=50)
*/
private $redirect_url;
/**
* @var string|null
*
* @ORM\Column(name="data", type="text", nullable=true)
*/
private $data;
/**
* @var string
*
* @ORM\Column(name="virtual", type="text", columnDefinition="ENUM('Y', 'N')", nullable=false)
*/
private $virtual;
/**
* @var int|null
*
* @ORM\Column(name="priority", type="integer", nullable=true)
*/
private $priority;
/**
* @var \Doctrine\Common\Collections\Collection
*/
private $children;
/**
* @var Section
*/
private $parent;
private ?array $parents = null;
/**
* @var int
*/
private $count;
/**
* @var int
*/
private $inStockCount;
/** @var string */
private $annotation;
private array $sliders = [];
private ?string $template;
/**
* Constructor.
*/
public function __construct()
{
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}
public function getId(): int
{
return $this->id;
}
public function setId(int $id): Section
{
$this->id = $id;
return $this;
}
public function getIdBlock(): ?int
{
return $this->idBlock;
}
public function setIdBlock(?int $idBlock = null): Section
{
$this->idBlock = $idBlock;
return $this;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): Section
{
$this->name = $name;
return $this;
}
public function getNameShort(): ?string
{
return $this->nameShort;
}
public function setNameShort(?string $nameShort): Section
{
$this->nameShort = $nameShort;
return $this;
}
public function getDescr()
{
return $this->descr;
}
public function setDescr(string $descr): Section
{
$this->descr = $descr;
return $this;
}
public function getFigure(): string
{
return $this->figure;
}
public function setFigure(string $figure): Section
{
$this->figure = $figure;
return $this;
}
public function getShowInSearch(): string
{
return $this->show_in_search;
}
public function setShowInSearch(string $show_in_search): Section
{
$this->show_in_search = $show_in_search;
return $this;
}
public function getBehaviour(): string
{
return $this->behaviour;
}
public function setBehaviour(string $behaviour): Section
{
$this->behaviour = $behaviour;
return $this;
}
public function getOrderby(): string
{
return $this->orderby;
}
public function setOrderby(string $orderby): Section
{
$this->orderby = $orderby;
return $this;
}
public function getOrderdir(): string
{
return $this->orderdir;
}
public function setOrderdir(string $orderdir): Section
{
$this->orderdir = $orderdir;
return $this;
}
public function getDateUpdated(): \DateTime
{
return $this->date_updated;
}
public function setDateUpdated(\DateTime $date): Section
{
$this->date_updated = $date;
return $this;
}
public function getListVariations(): string
{
return $this->listVariations;
}
public function setListVariations(string $listVariations): Section
{
$this->listVariations = $listVariations;
return $this;
}
public function getLeadFigure(): string
{
return $this->leadFigure;
}
public function setLeadFigure(string $leadFigure): Section
{
$this->leadFigure = $leadFigure;
return $this;
}
public function getLeadText(): string
{
return $this->leadText;
}
public function setLeadText(string $leadText): Section
{
$this->leadText = $leadText;
return $this;
}
public function getLeadProducts(): string
{
return $this->leadProducts;
}
public function setLeadProducts(string $leadProducts): Section
{
$this->leadProducts = $leadProducts;
return $this;
}
public function getPhoto(): ?array
{
return $this->photo ? getImage($this->getId(), '', '', 'section', '', $this->getDateUpdated()->getTimestamp()) : null;
}
public function setPhoto(?string $photo = null): Section
{
$this->photo = $photo;
return $this;
}
public function getPhotoFilename(): ?string
{
return !empty($this->photo) ? $this->photo : null;
}
/**
* @return array|null
*/
public function getPhotos()
{
$SQL = sqlQueryBuilder()->select('p.id, p.descr, p.source, p.image_2, p.date, p.data, p.date_update')
->from('photos', 'p')
->join('p', 'photos_sections_relation', 'psr', 'psr.id_photo = p.id')
->andWhere(Operator::equals(['psr.id_section' => $this->getId()]))
->orderBy('psr.position')
->execute();
$photos = [];
foreach ($SQL as $row) {
$photos[] = getImage($row['id'], '', '', 'section', $row['descr'], strtotime($row['date_update']), $row['data']);
}
return $photos;
}
/**
* @return $this
*/
public function setPhotos(array $photos)
{
$this->photos = $photos;
return $this;
}
/**
* @return string
*/
public function getUrl()
{
if ($this->getRedirectUrl()) {
return ltrim($this->getRedirectUrl(), '/');
}
if ($this->url) {
return $this->url.'/';
}
return $this->getAutogeneratedUrl();
}
public function getFullUrl()
{
$url = $this->getUrl();
if (StringUtil::isAbsoluteUrl($url)) {
return $url;
}
return Config::get()['Addr']['full'].$url;
}
/**
* @return string
*/
public function getAutogeneratedUrl()
{
$seoTitle = StringUtil::slugify($this->getName());
$seoUrl = '';
foreach ($this->getParents() as $id => $parent) {
if ($id != $this->getId()) {
$seoUrl .= StringUtil::slugify($parent->getName()).'_k'.$id.'/';
}
}
if (!empty($seoTitle)) {
$seoUrl .= $seoTitle;
} else {
$seoUrl .= translate('category', 'SEO_URL');
}
$seoUrl .= '_k'.$this->getId().'/';
return $seoUrl;
}
/**
* @return $this
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
public function getRedirectUrl(): ?string
{
return $this->redirect_url;
}
public function setRedirectUrl(?string $redirect_url): Section
{
$this->redirect_url = $redirect_url;
return $this;
}
/**
* @return string|null
*/
public function getMetaTitle()
{
return $this->metaTitle;
}
public function setMetaTitle(?string $metaTitle = null): Section
{
$this->metaTitle = $metaTitle;
return $this;
}
/**
* @return string|null
*/
public function getMetaDescription()
{
return $this->metaDescription;
}
public function setMetaDescription(?string $metaDescription = null): Section
{
$this->metaDescription = $metaDescription;
return $this;
}
/**
* @return string|null
*/
public function getMetaKeywords()
{
return $this->metaKeywords;
}
public function setMetaKeywords(?string $metaKeywords = null): Section
{
$this->metaKeywords = $metaKeywords;
return $this;
}
/**
* @return int|null
*/
public function getFeedHeureka()
{
return $this->feedHeureka;
}
/**
* @return int|null
*/
public function getFeedHeurekaSk()
{
return $this->feedHeurekaSk;
}
public function setFeedHeurekaSk(?int $feedHeurekaSk = null): Section
{
$this->feedHeurekaSk = $feedHeurekaSk;
return $this;
}
public function setFeedHeureka(?int $feedHeureka = null): Section
{
$this->feedHeureka = $feedHeureka;
return $this;
}
/**
* @return int|null
*/
public function getFeedGoogle()
{
return $this->feedGoogle;
}
public function setFeedGoogle(?int $feedGoogle = null): Section
{
$this->feedGoogle = $feedGoogle;
return $this;
}
/**
* @return int|null
*/
public function getFeedGlami()
{
return $this->feedGlami;
}
public function setFeedGlami(?int $feedGlami = null): Section
{
$this->feedGlami = $feedGlami;
return $this;
}
public function getFlags(): array
{
return $this->flags;
}
public function setFlags(array $flags): Section
{
$this->flags = $flags;
return $this;
}
/**
* @return int|null
*/
public function getFeedSeznam()
{
return $this->feedSeznam;
}
public function setFeedSeznam(?int $feedSeznam = null): Section
{
$this->feedSeznam = $feedSeznam;
return $this;
}
/**
* @return int|null
*/
public function getIdSlider()
{
return $this->idSlider;
}
public function setIdSlider(?int $idSlider = null): Section
{
$this->idSlider = $idSlider;
return $this;
}
/**
* @return array|mixed
*/
public function getData()
{
if (!$this->data) {
return [];
}
return json_decode($this->data, true);
}
/**
* @param $data array|null
*
* @return $this
*/
public function setData($data)
{
$this->data = ($data === null) ? $data : json_encode($data);
return $this;
}
/**
* @return string
*/
public function getVirtual()
{
return $this->virtual;
}
/**
* @param $virtual string
*
* @return $this
*/
public function setVirtual($virtual)
{
$this->virtual = $virtual;
return $this;
}
/**
* @return int|null
*/
public function getPriority()
{
return $this->priority;
}
/**
* @param $priority int|null
*
* @return $this
*/
public function setPriority($priority)
{
$this->priority = $priority;
return $this;
}
public function getProducersFilter(): string
{
return $this->producersFilter;
}
public function setProducersFilter(string $producersFilter): Section
{
$this->producersFilter = $producersFilter;
return $this;
}
public function getChildren(): \Doctrine\Common\Collections\Collection
{
return $this->children;
}
public function getVisibleChildren(): \Doctrine\Common\Collections\Collection
{
return $this->getChildren()->filter(function ($section) {
return $section->isVisible();
});
}
public function setChildren(\Doctrine\Common\Collections\Collection $children): Section
{
$this->children = $children;
return $this;
}
/**
* @return Section[] id => Section pairs
*/
public function getParents()
{
if (isset($this->parents)) {
return $this->parents;
}
$parents = [$this->getId() => $this];
$parent = $this;
while ($parent = $parent->getParent()) {
$parents[$parent->getId()] = $parent;
}
return $this->parents = array_reverse($parents, true);
}
/**
* @return array id => name pairs
*
* @deprecated Use getParents() instead
*/
public function getParentIDs(): array
{
$parentIDs = [];
foreach ($this->getParents() as $parent) {
/* @var $parent Section */
$parentIDs[(string) $parent->getId()] = $parent->getName();
}
return $parentIDs;
}
/**
* @return Section|null
*/
public function getParent()
{
return $this->parent;
}
public function setParent(?Section $parent = null): Section
{
$this->parent = $parent;
return $this;
}
/**
* @return int
*/
public function getCount()
{
return $this->count;
}
/**
* @return Section
*/
public function setCount(int $count)
{
$this->count = $count;
return $this;
}
/**
* @return int
*/
public function getInStockCount()
{
return $this->inStockCount;
}
/**
* @return Section
*/
public function setInStockCount(int $inStockCount)
{
$this->inStockCount = $inStockCount;
return $this;
}
/**
* @return string|null
*/
public function getAnnotation()
{
return $this->annotation;
}
public function setAnnotation(?string $annotation = null): Section
{
$this->annotation = $annotation;
return $this;
}
public function getSliders(): array
{
return $this->sliders;
}
public function setSliders(array $sliders): Section
{
$this->sliders = $sliders;
return $this;
}
public function getTemplate(): ?string
{
if ($this->template) {
return "section/{$this->template}.tpl";
}
return $this->template;
}
public function setTemplate(string $template): Section
{
$this->template = $template;
return $this;
}
public function isVisible(): bool
{
$dbcfg = \Settings::getDefault();
if (($this->getFigure() == 'N') || ($this->getFigure() == 'O')) {
return false;
}
return $dbcfg->cat_show_empty != 'N'
|| $this->getRedirectUrl()
|| ($dbcfg->prod_show_not_in_store != 'N' && $this->getCount() > 0)
|| $this->getInStockCount() > 0;
}
public function isVirtual()
{
return (bool) ($this->getVirtual() == 'Y');
}
protected function getLevel(): int
{
return count($this->getParents()) - 1;
}
/**
* BC getter.
*
* @return string
*
* @deprecated
*/
protected function getUid()
{
$uid = '';
foreach ($this->getParents() as $parent) {
/* @var $parent Section */
$uid .= '_'.$parent->getId();
}
return trim($uid, '_');
}
/**
* BC getter.
*
* @return array of VISIBLE sections only
*
* @deprecated
*/
protected function getSubmenu()
{
$children = [];
foreach ($this->getChildren() as $child) {
if ($child->isVisible() || isAdministration()) { // TODO: Omlouvám se za admin HACK :-( Ale je to na spoustě míst. V adminu má být vidět všechno.
$children[$child->getId()] = $child;
}
}
return $children;
}
public function offsetExists($offset): bool
{
return method_exists($this, $this->getterMethod($offset));
}
protected function getterMethod($offset)
{
// backward compatible transformation
// also take a look at methods getUid, getSubmenu
$bcTransformation = static::bcTransformation();
return 'get'.ucfirst(
isset($bcTransformation[$offset]) ? $bcTransformation[$offset] : $offset
);
}
public static function bcTransformation()
{
return [
'id_block' => 'idBlock',
'title' => 'name',
'title_short' => 'nameShort',
'list_variations' => 'listVariations',
'lead_figure' => 'leadFigure',
'lead_text' => 'leadText',
'lead_products' => 'leadProducts',
'meta_title' => 'metaTitle',
'meta_description' => 'metaDescription',
'feed_heureka' => 'feedHeureka',
'feed_google' => 'feedGoogle',
'id_slider' => 'idSlider',
'feed_seznam' => 'feedSeznam',
'producers_filter' => 'producersFilter',
'parents' => 'parentIDs',
'url' => 'Url',
'link' => 'fullUrl',
'date_updated' => 'dateUpdated',
];
}
public function &offsetGet($offset): mixed
{
$method = $this->getterMethod($offset);
if (method_exists($this, $method)) {
$res = call_user_func([$this, $method]);
return $res;
}
$res = null;
return $res;
}
/**
* Offset to set.
*
* @see http://php.net/manual/en/arrayaccess.offsetset.php
*
* @param mixed $offset <p>
* The offset to assign the value to.
* </p>
* @param mixed $value <p>
* The value to set.
* </p>
*
* @since 5.0.0
*/
public function offsetSet($offset, $value): void
{
}
/**
* Offset to unset.
*
* @see http://php.net/manual/en/arrayaccess.offsetunset.php
*
* @param mixed $offset <p>
* The offset to unset.
* </p>
*
* @since 5.0.0
*/
public function offsetUnset($offset): void
{
}
public function jsonSerialize(): mixed
{
$fields = [
'_fields' => array_keys(static::bcTransformation()),
];
$f = new \ReflectionClass($this);
foreach ($f->getMethods() as $method) {
if (!$method->isPublic() || !StringUtil::startsWith($method->name, 'get')) {
continue;
}
$name = lcfirst(substr($method->name, 3));
if (!in_array($name, array_values(static::bcTransformation()))) {
$fields['_fields'][] = $name;
}
}
return $fields;
}
public function displayProductsFromSubsections(): bool
{
return $this->getBehaviour() == self::DISPLAY_PRODUCTS_FROM_SUBSECTIONS;
}
public function getProducersToTitle(): ?string
{
return $this->producersToTitle;
}
public function setProducersToTitle(?string $producersToTitle): void
{
$this->producersToTitle = $producersToTitle;
}
public function getProducersIndexing(): ?string
{
return $this->producersIndexing;
}
public function setProducersIndexing(?string $producersIndexing): void
{
$this->producersIndexing = $producersIndexing;
}
public function getLabelsFilter(): ?string
{
return $this->labelsFilter;
}
public function setLabelsFilter(?string $labelsFilter): void
{
$this->labelsFilter = $labelsFilter;
}
/**
* @param Section[]|null $parents
*/
public function setParents(?array $parents): void
{
$this->parents = $parents;
}
}