2 namespace wcf\data\page
;
3 use wcf\data\page\content\PageContent
;
4 use wcf\data\page\content\PageContentEditor
;
5 use wcf\data\AbstractDatabaseObjectAction
;
6 use wcf\data\ISearchAction
;
7 use wcf\data\IToggleAction
;
8 use wcf\system\exception\PermissionDeniedException
;
9 use wcf\system\exception\UserInputException
;
10 use wcf\system\html\simple\HtmlSimpleParser
;
11 use wcf\system\message\embedded\
object\MessageEmbeddedObjectManager
;
12 use wcf\system\page\handler\ILookupPageHandler
;
16 * Executes page related actions.
19 * @copyright 2001-2016 WoltLab GmbH
20 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
21 * @package WoltLabSuite\Core\Data\Page
24 * @method PageEditor[] getObjects()
25 * @method PageEditor getSingleObject()
27 class PageAction
extends AbstractDatabaseObjectAction
implements ISearchAction
, IToggleAction
{
31 protected $className = PageEditor
::class;
36 protected $pageEditor;
41 protected $permissionsCreate = ['admin.content.cms.canManagePage'];
46 protected $permissionsDelete = ['admin.content.cms.canManagePage'];
51 protected $permissionsUpdate = ['admin.content.cms.canManagePage'];
56 protected $requireACP = ['create', 'delete', 'getSearchResultList', 'search', 'toggle', 'update'];
62 public function create() {
63 /** @var Page $page */
64 $page = parent
::create();
67 if (!empty($this->parameters
['content'])) {
68 foreach ($this->parameters
['content'] as $languageID => $content) {
69 if (!empty($content['htmlInputProcessor'])) {
70 /** @noinspection PhpUndefinedMethodInspection */
71 $content['content'] = $content['htmlInputProcessor']->getHtml();
74 /** @var PageContent $pageContent */
75 $pageContent = PageContentEditor
::create([
76 'pageID' => $page->pageID
,
77 'languageID' => $languageID ?
: null,
78 'title' => $content['title'],
79 'content' => $content['content'],
80 'metaDescription' => $content['metaDescription'],
81 'metaKeywords' => $content['metaKeywords'],
82 'customURL' => $content['customURL']
84 $pageContentEditor = new PageContentEditor($pageContent);
86 // save embedded objects
87 if (!empty($content['htmlInputProcessor'])) {
88 /** @noinspection PhpUndefinedMethodInspection */
89 $content['htmlInputProcessor']->setObjectID($pageContent->pageContentID
);
90 if (MessageEmbeddedObjectManager
::getInstance()->registerObjects($content['htmlInputProcessor'])) {
91 $pageContentEditor->update(['hasEmbeddedObjects' => 1]);
94 else if ($page->pageType
== 'html' ||
$page->pageType
== 'tpl') {
95 HtmlSimpleParser
::getInstance()->parse('com.woltlab.wcf.page.content', $pageContent->pageContentID
, $pageContent->content
);
100 // save box to page assignments
101 if (!empty($this->parameters
['boxToPage'])) {
102 $sql = "INSERT INTO wcf".WCF_N
."_box_to_page
103 (boxID, pageID, visible)
105 $statement = WCF
::getDB()->prepareStatement($sql);
107 foreach ($this->parameters
['boxToPage'] as $boxData) {
108 $statement->execute([
117 if ($page->pageType
== 'tpl') {
118 if (!empty($this->parameters
['content'])) {
119 foreach ($this->parameters
['content'] as $languageID => $content) {
120 file_put_contents(WCF_DIR
. 'templates/' . $page->getTplName(($languageID ?
: null)) . '.tpl', $content['content']);
131 public function update() {
134 // update page content
135 if (!empty($this->parameters
['content'])) {
136 foreach ($this->getObjects() as $page) {
137 foreach ($this->parameters
['content'] as $languageID => $content) {
138 if (!empty($content['htmlInputProcessor'])) {
139 /** @noinspection PhpUndefinedMethodInspection */
140 $content['content'] = $content['htmlInputProcessor']->getHtml();
143 $pageContent = PageContent
::getPageContent($page->pageID
, ($languageID ?
: null));
144 $pageContentEditor = null;
145 if ($pageContent !== null) {
147 $pageContentEditor = new PageContentEditor($pageContent);
148 $pageContentEditor->update([
149 'title' => $content['title'],
150 'content' => $content['content'],
151 'metaDescription' => $content['metaDescription'],
152 'metaKeywords' => $content['metaKeywords'],
153 'customURL' => $content['customURL']
155 $pageContent = PageContent
::getPageContent($page->pageID
, ($languageID ?
: null));
158 /** @var PageContent $pageContent */
159 $pageContent = PageContentEditor
::create([
160 'pageID' => $page->pageID
,
161 'languageID' => $languageID ?
: null,
162 'title' => $content['title'],
163 'content' => $content['content'],
164 'metaDescription' => $content['metaDescription'],
165 'metaKeywords' => $content['metaKeywords'],
166 'customURL' => $content['customURL']
168 $pageContentEditor = new PageContentEditor($pageContent);
171 // save embedded objects
172 if (!empty($content['htmlInputProcessor'])) {
173 /** @noinspection PhpUndefinedMethodInspection */
174 $content['htmlInputProcessor']->setObjectID($pageContent->pageContentID
);
175 if ($pageContent->hasEmbeddedObjects
!= MessageEmbeddedObjectManager
::getInstance()->registerObjects($content['htmlInputProcessor'])) {
176 $pageContentEditor->update(['hasEmbeddedObjects' => $pageContent->hasEmbeddedObjects ?
0 : 1]);
179 else if ($page->pageType
== 'html' ||
$page->pageType
== 'tpl') {
180 HtmlSimpleParser
::getInstance()->parse('com.woltlab.wcf.page.content', $pageContent->pageContentID
, $pageContent->content
);
185 if ($page->pageType
== 'tpl') {
186 foreach ($this->parameters
['content'] as $languageID => $content) {
187 file_put_contents(WCF_DIR
. 'templates/' . $page->getTplName(($languageID ?
: null)) . '.tpl', $content['content']);
193 // save box to page assignments
194 if (isset($this->parameters
['boxToPage'])) {
195 $sql = "DELETE FROM wcf".WCF_N
."_box_to_page
197 $deleteStatement = WCF
::getDB()->prepareStatement($sql);
199 $sql = "INSERT INTO wcf".WCF_N
."_box_to_page
200 (boxID, pageID, visible)
202 $insertStatement = WCF
::getDB()->prepareStatement($sql);
204 foreach ($this->getObjects() as $page) {
205 $deleteStatement->execute([$page->pageID
]);
207 if (!empty($this->parameters
['boxToPage'])) {
208 foreach ($this->parameters
['boxToPage'] as $boxData) {
209 $insertStatement->execute([
223 public function validateDelete() {
224 parent
::validateDelete();
226 foreach ($this->getObjects() as $object) {
227 if (!$object->canDelete()) {
228 throw new PermissionDeniedException();
236 public function validateToggle() {
237 parent
::validateUpdate();
239 foreach ($this->getObjects() as $object) {
240 if (!$object->canDisable()) {
241 throw new PermissionDeniedException();
249 public function toggle() {
250 foreach ($this->getObjects() as $object) {
251 $object->update(['isDisabled' => $object->isDisabled ?
0 : 1]);
258 public function validateGetSearchResultList() {
259 $this->pageEditor
= $this->getSingleObject();
260 if ($this->pageEditor
->getHandler() === null ||
!($this->pageEditor
->getHandler() instanceof ILookupPageHandler
)) {
261 throw new UserInputException('objectIDs');
264 $this->readString('searchString', false, 'data');
270 public function getSearchResultList() {
271 /** @noinspection PhpUndefinedMethodInspection */
272 return $this->pageEditor
->getHandler()->lookup($this->parameters
['data']['searchString']);
276 * Validates parameters to search for a page by its internal name.
278 public function validateSearch() {
279 $this->readString('searchString');
283 * Searches for a page by its internal name.
285 * @return array list of matching pages
287 public function search() {
288 $sql = "SELECT pageID
289 FROM wcf".WCF_N
."_page
291 AND requireObjectID = ?
293 $statement = WCF
::getDB()->prepareStatement($sql, 5);
294 $statement->execute([
295 '%' . $this->parameters
['searchString'] . '%',
300 while ($pageID = $statement->fetchColumn()) {
301 $page = PageCache
::getInstance()->getPage($pageID);
303 'displayLink' => $page->getDisplayLink(),
304 'name' => $page->name
,
315 public function delete() {
316 foreach ($this->getObjects() as $page) {
317 if ($page->pageType
== 'tpl') {
318 foreach ($page->getPageContents() as $languageID => $content) {
319 $file = WCF_DIR
. 'templates/' . $page->getTplName(($languageID ?
: null)) . '.tpl';
320 if (file_exists($file)) {