Improved application management
authorAlexander Ebert <ebert@woltlab.com>
Sun, 4 Nov 2012 20:44:05 +0000 (21:44 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 4 Nov 2012 20:44:05 +0000 (21:44 +0100)
wcfsetup/install/files/acp/templates/applicationGroupAdd.tpl
wcfsetup/install/files/acp/templates/applicationManagement.tpl
wcfsetup/install/files/lib/acp/form/ApplicationEditForm.class.php
wcfsetup/install/files/lib/acp/form/ApplicationGroupAddForm.class.php
wcfsetup/install/files/lib/acp/page/ApplicationManagementPage.class.php
wcfsetup/install/files/lib/data/application/ViewableApplication.class.php [new file with mode: 0644]
wcfsetup/install/files/lib/data/application/ViewableApplicationList.class.php [new file with mode: 0644]
wcfsetup/install/files/lib/data/application/group/ViewableApplicationGroup.class.php
wcfsetup/install/lang/de.xml

index 873adf73efd6a5a24e147a95e5a15c169d26a221..19276694c2886a01261110907089d313fa4c6bbb 100644 (file)
                <fieldset{if $errorField == 'applications'} class="formError"{/if}>
                        <legend>{lang}wcf.acp.application.group.availableApplications{/lang}</legend>
                        
-                       <div class="tabularBox">
-                               <table class="table">
-                                       <thead>
-                                               <tr>
-                                                       <th class="columnID columnPackageID" colspan="2">{lang}wcf.global.objectID{/lang}</th>
-                                                       <th class="columnText columnPackageName">{lang}wcf.acp.package.name{/lang}</th>
-                                                       <th class="columnText columnDomainName">{lang}wcf.acp.application.domainName{/lang}</th>
-                                                       <th class="columnText columnDomainPath">{lang}wcf.acp.application.domainPath{/lang}</th>
-                                                       <th class="columnText columnCookieDomain">{lang}wcf.acp.application.cookieDomain{/lang}</th>
-                                                       <th class="columnText columnCookiePath">{lang}wcf.acp.application.cookiePath{/lang}</th>
-                                                       
-                                                       {event name='headColumns'}
-                                               </tr>
-                                       </thead>
-                                       
-                                       <tbody>
-                                               {foreach from=$availableApplications item=application}
-                                                       <tr data-package="{$application->package}">
-                                                               <td class="columnIcon"><a href="{link controller='ApplicationEdit' id=$application->packageID}{/link}"><img src="{@RELATIVE_WCF_DIR}icon/edit.svg" alt="" class="icon16 jsTooltip" title="{lang}wcf.global.button.edit{/lang}" /></a></td>
-                                                               <td class="columnID columnPackageID">{#$application->packageID}</td>
-                                                               <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->packageName}{/lang}</a></td>
-                                                               <td class="columnText columnDomainName">{$application->domainName}</td>
-                                                               <td class="columnText columnDomainPath">{$application->domainPath}</td>
-                                                               <td class="columnText columnCookieDomain">{$application->cookieDomain}</td>
-                                                               <td class="columnText columnCookiePath">{$application->cookiePath}</td>
+                       {if $availableApplications|count > 1}
+                               <div class="tabularBox">
+                                       <table class="table">
+                                               <thead>
+                                                       <tr>
+                                                               <th class="columnID columnPackageID" colspan="3">{lang}wcf.global.objectID{/lang}</th>
+                                                               <th class="columnText columnPackageName">{lang}wcf.acp.package.name{/lang}</th>
+                                                               <th class="columnText columnDomainName">{lang}wcf.acp.application.domainName{/lang}</th>
+                                                               <th class="columnText columnDomainPath">{lang}wcf.acp.application.domainPath{/lang}</th>
+                                                               <th class="columnText columnCookieDomain">{lang}wcf.acp.application.cookieDomain{/lang}</th>
+                                                               <th class="columnText columnCookiePath">{lang}wcf.acp.application.cookiePath{/lang}</th>
                                                                
-                                                               {event name='columns'}
+                                                               {event name='headColumns'}
                                                        </tr>
-                                               {/foreach}
-                                       </tbody>
-                               </table>
-                       </div>
-                       
-                       {if $errorField == 'applications'}
-                               <small class="innerError">
-                                       {if $errorType == 'empty'}
-                                               {lang}wcf.global.form.error.empty{/lang}
-                                       {else}
-                                               {lang}wcf.acp.application.group.applications.error.{$errorType}{/lang}
-                                       {/if}
-                               </small>
+                                               </thead>
+                                               
+                                               <tbody>
+                                                       {foreach from=$availableApplications item=application}
+                                                               <tr data-package="{$application->package}">
+                                                                       <td class="columnMark"><input type="checkbox" name="applications[]" value="{@$application->packageID}"{if $application->packageID|in_array:$applications} checked="checked"{/if} /></td>
+                                                                       <td class="columnIcon"><a href="{link controller='ApplicationEdit' id=$application->packageID}{/link}"><img src="{@RELATIVE_WCF_DIR}icon/edit.svg" alt="" class="icon16 jsTooltip" title="{lang}wcf.global.button.edit{/lang}" /></a></td>
+                                                                       <td class="columnID columnPackageID">{#$application->packageID}</td>
+                                                                       <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->getPackage()->getName()}{/lang}</a></td>
+                                                                       <td class="columnText columnDomainName">{$application->domainName}</td>
+                                                                       <td class="columnText columnDomainPath">{$application->domainPath}</td>
+                                                                       <td class="columnText columnCookieDomain">{$application->cookieDomain}</td>
+                                                                       <td class="columnText columnCookiePath">{$application->cookiePath}</td>
+                                                                       
+                                                                       {event name='columns'}
+                                                               </tr>
+                                                       {/foreach}
+                                               </tbody>
+                                       </table>
+                               </div>
+                               
+                               {if $errorField == 'applications'}
+                                       <small class="innerError">
+                                               {if $errorType == 'empty'}
+                                                       {lang}wcf.global.form.error.empty{/lang}
+                                               {else}
+                                                       {lang}wcf.acp.application.group.applications.error.{$errorType}{/lang}
+                                               {/if}
+                                       </small>
+                               {/if}
+                       {else}
+                               <p class="info">{lang}wcf.acp.application.group.noAvailableApplications{/lang}</p>
                        {/if}
                </fieldset>
                
index 01d78b3e7a358ef4a37027ad811fe57ba649dc45..31de66ab166b9f358acced51d6b5062f4f7224a3 100644 (file)
@@ -27,7 +27,7 @@
                                        <tr>
                                                <td class="columnIcon"><a href="{link controller='ApplicationEdit' id=$application->packageID}{/link}"><img src="{@RELATIVE_WCF_DIR}icon/edit.svg" alt="" class="icon16 jsTooltip" title="{lang}wcf.global.button.edit{/lang}" /></a></td>
                                                <td class="columnID columnPackageID">{#$application->packageID}</td>
-                                               <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->packageName}{/lang}</a></td>
+                                               <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->getPackage()->getName()}{/lang}</a></td>
                                                <td class="columnText columnDomainName">{$application->domainName}</td>
                                                <td class="columnText columnDomainPath">{$application->domainPath}</td>
                                                <td class="columnText columnCookieDomain">{$application->cookieDomain}</td>
