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