|
|
|
<?php
|
|
|
|
|
|
|
|
namespace common\modules\pages\services;
|
|
|
|
|
|
|
|
use common\modules\pages\helpers\PageHelper;
|
|
|
|
use core\entities\Meta;
|
|
|
|
use common\modules\pages\entities\Page;
|
|
|
|
use common\modules\pages\forms\PageForm;
|
|
|
|
use common\modules\pages\repositories\PageRepository;
|
|
|
|
|
|
|
|
class PageManageService
|
|
|
|
{
|
|
|
|
private $pages;
|
|
|
|
|
|
|
|
public function __construct(PageRepository $pages)
|
|
|
|
{
|
|
|
|
$this->pages = $pages;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function create(PageForm $form, $type = Page::TYPE_PUBLIC): Page
|
|
|
|
{
|
|
|
|
$parent = $this->pages->get($form->parentId);
|
|
|
|
$page = Page::create(
|
|
|
|
$form->title,
|
|
|
|
$form->slug,
|
|
|
|
$form->content,
|
|
|
|
$type,
|
|
|
|
new Meta(
|
|
|
|
$form->meta->title,
|
|
|
|
$form->meta->description,
|
|
|
|
$form->meta->keywords
|
|
|
|
)
|
|
|
|
);
|
|
|
|
if ($type == Page::TYPE_PUBLIC) {
|
|
|
|
$page->appendTo( $parent );
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$parent = Page::find()->andWhere(['tree' => 2])->andWhere(['depth' => 0])->one();
|
|
|
|
$page->appendTo( $parent );
|
|
|
|
}
|
|
|
|
$this->pages->save($page);
|
|
|
|
return $page;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function edit($id, PageForm $form): void
|
|
|
|
{
|
|
|
|
$page = $this->pages->get($id);
|
|
|
|
|
|
|
|
PageHelper::saveRevision($page);
|
|
|
|
|
|
|
|
$this->assertIsNotRoot($page);
|
|
|
|
$page->edit(
|
|
|
|
$form->title,
|
|
|
|
$form->slug,
|
|
|
|
$form->content,
|
|
|
|
$form->type,
|
|
|
|
new Meta(
|
|
|
|
$form->meta->title,
|
|
|
|
$form->meta->description,
|
|
|
|
$form->meta->keywords
|
|
|
|
)
|
|
|
|
);
|
|
|
|
if ($form->parentId !== $page->parent->id) {
|
|
|
|
$parent = $this->pages->get($form->parentId);
|
|
|
|
$page->appendTo($parent);
|
|
|
|
}
|
|
|
|
$this->pages->save($page);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function moveUp($id): void
|
|
|
|
{
|
|
|
|
$page = $this->pages->get($id);
|
|
|
|
$this->assertIsNotRoot($page);
|
|
|
|
if ($prev = $page->prev) {
|
|
|
|
$page->insertBefore($prev);
|
|
|
|
}
|
|
|
|
$this->pages->save($page);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function moveDown($id): void
|
|
|
|
{
|
|
|
|
$page = $this->pages->get($id);
|
|
|
|
$this->assertIsNotRoot($page);
|
|
|
|
if ($next = $page->next) {
|
|
|
|
$page->insertAfter($next);
|
|
|
|
}
|
|
|
|
$this->pages->save($page);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function remove($id): void
|
|
|
|
{
|
|
|
|
$page = $this->pages->get($id);
|
|
|
|
$this->assertIsNotRoot($page);
|
|
|
|
$this->pages->remove($page);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function assertIsNotRoot(Page $page): void
|
|
|
|
{
|
|
|
|
if ($page->isRoot()) {
|
|
|
|
throw new \DomainException('Unable to manage the root page.');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function removePreviews(): void
|
|
|
|
{
|
|
|
|
$pages = Page::find()->andWhere(['type' => Page::TYPE_PREVIEW])->all();
|
|
|
|
foreach ($pages as $page) {
|
|
|
|
$page->delete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function clearHistory(Page $page): void
|
|
|
|
{
|
|
|
|
Page::deleteAll(['revision_id' => $page->id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function restoreHistory($from_id, $id): void
|
|
|
|
{
|
|
|
|
$page = $this->pages->get($id);
|
|
|
|
$from = $this->pages->get($from_id);
|
|
|
|
|
|
|
|
$page->title = $from->title;
|
|
|
|
$page->slug = $from->slug;
|
|
|
|
$page->content = $from->content;
|
|
|
|
$page->created_at = $from->created_at;
|
|
|
|
$page->updated_at = $from->updated_at;
|
|
|
|
$page->revision_at = $from->revision_at;
|
|
|
|
|
|
|
|
$this->pages->save($page);
|
|
|
|
|
|
|
|
// remove current revision
|
|
|
|
$this->pages->remove($from);
|
|
|
|
Page::deleteAll(['AND', ['revision_id' => $page->id], ['>', 'revision_at', $page->revision_at]]);
|
|
|
|
}
|
|
|
|
}
|