/** * Save new page. * * @param array $values * @return Page */ public static function saveNewPage(array $values) { $subpage = new Page(); $subpage->setUid(Helper::getUniqueId()); $subpage->setVisible($values['visible']); $subpage->setEnabled($values['enabled']); $subpage->setIncludeInIndex($values['index']); if ($values['parent_page_id'] == '@root' && !PageQuery::create()->findRoot()) { // Create root node $subpage->makeRoot(); $subpage->setName($values['name']); $subpage->setUrl('/'); // Grant everyone access $pageAccess = new PageAccess(); $pageAccess->setPage($subpage); $permissions = PageAccess::getPermissionTypes(); $grant = array_fill(0, count($permissions), true); $pageAccess->fromArray(array_combine($permissions, $grant)); } else { $parentPage = PageQuery::create()->findPk($values['parent_page_id']); $subpage->insertAsLastChildOf($parentPage); $subpage->setAutoName($values['name']); } $subpage->save(); return $subpage; }
/** * Restore multiple pages from "copy code". * * @param Page $page * @param array $pageData * @param bool|array $subpages * @return array * @throws Exception */ public static function restorePages(Page $page, array $pageData, $subpages) { // url => Page $pages = array(); // Restore object $p = new stdClass(); $p->data = $pageData; $p->parent = null; $p->page = $page; // Flatten pages to restore $pageDatas = array(); $stack = array($p); while (count($stack)) { $p = array_shift($stack); foreach ($p->data['pages'] as $sub) { $sp = new stdClass(); $sp->data = $sub; $sp->parent = $p; $sp->page = $p->page ? PageQuery::create()->childrenOf($p->page)->filterByName($sub['name'])->findOne() : null; array_push($stack, $sp); } if (is_bool($subpages) || is_array($subpages) && in_array($p->data['id'], $subpages)) { $pageDatas[$p->data['url']] = $p; } if ($subpages === false) { break; } } // Create pages foreach ($pageDatas as $p) { if (isset($pages[$p->data['url']])) { continue; } if (!$p->page) { $parent = $p->parent->page; if (!$parent) { throw new Exception('Parent page not found for page: ' . $p->data['name']); } $pp = new Page(); if (!PageQuery::create()->findOneByUid($p->data['uid'])) { $pp->setUid($p->data['uid']); } $pp->insertAsLastChildOf($parent); $pp->save(); $pp->setAutoName($p->data['name']); $pp->save(); $p->page = $pp; } $pages[$p->data['url']] = $p->page; } // Rearrange pages depending on base page $alreadyMoved = array(); foreach ($pageDatas as $url => $p) { $basePage = $p->data['revision']['base_page']; if ($basePage && isset($pageDatas[$basePage]) && !isset($alreadyMoved[$basePage])) { $alreadyMoved[$basePage] = true; ArrayHelper::insertBefore($pageDatas, array($basePage => $pageDatas[$basePage]), $url); } } // Restore page data foreach ($pageDatas as $p) { self::restorePage($pages[$p->data['url']], $p->data, $pages); } return $pages; }