Allow most system pages to receive a new parent
authorAlexander Ebert <ebert@woltlab.com>
Sat, 9 Jul 2016 18:06:28 +0000 (20:06 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 9 Jul 2016 18:06:34 +0000 (20:06 +0200)
com.woltlab.wcf/page.xml
wcfsetup/install/files/acp/templates/pageAdd.tpl
wcfsetup/install/files/lib/acp/form/PageAddForm.class.php
wcfsetup/install/files/lib/acp/form/PageEditForm.class.php
wcfsetup/install/files/lib/data/page/Page.class.php
wcfsetup/install/files/lib/system/package/plugin/PagePackageInstallationPlugin.class.php
wcfsetup/setup/db/install.sql

index b727d692b8487321e55a371b1497fc7789524c8e..66d99593ced43cc1e32385ef03a725853f832b06 100644 (file)
@@ -98,6 +98,7 @@
                        <controller>wcf\form\AvatarEditForm</controller>
                        <name language="de"><![CDATA[Avatar-Verwaltung]]></name>
                        <name language="en"><![CDATA[Avatar Management]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\form\EmailActivationForm</controller>
                        <name language="de"><![CDATA[Aktivierung neuer E-Mail-Adresse]]></name>
                        <name language="en"><![CDATA[New Email Address Verification]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\form\EmailNewActivationCodeForm</controller>
                        <name language="de"><![CDATA[E-Mail-Aktivierungscode-Anforderung]]></name>
                        <name language="en"><![CDATA[New Email Activation Code Request]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\form\NotificationSettingsForm</controller>
                        <name language="de"><![CDATA[Benachrichtigungseinstellungen]]></name>
                        <name language="en"><![CDATA[Notification Settings]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\form\RegisterActivationForm</controller>
                        <name language="de"><![CDATA[Registrierung abschließen]]></name>
                        <name language="en"><![CDATA[Complete Registration]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.Register</parent>
                        
                        <content language="en">
                        <controller>wcf\form\RegisterNewActivationCodeForm</controller>
                        <name language="de"><![CDATA[Aktivierungscode-Anforderung]]></name>
                        <name language="en"><![CDATA[New Activation Code Request]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.Register</parent>
                        
                        <content language="en">
                        <controller>wcf\form\SettingsForm</controller>
                        <name language="de"><![CDATA[Einstellungen]]></name>
                        <name language="en"><![CDATA[Settings]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <name language="de"><![CDATA[Signatur-Verwaltung]]></name>
                        <name language="en"><![CDATA[Signature Management]]></name>
                        <options>module_user_signature</options>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\page\FollowingPage</controller>
                        <name language="de"><![CDATA[Benutzer, denen Sie folgen]]></name>
                        <name language="en"><![CDATA[Followed Users]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <controller>wcf\page\IgnoredUsersPage</controller>
                        <name language="de"><![CDATA[Blockierte Benutzer]]></name>
                        <name language="en"><![CDATA[Blocked Users]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <name language="de"><![CDATA[Gelöschte Inhalte]]></name>
                        <name language="en"><![CDATA[Deleted Content]]></name>
                        <permissions>mod.general.canUseModeration</permissions>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.ModerationList</parent>
                        
                        <content language="en">
                        <name language="en"><![CDATA[Content Approval]]></name>
                        <parent>com.woltlab.wcf.ModerationList</parent>
                        <permissions>mod.general.canUseModeration</permissions>
+                       <hasFixedParent>1</hasFixedParent>
                        <requireObjectID>1</requireObjectID>
                        
                        <content language="en">
                        <name language="de"><![CDATA[Inhaltsmeldung]]></name>
                        <name language="en"><![CDATA[Content Report]]></name>
                        <parent>com.woltlab.wcf.ModerationList</parent>
+                       <hasFixedParent>1</hasFixedParent>
                        <permissions>mod.general.canUseModeration</permissions>
                        <requireObjectID>1</requireObjectID>
                        
                        <controller>wcf\page\NotificationListPage</controller>
                        <name language="de"><![CDATA[Benachrichtigungen]]></name>
                        <name language="en"><![CDATA[Notifications]]></name>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <name language="de"><![CDATA[Bezahlte Mitgliedschaften]]></name>
                        <name language="en"><![CDATA[Paid Subscriptions]]></name>
                        <options>module_paid_subscription</options>
+                       <hasFixedParent>1</hasFixedParent>
                        <parent>com.woltlab.wcf.AccountManagement</parent>
                        
                        <content language="en">
                        <name language="de"><![CDATA[Suchergebnisse]]></name>
                        <name language="en"><![CDATA[Search Results]]></name>
                        <parent>com.woltlab.wcf.Search</parent>
+                       <hasFixedParent>1</hasFixedParent>
                        <requireObjectID>1</requireObjectID>
                        
                        <content language="en">
                        <name language="en"><![CDATA[List of Articles in Certain Category]]></name>
                        <options>module_article</options>
                        <parent>com.woltlab.wcf.ArticleList</parent>
+                       <hasFixedParent>1</hasFixedParent>
                        <requireObjectID>1</requireObjectID>
                </page>
                <page identifier="com.woltlab.wcf.Article">
                        <name language="en"><![CDATA[Article]]></name>
                        <options>module_article</options>
                        <parent>com.woltlab.wcf.CategoryArticleList</parent>
+                       <hasFixedParent>1</hasFixedParent>
                        <requireObjectID>1</requireObjectID>
                </page>
                
index 7c8671b4318e58222cb9bdd8cdb4b6a62b4fd2ae..2ec202c90b055923c0d87c508b533133511165d2 100644 (file)
                                <dl{if $errorField == 'parentPageID'} class="formError"{/if}>
                                        <dt><label for="parentPageID">{lang}wcf.acp.page.parentPage{/lang}</label></dt>
                                        <dd>
-                                               <select name="parentPageID" id="parentPageID"{if $action == 'edit' && $page->originIsSystem} disabled{/if}>
+                                               <select name="parentPageID" id="parentPageID"{if $action == 'edit' && $page->hasFixedParent} disabled{/if}>
                                                        <option value="0">{lang}wcf.acp.page.parentPage.none{/lang}</option>
                                                        
                                                        {foreach from=$pageNodeList item=pageNode}
-                                                               <option value="{@$pageNode->pageID}"{if $pageNode->pageID == $parentPageID} selected{/if}>{if $pageNode->getDepth() > 1}{@"&nbsp;&nbsp;&nbsp;&nbsp;"|str_repeat:($pageNode->getDepth() - 1)}{/if}{$pageNode->name}</option>
+                                                               <option value="{@$pageNode->pageID}"{if $pageNode->pageID == $parentPageID} selected{/if}{if $pageNode->requireObjectID} disabled{/if}>{if $pageNode->getDepth() > 1}{@"&nbsp;&nbsp;&nbsp;&nbsp;"|str_repeat:($pageNode->getDepth() - 1)}{/if}{$pageNode->name}</option>
                                                        {/foreach}
                                                </select>
                                                {if $errorField == 'parentPageID'}
index 98bd0bb6d59aaf1e182dab8a5c2924ca150e2df4..627dfb8b52f92b6197bb8987ad8b5f9e570e952f 100644 (file)
@@ -289,6 +289,10 @@ class PageAddForm extends AbstractForm {
                        if (!$page->pageID) {
                                throw new UserInputException('parentPageID', 'invalid');
                        }
+                       
+                       if ($page->requireObjectID) {
+                               throw new UserInputException('parentPageID', 'invalid');
+                       }
                }
        }
        
index 4ae43fd0e2cf1e9413aac1ef05b06f9a4614724c..21ecc66dc03fc842c582fd091984e49f38742d52 100644 (file)
@@ -5,6 +5,7 @@ use wcf\data\page\PageAction;
 use wcf\form\AbstractForm;
 use wcf\system\acl\simple\SimpleAclHandler;
 use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\UserInputException;
 use wcf\system\language\LanguageFactory;
 use wcf\system\WCF;
 
@@ -66,8 +67,11 @@ class PageEditForm extends PageAddForm {
                
                $this->pageType = $this->page->pageType;
                if ($this->page->originIsSystem) {
-                       $this->parentPageID = $this->page->parentPageID;
                        $this->applicationPackageID = $this->page->applicationPackageID;
+                       
+                       if ($this->page->hasFixedParent) {
+                               $this->parentPageID = $this->page->parentPageID;
+                       }
                }
                
                if ($this->page->requireObjectID) {
@@ -92,6 +96,20 @@ class PageEditForm extends PageAddForm {
                // type is immutable
        }
        
+       /**
+        * @inheritDoc
+        */
+       protected function validateParentPageID() {
+               if ($this->page->hasFixedParent) {
+                       if ($this->parentPageID != $this->page->parentPageID) {
+                               throw new UserInputException('parentPageID', 'invalid');
+                       }
+               }
+               else {
+                       parent::validateParentPageID();
+               }
+       }
+       
        /**
         * @inheritDoc
         */
index 97e9586fcb94a280f325cceca27a7eb0b2a53918..183d598f8d4dbe9ed3f4141b81a1a8f3828df4e5 100644 (file)
@@ -37,6 +37,7 @@ use wcf\system\WCF;
  * @property-read      string          $handler
  * @property-read      string          $controllerCustomURL
  * @property-read      integer         $requireObjectID
+ * @property-read      integer         $hasFixedParent
  * @property-read      integer         $lastUpdateTime
  * @property-read      string          $permissions
  * @property-read      string          $options
index 42f7fd80715ac2e12ec2f874100f946145c551b0..66b74e087dba9bbb709ba830fb070556a2ebba5b 100644 (file)
@@ -218,7 +218,8 @@ class PagePackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin
                        'applicationPackageID' => $applicationPackageID,
                        'requireObjectID' => (!empty($data['elements']['requireObjectID'])) ? 1 : 0,
                        'options' => (isset($data['elements']['options'])) ? $data['elements']['options'] : '',
-                       'permissions' => (isset($data['elements']['permissions'])) ? $data['elements']['permissions'] : ''
+                       'permissions' => (isset($data['elements']['permissions'])) ? $data['elements']['permissions'] : '',
+                       'hasFixedParent' => ($pageType == 'system' && !empty($data['elements']['hasFixedParent'])) ? 1 : 0
                ];
        }
        
index 25aa7447f5ce1a7f87a49e9a0cacb121cabcd32d..cd5c0cebe92d331ba1353b78f2833a0c78442b0a 100644 (file)
@@ -963,6 +963,7 @@ CREATE TABLE wcf1_page (
        handler VARCHAR(255) NOT NULL DEFAULT '',
        controllerCustomURL VARCHAR(255) NOT NULL DEFAULT '',
        requireObjectID TINYINT(1) NOT NULL DEFAULT 0,
+       hasFixedParent TINYINT(1) NOT NULL DEFAULT 0,
        lastUpdateTime INT(10) NOT NULL DEFAULT 0,
        permissions TEXT NULL,
        options TEXT NULL