/** * Get selected pages for a block to display in overview page * @see $this->_showOverview() * * @param integer $blockId Block id * @param string $placeholder Placeholder (global, direct) * @param \ContentTree $objContentTree ContentTree instance * @param \Cx\Core\ContentManager\Model\Repository\PageRepository $pageRepo PageRepository instance * * @return string Return the selected pages as <ul><li></li></ul> */ function getSelectedPages($blockId, $placeholder, \ContentTree $objContentTree, \Cx\Core\ContentManager\Model\Repository\PageRepository $pageRepo) { $pageLinkTemplate = '<li><a href="%1$s" target="_blank">%2$s</a></li>'; $blockAssociatedPageIds = $this->_getAssociatedPageIds($blockId, $placeholder); $selectedPages = array(); $strSelectedPages = ''; foreach ($objContentTree->getTree() as $arrData) { if (!in_array($arrData['catid'], $blockAssociatedPageIds)) { continue; } $page = $pageRepo->findOneById($arrData['catid']); if (!$page) { continue; } $selectedPages[] = sprintf($pageLinkTemplate, \Cx\Core\Routing\Url::fromPage($page)->toString(), contrexx_raw2xhtml($arrData['catname'])); } if ($selectedPages) { $strSelectedPages = '<ul>' . implode($selectedPages) . '</ul>'; } return $strSelectedPages; }
/** * Converts a tree level to JSON * @param Cx\Core\ContentManager\Model\Entity\Node $root Root node of the current level * @param Array $logs List of all logs (used to get the username) * @return String JSON data */ private function tree_to_jstree_array($root, $flat = false, &$actions = null) { $fallback_langs = $this->fallbacks; $sorted_tree = array(); foreach ($root->getChildren() as $node) { $sorted_tree[$node->getLft()] = $node; } ksort($sorted_tree); // get open nodes $open_nodes = array(); if (isset($_COOKIE['jstree_open'])) { $tmp_open_nodes = explode(',', $_COOKIE['jstree_open']); foreach ($tmp_open_nodes as $node) { $node_id = substr($node, 6); $open_nodes[$node_id] = true; } } $output = array(); $tree = array(); $nodeLevels = array(); foreach ($sorted_tree as $node) { $data = array(); $metadata = array(); $children = array(); // if this node is expanded (toggled) $toggled = isset($open_nodes[$node->getId()]) && $open_nodes[$node->getId()]; if (!$flat || $toggled) { $children = $this->tree_to_jstree_array($node, $flat); } $last_resort = 0; $numberOfPages = 0; /** * I (<*****@*****.**> cannot recall the reason why to * get alias pages too but I think there was one (probably not a nice one) * @todo Write unit tests for CM then try $node->getPages() * if the above is done do the following too * @todo Replace $numberOfPages by $pages = $node->getPages(), then just count them */ foreach ($node->getPages(false, true) as $page) { // don't display aliases in cm's tree if ($page->getType() == \Cx\Core\ContentManager\Model\Entity\Page::TYPE_ALIAS) { continue 2; } $numberOfPages++; $user = $page->getUpdatedBy(); $data[\FWLanguage::getLanguageCodeById($page->getLang())] = array('language' => \FWLanguage::getLanguageCodeById($page->getLang()), 'title' => $page->getTitle(), 'attr' => array('id' => $page->getId(), 'data-href' => json_encode(array('slug' => $page->getSlug(), 'path' => $page->getPath(), 'module' => $page->getModule() . ' ' . $page->getCmd(), 'lastupdate' => $page->getUpdatedAt()->format('d.m.Y H:i'), 'level' => $page->getNode()->getLvl(), 'user' => $user)), 'frontend_access_id' => $page->getFrontendAccessId(), 'backend_access_id' => $page->getBackendAccessId(), 'protected' => $page->isFrontendProtected(), 'locked' => $page->isBackendProtected())); $editingStatus = $page->getEditingStatus(); if ($page->isActive()) { if ($editingStatus == 'hasDraft') { $publishingStatus = 'published draft'; } else { if ($editingStatus == 'hasDraftWaiting') { $publishingStatus = 'published draft waiting'; } else { $publishingStatus = 'published'; } } } else { if ($editingStatus == 'hasDraft') { $publishingStatus = 'unpublished draft'; } else { if ($editingStatus == 'hasDraftWaiting') { $publishingStatus = 'unpublished draft waiting'; } else { $publishingStatus = 'unpublished'; } } } if ($page->isBackendProtected() && !\Permission::checkAccess($page->getBackendAccessId(), 'dynamic', true)) { $publishingStatus .= ' locked'; } $metadata[$page->getId()] = array('visibility' => $page->getStatus(), 'publishing' => $publishingStatus); $last_resort = \FWLanguage::getLanguageCodeById($page->getLang()); } if ($numberOfPages == 0) { continue; } foreach ($fallback_langs as $lang => $fallback) { // fallback can be false, array_key_exists does not like booleans if (!$fallback) { $fallback = null; } if (!array_key_exists($lang, $data) && array_key_exists($fallback, $data)) { $data[$lang]['language'] = $lang; $data[$lang]['title'] = $data[$fallback]['title']; if ($data[$fallback]['attr']['id'] == 'broken') { $data[$lang]['attr']['id'] = 'broken'; } else { $data[$lang]['attr']['id'] = '0'; } } else { if (!array_key_exists($lang, $data)) { $data[$lang]['language'] = $lang; if (array_key_exists($last_resort, $data)) { $data[$lang]['title'] = $data[$last_resort]['title']; $data[$lang]['attr']['id'] = '0'; } else { $data[$lang]['title'] = 'No Title'; $data[$lang]['attr']['id'] = 'broken'; } } } $metadata[0] = array('visibility' => 'active', 'publishing' => 'unpublished'); $metadata['broken'] = array('visibility' => 'broken', 'publishing' => 'unpublished'); } $state = array(); if (count($node->getChildren()) > 0) { if ($toggled) { $state = array('state' => 'open'); } else { $state = array('state' => 'closed'); } } $nodeLevels[$node->getId()] = $node->getLvl(); if (isset($children['nodeLevels'])) { $nodeLevels = $nodeLevels + $children['nodeLevels']; } $tree[] = array_merge(array('attr' => array('id' => 'node_' . $node->getId(), 'rel_id' => $node->getId()), 'data' => array_values($data), 'children' => isset($children['tree']) ? $children['tree'] : array(), 'metadata' => $metadata), $state); } $output['tree'] = $tree; $output['nodeLevels'] = $nodeLevels; $output['hasHome'] = array(); foreach (\FWLanguage::getActiveFrontendLanguages() as $lang) { $page = $this->pageRepo->findOneBy(array('module' => 'Home', 'cmd' => '', 'lang' => $lang['id'])); $output['hasHome'][$lang['lang']] = $page ? $page->getId() : false; } return $output; }