You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.4 KiB
135 lines
3.4 KiB
<?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, $type = Page::TYPE_PUBLIC): void |
|
{ |
|
$page = $this->pages->get($id); |
|
|
|
PageHelper::saveRevision($page); |
|
|
|
$this->assertIsNotRoot($page); |
|
$page->edit( |
|
$form->title, |
|
$form->slug, |
|
$form->content, |
|
$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]]); |
|
} |
|
} |