Spaces:
No application file
No application file
namespace Mautic\PageBundle\Entity; | |
use Doctrine\ORM\Mapping as ORM; | |
use Mautic\ApiBundle\Serializer\Driver\ApiMetadataDriver; | |
use Mautic\CategoryBundle\Entity\Category; | |
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
use Mautic\CoreBundle\Entity\FormEntity; | |
use Mautic\CoreBundle\Entity\TranslationEntityInterface; | |
use Mautic\CoreBundle\Entity\TranslationEntityTrait; | |
use Mautic\CoreBundle\Entity\VariantEntityInterface; | |
use Mautic\CoreBundle\Entity\VariantEntityTrait; | |
use Mautic\CoreBundle\Validator\EntityEvent; | |
use Symfony\Component\Validator\Constraints as Assert; | |
use Symfony\Component\Validator\Constraints\Callback; | |
use Symfony\Component\Validator\Constraints\NotBlank; | |
use Symfony\Component\Validator\Context\ExecutionContextInterface; | |
use Symfony\Component\Validator\Mapping\ClassMetadata; | |
class Page extends FormEntity implements TranslationEntityInterface, VariantEntityInterface | |
{ | |
use TranslationEntityTrait; | |
use VariantEntityTrait; | |
/** | |
* @var int | |
*/ | |
private $id; | |
/** | |
* @var string | |
*/ | |
private $title; | |
/** | |
* @var string | |
*/ | |
private $alias; | |
/** | |
* @var string|null | |
*/ | |
private $template; | |
/** | |
* @var string|null | |
*/ | |
private $customHtml; | |
/** | |
* @var array | |
*/ | |
private $content = []; | |
/** | |
* @var \DateTimeInterface | |
*/ | |
private $publishUp; | |
/** | |
* @var \DateTimeInterface | |
*/ | |
private $publishDown; | |
/** | |
* @var int | |
*/ | |
private $hits = 0; | |
/** | |
* @var int | |
*/ | |
private $uniqueHits = 0; | |
/** | |
* @var int | |
*/ | |
private $variantHits = 0; | |
/** | |
* @var int | |
*/ | |
private $revision = 1; | |
/** | |
* @var string|null | |
*/ | |
private $metaDescription; | |
/** | |
* @var string|null | |
*/ | |
private $headScript; | |
/** | |
* @var string|null | |
*/ | |
private $footerScript; | |
/** | |
* @var string|null | |
*/ | |
private $redirectType; | |
/** | |
* @var string|null | |
*/ | |
private $redirectUrl; | |
/** | |
* @var Category|null | |
**/ | |
private $category; | |
/** | |
* @var bool|null | |
*/ | |
private $isPreferenceCenter; | |
/** | |
* @var bool|null | |
*/ | |
private $noIndex; | |
/** | |
* Used to identify the page for the builder. | |
*/ | |
private $sessionId; | |
public function __clone() | |
{ | |
$this->id = null; | |
$this->clearTranslations(); | |
$this->clearVariants(); | |
parent::__clone(); | |
} | |
public function __construct() | |
{ | |
$this->translationChildren = new \Doctrine\Common\Collections\ArrayCollection(); | |
$this->variantChildren = new \Doctrine\Common\Collections\ArrayCollection(); | |
} | |
public static function loadMetadata(ORM\ClassMetadata $metadata): void | |
{ | |
$builder = new ClassMetadataBuilder($metadata); | |
$builder->setTable('pages') | |
->setCustomRepositoryClass(PageRepository::class) | |
->addIndex(['alias'], 'page_alias_search'); | |
$builder->addId(); | |
$builder->addField('title', 'string'); | |
$builder->addField('alias', 'string'); | |
$builder->addNullableField('template', 'string'); | |
$builder->createField('customHtml', 'text') | |
->columnName('custom_html') | |
->nullable() | |
->build(); | |
$builder->createField('content', 'array') | |
->nullable() | |
->build(); | |
$builder->addPublishDates(); | |
$builder->addField('hits', 'integer'); | |
$builder->createField('uniqueHits', 'integer') | |
->columnName('unique_hits') | |
->build(); | |
$builder->createField('variantHits', 'integer') | |
->columnName('variant_hits') | |
->build(); | |
$builder->addField('revision', 'integer'); | |
$builder->createField('metaDescription', 'string') | |
->columnName('meta_description') | |
->nullable() | |
->build(); | |
$builder->createField('headScript', 'text') | |
->columnName('head_script') | |
->nullable() | |
->build(); | |
$builder->createField('footerScript', 'text') | |
->columnName('footer_script') | |
->nullable() | |
->build(); | |
$builder->createField('redirectType', 'string') | |
->columnName('redirect_type') | |
->nullable() | |
->length(100) | |
->build(); | |
$builder->createField('redirectUrl', 'string') | |
->columnName('redirect_url') | |
->nullable() | |
->length(2048) | |
->build(); | |
$builder->addCategory(); | |
$builder->createField('isPreferenceCenter', 'boolean') | |
->columnName('is_preference_center') | |
->nullable() | |
->build(); | |
$builder->createField('noIndex', 'boolean') | |
->columnName('no_index') | |
->nullable() | |
->build(); | |
self::addTranslationMetadata($builder, self::class); | |
self::addVariantMetadata($builder, self::class); | |
} | |
public static function loadValidatorMetadata(ClassMetadata $metadata): void | |
{ | |
$metadata->addPropertyConstraint('title', new NotBlank([ | |
'message' => 'mautic.core.title.required', | |
])); | |
$metadata->addConstraint(new Callback([ | |
'callback' => function (Page $page, ExecutionContextInterface $context): void { | |
$type = $page->getRedirectType(); | |
if (!is_null($type)) { | |
$validator = $context->getValidator(); | |
$violations = $validator->validate($page->getRedirectUrl(), [ | |
new Assert\Url( | |
[ | |
'message' => 'mautic.core.value.required', | |
] | |
), | |
]); | |
if (count($violations) > 0) { | |
$string = (string) $violations; | |
$context->buildViolation($string) | |
->atPath('redirectUrl') | |
->addViolation(); | |
} | |
} | |
if ($page->isVariant()) { | |
// Get a summation of weights | |
$parent = $page->getVariantParent(); | |
$children = $parent ? $parent->getVariantChildren() : $page->getVariantChildren(); | |
$total = 0; | |
foreach ($children as $child) { | |
$settings = $child->getVariantSettings(); | |
$total += (int) $settings['weight']; | |
} | |
if ($total > 100) { | |
$context->buildViolation('mautic.core.variant_weights_invalid') | |
->atPath('variantSettings[weight]') | |
->addViolation(); | |
} | |
} | |
}, | |
])); | |
$metadata->addConstraint(new EntityEvent()); | |
} | |
/** | |
* Prepares the metadata for API usage. | |
*/ | |
public static function loadApiMetadata(ApiMetadataDriver $metadata): void | |
{ | |
$metadata->setGroupPrefix('page') | |
->addListProperties( | |
[ | |
'id', | |
'title', | |
'alias', | |
'category', | |
] | |
) | |
->addProperties( | |
[ | |
'language', | |
'publishUp', | |
'publishDown', | |
'hits', | |
'uniqueHits', | |
'variantHits', | |
'revision', | |
'metaDescription', | |
'redirectType', | |
'redirectUrl', | |
'isPreferenceCenter', | |
'noIndex', | |
'variantSettings', | |
'variantStartDate', | |
'variantParent', | |
'variantChildren', | |
'translationParent', | |
'translationChildren', | |
'template', | |
'customHtml', | |
] | |
) | |
->setMaxDepth(1, 'variantParent') | |
->setMaxDepth(1, 'variantChildren') | |
->setMaxDepth(1, 'translationParent') | |
->setMaxDepth(1, 'translationChildren') | |
->build(); | |
} | |
/** | |
* Get id. | |
* | |
* @return int | |
*/ | |
public function getId() | |
{ | |
return $this->id; | |
} | |
/** | |
* Set title. | |
* | |
* @param string $title | |
* | |
* @return Page | |
*/ | |
public function setTitle($title) | |
{ | |
$this->isChanged('title', $title); | |
$this->title = $title; | |
return $this; | |
} | |
/** | |
* Get title. | |
* | |
* @return string | |
*/ | |
public function getTitle() | |
{ | |
return $this->title; | |
} | |
/** | |
* Set alias. | |
* | |
* @param string $alias | |
* | |
* @return Page | |
*/ | |
public function setAlias($alias) | |
{ | |
$this->isChanged('alias', $alias); | |
$this->alias = $alias; | |
return $this; | |
} | |
/** | |
* Get alias. | |
* | |
* @return string | |
*/ | |
public function getAlias() | |
{ | |
return $this->alias; | |
} | |
/** | |
* Set content. | |
* | |
* @param array<string> $content | |
* | |
* @return Page | |
*/ | |
public function setContent($content) | |
{ | |
$this->isChanged('content', $content); | |
$this->content = $content; | |
return $this; | |
} | |
/** | |
* Get content. | |
* | |
* @return array<string> | |
*/ | |
public function getContent() | |
{ | |
return $this->content; | |
} | |
/** | |
* Set publishUp. | |
* | |
* @param \DateTime $publishUp | |
* | |
* @return Page | |
*/ | |
public function setPublishUp($publishUp) | |
{ | |
$this->isChanged('publishUp', $publishUp); | |
$this->publishUp = $publishUp; | |
return $this; | |
} | |
/** | |
* Get publishUp. | |
* | |
* @return \DateTimeInterface | |
*/ | |
public function getPublishUp() | |
{ | |
return $this->publishUp; | |
} | |
/** | |
* Set publishDown. | |
* | |
* @param \DateTime $publishDown | |
* | |
* @return Page | |
*/ | |
public function setPublishDown($publishDown) | |
{ | |
$this->isChanged('publishDown', $publishDown); | |
$this->publishDown = $publishDown; | |
return $this; | |
} | |
/** | |
* Get publishDown. | |
* | |
* @return \DateTimeInterface | |
*/ | |
public function getPublishDown() | |
{ | |
return $this->publishDown; | |
} | |
/** | |
* Set hits. | |
* | |
* @param int $hits | |
* | |
* @return Page | |
*/ | |
public function setHits($hits) | |
{ | |
$this->hits = $hits; | |
return $this; | |
} | |
/** | |
* Get hits. | |
* | |
* @param bool $includeVariants | |
* | |
* @return int|mixed | |
*/ | |
public function getHits($includeVariants = false) | |
{ | |
return ($includeVariants) ? $this->getAccumulativeVariantCount('getHits') : $this->hits; | |
} | |
/** | |
* Set revision. | |
* | |
* @param int $revision | |
* | |
* @return Page | |
*/ | |
public function setRevision($revision) | |
{ | |
$this->revision = $revision; | |
return $this; | |
} | |
/** | |
* Get revision. | |
* | |
* @return int | |
*/ | |
public function getRevision() | |
{ | |
return $this->revision; | |
} | |
/** | |
* Set metaDescription. | |
* | |
* @param string $metaDescription | |
* | |
* @return Page | |
*/ | |
public function setMetaDescription($metaDescription) | |
{ | |
$this->isChanged('metaDescription', $metaDescription); | |
$this->metaDescription = $metaDescription; | |
return $this; | |
} | |
/** | |
* Get metaDescription. | |
* | |
* @return string | |
*/ | |
public function getMetaDescription() | |
{ | |
return $this->metaDescription; | |
} | |
/** | |
* Set headScript. | |
* | |
* @param string $headScript | |
* | |
* @return Page | |
*/ | |
public function setHeadScript($headScript) | |
{ | |
$this->headScript = $headScript; | |
return $this; | |
} | |
/** | |
* Get headScript. | |
* | |
* @return string | |
*/ | |
public function getHeadScript() | |
{ | |
return $this->headScript; | |
} | |
/** | |
* Set footerScript. | |
* | |
* @param string $footerScript | |
* | |
* @return Page | |
*/ | |
public function setFooterScript($footerScript) | |
{ | |
$this->footerScript = $footerScript; | |
return $this; | |
} | |
/** | |
* Get footerScript. | |
* | |
* @return string | |
*/ | |
public function getFooterScript() | |
{ | |
return $this->footerScript; | |
} | |
/** | |
* Set redirectType. | |
* | |
* @param string $redirectType | |
* | |
* @return Page | |
*/ | |
public function setRedirectType($redirectType) | |
{ | |
$this->isChanged('redirectType', $redirectType); | |
$this->redirectType = $redirectType; | |
return $this; | |
} | |
/** | |
* Get redirectType. | |
* | |
* @return string | |
*/ | |
public function getRedirectType() | |
{ | |
return $this->redirectType; | |
} | |
/** | |
* Set redirectUrl. | |
* | |
* @param string $redirectUrl | |
* | |
* @return Page | |
*/ | |
public function setRedirectUrl($redirectUrl) | |
{ | |
$this->isChanged('redirectUrl', $redirectUrl); | |
$this->redirectUrl = $redirectUrl; | |
return $this; | |
} | |
/** | |
* Get redirectUrl. | |
* | |
* @return string | |
*/ | |
public function getRedirectUrl() | |
{ | |
return $this->redirectUrl; | |
} | |
/** | |
* Set category. | |
* | |
* @return Page | |
*/ | |
public function setCategory(Category $category = null) | |
{ | |
$this->isChanged('category', $category); | |
$this->category = $category; | |
return $this; | |
} | |
/** | |
* Get category. | |
* | |
* @return Category | |
*/ | |
public function getCategory() | |
{ | |
return $this->category; | |
} | |
/** | |
* @param bool|null $isPreferenceCenter | |
* | |
* @return Page | |
*/ | |
public function setIsPreferenceCenter($isPreferenceCenter) | |
{ | |
$sanitizedValue = null === $isPreferenceCenter ? null : (bool) $isPreferenceCenter; | |
$this->isChanged('isPreferenceCenter', $sanitizedValue); | |
$this->isPreferenceCenter = $sanitizedValue; | |
return $this; | |
} | |
/** | |
* @return bool|null | |
*/ | |
public function getIsPreferenceCenter() | |
{ | |
return $this->isPreferenceCenter; | |
} | |
/** | |
* @param bool|null $noIndex | |
*/ | |
public function setNoIndex($noIndex): void | |
{ | |
$sanitizedValue = null === $noIndex ? null : (bool) $noIndex; | |
$this->isChanged('noIndex', $sanitizedValue); | |
$this->noIndex = $sanitizedValue; | |
} | |
/** | |
* @return bool|null | |
*/ | |
public function getNoIndex() | |
{ | |
return $this->noIndex; | |
} | |
/** | |
* Set sessionId. | |
* | |
* @param string $id | |
* | |
* @return Page | |
*/ | |
public function setSessionId($id) | |
{ | |
$this->sessionId = $id; | |
return $this; | |
} | |
/** | |
* Get sessionId. | |
* | |
* @return string | |
*/ | |
public function getSessionId() | |
{ | |
return $this->sessionId; | |
} | |
/** | |
* Set template. | |
* | |
* @param string $template | |
* | |
* @return Page | |
*/ | |
public function setTemplate($template) | |
{ | |
$this->isChanged('template', $template); | |
$this->template = $template; | |
return $this; | |
} | |
/** | |
* Get template. | |
* | |
* @return string | |
*/ | |
public function getTemplate() | |
{ | |
return $this->template; | |
} | |
protected function isChanged($prop, $val) | |
{ | |
$getter = 'get'.ucfirst($prop); | |
$current = $this->$getter(); | |
if ('translationParent' == $prop || 'variantParent' == $prop || 'category' == $prop) { | |
$currentId = ($current) ? $current->getId() : ''; | |
$newId = ($val) ? $val->getId() : null; | |
if ($currentId != $newId) { | |
$this->changes[$prop] = [$currentId, $newId]; | |
} | |
} else { | |
parent::isChanged($prop, $val); | |
} | |
} | |
/** | |
* Set uniqueHits. | |
* | |
* @param int $uniqueHits | |
* | |
* @return Page | |
*/ | |
public function setUniqueHits($uniqueHits) | |
{ | |
$this->uniqueHits = $uniqueHits; | |
return $this; | |
} | |
/** | |
* Get uniqueHits. | |
* | |
* @return int | |
*/ | |
public function getUniqueHits($includeVariants = false) | |
{ | |
return ($includeVariants) ? $this->getAccumulativeVariantCount('getUniqueHits') : $this->uniqueHits; | |
} | |
/** | |
* @param bool $includeVariants | |
* | |
* @return int|mixed | |
*/ | |
public function getVariantHits($includeVariants = false) | |
{ | |
return ($includeVariants) ? $this->getAccumulativeVariantCount('getVariantHits') : $this->variantHits; | |
} | |
/** | |
* @param mixed $variantHits | |
*/ | |
public function setVariantHits($variantHits): void | |
{ | |
$this->variantHits = $variantHits; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getCustomHtml() | |
{ | |
return $this->customHtml; | |
} | |
/** | |
* @param mixed $customHtml | |
*/ | |
public function setCustomHtml($customHtml): void | |
{ | |
$this->customHtml = $customHtml; | |
} | |
} | |