/** * @return HttpResponse */ public function getAjaxRevisionControlBox() { $pageModel = new PageModel($this->db); $cmsPage = $pageModel->getPageByID($this->route->getParam(1)); $elementModel = new ElementModel($this->db); $elementTree = $elementModel->getElementTree($cmsPage); $elementInstance = $elementModel->findElementIDInTree($elementTree, $this->route->getParam(0)); try { $res = $elementInstance->generateRevisionBox($this, $cmsPage->getID()); } catch (PHPException $e) { return $this->generateResponse(500, '<p><b>PHP Error:</b> ' . $e->getMessage() . ' in ' . $e->getFile() . ' (Line: ' . $e->getLine() . ')</p><pre>' . $e->getTraceAsString() . '</pre>'); } catch (\Exception $e) { return $this->generateResponse(500, '<p>' . $e->getMessage() . '</p>'); } return $this->generateResponse(200, $res); }
public function index() { $oldReqUri = $_SERVER['REQUEST_URI']; $_SERVER['REQUEST_URI'] = ''; $pageModel = new PageModel($this->indexer->getDB()); $elementModel = new ElementModel($this->indexer->getDB()); $searchModel = new SearchModel($this->indexer->getDB()); $stmntPages = $this->indexer->getDB()->prepare("\n\t\t\tSELECT p.ID, p.language_codeFK lang, p.title, p.description, r.pattern, p.role\n\t\t\tFROM page p\n\t\t\tLEFT JOIN route r ON r.page_IDFK = p.ID\n\t\t\tWHERE r.ID IS NOT NULL\n\t\t"); $resPages = $this->indexer->getDB()->select($stmntPages); $indexedPages = 0; foreach ($resPages as $p) { if ($p->role !== 'page') { echo " Skipped page #" . $p->ID . ": reason -> unusable role: " . $p->role . PHP_EOL; continue; } $searchIndexInterface = $this->indexer->getIndex($p->lang); // Index page echo " Indexing page #" . $p->ID . " into index \"" . $p->lang . "\": "; $cmsPage = $pageModel->getPageByID($p->ID); $elementTree = $elementModel->getElementTree($cmsPage); try { $searchableContent = $this->renderElementTreeRecursive($elementTree, $cmsPage->getLanguage()); } catch (\Exception $e) { echo " Error -> " . $e->getMessage() . "\n"; continue; } $searchDoc = new Document(); $searchDoc->setInternalID($p->ID); $searchDoc->setLanguage($p->lang); $searchDoc->setTitle($p->title); $searchDoc->setDescription($searchableContent); $searchDoc->setPath($p->pattern); $searchDoc->setType('core_page'); $docID = $searchModel->saveDocument($searchDoc); $luceneDocument = new \ZendSearch\Lucene\Document(); $luceneDocument->addField(Field::keyword('ID', $docID)); $luceneDocument->addField(Field::unStored('content', $searchableContent)); $luceneDocument->addField(Field::unStored('description', $p->description)); $searchIndexInterface->addDocument($luceneDocument); echo "done"; echo "\n"; ++$indexedPages; } $_SERVER['REQUEST_URI'] = $oldReqUri; echo " Total indexed pages: " . $indexedPages . "\n"; }
/** * Renders the current frontend page into the basic frontend template.html file and adds some useful data to the * template (e.x. logged in user if there is any, site title, etc.) * * @param PageModel $pageModel * * @return HttpResponse The rendered CMS page ready to send it to the client * @throws HttpException if the page does not exist or is not accessible for the current user */ protected function generateCMSPage(PageModel $pageModel) { if ($this->cmsPage === null) { $this->eventDispatcher->dispatch('cms.page_not_found', new PageNotFoundEvent($this->httpRequest)); throw new HttpException('Could not find cms page', 404); } if (!$pageModel->hasUserReadAccess($this->cmsPage, $this->auth)) { $this->eventDispatcher->dispatch('cms.page_access_denied', new PageAccessDeniedEvent($this->httpRequest)); throw new HttpException('You don\'t have access to this page', 403); } $currentEnv = $this->core->getCurrentDomain()->environment; $lastChanged = new \DateTime($this->cmsPage->getLastModified()); $cacheDuration = 18000; //31536000; <-- a year $responseHeaders = array('Content-Type' => 'text/html; charset=utf-8', 'Content-Language' => $this->cmsPage->getLanguage(), 'Cache-Control' => 'No-Cache', 'Last-Modified' => null, 'Vary' => 'Accept-Encoding'); // Don't cache if a module controls page content /*if($this->cmsRoute->getModuleID() === null) $responseHeaders['Last-Modified'] = gmdate('D, d M Y H:i:s \G\M\T', $lastChanged->getTimestamp());*/ /*if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $this->cmsPage->getLastModified() <= date('Y-m-d H:i:s', strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))) return new HttpResponse(304, null, $responseHeaders);*/ $lang = $this->getLocaleHandler()->getLanguage(); // HTML Cache here! $pageCacheActive = isset($this->core->getSettings()->cms->{$currentEnv}->page_cache) ? $this->core->getSettings()->cms->{$currentEnv}->page_cache : false; $pageCacheMode = $this->cmsPage->getCacheMode(); $cacheDir = $this->core->getSiteCacheDir() . 'html' . DIRECTORY_SEPARATOR; $pageCacheFile = $cacheDir . 'page-' . $this->cmsPage->getID() . '.html'; if ($pageCacheActive === true && $this->auth->isLoggedIn() === false && in_array($pageCacheMode, array(CmsPage::CACHE_MODE_PRIVATE, CmsPage::CACHE_MODE_PUBLIC)) && stream_resolve_include_path($pageCacheFile)) { $fileTime = filemtime($pageCacheFile); // TODO: check if a parent page has changed not only the current if ($this->cmsPage->getLastModified() === null || $fileTime >= $lastChanged->getTimestamp()) { if ($currentEnv === 'dev') { echo 'Cached page found from: ' . date('d.m.Y H:i:s', $fileTime); } return new HttpResponse(200, $pageCacheFile, $responseHeaders, true); } } $pageElementCache = isset($this->core->getSettings()->cms->{$currentEnv}) && $this->core->getSettings()->cms->{$currentEnv}->page_cache === true; $elementModel = new ElementModel($this->db); $elements = $elementModel->getElementTree($this->cmsPage, $pageElementCache); if ($this->cmsPage->getLayoutID() !== null && $elements->offsetExists($this->cmsPage->getLayoutID())) { $this->cmsPage->setLayout($elements->offsetGet($this->cmsPage->getLayoutID())); } $elementView = new CmsView($this->templateEngine, $this->core->getSiteRoot() . 'templates' . DIRECTORY_SEPARATOR . $this->currentDomain->template . DIRECTORY_SEPARATOR . 'elements' . DIRECTORY_SEPARATOR); // Last modified $dtLastModified = new \DateTime($this->cmsPage->getLastModified()); $dtCreated = new \DateTime($this->cmsPage->getCreated()); $pageHtml = $this->cmsPage->render($this, $elementView); /*$dtLastModifiedRender = new \DateTime($this->cmsPage->getLastModified()); $responseHeaders['Last-Modified'] = gmdate('D, d M Y H:i:s \G\M\T', $dtLastModifiedRender->getTimestamp());*/ $tplVars = array('siteTitle' => $this->cmsPage->getTitle(), 'meta_description' => $this->cmsPage->getDescription(), 'page_id' => $this->cmsPage->getID(), 'page_html' => $pageHtml, 'modifier_name' => $this->cmsPage->getModifierName(), 'creator_name' => $this->cmsPage->getCreatorName(), 'date_modified' => $dtLastModified->format($this->getLocaleHandler()->getDateTimeFormat()), 'date_created' => $dtCreated->format($this->getLocaleHandler()->getDateTimeFormat()), 'logged_in' => $this->auth->isLoggedIn(), 'cms_page' => true, 'area_head' => $this->generateAreaHead($this->cmsPage), 'area_body' => $this->generateAreaBody($this->cmsPage), 'current_uri' => urlencode($this->httpRequest->getURI())); if ($this->auth->isLoggedIn()) { $stmntElements = $this->db->prepare("SELECT ID, name, class FROM cms_element_available WHERE active = '1' ORDER BY name"); $resElements = $this->db->select($stmntElements); $elementList = array(); foreach ($resElements as $mod) { $mod->author = null; $mod->version = null; $mod->description = null; $settingsFile = $this->core->getSiteRoot() . 'settings' . DIRECTORY_SEPARATOR . 'elements' . DIRECTORY_SEPARATOR . $mod->name . '.config.json'; if (stream_resolve_include_path($settingsFile) === false) { $elementList[] = $mod; continue; } try { $jsonObj = JsonUtils::decodeFile($settingsFile); if (isset($jsonObj->name) === true) { $mod->name = isset($jsonObj->name->{$lang}) ? $jsonObj->name->{$lang} : $jsonObj->name->en; } if (isset($jsonObj->description) === true) { $mod->description = isset($jsonObj->description->{$lang}) ? $jsonObj->description->{$lang} : $jsonObj->description->en; } } catch (\Exception $e) { $this->logger->error('Could not parse config file of element: ' . $mod->name, $e); } $elementList[] = $mod; } usort($elementList, function ($a, $b) { return strtolower($a->name) > strtolower($b->name); }); $tplVars['elements'] = $elementList; } $html = $this->renderBasicTemplate('template.html', $tplVars); if ($pageCacheActive === true && $this->auth->isLoggedIn() === false && in_array($pageCacheMode, array(CmsPage::CACHE_MODE_PRIVATE, CmsPage::CACHE_MODE_PUBLIC))) { file_put_contents($pageCacheFile, $html); } $httpStatusCode = $this->cmsPage->getErrorCode() !== null ? $this->cmsPage->getErrorCode() : 200; return new HttpResponse($httpStatusCode, $html, $responseHeaders); }
/** * @return HttpResponse * @throws CMSException if element can not be found * @throws \Exception * @throws HttpException */ public function deleteModuleAjax() { list($elementType, $elementID, $pageID) = explode('-', $this->httpRequest->getVar('module')); $referrerPath = StringUtils::beforeFirst($this->httpRequest->getVar('referrer', 'strip_tags'), '?'); $html = null; /** @var HttpRequest $httpRequestFrontend */ $httpRequestFrontend = clone $this->httpRequest; $httpRequestFrontend->setPath($referrerPath); $httpRequestFrontend->setRequestMethod('GET'); $matchedRoutes = RouteUtils::matchRoutesAgainstPath($this->core->getSettings()->core->routes, $httpRequestFrontend); $matchedRoute = current($matchedRoutes); $frontendController = new FrontendController($this->core, $httpRequestFrontend, $matchedRoute); // Check if you use the site in preview mode or real if ($matchedRoute->id == 'cms-site-preview') { preg_match($matchedRoute->pattern, $referrerPath, $res); $frontendController->getRoute()->setParams(array(0 => $res[1])); $frontendController->deliverPreviewCMSPage(); } else { $frontendController->deliverCMSPage(); } $cmsPage = $this->pageModel->getPageByID($pageID); $frontendController->setCmsPage($cmsPage); $elementModel = new ElementModel($this->db); $pageElements = $elementModel->getElementTree($cmsPage); $elementToDeleteInstance = $elementModel->findElementIDInTree($pageElements, $elementID); if ($elementToDeleteInstance === null) { throw new CMSException('Could not find module to delete: #' . $elementID); } $parentElement = $elementToDeleteInstance->getParentElement(); try { // Delete element $this->db->beginTransaction($elementToDeleteInstance->getIdentifier() . '.' . $elementToDeleteInstance->getID() . '-' . $elementToDeleteInstance->getPageID() . '.' . date('YmdHis') . '.delete'); $elementToDeleteInstance->remove($this->db); if ($parentElement instanceof LayoutElement) { $parentElement->removedChildElement($this->db, $elementToDeleteInstance, $pageID); } $this->updatePage($cmsPage); // Reload page elements $pageElements = $elementModel->getElementTree($cmsPage); $parentElement = $elementModel->findElementIDInTree($pageElements, $parentElement->getID()); // Render new parent element $html = $parentElement->render($frontendController, $this->moduleView); $this->db->commit(); } catch (\Exception $e) { $this->db->rollBack(); $this->logger->error('Could not delete module', $e); return new HttpResponse(500, 'Could not delete module: ' . $e->getMessage(), array('Content-Type' => 'text/html; charset=utf-8', 'Content-Language' => $this->getLocaleHandler()->getLanguage())); } return new HttpResponse(200, $html, array('Content-Type' => 'text/html; charset=utf-8', 'Content-Language' => $this->getLocaleHandler()->getLanguage())); }
public function getPageDetails($params) { $pageID = (int) $params[0]; $cmsPage = $this->pageModel->getPageByID($pageID); if ($cmsPage === null) { throw new HttpException('Could not find page', 404); } $moduleModel = new ElementModel($this->cmsController->getDB()); $coreModel = new CoreModel($this->cmsController->getDB()); //$modules = $moduleModel->getModulesByPage($pageData); $elements = $moduleModel->getElementTree($cmsPage); $rights = array(); foreach ($cmsPage->getRights() as $r) { $rightEntry = new \stdClass(); $rightEntry->ID = $r->ID; $rightEntry->group_name = $r->groupname; $rightEntry->rights = CmsUtils::getRightsAsString($r->rights); $rightEntry->inherited_page = $r->inherted_page == $pageID ? null : '<a href="/backend/page/' . $r->inherted_page . '">Page #' . $r->inherted_page . '</a>'; $dtStart = new \DateTime($r->start_date); $dtFormat = $this->cmsController->getLocaleHandler()->getDateTimeFormat(); $rightEntry->duration = $r->end_date === null ? 'since ' . $dtStart->format($dtFormat) : $dtStart->format($dtFormat) . ' - ' . $r->end_date; $rights[] = $rightEntry; } $sqlQueryStr = "SELECT r.ID, r.pattern, m.ID mod_ID, m.name mod_name, r.robots, r.ssl_forbidden, r.ssl_required\n\t\t\tFROM route r\n\t\t\tLEFT JOIN cms_mod_available m ON m.ID = r.mod_IDFK\n\t\t\tWHERE page_IDFK = ?\n\t\t"; $trRoutes = new TableRenderer('route', $this->cmsController->getDB(), $sqlQueryStr); $trRoutes->setColumns(array(new Column('ID', 'ID'), new Column('pattern', 'Path', array(new LinkColumnDecorator())), new Column('mod_name', 'Module', array(new EmptyValueColumnDecorator('<em>none</em>'), new RewriteColumnDecorator('<a href="/backend/module/{mod_name}">{mod_name}</a>'))), new Column('robots', 'Robots', array(new EmptyValueColumnDecorator('<em>default</em>'))), new Column(null, 'SSL', array(new CallbackColumnDecorator(function ($value, $record, $selector, $tableRenderer) { $sslAttrs = array(); if ($record->ssl_forbidden + $record->ssl_required == 0) { return 'user\'s choice'; } if ($record->ssl_forbidden == 1) { $sslAttrs[] = 'forbidden'; } if ($record->ssl_required == 1) { $sslAttrs[] = 'required'; } return implode(' / ', $sslAttrs); }))))); $trRoutes->setOptions(array('edit' => '/backend/route/{ID}/edit', 'delete' => '/backend/route/{ID}/delete')); $pageInfo = array(); $pageInfo['ID'] = $pageID; $pageInfo['Title'] = $cmsPage->getTitle(); if ($cmsPage->getDescription() !== null) { $pageInfo['Description'] = $cmsPage->getDescription(); } if (($pagePathAsHtmlStr = $this->getPagePathAsHtmlStr($this->pageModel->getPagePath($pageID))) !== null) { $pageInfo['Page inheritance'] = $pagePathAsHtmlStr; } $roles = $this->getRoleOptions(); $pageInfo['Role'] = isset($roles[$cmsPage->getRole()]) ? $roles[$cmsPage->getRole()] : $cmsPage->getRole(); $languages = $coreModel->getLanguages(); $pageInfo['Language'] = isset($languages[$cmsPage->getLanguage()]) ? $languages[$cmsPage->getLanguage()] : $cmsPage->getLanguage(); $pageInfo['Inherit rights'] = $cmsPage->getInheritRights() == 1 ? 'yes' : 'no'; $dtCreated = new \DateTime($cmsPage->getCreated()); $pageInfo['Created'] = $dtCreated->format($this->cmsController->getLocaleHandler()->getDateTimeFormat()) . ' by <a href="/backend/account/' . $cmsPage->getCreatorID() . '">' . $cmsPage->getCreatorName() . '</a>'; if ($cmsPage->getLastModified() !== null) { $dtLastModified = new \DateTime($cmsPage->getCreated()); $pageInfo['Last modified'] = $dtLastModified->format($this->cmsController->getLocaleHandler()->getDateTimeFormat()) . ' by <a href="/backend/account/' . $cmsPage->getModifierID() . '">' . $cmsPage->getModifierName() . '</a>'; } $tplVars = array('siteTitle' => 'Page "' . $cmsPage->getTitle() . '"', 'base_link' => $this->baseLink, 'page' => $cmsPage, 'page_info' => $pageInfo, 'rights' => $rights, 'elements_list' => $this->generateElementList($elements, $cmsPage->getID()), 'routes' => $trRoutes->display(array($pageID))); return $this->renderModuleContent('mod-pages-page-details', $tplVars); }