/** * Reloads settings for a given element * @param CmsElement $cmsElement The element which settings should be reloaded * @param CmsPage $cmsPage The CmsPage in which context the settings for the element should be loaded */ public function reloadSettings(CmsElement $cmsElement, CmsPage $cmsPage) { if ($cmsElement instanceof CmsElementSettingsLoadable === false) { return; } /** @var CmsElementSettingsLoadable $cmsElement */ $cmsElement->resetSettingsFound(); /** @var CmsElementSettingsLoadable $cmsElement */ $settings = $cmsElement->getSettingsForElements($this->db, array($cmsElement->getID()), PageModel::getPageIdsRecursive($cmsPage)); foreach ($settings as $settingEntries) { /** @var CmsElement */ $settingsEntry = $this->combineSettings($settingEntries); $cmsElement->setSettings($settingsEntry); } }
/** * @param CmsPage $cmsPage * @param bool $useCache * @return \ArrayObject The element tree for the current page */ private function generateElementTree(CmsPage $cmsPage, $useCache = false) { // TODO check if any page inheriting from has changed $pageIDs = PageModel::getPageIdsRecursive($cmsPage); /*if($useCache === true) { $stmntFetchCache = $this->db->prepare(" SELECT pc.ID, pc.cached_elements, pc.cache_time FROM page_cache pc LEFT JOIN page p ON p.ID = pc.ID WHERE pc.cache_time >= p.last_modified AND pc.ID IN(" . DB::createInQuery($pageIDs) . ") "); $resFetchCache = $this->db->select($stmntFetchCache, $pageIDs ); if(count($resFetchCache) === count($pageIDs)) { foreach($resFetchCache as $fc) { if($fc->ID != $cmsPage->getID()) continue; return unserialize($fc->cached_elements); } } }*/ /*$stmntElements = $this->db->prepare(" SELECT ei.ID, ei.mod_IDFK element_ID, ei.page_IDFK page_ID, parent_mod_IDFK parent_element_ID, ea.class, ea.name, ei.revision, IF(ih.element_instance_IDFK IS NULL, 0, 1) hidden FROM cms_element_instance ei LEFT JOIN cms_element_available ea ON ea.ID = ei.mod_IDFK LEFT JOIN cms_element_instance_hidden ih ON ih.element_instance_IDFK = ei.ID AND ih.page_IDFK = ? WHERE ei.page_IDFK IN (" . DB::createInQuery($pageIDs) . ") AND ea.active = 1 "); $resElements = $this->db->select($stmntElements, array_merge(array($cmsPage->getID()), $pageIDs) );*/ $stmntElements = $this->db->prepare("\n\t\t\tSELECT ei.ID, ei.mod_IDFK element_ID, ei.page_IDFK page_ID, parent_mod_IDFK parent_element_ID, ea.class, ea.name, ei.revision,\n\t\t\tIF(ih.element_instance_IDFK IS NULL, 0, 1) hidden\n\t\t\tFROM cms_element_instance ei\n\t\t\tLEFT JOIN cms_element_available ea ON ea.ID = ei.mod_IDFK\n\t\t\tLEFT JOIN cms_element_instance_hidden ih ON ih.element_instance_IDFK = ei.ID AND ih.page_IDFK IN (" . DB::createInQuery($pageIDs) . ")\n\t\t\tWHERE ei.page_IDFK IN (" . DB::createInQuery($pageIDs) . ")\n\t\t\tAND ea.active = 1\n\t\t"); $resElements = $this->db->select($stmntElements, array_merge($pageIDs, $pageIDs)); // Settings und co $elementTypes = array(); $elementInstances = array(); foreach ($resElements as $e) { /** @var CmsElement $elementInstance */ $elementInstance = new $e->class($e->ID, $e->page_ID, $e->name); if ($e->revision !== null) { $elementInstance->setRevision($e->revision); } $elementInstance->setHidden($e->hidden == 1); $elementInstances[$e->ID] = $elementInstance; $elementTypes[$e->class][] = $e->ID; } // Load settings for modules foreach ($elementTypes as $class => $modIDs) { $refClass = new \ReflectionClass($class); if ($refClass->isSubclassOf('ch\\metanet\\cms\\common\\CmsElementSettingsLoadable') === false) { continue; } /** @var CmsElementSettingsLoadable $class */ $settings = $class::getSettingsForElements($this->db, $modIDs, $pageIDs); foreach ($settings as $key => $settingEntries) { $settingsEntry = $this->combineSettings($settingEntries); $elementInstances[$key]->setSettings($settingsEntry); } } $cachedTree = new \ArrayObject($this->createTree($resElements, $elementInstances)); if ($useCache === true) { $cachedTreeSerialized = serialize($cachedTree); try { $stmntCacheElements = $this->db->prepare("\n\t\t\t\t\tINSERT INTO page_cache SET\n\t\t\t\t\t\tID = ?, cached_elements = ?, cache_time = NOW()\n\t\t\t\t\tON DUPLICATE KEY UPDATE\n\t\t\t\t\t\tcached_elements = ?, cache_time = NOW()\n\t\t\t\t"); $this->db->insert($stmntCacheElements, array($cmsPage->getID(), $cachedTreeSerialized, $cachedTreeSerialized)); } catch (\Exception $e) { // Cache could not be saved } } return $cachedTree; }