/** * 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; }