Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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;
 }