File modules/cms/action/pageelement/PageelementValueAction.class.php

Last commit: Wed Oct 14 01:41:42 2026 +0200	Jan Dankert	Saving values with the new object-oriented ui objects.
1 <?php 2 namespace cms\action\pageelement; 3 use cms\action\Method; 4 use cms\action\PageelementAction; 5 use cms\action\ValueMapping; 6 use cms\api\Values; 7 use cms\base\Language as L; 8 use cms\base\Startup; 9 use cms\model\Content; 10 use cms\model\PageContent; 11 use cms\model\Permission; 12 use cms\model\Page; 13 use cms\model\Project; 14 use cms\model\Value; 15 use language\Messages; 16 use logger\Logger; 17 use util\exception\ClientException; 18 19 class PageelementValueAction extends PageelementAction implements Method { 20 21 use ValueMapping; 22 23 public function view() { 24 25 $this->element->load(); 26 $this->pageContent->load(); 27 28 $this->value->contentid = $this->pageContent->contentId; 29 30 $valueId =$this->request->getNumber('valueid'); 31 32 if ( $valueId ) { 33 $this->ensureValueIdIsInAnyContent( $valueId ); 34 35 $this->value->valueid = $valueId; 36 $this->value->loadWithId(); 37 } 38 else { 39 $this->value->load(); 40 } 41 42 $this->setTemplateVar('name' ,$this->element->name ); 43 $this->setTemplateVar('desc' ,$this->element->desc ); 44 $this->setTemplateVar('elementid' ,$this->element->elementid); 45 $this->setTemplateVar('languageid',$this->pageContent->languageid ); 46 $this->setTemplateVar('type' ,$this->element->getTypeName() ); 47 $this->setTemplateVar('value_time',Startup::getStartTime() ); 48 49 $this->setTemplateVar( 'objectid' ,$this->page->objectid ); 50 51 if ( $this->page->hasRight(Permission::ACL_RELEASE) ) 52 $this->setTemplateVar( 'release',true ); 53 54 if ( $this->page->hasRight(Permission::ACL_PUBLISH) ) 55 $this->setTemplateVar( 'publish',false ); 56 57 $output = $this->outputValue( $this->element,$this->value ); 58 $this->setTemplateVars( $output ); 59 60 /* 61 $methodName = 'edit'.ucfirst($this->element->getTypeName()); 62 63 if ( ! method_exists($this,$methodName) ) 64 throw new \LogicException('Method does not exist: PageElementAction#'.$methodName ); 65 66 $this->$methodName(); // Call method "edit<Elementtyp>()". 67 */ 68 } 69 70 71 public function post() { 72 73 Logger::debug( print_r($this->request->getRawParameters(),true) ); 74 $this->element->load(); 75 76 /** @var Values $values */ 77 $values = $this->request->toObject( Values::class ); 78 79 if ( sizeof($values->values) != 1 ) 80 throw new ClientException("there must be exactly one value"); 81 82 /** @var \cms\api\Value $value */ 83 $uiValue = $values->values[0]; 84 85 if ( $uiValue->elementId != $this->elementid ) 86 throw new ClientException("Invalid element id"); 87 88 $project = $this->page->getProject(); 89 90 if ( ! array_any( $project->getLanguageIds(), function($id) use ($uiValue) { 91 return ( $id == $uiValue->languageId ); 92 })) 93 throw new ClientException("Invalid language id ".$uiValue->languageId.", not found in project " . $project->__toString()); 94 95 $log = []; 96 $type = $this->element->getTypeName(); 97 98 $value = new Value(); 99 $value->contentid = $this->pageContent->contentId; 100 $value->load(); 101 102 $oldValue = clone $value; 103 104 $this->parseToValue( $this->element,$value,$uiValue->value ); 105 106 // Inhalt sofort freigegeben, wenn 107 // - Recht vorhanden 108 // - Freigabe gewuenscht 109 $value->publish = $this->page->hasRight(Permission::ACL_RELEASE) && $this->request->isTrue('release'); 110 $value->format = $this->request->getNumber('format'); 111 112 // Up-To-Date-Check 113 $content = new Content( $this->pageContent->contentId ); 114 $lastChangeTime = $content->getLastChangeSinceByAnotherUser($this->request->getNumber('value_time'), $this->getCurrentUserId()); 115 if ($lastChangeTime) 116 $this->addWarningFor($value, Messages::CONCURRENT_VALUE_CHANGE, array('last_change_time' => date(L::lang('DATE_FORMAT'), $lastChangeTime))); 117 118 // Check if anything has changed 119 if ( $oldValue->text == $value->text && 120 $oldValue->linkToObjectId == $value->linkToObjectId && 121 $oldValue->format == $value->format && 122 $oldValue->number == $value->number && 123 $oldValue->date == $value->date && 124 !(!$oldValue->publish && $value->publish) 125 ) { 126 $log[] = 'Status: Unchanged'; 127 } else { 128 129 // Inhalt speichern 130 $value->persist(); 131 $log[] = 'Status: Saved '."\u{2713}"; 132 133 // Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt 134 // fuer jede Sprache einzeln gespeichert. 135 if ($this->element->allLanguages) { 136 $project = new Project($this->page->projectid); 137 foreach ($project->getLanguageIds() as $languageid) { 138 if ($languageid != $this->pageContent->languageid) { 139 $otherPageContent = clone $this->pageContent; 140 $otherPageContent->languageid = $languageid; 141 $otherPageContent->contentId = null; 142 $otherPageContent->load(); 143 if (!$otherPageContent->contentId) 144 $otherPageContent->persist(); // create pagecontent if it does not exist. 145 146 $otherValue = clone $value; 147 $otherValue->contentid = $otherPageContent->contentId; 148 $otherValue->persist(); 149 } 150 } 151 } 152 } 153 154 155 156 $this->page->setTimestamp(); // "Letzte Aenderung" setzen 157 158 // Falls ausgewaehlt die Seite sofort veroeffentlichen 159 if ( $this->page->hasRight( Permission::ACL_PUBLISH ) && $this->request->isTrue('publish') ) 160 { 161 $this->publishPage(); 162 $log[] = 'Published page "'.$this->page->getName().'".'; 163 } 164 165 $this->addNoticeFor( $this->page, Messages::SAVED,[],$log); 166 167 /** 168 $methodName = 'save'.ucfirst($type); 169 170 if ( !method_exists($this,$methodName)) 171 throw new \InvalidArgumentException('Method not available: '.$methodName); 172 173 $this->$methodName(); // Call method "save<ElementType>()" 174 * */ 175 } 176 }
Download modules/cms/action/pageelement/PageelementValueAction.class.php
History Wed, 14 Oct 2026 01:41:42 +0200 Jan Dankert Saving values with the new object-oriented ui objects. Tue, 14 Jan 2025 01:57:22 +0100 Jan Dankert New: Some new template element types like 'url','email','range','password','date','time', ...; New: datalists for input fields; Refactoring: Cleaner templates and actions for editing values; Sat, 4 Dec 2021 00:18:39 +0100 dankert Some security enhancements. Sat, 27 Nov 2021 23:31:32 +0100 Jan Dankert Fix: Saving values for unauthenticated users. Sat, 27 Nov 2021 01:52:24 +0100 Jan Dankert New: Releasing and Restoring for file and template values. Tue, 9 Nov 2021 00:35:42 +0100 Jan Dankert Fixes: Reading and writing template sources with the new content table. Sat, 6 Mar 2021 03:42:38 +0100 Jan Dankert New: Better permission checks. Fri, 26 Feb 2021 01:06:01 +0100 Jan Dankert Refactoring accessing the request parameter values. Thu, 25 Feb 2021 01:22:10 +0100 Jan Dankert New: Edit all page elements in 1 view. Mon, 4 Jan 2021 19:03:18 +0100 Jan Dankert Refactoring: ACL class is renamed to Permission, because most RBAC/DMAC concepts are calling it a permission. Tue, 17 Nov 2020 23:51:00 +0100 Jan Dankert Refactoring: Every Actionmethod has now its own class.