openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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(' &raquo; ', $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(' &raquo; ', $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 }