Example #1
0
 /**
  * Returns the navigation object from the post data
  *
  * @return Omeka_Navigation The navigation object from the post data
  */
 protected function _getNavigationFromPost()
 {
     $nav = new Omeka_Navigation();
     $nav->loadAsOption(Omeka_Navigation::PUBLIC_NAVIGATION_MAIN_OPTION_NAME);
     $pageUids = array();
     if ($pageLinks = $this->getValue(self::HIDDEN_ELEMENT_ID)) {
         if ($pageLinks = json_decode($pageLinks, true)) {
             // add and update the pages in the navigation
             $pageOrder = 0;
             $pages = array();
             $parentPageIds = array();
             $pageIdsToPageUids = array();
             foreach ($pageLinks as $pageLink) {
                 $pageOrder++;
                 // add or update the page in the navigation
                 $pageUid = $nav->createPageUid($pageLink['uri']);
                 if (!($page = $nav->getPageByUid($pageUid))) {
                     $page = new Omeka_Navigation_Page_Uri();
                     $page->setHref($pageLink['uri']);
                     // this sets both the uri and the fragment
                     $page->set('uid', $pageUid);
                 }
                 $page->setLabel($pageLink['label']);
                 $page->set('can_delete', (bool) $pageLink['can_delete']);
                 $page->setVisible($pageLink['visible']);
                 $page->setOrder($pageOrder);
                 $parentPageIds[] = $pageLink['parent_id'];
                 $pageUids[] = $page->uid;
                 $pages[] = $page;
                 $pageIdsToPageUids[strval($pageLink['id'])] = $page->uid;
             }
             // structure the parent/child relationships
             // this assumes that the $pages are in a flattened hierarchical order
             for ($i = 0; $i < $pageOrder; $i++) {
                 $page = $pages[$i];
                 $page->removePages();
                 // remove old children pages
                 $parentPageId = $parentPageIds[$i];
                 if ($parentPageId === null || !array_key_exists($parentPageId, $pageIdsToPageUids)) {
                     // add a page that lacks a parent
                     $nav->addPage($page);
                 } else {
                     // add a child page to its parent page
                     // we assume that all parents already exist in the navigation
                     $parentPageUid = $pageIdsToPageUids[$parentPageId];
                     if (!($parentPage = $nav->getPageByUid($parentPageUid))) {
                         throw new RuntimeException(__("Cannot find parent navigation page."));
                     } else {
                         $parentPage->addPage($page);
                     }
                 }
             }
         }
     }
     // prune the remaining expired pages from navigation
     $otherPages = $nav->getOtherPages($pageUids);
     $expiredPages = array();
     foreach ($otherPages as $otherPage) {
         $nav->prunePage($otherPage);
     }
     return $nav;
 }