openrat-cms

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

PageelementAllAction.class.php (9140B)


      1 <?php
      2 namespace cms\action\pageelement;
      3 
      4 use cms\action\Method;
      5 use cms\action\PageelementAction;
      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\PageContent;
     18 use cms\model\Permission;
     19 use cms\model\Project;
     20 use cms\model\Value;
     21 use language\Messages;
     22 use util\exception\SecurityException;
     23 use util\Session;
     24 use util\Text;
     25 
     26 
     27 /**
     28  * Edit values for all languages.
     29  */
     30 class PageelementAllAction extends PageelementAction implements Method {
     31 
     32 	public function getRequiredPermission() {
     33 		return Permission::ACL_WRITE;
     34 	}
     35 
     36 
     37 	public function view()
     38 	{
     39 		$elements = [];
     40 
     41 		foreach( $this->getLanguageIds() as $languageId ) {
     42 
     43 			$language = new Language($languageId);
     44 			$language->load();
     45 
     46 			$this->setTemplateVar('value_time',time() );
     47 			$this->setTemplateVar('writable'  ,$this->page->hasRight( Permission::ACL_WRITE ) );
     48 
     49 			$element = $this->element;
     50 			$element->load();
     51 
     52 			$pageContent = new PageContent();
     53 			$pageContent->elementId  = $element->elementid;
     54 			$pageContent->pageId     = $this->page->pageid;
     55 			$pageContent->languageid = $languageId;
     56 			$pageContent->load();
     57 
     58 			if   ( $pageContent->isPersistent() ) {
     59 				$value = new Value();
     60 				$value->contentid = $pageContent->contentId;
     61 				$value->load();
     62 			}
     63 			else {
     64 				// There is no content yet, so creating an empty value.
     65 				$value = new Value();
     66 			}
     67 
     68 			$output = [];
     69 			$output += $element->getProperties();
     70 			$output += $value->getProperties();
     71 			$output['label'] = $language->getName();
     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 ($requestedFormat = $this->request->getText('format'))
    165 						// Individual format from request.
    166 						$format = $requestedFormat;
    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'   ] = $language->isoCode;
    188 			$output[ 'value'  ] = $content;
    189 			//$this->setTemplateVar( $language->getId(), $content );
    190 
    191 			$elements[ $language->getId() ] = $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 		$element = $this->element;
    210 		$element->load();
    211 
    212 		foreach( $this->getLanguageIds() as $languageid ) {
    213 
    214 			$language = new Language($languageid);
    215 			$language->load();
    216 
    217 			$language = new Language($languageid);
    218 			$language->load();
    219 
    220 			$pageContent = new PageContent();
    221 			$pageContent->elementId = $element->elementid;
    222 			$pageContent->pageId = $this->page->pageid;
    223 			$pageContent->languageid = $languageid;
    224 			$pageContent->load();
    225 			$pageContent->persist(); // Create the content if it does not exist yet.
    226 
    227 			$value = new Value();
    228 			$value->contentid = $pageContent->contentId;
    229 
    230 			switch ($element->typeid) {
    231 
    232 				case Element::ELEMENT_TYPE_TEXT:
    233 				case Element::ELEMENT_TYPE_DATA:
    234 				case Element::ELEMENT_TYPE_COORD:
    235 					$value->text = $this->request->getText($language->isoCode);
    236 					break;
    237 				case Element::ELEMENT_TYPE_LONGTEXT:
    238 					$value->text = $this->compactOIDs($this->request->getText($language->isoCode));
    239 					break;
    240 
    241 				case Element::ELEMENT_TYPE_DATE:
    242 					$value->date = strtotime($this->request->getText($language->isoCode . '_date') . $this->request->getText($language->isoCode . '_time'));
    243 					break;
    244 
    245 				case Element::ELEMENT_TYPE_SELECT:
    246 					$value->text = $this->request->getText($language->isoCode);
    247 					break;
    248 				case Element::ELEMENT_TYPE_LINK:
    249 				case Element::ELEMENT_TYPE_INSERT:
    250 					$value->linkToObjectId = $this->request->getNumber($language->isoCode);
    251 					break;
    252 
    253 				case Element::ELEMENT_TYPE_NUMBER:
    254 					$value->number = $this->request->getText($language->isoCode) * pow(10, $element->decimals);
    255 					break;
    256 				case Element::ELEMENT_TYPE_CHECKBOX:
    257 					$value->number = $this->request->getText($language->isoCode)?1:0;
    258 					break;
    259 				default:
    260 					throw new \LogicException('Unknown element type: ' . $element->getTypeName());
    261 			}
    262 
    263 
    264 			// Inhalt sofort freigegeben, wenn
    265 			// - Recht vorhanden
    266 			// - Freigabe gewuenscht
    267 			$value->publish = $this->page->hasRight(Permission::ACL_RELEASE) && $this->request->isTrue('release');
    268 
    269 			// Up-To-Date-Check
    270 			$content = new Content( $pageContent->contentId );
    271 			$lastChangeTime = $content->getLastChangeSinceByAnotherUser($this->request->getNumber('value_time'), $this->getCurrentUserId());
    272 			if ($lastChangeTime)
    273 				$this->addWarningFor($value, Messages::CONCURRENT_VALUE_CHANGE, array('last_change_time' => date(L::lang('DATE_FORMAT'), $lastChangeTime)));
    274 
    275 			// Inhalt speichern
    276 			$value->persist();
    277 
    278 			// Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt
    279 			// fuer jede Sprache einzeln gespeichert.
    280 			if ($element->allLanguages) {
    281 				$project = new Project($this->page->projectid);
    282 				foreach ($project->getLanguageIds() as $languageid) {
    283 					if ($languageid != $pageContent->languageid) {
    284 						$otherPageContent = clone $pageContent;
    285 						$otherPageContent->languageid = $languageid;
    286 						$otherPageContent->contentId = null;
    287 						$otherPageContent->load();
    288 						if (!$otherPageContent->contentId)
    289 							$otherPageContent->persist(); // create pagecontent if it does not exist.
    290 
    291 						$otherValue = clone $value;
    292 						$otherValue->contentid = $otherPageContent->contentId;
    293 						$otherValue->persist();
    294 					}
    295 				}
    296 			}
    297 		}
    298 
    299 		// Falls ausgewaehlt die Seite sofort veroeffentlichen
    300 		if ($this->page->hasRight(Permission::ACL_PUBLISH) && $this->request->isTrue('publish')) {
    301 			$this->publishPage( $languageid );
    302 		}
    303 
    304 		$this->page->setTimestamp(); // "Letzte Aenderung" setzen
    305 
    306 		$this->addNoticeFor($this->page, Messages::SAVED);
    307 	}
    308 
    309 	/**
    310 	 * @return int[]
    311 	 */
    312 	protected function getLanguageIds()
    313 	{
    314 		return $this->page->getProject()->getLanguageIds();
    315 	}
    316 
    317 }