|  |  |  | <?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]]);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |