/**
  * @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);
 }
示例#4
0
 /**
  * @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);
 }