@@ -76,7 +76,7 @@
                                                <tr>
                                                        <td class="columnIcon"><a href="{link controller='ApplicationEdit' id=$application->packageID}{/link}"><img src="{@RELATIVE_WCF_DIR}icon/edit.svg" alt="" class="icon16 jsTooltip" title="{lang}wcf.global.button.edit{/lang}" /></a></td>
                                                        <td class="columnID columnPackageID">{#$application->packageID}</td>
-                                                       <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->packageName}{/lang}</a></td>
+                                                       <td class="columnText columnPackageName"><a href="{link controller='PackageView' id=$application->packageID}{/link}">{lang}{$application->getPackage()->getName()}{/lang}</a></td>
                                                        <td class="columnText columnDomainName">{$application->domainName}</td>
                                                        <td class="columnText columnDomainPath">{$application->domainPath}</td>
                                                        <td class="columnText columnCookieDomain">{$application->cookieDomain}</td>
index 0ee6b20e3b818e681f67fd922bebaa579725df2c..cf0303f159b39cdc1d1ffc7b3dc788661b4f354d 100644 (file)
@@ -2,6 +2,7 @@
 namespace wcf\acp\form;
 use wcf\data\application\Application;
 use wcf\data\application\ApplicationAction;
+use wcf\data\application\ViewableApplication;
 use wcf\system\exception\IllegalLinkException;
 use wcf\system\exception\UserInputException;
 use wcf\system\Regex;
