PageAllAction.class.php (11526B)
1 <?php 2 namespace cms\action\page; 3 4 use cms\action\Method; 5 use cms\action\PageAction; 6 use cms\base\Language as L; 7 use cms\generator\PageContext; 8 use cms\generator\PageGenerator; 9 use cms\generator\Producer; 10 use cms\generator\Publisher; 11 use cms\generator\PublishOrder; 12 use cms\model\BaseObject; 13 use cms\model\Content; 14 use cms\model\Element; 15 use cms\model\Folder; 16 use cms\model\Language; 17 use cms\model\Page; 18 use cms\model\PageContent; 19 use cms\model\Permission; 20 use cms\model\Project; 21 use cms\model\Value; 22 use language\Messages; 23 use util\exception\PublisherException; 24 use util\exception\SecurityException; 25 use util\exception\ValidationException; 26 use util\Session; 27 use util\Text; 28 29 class PageAllAction extends PageAction implements Method { 30 31 public function getRequiredPermission() { 32 return Permission::ACL_READ; 33 } 34 35 36 public function view() 37 { 38 $languageid = $this->request->getRequiredNumber('languageid'); 39 $language = new Language($languageid); 40 $language->load(); 41 42 $this->setTemplateVar('language_name', $language->getName()); 43 $this->setTemplateVar('languageid' , $language->languageid ); 44 45 $this->setTemplateVar('value_time',time() ); 46 $this->setTemplateVar('writable' ,$this->page->hasRight( Permission::ACL_WRITE ) ); 47 48 $elements = []; 49 50 /** @var Element $element */ 51 foreach ($this->getElements() as $element) { 52 53 $pageContent = new PageContent(); 54 $pageContent->elementId = $element->elementid; 55 $pageContent->pageId = $this->page->pageid; 56 $pageContent->languageid = $languageid; 57 $pageContent->load(); 58 59 if ( $pageContent->isPersistent() ) { 60 $value = new Value(); 61 $value->contentid = $pageContent->contentId; 62 $value->load(); 63 } 64 else { 65 // There is no content yet, so creating an empty value. 66 $value = new Value(); 67 } 68 69 $output = []; 70 $output += $element->getProperties(); 71 $output += $value->getProperties(); 72 73 $content = ''; 74 75 switch( $element->typeid) { 76 77 case Element::ELEMENT_TYPE_DATE: 78 $output['date']=date('Y-m-d',$value->date ); 79 $output['time']=date('H:i' ,$value->date ); 80 break; 81 82 case Element::ELEMENT_TYPE_LINK: 83 $project = new Project($this->page->projectid); 84 $output['rootfolderid'] = $project->getRootObjectId(); 85 86 // Ermitteln, welche Objekttypen verlinkt werden d�rfen. 87 $type = $element->subtype; 88 89 if (substr($type, 0, 5) == 'image') 90 $type = 'file'; 91 92 if (!in_array($type, array('file', 'page', 'link', 'folder'))) 93 $types = array('file', 'page', 'link'); // Fallback: Der Link kann auf Seiten,Dateien und Verknüpfungen zeigen 94 else 95 $types = array($type); // gewünschten Typ verwenden 96 97 $oid = $value->linkToObjectId; 98 $name = ''; 99 100 if ($oid) { 101 $o = new BaseObject($oid); 102 $o->load(); 103 $name = $o->filename; 104 } 105 106 $output['objects'] = array(); 107 $output['linkobjectid']= $oid; 108 $content = $oid; 109 $output['linkname']= $name; 110 111 $output['types'] = implode(',', $types); 112 113 break; 114 115 case Element::ELEMENT_TYPE_SELECT: 116 $output['items'] = $element->getSelectItems(); 117 $content = $value->text; 118 break; 119 120 case Element::ELEMENT_TYPE_INSERT: 121 // Auswahl ueber alle Elementtypen 122 $objects = array(); 123 //Änderung der möglichen Types 124 $types = array('file', 'page', 'link'); 125 $objects[0] = \cms\base\Language::lang('LIST_ENTRY_EMPTY'); // Wert "nicht ausgewählt" 126 127 $project = new Project($this->page->projectid); 128 $folder = new Folder($project->getRootObjectId()); 129 $folder->load(); 130 131 //Auch Dateien dazu 132 foreach ($project->getAllObjectIds($types) as $id) { 133 $f = new Folder($id); 134 $f->load(); 135 136 $objects[$id] = \cms\base\Language::lang($f->getType()) . ': '; 137 $objects[$id] .= implode(' » ', $f->parentObjectNames(false, true)); 138 } 139 140 foreach ($project->getAllFolders() as $id) { 141 $f = new Folder($id); 142 $f->load(); 143 144 $objects[$id] = \cms\base\Language::lang($f->getType()) . ': '; 145 $objects[$id] .= implode(' » ', $f->parentObjectNames(false, true)); 146 } 147 148 asort($objects); // Sortieren 149 150 $output['objects'] = $objects; 151 $content = $value->linkToObjectId; 152 153 break; 154 155 case Element::ELEMENT_TYPE_NUMBER: 156 $content = $value->number / pow(10, $element->decimals); 157 break; 158 159 case Element::ELEMENT_TYPE_CHECKBOX: 160 $content = $value->number; 161 break; 162 163 case Element::ELEMENT_TYPE_LONGTEXT: 164 if ($requestFormat = $this->request->getText('format')) 165 // Individual format from request. 166 $format = $requestFormat; 167 elseif ($value->format != null) 168 $format = $value->format; 169 else 170 // There is no saved value. Get the format from the template element. 171 $format = $element->format; 172 173 $output['format'] = $format; 174 $output['editor'] = Element::getAvailableFormats()[$format]; 175 176 $content = $this->linkifyOIDs($value->text); 177 break; 178 179 case Element::ELEMENT_TYPE_TEXT: 180 case Element::ELEMENT_TYPE_DATA: 181 case Element::ELEMENT_TYPE_COORD: 182 183 $content = $value->text; 184 break; 185 } 186 187 $output[ 'name' ] = $element->name; 188 $output[ 'value' ] = $content; 189 $this->setTemplateVar( $element->name, $content ); 190 191 $elements[ $element->elementid ] = $output; 192 } 193 194 if ($this->page->hasRight(Permission::ACL_RELEASE)) 195 $this->setTemplateVar('release', true); 196 if ($this->page->hasRight(Permission::ACL_PUBLISH)) 197 $this->setTemplateVar('publish', false); 198 199 $this->setTemplateVar('elements', $elements ); 200 } 201 202 203 204 public function post() 205 { 206 if ( !$this->page->hasRight( Permission::ACL_WRITE )) 207 throw new SecurityException(); 208 209 $languageid = $this->request->getRequiredNumber('languageid'); 210 $language = new Language($languageid); 211 $language->load(); 212 213 /** @var Element $element */ 214 foreach ($this->getElements() as $element) { 215 216 $pageContent = new PageContent(); 217 $pageContent->elementId = $element->elementid; 218 $pageContent->pageId = $this->page->pageid; 219 $pageContent->languageid = $languageid; 220 $pageContent->load(); 221 $pageContent->persist(); // Create if it does not exist yet. 222 223 $value = new Value(); 224 $value->contentid = $pageContent->contentId; 225 $oldValue = clone $value; 226 $oldValue->load(); 227 228 switch ($element->typeid) { 229 230 case Element::ELEMENT_TYPE_TEXT: 231 case Element::ELEMENT_TYPE_DATA: 232 case Element::ELEMENT_TYPE_COORD: 233 $value->text = $this->request->getText($element->name); 234 break; 235 case Element::ELEMENT_TYPE_LONGTEXT: 236 $value->text = $this->compactOIDs($this->request->getText($element->name)); 237 break; 238 239 case Element::ELEMENT_TYPE_DATE: 240 $value->date = strtotime($this->request->getText($element->name . '_date') . $this->request->getText($element->name . '_time')); 241 break; 242 243 case Element::ELEMENT_TYPE_SELECT: 244 $value->text = $this->request->getText($element->name); 245 break; 246 case Element::ELEMENT_TYPE_CHECKBOX: 247 $value->number = $this->request->getText($element->name)?1:0; 248 break; 249 case Element::ELEMENT_TYPE_LINK: 250 case Element::ELEMENT_TYPE_INSERT: 251 $value->linkToObjectId = $this->request->getNumber($element->name); 252 break; 253 254 case Element::ELEMENT_TYPE_NUMBER: 255 $value->number = $this->request->getText($element->name) * pow(10, $element->decimals); 256 break; 257 case Element::ELEMENT_TYPE_CHECKBOX: 258 $value->number = $this->request->getText($element->name) * pow(10, $element->decimals); 259 break; 260 default: 261 throw new \LogicException('Unknown element type: ' . $element->getTypeName()); 262 } 263 264 265 // Inhalt sofort freigegeben, wenn 266 // - Recht vorhanden 267 // - Freigabe gewuenscht 268 $value->publish = $this->page->hasRight(Permission::ACL_RELEASE) && $this->request->isTrue('release'); 269 270 // Up-To-Date-Check 271 $content = new Content( $pageContent->contentId ); 272 $lastChangeTime = $content->getLastChangeSinceByAnotherUser($this->request->getNumber('value_time'), $this->getCurrentUserId()); 273 if ($lastChangeTime) 274 $this->addWarningFor($value, Messages::CONCURRENT_VALUE_CHANGE, array('last_change_time' => date(L::lang('DATE_FORMAT'), $lastChangeTime))); 275 276 // Check if anything has changed 277 if ( $oldValue->text == $value->text && 278 $oldValue->linkToObjectId == $value->linkToObjectId && 279 $oldValue->format == $value->format && 280 $oldValue->number == $value->number && 281 $oldValue->date == $value->date && 282 !(!$oldValue->publish && $value->publish) 283 ) 284 continue; // nothing has changed. 285 286 // Inhalt speichern 287 $value->persist(); 288 289 // Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt 290 // fuer jede Sprache einzeln gespeichert. 291 if ($element->allLanguages) { 292 $project = new Project($this->page->projectid); 293 foreach ($project->getLanguageIds() as $languageid) { 294 if ($languageid != $pageContent->languageid) { 295 $otherPageContent = clone $pageContent; 296 $otherPageContent->languageid = $languageid; 297 $otherPageContent->contentId = null; 298 $otherPageContent->load(); 299 if (!$otherPageContent->contentId) 300 $otherPageContent->persist(); // create pagecontent if it does not exist. 301 302 $otherValue = clone $value; 303 $otherValue->contentid = $otherPageContent->contentId; 304 $otherValue->persist(); 305 } 306 } 307 } 308 } 309 310 // Falls ausgewaehlt die Seite sofort veroeffentlichen 311 if ($this->page->hasRight(Permission::ACL_PUBLISH) && $this->request->isTrue('publish')) { 312 $this->publishPage( $languageid ); 313 } 314 315 $this->page->setTimestamp(); // "Letzte Aenderung" setzen 316 317 $this->addNoticeFor($this->page, Messages::SAVED); 318 } 319 320 321 /** 322 * Gets all elements of the current page. 323 * 324 * @return array 325 */ 326 protected function getElements() { 327 328 return $this->page->getTemplate()->getWritableElements(); 329 } 330 331 332 protected function linkifyOIDs( $text ) 333 { 334 $pageContext = $this->createPageContext( Producer::SCHEME_PREVIEW ); 335 336 $linkFormat = $pageContext->getLinkScheme(); 337 338 foreach( Text::parseOID($text) as $oid=>$t ) 339 { 340 $url = $linkFormat->linkToObject($this->page, (new BaseObject($oid))->load() ); 341 foreach( $t as $match) 342 $text = str_replace($match,$url,$text); 343 } 344 345 return $text; 346 } 347 348 349 350 351 protected function compactOIDs( $text ) 352 { 353 foreach( Text::parseOID($text) as $oid=>$t ) 354 { 355 foreach( $t as $match) 356 $text = str_replace($match,'?__OID__'.$oid.'__',$text); 357 } 358 359 return $text; 360 } 361 362 363 364 protected function publishPage( $languageid ) { 365 366 $project = $this->page->getProject(); 367 368 // Nothing is written to the session from this point. so we should free the session. 369 Session::close(); 370 371 $publisher = new Publisher( $project->projectid ); 372 373 foreach( $project->getModelIds() as $modelId ) { 374 375 $pageContext = new PageContext( $this->page->objectid, Producer::SCHEME_PUBLIC ); 376 $pageContext->modelId = $modelId; 377 $pageContext->languageId = $languageid; 378 379 $pageGenerator = new PageGenerator( $pageContext ); 380 381 $publisher->addOrderForPublishing( new PublishOrder( $pageGenerator->getCache()->load()->getFilename(),$pageGenerator->getPublicFilename(), $this->page->lastchangeDate ) ); 382 } 383 384 try { 385 $publisher->publish(); 386 } catch( PublisherException $e ) { 387 $this->addErrorFor( $this->page,Messages::PUBLISHED_ERROR,[],$e->getMessage() ); 388 } 389 390 $this->page->setPublishedTimestamp(); 391 392 $this->addNoticeFor( $this->page,Messages::PUBLISHED,[], 393 implode("\n",$publisher->getDestinationFilenames() ) ); 394 395 } 396 }