/** * @expectedException \Cx\Model\Base\ValidationException */ public function testValidationException() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $n = new \Cx\Core\ContentManager\Model\Entity\Node(); $n->setParent($nodeRepo->getRoot()); $nodeRepo->getRoot()->addChildren($n); self::$em->persist($n); self::$em->flush(); $p = new \Cx\Core\ContentManager\Model\Entity\Page(); $p->setNode($n); $p->setLang(1); $p->setTitle('validation testpage'); $p->setNodeIdShadowed($n->getId()); $p->setUseCustomContentForAllChannels(''); $p->setUseCustomApplicationTemplateForAllChannels(''); $p->setUseSkinForAllChannels(''); $p->setType(\Cx\Core\ContentManager\Model\Entity\Page::TYPE_APPLICATION); $p->setActive(1); //set disallowed module name $p->setModule('1|@f2'); $p->setCmd(''); self::$em->persist($n); self::$em->persist($p); //should raise exception self::$em->flush(); }
public function testPagesByLang() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $node = new \Cx\Core\ContentManager\Model\Entity\Node(); $node->setParent($nodeRepo->getRoot()); $nodeRepo->getRoot()->addChildren($node); self::$em->persist($node); self::$em->flush(); $p1 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p2 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p1->setNode($node); $p2->setNode($node); $p1->setLang(1); $p1->setTitle('testpage'); $p1->setNodeIdShadowed($node->getId()); $p1->setUseCustomContentForAllChannels(''); $p1->setUseCustomApplicationTemplateForAllChannels(''); $p1->setUseSkinForAllChannels(''); $p1->setCmd(''); $p1->setActive(1); $p2->setLang(2); $p2->setTitle('testpage2'); $p2->setNodeIdShadowed($node->getId()); $p2->setUseCustomContentForAllChannels(''); $p2->setUseCustomApplicationTemplateForAllChannels(''); $p2->setUseSkinForAllChannels(''); $p2->setCmd(''); $p2->setActive(1); self::$em->persist($node); self::$em->persist($p1); self::$em->persist($p2); self::$em->flush(); self::$em->refresh($node); // Refreshes the state of the given entity from the database, overwriting local changes. $id = $p1->getId(); $r = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Page'); $p = $r->find($id); $pages = $p->getNode()->getPagesByLang(); $this->assertArrayHasKey(2, $pages); $this->assertArrayHasKey(1, $pages); $this->assertEquals('testpage', $pages[1]->getTitle()); $this->assertEquals('testpage2', $pages[2]->getTitle()); }
protected function getResolvedFallbackPage() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $root = $nodeRepo->getRoot(); $n1 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n1->setParent($root); $root->addChildren($n1); self::$em->persist($n1); self::$em->flush(); //test if requesting this page... $p2 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p2->setLang(1); $p2->setTitle('pageThatsFallingBack'); $p2->setNode($n1); $p2->setType(\Cx\Core\ContentManager\Model\Entity\Page::TYPE_FALLBACK); $p2->setNodeIdShadowed($n1->getId()); $p2->setUseCustomContentForAllChannels(''); $p2->setUseCustomApplicationTemplateForAllChannels(''); $p2->setUseSkinForAllChannels(''); $p2->setCmd(''); $p2->setActive(1); //... will yield contents of this page as result. $p1 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p1->setLang(2); $p1->setTitle('pageThatHoldsTheContent'); $p1->setNode($n1); $p1->setType(\Cx\Core\ContentManager\Model\Entity\Page::TYPE_CONTENT); $p1->setContent('fallbackContent'); $p1->setNodeIdShadowed($n1->getId()); $p1->setUseCustomContentForAllChannels(''); $p1->setUseCustomApplicationTemplateForAllChannels(''); $p1->setUseSkinForAllChannels(''); $p1->setCmd(''); $p1->setActive(1); self::$em->persist($n1); self::$em->persist($p1); self::$em->persist($p2); self::$em->flush(); self::$em->refresh($n1); return false; $url = new Url('http://example.com/pageThatsFallingBack/'); $resolver = new Resolver($url, 1, self::$em, '', $this->mockFallbackLanguages, true); $resolver->resolve(); $p = $resolver->getPage(); return $p; }
public function testSlugReleasing() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $root = $nodeRepo->getRoot(); $n1 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n1->setParent($root); $root->addChildren($n1); $n2 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n2->setParent($root); $root->addChildren($n2); self::$em->persist($n1); self::$em->persist($n2); self::$em->flush(); $p1 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p1->setLang(1); $p1->setTitle('slug release testpage'); $p1->setNode($n1); $p1->setNodeIdShadowed($n1->getId()); $p1->setUseCustomContentForAllChannels(''); $p1->setUseCustomApplicationTemplateForAllChannels(''); $p1->setUseSkinForAllChannels(''); $p1->setCmd(''); $p1->setActive(1); self::$em->persist($root); self::$em->persist($n1); self::$em->persist($n2); self::$em->persist($p1); self::$em->flush(); $idp1 = $p1->getId(); $idn2 = $n2->getId(); self::$em->refresh($n1); self::$em->refresh($n2); $this->assertEquals('slug-release-testpage', $p1->getSlug()); $p1 = self::$em->find('Cx\\Core\\ContentManager\\Model\\Entity\\Page', $idp1); $n2 = self::$em->find('Cx\\Core\\ContentManager\\Model\\Entity\\Node', $idn2); //shouldn't provocate a slug conflict, since we delete the other page below $p2 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p2->setLang(1); $p2->setTitle('slug release testpage'); $p2->setNode($n2); $p2->setNodeIdShadowed($n2->getId()); $p2->setUseCustomContentForAllChannels(''); $p2->setUseCustomApplicationTemplateForAllChannels(''); $p2->setUseSkinForAllChannels(''); $p2->setCmd(''); $p2->setActive(1); self::$em->remove($p1); self::$em->flush(); self::$em->persist($p2); self::$em->flush(); $this->assertEquals('slug-release-testpage', $p2->getSlug()); }
/** * DO NOT CALL THIS METHOD! USE copyToLang() OR copyToNode() INSTEAD! * Copies data from another Page. * @param boolean $includeContent Whether to copy content. Defaults to true. * @param boolean $includeModuleAndCmd Whether to copy module and cmd. Defaults to true. * @param boolean $includeName Wheter to copy title, content title and slug. Defaults to true. * @param boolean $includeMetaData Wheter to copy meta data. Defaults to true. * @param boolean $includeProtection Wheter to copy protection. Defaults to true. * @param boolean $followRedirects Wheter to return a redirection page or the page its pointing at. Defaults to false, which returns the redirection page * @param boolean $followFallbacks Wheter to return a fallback page or the page its pointing at. Defaults to false, witch returns the fallback page * @param \Cx\Core\ContentManager\Model\Entity\Page Page to use as target * @return \Cx\Core\ContentManager\Model\Entity\Page The copy of $this or null on error */ public function copy($includeContent = true, $includeModuleAndCmd = true, $includeName = true, $includeMetaData = true, $includeProtection = true, $followRedirects = false, $followFallbacks = false, $page = null) { $targetPage = null; if ($followRedirects && $this->getType() == self::TYPE_REDIRECT) { $targetPage = $this->getTargetNodeId()->getPage($this->getTargetLangId()); } if ($followFallbacks && $this->getType() == self::TYPE_FALLBACK) { $fallbackLanguage = \FWLanguage::getFallbackLanguageIdById($this->getLang()); $targetPage = $this->getNode()->getPage($fallbackLanguage); } if ($targetPage) { return $targetPage->copy($includeContent, $includeModuleAndCmd, $includeName, $includeMetaData, $includeProtection, $followRedirects, $followFallbacks); } if (!$page) { $page = new \Cx\Core\ContentManager\Model\Entity\Page(); } if ($includeName) { $page->setContentTitle($this->getContentTitle()); $page->setTitle($this->getTitle()); $page->setSlug($this->getSlug()); } $newType = $this->getType(); if ($includeContent) { $page->setContent($this->getContent()); } else { $newType = self::TYPE_FALLBACK; } if ($includeModuleAndCmd) { $page->setModule($this->getModule()); $page->setCmd($this->getCmd()); } else { $page->setCmd(''); } if ($includeMetaData) { $page->setMetatitle($this->getMetatitle()); $page->setMetadesc($this->getMetadesc()); $page->setMetakeys($this->getMetakeys()); $page->setMetarobots($this->getMetarobots()); } $page->setNode($this->getNode()); $page->setActive($this->getActive()); $page->setDisplay($this->getDisplay()); $page->setLang($this->getLang()); $page->setType($newType); $page->setCaching($this->getCaching()); $page->setCustomContent($this->getCustomContent()); $page->setCssName($this->getCssName()); $page->setCssNavName($this->getCssNavName()); $page->setSkin($this->getSkin()); $page->setStart($this->getStart()); $page->setEnd($this->getEnd()); $page->setEditingStatus($this->getEditingStatus()); $page->setTarget($this->getTarget()); $page->setLinkTarget($this->getLinkTarget()); $page->setUpdatedBy(\FWUser::getFWUserObject()->objUser->getUsername()); if ($includeProtection) { if (!$this->copyProtection($page, true) || !$this->copyProtection($page, false)) { return null; } } return $page; }
public function testGetPathToPage() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $n1 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n1->setParent($nodeRepo->getRoot()); $nodeRepo->getRoot()->addChildren($n1); $n2 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n2->setParent($n1); $n1->addChildren($n2); self::$em->persist($n1); self::$em->persist($n2); self::$em->flush(); $p1 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p1->setLang(1); $p1->setTitle('root'); $p1->setNode($n1); $p1->setNodeIdShadowed($n1->getId()); $p1->setUseCustomContentForAllChannels(''); $p1->setUseCustomApplicationTemplateForAllChannels(''); $p1->setUseSkinForAllChannels(''); $p1->setCmd(''); $p1->setActive(1); $p2 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p2->setLang(1); $p2->setTitle('child page'); $p2->setNode($n2); $p2->setNodeIdShadowed($n2->getId()); $p2->setUseCustomContentForAllChannels(''); $p2->setUseCustomApplicationTemplateForAllChannels(''); $p2->setUseSkinForAllChannels(''); $p2->setCmd(''); $p2->setActive(1); self::$em->persist($n1); self::$em->persist($n2); self::$em->persist($p1); self::$em->persist($p2); self::$em->flush(); $pageId = $p2->getId(); \Env::get('em')->refresh($n1); //make sure we re-fetch a correct state self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node')->verify(); $pageRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Page'); $page = $pageRepo->findOneById($pageId); $this->assertEquals('root/child-page', $pageRepo->getPath($page)); }
public function testTranslate() { $nodeRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node'); $pageRepo = self::$em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Page'); $n1 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n1->setParent($nodeRepo->getRoot()); $nodeRepo->getRoot()->addChildren($n1); $n2 = new \Cx\Core\ContentManager\Model\Entity\Node(); $n2->setParent($n1); self::$em->persist($n1); self::$em->persist($n2); self::$em->flush(); $p1 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p1->setLang(1); $p1->setTitle('test translate root'); $p1->setNode($n1); $p1->setNodeIdShadowed($n1->getId()); $p1->setUseCustomContentForAllChannels(''); $p1->setUseCustomApplicationTemplateForAllChannels(''); $p1->setUseSkinForAllChannels(''); $p1->setCmd(''); $p1->setActive(1); $p2 = new \Cx\Core\ContentManager\Model\Entity\Page(); $p2->setLang(1); $p2->setTitle('child page'); $p2->setNode($n2); $p2->setNodeIdShadowed($n1->getId()); $p2->setUseCustomContentForAllChannels(''); $p2->setUseCustomApplicationTemplateForAllChannels(''); $p2->setUseSkinForAllChannels(''); $p2->setCmd(''); $p2->setActive(1); self::$em->persist($n1); self::$em->persist($n2); self::$em->persist($p1); self::$em->persist($p2); self::$em->flush(); $pageId = $p2->getId(); self::$em->refresh($n1); self::$em->refresh($n2); $pageToTranslate = $pageRepo->findOneById($pageId); // copy page following redirects $page = $pageToTranslate->copyToLang(2, true, true, true, true, true, false, true); $page->setActive(1); $pageToTranslate->setupPath(2); $page->setNodeIdShadowed($pageToTranslate->getId()); self::$em->persist($page); self::$em->flush(); $pageId = $page->getId(); // Translated page id self::$em->refresh($n1); self::$em->refresh($n2); $page = $pageRepo->findOneById($pageId); // Translated page $this->assertEquals('/test-translate-root/child-page', $page->getPath()); $this->assertEquals(2, $page->getLang()); //see if the parent node is really, really there. $parentPages = $page->getNode()->getParent()->getPagesByLang(); $this->assertArrayHasKey(2, $parentPages); $this->assertEquals('test translate root', $parentPages[2]->getTitle()); }
/** * Creates a page with the given parameters. * * This should be a constructor of Page. Since PHP does not support method * overloading and doctrine needs a constructor without parameters, it's * located here. * @param \Cx\Core\ContentManager\Model\Entity\Node $parentNode * @param int $lang Language id * @param string $title Page title * @param string $type Page type (fallback, content, application) * @param string $module Module name * @param string $cmd Module cmd * @param boolean $display Is page shown in navigation? * @param string $content HTML content * @return \Cx\Core\ContentManager\Model\Entity\Page Newly created page */ public function createPage($parentNode, $lang, $title, $type, $module, $cmd, $display, $content) { $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setNode($parentNode); $page->setNodeIdShadowed($parentNode->getId()); $page->setLang($lang); $page->setTitle($title); $page->setType($type); $page->setModule($module); $page->setCmd($cmd); $page->setActive(true); $page->setDisplay($display); $page->setContent($content); $page->setMetatitle($title); $page->setMetadesc($title); $page->setMetakeys($title); $page->setMetarobots('index'); $page->setMetatitle($title); $page->setUpdatedBy(\FWUser::getFWUserObject()->objUser->getUsername()); return $page; }
/** * Handles request from the client * @todo Clean up usage of $param and $_GET * @global Array $_CORELANG Core language data * @param Array $params Client parameters * @return type */ public function set($params) { global $_CORELANG; // Global access check if (!\Permission::checkAccess(6, 'static', true) || !\Permission::checkAccess(35, 'static', true)) { throw new \Exception($_CORELANG['TXT_CORE_CM_USAGE_DENIED']); } $newPage = false; $reload = false; $pg = \Env::get('pageguard'); $dataPost = !empty($params['post']) ? $params['post'] : array(); $pageArray = !empty($dataPost['page']) ? $dataPost['page'] : array(); // Only set in the editing mode. $pageId = !empty($pageArray['id']) ? intval($pageArray['id']) : (!empty($dataPost['pageId']) ? intval($dataPost['pageId']) : 0); $nodeId = !empty($pageArray['node']) ? intval($pageArray['node']) : (!empty($dataPost['nodeId']) ? intval($dataPost['nodeId']) : 0); $lang = !empty($pageArray['lang']) ? contrexx_input2raw($pageArray['lang']) : (!empty($dataPost['lang']) ? contrexx_input2raw($dataPost['lang']) : \FWLanguage::getLanguageCodeById(\FWLanguage::getDefaultLangId())); $action = !empty($dataPost['action']) ? contrexx_input2raw($dataPost['action']) : ''; $cacheManager = new \Cx\Core_Modules\Cache\Controller\CacheManager(); $cacheManager->deleteSingleFile($pageId); if (!empty($pageArray)) { if (!empty($pageArray['target']) && !empty($pageArray['target_protocol'])) { $pageArray['target'] = $pageArray['target_protocol'] . $pageArray['target']; } elseif (empty($pageArray['target']) && !empty($pageArray['target_protocol'])) { $pageArray['target'] = ''; } $validatedPageArray = $this->validatePageArray($pageArray); } // UPDATE if (!empty($pageId)) { // If we got a page id, the page already exists and can be updated. $page = $this->pageRepo->find($pageId, 0, null, false); $node = $page->getNode(); // TRANSLATE } else { if (!empty($nodeId) && !empty($lang)) { // We are translating the page. $node = $this->nodeRepo->find($nodeId); $page = $node->translatePage(true, \FWLanguage::getLanguageIdByCode($lang)); $page->setNodeIdShadowed($node->getId()); $page->setEditingStatus(''); $newPage = true; $reload = true; // CREATE } else { if (empty($pageId) && !empty($lang)) { if (!\Permission::checkAccess(5, 'static', true)) { throw new \Exception($_CORELANG['TXT_CORE_CM_CREATION_DENIED']); } // Create a new node/page combination. $node = new \Cx\Core\ContentManager\Model\Entity\Node(); // CREATE WITHIN if (isset($dataPost['parent_node'])) { $parentNode = $this->nodeRepo->find($dataPost['parent_node']); if (!$parentNode) { $parentNode = $this->nodeRepo->getRoot(); } $node->setParent($parentNode); $parentNode->addChildren($node); // add parent node to ID, so the node containing the new page is opened if (!isset($_COOKIE['jstree_open'])) { $_COOKIE['jstree_open'] = ''; } $openNodes = explode(',', $_COOKIE['jstree_open']); if ($openNodes == array(0 => '')) { $openNodes = array(); } if (!in_array('#node_' . $parentNode->getId(), $openNodes)) { $openNodes[] = '#node_' . $parentNode->getId(); } setcookie('jstree_open', implode(',', $openNodes)); $this->em->persist($node); $this->em->flush(); // CREATE } else { $node->setParent($this->nodeRepo->getRoot()); $this->nodeRepo->getRoot()->addChildren($node); $this->em->persist($node); $this->em->flush(); } $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setNode($node); $node->addPage($page); $page->setNodeIdShadowed($node->getId()); $page->setLang(\FWLanguage::getLanguageIdByCode($lang)); $page->setUpdatedBy(\FWUser::getFWUserObject()->objUser->getUsername()); $newPage = true; $reload = true; } else { throw new \Exception('Page cannot be created. There are too little information.'); } } } // Page access check if ($page->isBackendProtected() && !\Permission::checkAccess($page->getBackendAccessId(), 'dynamic', true)) { throw new \Cx\Core\ContentManager\Model\Entity\PageException('Not allowed to read page'); } if (!empty($pageArray)) { $page->updateFromArray($validatedPageArray); if ($newPage) { // Make sure page has an ID $this->em->persist($page); $this->em->flush(); } } if (!empty($action)) { switch ($action) { case 'activate': case 'publish': $page->setActive(true); break; case 'deactivate': $page->setActive(false); break; case 'show': $page->setDisplay(true); break; case 'hide': $page->setDisplay(false); break; case 'protect': $page->setFrontendProtection(true); break; case 'unprotect': $page->setFrontendProtection(false); break; case 'lock': $page->setBackendProtection(true); break; case 'unlock': $page->setBackendProtection(false); break; } if ($action != 'publish' && !$page->isDraft()) { $action = 'publish'; } } $page->setUpdatedAtToNow(); $page->validate(); // Permissions are only updated in the editing mode. if (!empty($pageArray)) { if ($action == 'publish') { if (\Permission::checkAccess(36, 'static', true)) { if ($page->isFrontendProtected()) { // remove all \Permission::removeAccess($page->getFrontendAccessId(), 'dynamic'); if (isset($dataPost['frontendGroups'])) { // set new $pg->setAssignedGroupIds($page, $dataPost['frontendGroups'], true); } } if ($page->isBackendProtected()) { // remove all $groupIds = $pg->getAssignedGroupIds($page, false); \Permission::removeAccess($page->getBackendAccessId(), 'dynamic'); if (isset($dataPost['backendGroups'])) { // set new $pg->setAssignedGroupIds($page, $dataPost['backendGroups'], false); } if ($page->isBackendProtected() && !\Permission::checkAccess($page->getBackendAccessId(), 'dynamic', true)) { if (!count($groupIds)) { $page->setBackendProtection(false); } else { $pg->setAssignedGroupIds($page, $groupIds, false); } } } } } } // Block associations are only updated in the editing mode. if (!empty($pageArray) && empty($dataPost['ignoreBlocks'])) { if (!isset($dataPost['pageBlocks'])) { $dataPost['pageBlocks'] = array(); } $page->setRelatedBlocks($dataPost['pageBlocks']); } $draftUpdateLog = null; $liveUpdateLog = null; $updatingDraft = false; if ($action == 'publish' && \Permission::checkAccess(78, 'static', true)) { // User w/permission clicked save&publish. we should either publish the page or submit the draft for approval. if ($page->getEditingStatus() == 'hasDraftWaiting') { $reload = true; } if ($page->getEditingStatus() != '') { $logEntries = $this->logRepo->getLogEntries($page, false); $this->em->remove($logEntries[0]); } $page->setEditingStatus(''); $this->messages[] = $_CORELANG['TXT_CORE_SAVED']; } else { // User clicked save [as draft], so let's do that. $updatingDraft = $page->getEditingStatus() != '' ? true : false; if ($action == 'publish') { // User w/o publish permission clicked save&publish. submit it as a draft. $page->setEditingStatus('hasDraftWaiting'); $this->messages[] = $_CORELANG['TXT_CORE_DRAFT_SUBMITTED']; } else { if ($page->getEditingStatus() == 'hasDraftWaiting' && \Permission::checkAccess(78, 'static', true)) { $reload = true; } $page->setEditingStatus('hasDraft'); $this->messages[] = $_CORELANG['TXT_CORE_SAVED_AS_DRAFT']; } // Gedmo-loggable generates a LogEntry (i.e. revision) on persist, so we'll have to // store the draft first, then revert the current version to what it previously was. // In the end, we'll have the current [published] version properly stored as a page // and the draft version stored as a gedmo LogEntry. $this->em->persist($page); // Gedmo hooks in on persist/flush, so we unfortunately need to flush our em in // order to get a clean set of logEntries. $this->em->flush(); $logEntries = $this->logRepo->getLogEntries($page, false); // Revert to the published version. $cachedEditingStatus = $page->getEditingStatus(); $this->logRepo->revert($page, $logEntries[1]->getVersion()); $page->setEditingStatus($cachedEditingStatus); switch ($action) { case 'activate': case 'publish': $page->setActive(true); break; case 'deactivate': $page->setActive(false); break; case 'show': $page->setDisplay(true); break; case 'hide': $page->setDisplay(false); break; case 'protect': $page->setFrontendProtection(true); break; case 'unprotect': $page->setFrontendProtection(false); break; case 'lock': $page->setBackendProtection(true); break; case 'unlock': $page->setBackendProtection(false); break; } $this->em->persist($page); // Gedmo auto-logs slightly too much data. clean up unnecessary revisions: if ($updatingDraft) { $this->em->flush(); $logEntries = $this->logRepo->getLogEntries($page); $currentLog = $logEntries[1]; $currentLogData = $currentLog->getData(); $currentLogData['editingStatus'] = $page->getEditingStatus(); $currentLog->setData($currentLogData); $this->em->persist($currentLog); $liveUpdateLog = $logEntries[2]; $this->em->remove($logEntries[2]); } } $this->em->persist($page); if (isset($dataPost['inheritFrontendAccess']) && $dataPost['inheritFrontendAccess'] == 'on' || isset($dataPost['inheritBackendAccess']) && $dataPost['inheritBackendAccess'] == 'on' || isset($dataPost['inheritSkin']) && $dataPost['inheritSkin'] == 'on' || isset($dataPost['inheritCustomContent']) && $dataPost['inheritCustomContent'] == 'on' || isset($dataPost['inheritCssName']) && $dataPost['inheritCssName'] == 'on' || isset($dataPost['inheritCssNavName']) && $dataPost['inheritCssNavName'] == 'on' || isset($dataPost['inheritCaching']) && $dataPost['inheritCaching'] == 'on') { $pageStack = $page->getChildren(); while (count($pageStack)) { $currentPage = array_pop($pageStack); foreach ($currentPage->getChildren() as $child) { array_push($pageStack, $child); } if (isset($dataPost['inheritFrontendAccess']) && $dataPost['inheritFrontendAccess'] == 'on') { $reload = true; $page->copyProtection($currentPage, true); } if (isset($dataPost['inheritBackendAccess']) && $dataPost['inheritBackendAccess'] == 'on') { $reload = true; $page->copyProtection($currentPage, false); } if (isset($dataPost['inheritSkin']) && $dataPost['inheritSkin'] == 'on') { $currentPage->setSkin($page->getSkin()); } if (isset($dataPost['inheritCustomContent']) && $dataPost['inheritCustomContent'] == 'on') { $currentPage->setCustomContent($page->getCustomContent()); } if (isset($dataPost['inheritCssName']) && $dataPost['inheritCssName'] == 'on') { $currentPage->setCssName($page->getCssName()); } if (isset($dataPost['inheritCssNavName']) && $dataPost['inheritCssNavName'] == 'on') { $currentPage->setCssNavName($page->getCssNavName()); } if (isset($dataPost['inheritCaching']) && $dataPost['inheritCaching'] == 'on') { $currentPage->setCaching($page->getCaching()); } $this->em->persist($currentPage); } } $this->em->flush(); // bug fix #2279 // could not save alias after running $this->em->clear() // Aliases are only updated in the editing mode. if (!empty($pageArray)) { // Only users with publish rights can create aliases. if (\Permission::checkAccess(115, 'static', true) && \Permission::checkAccess(78, 'static', true)) { // Aliases are updated after persist. $data = array(); $data['alias'] = $pageArray['alias']; $aliases = $page->getAliases(); $page->updateFromArray($data); if ($aliases != $page->getAliases()) { $reload = true; } } else { // Users without permission shouldn't see the aliasses anyway //$this->messages[] = $_CORELANG['TXT_CORE_ALIAS_CREATION_DENIED']; } } // this fixes log version number skipping $this->em->clear(); $logs = $this->logRepo->getLogEntries($page); $this->em->persist($logs[0]); if ($updatingDraft) { $data = $logs[1]->getData(); if (!empty($action) && $draftUpdateLog) { $data = $draftUpdateLog->getData(); } $data['editingStatus'] = 'hasDraft'; if ($action == 'publish' && !\Permission::checkAccess(78, 'static', true)) { $data['editingStatus'] = 'hasDraftWaiting'; } switch ($action) { case 'activate': $data['active'] = true; break; case 'deactivate': $data['active'] = false; break; case 'show': $data['display'] = true; break; case 'hide': $data['display'] = false; break; case 'protect': $data['protection'] = $data['protection'] | FRONTEND_PROTECTION; break; case 'unprotect': $data['protection'] = $data['protection'] & ~FRONTEND_PROTECTION; break; case 'lock': $data['protection'] = $data['protection'] | BACKEND_PROTECTION; break; case 'unlock': $data['protection'] = $data['protection'] & ~BACKEND_PROTECTION; break; } $logs[1]->setData($data); if (!empty($action) && $action != 'publish') { $data = $logs[0]->getData(); if ($liveUpdateLog) { $data = $liveUpdateLog->getData(); } switch ($action) { case 'activate': $data['active'] = true; break; case 'deactivate': $data['active'] = false; break; case 'show': $data['display'] = true; break; case 'hide': $data['display'] = false; break; case 'protect': $data['protection'] = $data['protection'] | FRONTEND_PROTECTION; break; case 'unprotect': $data['protection'] = $data['protection'] & ~FRONTEND_PROTECTION; break; case 'lock': $data['protection'] = $data['protection'] | BACKEND_PROTECTION; break; case 'unlock': $data['protection'] = $data['protection'] & ~BACKEND_PROTECTION; break; } $logs[0]->setData($data); } $this->em->persist($logs[0]); $this->em->persist($logs[1]); $this->em->flush(); } // get version // if it is a draft, don't take the last one $version = $page->getVersion()->getVersion(); if ($page->isDraft()) { $version--; } return array('reload' => $reload, 'id' => $page->getId(), 'version' => $version, 'node' => $page->getNode()->getId(), 'lang' => \FWLanguage::getLanguageCodeById($page->getLang())); }
function _handleContentPage($formId = 0) { if (!$formId) { return; } $objDatabase = \Env::get('db'); $objFWUser = \FWUser::getFWUserObject(); $pageRepo = $this->em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Page'); $pages = array(); foreach ($pageRepo->findBy(array('module' => 'Contact', 'cmd' => $formId)) as $page) { if ($page) { $pages[$page->getLang()] = $page; } } $frontendLangIds = array_keys(\FWLanguage::getActiveFrontendLanguages()); $selectedLangIds = array_keys($this->arrForms[$formId]['lang']); // filter out only those languages that are active in the frontent. // we do want to create/update only the content pages of those languages. $selectedLangIds = array_intersect($selectedLangIds, $frontendLangIds); // Maybe there will already be a fallback page if we activate a new language. // So we use the fallback page to prevent the creation of a new page. foreach ($selectedLangIds as $selectedLangId) { if (!isset($pages[$selectedLangId])) { $fallbackPage = $pageRepo->findOneByModuleCmdLang('Contact', $formId, $selectedLangId); if (!empty($fallbackPage)) { $pages[$selectedLangId] = $fallbackPage; } } } $presentLangIds = array_keys($pages); // define which languages of the content pages have to be updated // $updateLangIds = array_intersect($selectedLangIds, $presentLangIds); // define which languages of the content pages have to be created // $newLangIds = array_diff($selectedLangIds, $updateLangIds); // define which languages of the content pages have to be removed $deleteLangIds = array_diff($presentLangIds, $selectedLangIds); $langIdsOfAssociatedPagesOfPageNode = array(); foreach ($presentLangIds as $langId) { $langIdsOfAssociatedPagesOfPageNode[$pages[$langId]->getId()] = array_keys($pages[$langId]->getNode()->getPagesByLang()); } foreach ($selectedLangIds as $langId) { $page = null; $node = null; if (isset($pages[$langId])) { // Content page already exists, so we will update this very page $page = $pages[$langId]; \DBG::msg("Page in lang {$langId} exists -> Update()"); } else { // Content page of the frontend language $langId doesn't exist yet. // Therefore we will either have to create a new node or we will have to // find a node to which we can attach our new page. // We will prefer the latter. \DBG::msg("Page doesn't exist in lang {$langId} -> Create()"); // Check if there exists already a content page to who's node we could attach our new page if (count($pages)) { if ($langId != \FWLanguage::getDefaultLangId() && isset($pages[\FWLanguage::getDefaultLangId()]) && !in_array($langId, $langIdsOfAssociatedPagesOfPageNode[$pages[\FWLanguage::getDefaultLangId()]->getId()])) { // if that is the case, we will attach our new page to this node $node = $pages[\FWLanguage::getDefaultLangId()]->getNode(); \DBG::msg("Page does exists in the default language"); \DBG::msg("Attach page to node {$node->getId()} of the page of the lang " . \FWLanguage::getDefaultLangId()); } else { foreach ($pages as $langIdOfPage => $page) { // Skip the page of the default frontend language - we just checked this page's node before if ($langIdOfPage == \FWLanguage::getDefaultLangId()) { continue; } // Check if there exists a node of the pages in the other languages that don't // have an associated page in the language we're going to create a new page if (!in_array($langId, $langIdsOfAssociatedPagesOfPageNode[$pages[$langIdOfPage]->getId()])) { $node = $pages[$langIdOfPage]->getNode(); \DBG::msg("Attach page to node {$node->getId()} of the page of the lang {$langIdOfPage}"); break; } } } } if ($node === null) { \DBG::msg("No node found -> Create()"); $root = $this->em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\Node')->getRoot(); // Create a new node $node = new \Cx\Core\ContentManager\Model\Entity\Node(); $node->setParent($root); $this->em->persist($node); } // Create a new Page $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setNode($node); // Set the following attributes only on new pages $page->setTitle($this->arrForms[$formId]['lang'][$langId]['name']); $page->setDisplay(false); $page->setActive(true); $page->setLang($langId); } $page->setType(\Cx\Core\ContentManager\Model\Entity\Page::TYPE_APPLICATION); $page->setModule('Contact'); $page->setCmd($formId); $content = $page->getContent(); //if the content is missing the placeholder {APPLICATION_DATA}, append the placeholder to the page's content. if (!preg_match_all('/\\{APPLICATION_DATA\\}/xi', $content, $matches)) { $content .= '{APPLICATION_DATA}'; } $page->setContent($content); $page->setSourceMode(true); $this->em->persist($page); // Remember newly created pages. We will need this for the creating of other new pages above in this method. if (!isset($pages[$langId])) { $pages[$langId] = $page; $langIdsOfAssociatedPagesOfPageNode[$pages[$langId]->getId()] = array($langId); } } //$this->em->flush(); // Delete those content pages of those languages that had been deactivated foreach ($deleteLangIds as $langId) { $page = $pages[$langId]; $node = $page->getNode(); \DBG::msg("Delete page: {$langId}"); //DBG::dump(count($node->getPages())); $this->em->remove($page); //$this->em->persist($page); //$this->em->flush(); //DBG::dump(count($node->getPages())); // TODO: Delete empty nodes } $this->em->flush(); }