Read admin groups only once
authorTim Düsterhus <duesterhus@woltlab.com>
Wed, 24 Oct 2012 18:46:05 +0000 (20:46 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Wed, 24 Oct 2012 18:46:05 +0000 (20:46 +0200)
wcfsetup/install/files/lib/system/package/plugin/UserGroupOptionPackageInstallationPlugin.class.php

index 6cee5472d2df4023e4917f374f77f3c8e064bc66..3ffd8daba449c5e2e79dd3a478899a0ea4c1b580 100644 (file)
@@ -21,7 +21,7 @@ use wcf\util\StringUtil;
 class UserGroupOptionPackageInstallationPlugin extends AbstractOptionPackageInstallationPlugin {
        /**
         * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
-        */     
+        */
        public $tableName = 'user_group_option';
        
        /**
@@ -30,6 +30,12 @@ class UserGroupOptionPackageInstallationPlugin extends AbstractOptionPackageInst
         */
        public static $reservedTags = array('name', 'optiontype', 'defaultvalue', 'admindefaultvalue', 'validationpattern', 'showorder', 'categoryname', 'selectoptions', 'enableoptions', 'permissions', 'options', 'attrs', 'cdata');
        
+       /**
+        * array with group IDs that are admin groups
+        * @var array<integer>
+        */
+       protected static $adminGroupIDs = array();
+       
        /**
         * @see wcf\system\package\plugin\AbstractOptionPackageInstallationPlugin::saveOption()
         */
@@ -116,22 +122,39 @@ class UserGroupOptionPackageInstallationPlugin extends AbstractOptionPackageInst
                        $statement->execute(array($row['groupID'], $optionID, $defaultValue));
                        
                        if ($adminDefaultValue && $defaultValue != $adminDefaultValue) {
-                               $userGroupList = new UserGroupList();
-                               $userGroupList->sqlLimit = 0;
-                               $userGroupList->readObjects();
+                               $adminGroupIDs = self::getAdminGroupIDs();
                                
                                WCF::getDB()->beginTransaction();
-                               foreach ($userGroupList as $userGroup) {
-                                       if ($userGroup->isAdminGroup()) {
-                                               $statement->execute(array(
-                                                       $userGroup->groupID,
-                                                       $optionID,
-                                                       $adminDefaultValue
-                                               ));
-                                       }
+                               foreach ($adminGroupIDs as $groupID) {
+                                       $statement->execute(array(
+                                               $groupID,
+                                               $optionID,
+                                               $adminDefaultValue
+                                       ));
                                }
                                WCF::getDB()->commitTransaction();
                        }
                }
        }
+       
+       /**
+        * Returns an array of groupIDs that belong to an admin group.
+        * 
+        * @return      array<integer>
+        */
+       protected function getAdminGroupIDs() {
+               if (empty(self::$adminGroupIDs)) {
+                       $userGroupList = new UserGroupList();
+                       $userGroupList->sqlLimit = 0;
+                       $userGroupList->readObjects();
+                       
+                       foreach ($userGroupList as $userGroup) {
+                               if ($userGroup->isAdminGroup()) {
+                                       self::$adminGroupIDs[] = $userGroup->groupID;
+                               }
+                       }
+               }
+               
+               return self::$adminGroupIDs;
+       }
 }