File modules/cms/action/pageelement/PageelementAllAction.class.php
Last commit: Wed Oct 14 01:46:43 2026 +0200 Jan Dankert PHP 8: Fix: Method signature must match the interface.
1 <?php 2 namespace cms\action\pageelement; 3 4 use cms\action\Method; 5 use cms\action\PageelementAction; 6 use cms\action\ValueMapping; 7 use cms\api\Values; 8 use cms\base\Language as L; 9 use cms\generator\PageContext; 10 use cms\generator\PageGenerator; 11 use cms\generator\Producer; 12 use cms\generator\Publisher; 13 use cms\generator\PublishOrder; 14 use cms\model\BaseObject; 15 use cms\model\Content; 16 use cms\model\Element; 17 use cms\model\Folder; 18 use cms\model\Language; 19 use cms\model\PageContent; 20 use cms\model\Permission; 21 use cms\model\Project; 22 use cms\model\Value; 23 use http\Exception\InvalidArgumentException; 24 use language\Messages; 25 use logger\Logger; 26 use util\exception\ClientException; 27 use util\exception\SecurityException; 28 use util\Session; 29 use util\Text; 30 31 32 /** 33 * Edit values for all languages. 34 */ 35 class PageelementAllAction extends PageelementAction implements Method { 36 37 use ValueMapping; 38 39 public function getRequiredPermission(): int { 40 return Permission::ACL_WRITE; 41 } 42 43 44 public function view() 45 { 46 $elements = []; 47 48 foreach( $this->getLanguageIds() as $languageId ) { 49 50 $language = new Language($languageId); 51 $language->load(); 52 53 $this->setTemplateVar('value_time',time() ); 54 $this->setTemplateVar('writable' ,$this->page->hasRight( Permission::ACL_WRITE ) ); 55 56 $element = $this->element; 57 $element->load(); 58 59 $pageContent = new PageContent(); 60 $pageContent->elementId = $element->elementid; 61 $pageContent->pageId = $this->page->pageid; 62 $pageContent->languageid = $languageId; 63 $pageContent->load(); 64 65 if ( $pageContent->isPersistent() ) { 66 $value = new Value(); 67 $value->contentid = $pageContent->contentId; 68 $value->load(); 69 } 70 else { 71 // There is no content yet, so creating an empty value. 72 $value = new Value(); 73 } 74 75 $output = []; 76 $output += $element->getProperties(); 77 $output += $value->getProperties(); 78 $output['label'] = $language->getName(); 79 $output['languageid'] = $language->languageid; 80 81 $output['items'] = $element->getSelectItems(); 82 83 $output += $this->outputValue($element,$value); 84 85 $output[ 'name' ] = $language->isoCode; 86 //$this->setTemplateVar( $language->getId(), $content ); 87 88 $elements[ $language->getId() ] = $output; 89 } 90 91 if ($this->page->hasRight(Permission::ACL_RELEASE)) 92 $this->setTemplateVar('release', true); 93 if ($this->page->hasRight(Permission::ACL_PUBLISH)) 94 $this->setTemplateVar('publish', false); 95 96 $this->setTemplateVar('elements', $elements ); 97 } 98 99 100 101 public function post() 102 { 103 /** @var Values $values */ 104 $values = $this->request->toObject( Values::class ); 105 106 $element = $this->element; 107 $element->load(); 108 $log = []; 109 110 foreach( $this->getLanguageIds() as $languageid ) { 111 112 /** @var \cms\api\Value $uiValue */ 113 $uiValue = array_find( $values->values, function ($uiValue) use ($languageid) { 114 return ($uiValue->languageId == $languageid ); 115 } ); 116 117 if ( !$uiValue ) 118 continue; // Element not found in Request. 119 120 $language = new Language($languageid); 121 $language->load(); 122 123 if ( $uiValue->elementId != $element->elementid ) 124 throw new \InvalidArgumentException("elementid ".$uiValue->elementId." not valid for this page."); 125 126 $pageContent = new PageContent(); 127 $pageContent->elementId = $element->elementid; 128 $pageContent->pageId = $this->page->pageid; 129 $pageContent->languageid = $languageid; 130 $pageContent->load(); 131 $pageContent->persist(); // Create the content if it does not exist yet. 132 133 $value = new Value(); 134 $value->contentid = $pageContent->contentId; 135 136 $oldValue = clone $value; 137 $oldValue->load(); 138 $value->format = $oldValue->format; 139 140 $this->parseToValue( $element, $value, $uiValue->value ); 141 142 // Inhalt sofort freigegeben, wenn 143 // - Recht vorhanden 144 // - Freigabe gewuenscht 145 $value->publish = $this->page->hasRight(Permission::ACL_RELEASE) && $this->request->isTrue('release'); 146 147 // Up-To-Date-Check 148 $content = new Content( $pageContent->contentId ); 149 $lastChangeTime = $content->getLastChangeSinceByAnotherUser($this->request->getNumber('value_time'), $this->getCurrentUserId()); 150 if ($lastChangeTime) 151 $this->addWarningFor($value, Messages::CONCURRENT_VALUE_CHANGE, array('last_change_time' => date(L::lang('DATE_FORMAT'), $lastChangeTime))); 152 153 // Check if anything has changed 154 if ( $oldValue->text == $value->text && 155 $oldValue->linkToObjectId == $value->linkToObjectId && 156 $oldValue->format == $value->format && 157 $oldValue->number == $value->number && 158 $oldValue->date == $value->date && 159 !(!$oldValue->publish && $value->publish) 160 ) { 161 $log[] = str_pad($language->name,20).': Not changed'; 162 continue; // nothing has changed. 163 } 164 165 // Inhalt speichern 166 $value->persist(); 167 $log[] = str_pad($language->name,20).': Saved'; 168 169 // Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt 170 // fuer jede Sprache einzeln gespeichert. 171 if ($element->allLanguages) { 172 $project = new Project($this->page->projectid); 173 foreach ($project->getLanguageIds() as $languageid) { 174 if ($languageid != $pageContent->languageid) { 175 $otherPageContent = clone $pageContent; 176 $otherPageContent->languageid = $languageid; 177 $otherPageContent->contentId = null; 178 $otherPageContent->load(); 179 if (!$otherPageContent->contentId) 180 $otherPageContent->persist(); // create pagecontent if it does not exist. 181 182 $otherValue = clone $value; 183 $otherValue->contentid = $otherPageContent->contentId; 184 $otherValue->persist(); 185 } 186 } 187 } 188 } 189 190 // Falls ausgewaehlt die Seite sofort veroeffentlichen 191 if ($this->page->hasRight(Permission::ACL_PUBLISH) && $this->request->isTrue('publish')) { 192 $this->publishPage( $languageid ); 193 $log[] = 'published page: '.$this->page->getName(); 194 } 195 196 $this->page->setTimestamp(); // "Letzte Aenderung" setzen 197 198 $this->addNoticeFor($this->page, Messages::SAVED,[],$log); 199 } 200 201 /** 202 * @return int[] 203 */ 204 protected function getLanguageIds() 205 { 206 return $this->page->getProject()->getLanguageIds(); 207 } 208 209 }
Downloadmodules/cms/action/pageelement/PageelementAllAction.class.php
History Wed, 14 Oct 2026 01:46:43 +0200 Jan Dankert PHP 8: Fix: Method signature must match the interface. 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; Wed, 17 Apr 2024 00:34:07 +0200 Jan Dankert New: Inputfields for coordinates; coordinates are stored in the now 64bit-number-field of the value. Wed, 15 Feb 2023 00:22:28 +0100 Jan Dankert Fix: Changing the Longtext format was not possible. Mon, 27 Jun 2022 02:54:38 +0200 Jan Dankert Fix: Editing of dates was broken, do not know why the code was missing up to now... Mon, 27 Jun 2022 02:22:50 +0200 Jan Dankert Fix: Saving links in PageallAction and PageelementAllAction. Mon, 13 Jun 2022 22:40:05 +0200 Jan Dankert Fix: Edit texts in all-languages-mode was completely broken. Thu, 2 Jun 2022 01:04:54 +0200 Jan Dankert New: Element type "checkbox" Wed, 1 Jun 2022 01:05:34 +0200 Jan Dankert New: Element types for "coordinates" and "data" Wed, 1 Jun 2022 00:11:40 +0200 Jan Dankert New: DSL as a filter for number values Sun, 10 Apr 2022 12:10:24 +0200 dankert Fix: Pagecontent must be created if the value of a pageelement is stored for the first time. Fri, 11 Mar 2022 11:32:38 +0100 dankert New: Edit all languages for a page element.