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(' » ', $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 ($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 }