<?php
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Enterprise License (PEL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @category Pimcore
* @package Document
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PEL
*/
namespace Pimcore\Model\Document;
use Pimcore\Model\Document\Traits\RedirectHelperTrait;
use Pimcore\Model\Redirect;
use Pimcore\Model\Site;
use Pimcore\Model\Tool\Targeting\TargetGroup;
/**
* @method \Pimcore\Model\Document\Page\Dao getDao()
*/
class Page extends TargetingDocument
{
use RedirectHelperTrait;
/**
* Contains the title of the page (meta-title)
*
* @var string
*/
protected $title = '';
/**
* Contains the description of the page (meta-description)
*
* @var string
*/
protected $description = '';
/**
* @var array
*/
protected $metaData = [];
/**
* Static type of the document
*
* @var string
*/
protected $type = 'page';
/**
* @var string
*/
protected $prettyUrl;
/**
* Comma separated IDs of target groups
*
* @var string
*/
protected $targetGroupIds = '';
/**
* @inheritdoc
*/
public function delete(bool $isNested = false)
{
if ($this->getId() == 1) {
throw new \Exception('root-node cannot be deleted');
}
// check for redirects pointing to this document, and delete them too
$redirects = new Redirect\Listing();
$redirects->setCondition('target = ?', $this->getId());
$redirects->load();
foreach ($redirects->getRedirects() as $redirect) {
$redirect->delete();
}
if ($site = Site::getByRootId($this->getId())) {
$site->delete();
}
parent::delete($isNested);
}
/**
* @param array $params additional parameters (e.g. "versionNote" for the version note)
*
* @throws \Exception
*/
protected function update($params = [])
{
$oldPath = $this->getDao()->getCurrentFullPath();
$oldDocument = self::getById($this->getId(), true);
parent::update($params);
$this->createRedirectForFormerPath($oldPath, $oldDocument);
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @return string
*/
public function getTitle()
{
return \Pimcore\Tool\Text::removeLineBreaks($this->title);
}
/**
* @param string $description
*
* @return $this
*/
public function setDescription($description)
{
$this->description = str_replace("\n", ' ', $description);
return $this;
}
/**
* @param string $title
*
* @return $this
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* @param array $metaData
*
* @return $this
*/
public function setMetaData($metaData)
{
$this->metaData = $metaData;
return $this;
}
/**
* @return array
*/
public function getMetaData()
{
return $this->metaData;
}
/**
* Returns the full path of the document including the key (path+key)
*
* @param bool $force
*
* @return string
*/
public function getFullPath(bool $force = false)
{
$path = parent::getFullPath($force);
// do not use pretty url's when in admin, the current document is wrapped by a hardlink or this document isn't in the current site
if (!\Pimcore::inAdmin() && !($this instanceof Hardlink\Wrapper\WrapperInterface) && \Pimcore\Tool\Frontend::isDocumentInCurrentSite($this)) {
// check for a pretty url
$prettyUrl = $this->getPrettyUrl();
if (!empty($prettyUrl) && strlen($prettyUrl) > 1) {
return $prettyUrl;
}
}
return $path;
}
/**
* @param string $prettyUrl
*
* @return $this
*/
public function setPrettyUrl($prettyUrl)
{
$this->prettyUrl = '/' . trim($prettyUrl, ' /');
if (strlen($this->prettyUrl) < 2) {
$this->prettyUrl = null;
}
return $this;
}
/**
* @return string
*/
public function getPrettyUrl()
{
return $this->prettyUrl;
}
/**
* Set linked Target Groups as set in properties panel as list of IDs
*
* @param string|array $targetGroupIds
*/
public function setTargetGroupIds($targetGroupIds)
{
if (is_array($targetGroupIds)) {
$targetGroupIds = implode(',', $targetGroupIds);
}
$targetGroupIds = trim($targetGroupIds, ' ,');
if (!empty($targetGroupIds)) {
$targetGroupIds = ',' . $targetGroupIds . ',';
}
$this->targetGroupIds = $targetGroupIds;
}
/**
* Get serialized list of Target Group IDs
*
* @return string
*/
public function getTargetGroupIds(): string
{
return $this->targetGroupIds;
}
/**
* Set assigned target groups
*
* @param TargetGroup[]|int[] $targetGroups
*/
public function setTargetGroups(array $targetGroups)
{
$ids = array_map(function ($targetGroup) {
if (is_numeric($targetGroup)) {
return (int)$targetGroup;
} elseif ($targetGroup instanceof TargetGroup) {
return $targetGroup->getId();
}
return null;
}, $targetGroups);
$ids = array_filter($ids, function ($id) {
return null !== $id && $id > 0;
});
$this->setTargetGroupIds($ids);
}
/**
* Return list of assigned target groups (via properties panel)
*
* @return TargetGroup[]
*/
public function getTargetGroups(): array
{
$ids = explode(',', $this->targetGroupIds);
$targetGroups = array_map(function ($id) {
$id = trim($id);
if (!empty($id)) {
$targetGroup = TargetGroup::getById($id);
if ($targetGroup) {
return $targetGroup;
}
}
}, $ids);
$targetGroups = array_filter($targetGroups);
return $targetGroups;
}
/**
* @param bool $hdpi
*
* @return string
*/
public function getPreviewImageFilesystemPath($hdpi = false)
{
$suffix = '';
if ($hdpi) {
$suffix = '@2x';
}
return PIMCORE_SYSTEM_TEMP_DIRECTORY . '/document-page-previews/document-page-screenshot-' . $this->getId() . $suffix . '.jpg';
}
}