@@ -26,8 +27,8 @@ class ApplicationEditForm extends ACPForm {
        public $activeMenuItem = 'wcf.acp.menu.link.application';
        
        /**
-        * application object
-        * @var wcf\data\application\Application
+        * viewable application object
+        * @var wcf\data\application\ViewableApplication
         */
        public $application = null;
        
@@ -78,7 +79,7 @@ class ApplicationEditForm extends ACPForm {
                parent::readParameters();
                
                if (isset($_REQUEST['id'])) $this->packageID = intval($_REQUEST['id']);
-               $this->application = new Application($this->packageID);
+               $this->application = new ViewableApplication(new Application($this->packageID));
                if (!$this->application->packageID) {
                        throw new IllegalLinkException();
                }
@@ -167,7 +168,7 @@ class ApplicationEditForm extends ACPForm {
                parent::save();
                
                // save application
-               $this->objectAction = new ApplicationAction(array($this->application), 'update', array('data' => array(
+               $this->objectAction = new ApplicationAction(array($this->application->getDecoratedObject()), 'update', array('data' => array(
                        'cookieDomain' => $this->cookieDomain,
                        'cookiePath' => $this->cookiePath,
                        'domainName' => $this->domainName,
index 749e38f298256c6d817458c4e2aedbf6c19d9bc1..762c53c1cceff8ef4c3b59275f48a440582ff233 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 namespace wcf\acp\form;
-use wcf\data\application\ApplicationList;
+use wcf\data\application\ViewableApplicationList;
 use wcf\data\application\group\ApplicationGroupAction;
 use wcf\system\exception\UserInputException;
 use wcf\system\WCF;
@@ -31,7 +31,7 @@ class ApplicationGroupAddForm extends ACPForm {
        
        /**
         * list of available applications
-        * @var array<wcf\data\application\Application>
+        * @var array<wcf\data\application\ViewableApplication>
         */
        public $availableApplications = array();
        
@@ -59,11 +59,8 @@ class ApplicationGroupAddForm extends ACPForm {
         * Reads the list of available applications.
         */
        protected function readAvailableApplications() {
-               $applicationList = new ApplicationList();
-               $applicationList->sqlSelects = "package.package, package.packageName";
-               $applicationList->sqlJoins = "LEFT JOIN wcf".WCF_N."_package package ON (package.packageID = application.packageID)";
+               $applicationList = new ViewableApplicationList();
                $applicationList->getConditionBuilder()->add("application.groupID IS NULL");
-               $applicationList->getConditionBuilder()->add("application.packageID <> ? ", array(1));
                $applicationList->sqlLimit = 0;
                $applicationList->readObjects();
                
@@ -125,11 +122,11 @@ class ApplicationGroupAddForm extends ACPForm {
                                $application = $this->availableApplications[$packageID];
                                
                                // cannot group two or more applications of the same type
-                               if (in_array($application->package, $packages)) {
+                               if (in_array($application->getPackage()->package, $packages)) {
                                        throw new UserInputException('applications', 'duplicate');
                                }
                                
-                               $packages[] = $application->package;
+                               $packages[] = $application->getPackage()->package;
                        }
                }
        }
@@ -154,6 +151,9 @@ class ApplicationGroupAddForm extends ACPForm {
                $this->applications = array();
                $this->groupName = '';
                
+               // reload available applications
+               $this->readAvailableApplications();
+               
                // show success.
                WCF::getTPL()->assign(array(
                        'success' => true
index a4a40703c7321e923f49c030967a806e68cf1a77..d3e0dbe750feda59927219e8f2c77c22a5feaa38 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 namespace wcf\acp\page;
-use wcf\data\application\ApplicationList;
+use wcf\data\application\ViewableApplicationList;
 use wcf\data\application\group\ApplicationGroupList;
 use wcf\data\application\group\ViewableApplicationGroup;
 use wcf\page\AbstractPage;
@@ -42,10 +42,7 @@ class ApplicationManagementPage extends AbstractPage {
        public function readData() {
                parent::readData();
                
-               $applicationList = new ApplicationList();
-               $applicationList->sqlSelects = "package.packageName";
-               $applicationList->sqlJoins = "LEFT JOIN wcf".WCF_N."_package package ON (package.packageID = application.packageID)";
-               $applicationList->getConditionBuilder()->add("application.packageID <> ?", array(1)); // exclude WCF pseudo-application
+               $applicationList = new ViewableApplicationList();
                $applicationList->sqlLimit = 0;
                $applicationList->readObjects();
                
diff --git a/wcfsetup/install/files/lib/data/application/ViewableApplication.class.php b/wcfsetup/install/files/lib/data/application/ViewableApplication.class.php
new file mode 100644 (file)
index 0000000..0a6981d
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+namespace wcf\data\application;
+use wcf\data\package\PackageCache;
+use wcf\data\DatabaseObjectDecorator;
+
+/**
+ * Represents a viewable application.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2012 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.application
+ * @category   Community Framework
+ */
+class ViewableApplication extends DatabaseObjectDecorator {
+       /**
+        * @see wcf\data\DatabaseObjectDecorator::$baseClass
+        */
+       protected static $baseClass = 'wcf\data\application\Application';
+       
+       /**
+        * package object
+        * @var wcf\data\package\Package
+        */
+       protected $package = null;
+       
+       /**
+        * Returns package object.
+        * 
+        * @return      wcf\data\package\Package
+        */
+       public function getPackage() {
+               if ($this->package === null) {
+                       $this->package = PackageCache::getInstance()->getPackage($this->packageID);
+               }
+               
+               return $this->package;
+       }
+}
diff --git a/wcfsetup/install/files/lib/data/application/ViewableApplicationList.class.php b/wcfsetup/install/files/lib/data/application/ViewableApplicationList.class.php
new file mode 100644 (file)
index 0000000..b626716
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+namespace wcf\data\application;
+use wcf\data\package\PackageCache;
+
+/**
+ * Represents a list of viewable applications.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2012 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.application
+ * @category   Community Framework
+ */
+class ViewableApplicationList extends ApplicationList {
+       /**
+        * @see wcf\data\DatabaseObjectList::__construct()
+        */
+       public function __construct() {
+               parent::__construct();
+       
+               // exclude WCF pseudo-application
+               $this->getConditionBuilder()->add("application.packageID <> ?", array(1));
+       }
+       
+       /**
+        * @see wcf\data\DatabaseObjectList::readObjects()
+        */
+       public function readObjects() {
+               parent::readObjects();
+               
+               foreach ($this->objects as &$application) {
+                       $application = new ViewableApplication($application);
+               }
+               unset($application);
+       }
+}
index d7b7a79d2728b6a4b9467aba9f727d1fd8b29ce2..06633f09319845e4e914fb3030f1d2d8984486c4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 namespace wcf\data\application\group;
-use wcf\data\application\Application;
+use wcf\data\application\ViewableApplication;
 use wcf\data\DatabaseObjectDecorator;
 
 /**
@@ -20,8 +20,8 @@ class ViewableApplicationGroup extends DatabaseObjectDecorator implements \Count
        protected static $baseClass = 'wcf\data\application\group\ApplicationGroup';
        
        /**
-        * list of applications
-        * @var array<wcf\data\application\Application>
+        * list of viewable applications
+        * @var array<wcf\data\application\ViewableApplication>
         */
        protected $applications = array();
        
@@ -34,9 +34,9 @@ class ViewableApplicationGroup extends DatabaseObjectDecorator implements \Count
        /**
         * Assigns an application to this group.
         * 
-        * @param       wcf\data\application\Application        $application
+        * @param       wcf\data\application\ViewableApplication        $application
         */
-       public function addApplication(Application $application) {
+       public function addApplication(ViewableApplication $application) {
                if ($this->groupID == $application->groupID) {
                        $this->applications[] = $application;
                }
index 5a0e2b0fcd4a81f4137c80de9bba84b44f4fa200..ef85012233ab92a126c406253a8b5b980208a5f2 100644 (file)
@@ -19,7 +19,7 @@
                <item name="wcf.acp.application.domainPath"><![CDATA[Pfad]]></item>
                <item name="wcf.acp.application.domainPath.description"><![CDATA[Geben Sie den Pfad an, über den diese Anwendung erreichbar ist. Wenn Ihre Anwendung zum Beispiel unter &bdquo;http://www.example.com/community/forum/&ldquo; erreichbar ist, so geben Sie bitte &bdquo;/community/forum/&ldquo; ein.]]></item>
                <item name="wcf.acp.application.edit"><![CDATA[Anwendung bearbeiten]]></item>
-               <item name="wcf.acp.application.edit.title"><![CDATA[Anwendung bearbeiten: WoltLab Burning Board]]></item>
+               <item name="wcf.acp.application.edit.title"><![CDATA[Anwendung bearbeiten: &bdquo;<a href="{link controller='PackageView' id=$application->packageID}{/link}">{$application->getPackage()->getName()}</a>&ldquo;]]></item>
                <item name="wcf.acp.application.group.add"><![CDATA[Anwendungsgruppe hinzufügen]]></item>
                <item name="wcf.acp.application.group.applications.error.duplicate"><![CDATA[Zwei oder mehr Anwendungen des selben Typs können nicht in einer Gruppe zusammengefasst werden.]]></item>
                <item name="wcf.acp.application.group.applications.error.notValid"><![CDATA[Eine oder mehrere ausgewählte Anwendungen sind nicht mehr verfügbar.]]></item>
@@ -30,6 +30,7 @@
                <item name="wcf.acp.application.group.edit"><![CDATA[Anwendungsgruppe bearbeiten]]></item>
                <item name="wcf.acp.application.group.groupName"><![CDATA[Name]]></item>
                <item name="wcf.acp.application.group.groupName.error.notUnique"><![CDATA[Der Gruppenname muss einzigartig sein.]]></item>
+               <item name="wcf.acp.application.group.noAvailableApplications"><![CDATA[Es ist derzeit keine ausreichende Anzahl Anwendungen verfügbar, um eine Anwendungsgruppe zu erstellen.]]></item>
                <item name="wcf.acp.application.group.title"><![CDATA[Anwendungsgruppe: &bdquo;{$applicationGroup->groupName}&ldquo;]]></item>
                <item name="wcf.acp.application.independentApplications"><![CDATA[Unabhängige Anwendungen]]></item>
                <item name="wcf.acp.application.management"><![CDATA[Anwendungen verwalten]]></item>