Revert r39954, 39958 "Tweaks for SiteConfiguration:"
authorBrion Vibber <brion@users.mediawiki.org>
Mon, 25 Aug 2008 22:06:03 +0000 (22:06 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Mon, 25 Aug 2008 22:06:03 +0000 (22:06 +0000)
This seems to have broken upload dirs on live site (eg http://upload.wikimedia.org/wiki/commons/6/66/Diemetrie.png in place of http://upload.wikimedia.org/wikipedia/commons/6/66/Diemetrie.png)
Please make no further changes without some regression testing...

includes/SiteConfiguration.php

index 25c289f..6a1a863 100644 (file)
@@ -8,48 +8,19 @@
 
 // Hide this pattern from Doxygen, which spazzes out at it
 /// @cond
-if( !defined( 'SITE_CONFIGURATION' ) ){
-define( 'SITE_CONFIGURATION', 1 );
+if (!defined('SITE_CONFIGURATION')) {
+define('SITE_CONFIGURATION', 1);
 /// @endcond
 
 /**
  * This is a class used to hold configuration settings, particularly for multi-wiki sites.
+ *
  */
 class SiteConfiguration {
-
-       /**
-        * Array of suffixes, for self::siteFromDB()
-        */
-       public $suffixes = array();
-
-       /**
-        * Array of wikis, should be the same as $wgLocalDatabases
-        */
-       public $wikis = array();
-       
-       /**
-        * The whole array of settings
-        */
-       public $settings = array();
-
-       /**
-        * Array of domains that are local and can be handled by the same server
-        */
-       public $localVHosts = array();
-
-       /**
-        * A callback function that returns an array with the following keys (all
-        * optional):
-        * - suffix: site's suffix
-        * - lang: site's lang
-        * - tags: array of wiki tags
-        * - params: array of parameters to be replaced
-        * The function will receive the SiteConfiguration instance in the first
-        * argument and the wiki in the second one.
-        * if suffix and lang are passed they will be used for the return value of
-        * self::siteFromDB() and self::$suffixes will be ignored
-        */
-       public $siteParamsCallback = null;
+       var $suffixes = array();
+       var $wikis = array();
+       var $settings = array();
+       var $localVHosts = array();
 
        /**
         * Retrieves a configuration setting for a given wiki.
@@ -60,88 +31,72 @@ class SiteConfiguration {
         * @param $wikiTags Array The tags assigned to the wiki.
         * @return Mixed the value of the setting requested.
         */
-       public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
-               $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
-               return $this->getSetting( $settingName, $wiki, $params );
-       }
-       
-       /**
-        * Really retrieves a configuration setting for a given wiki.
-        *
-        * @param $settingName String ID of the setting name to retrieve.
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $params Array: array of parameters.
-        * @return Mixed the value of the setting requested.
-        */
-       protected function getSetting( $settingName, $wiki, /*array*/ $params ){
-               $retval = null;
-               if( array_key_exists( $settingName, $this->settings ) ) {
+       function get( $settingName, $wiki, $suffix, $params = array(), $wikiTags = array() ) {
+               if ( array_key_exists( $settingName, $this->settings ) ) {
                        $thisSetting =& $this->settings[$settingName];
                        do {
                                // Do individual wiki settings
-                               if( array_key_exists( $wiki, $thisSetting ) ) {
+                               if ( array_key_exists( $wiki, $thisSetting ) ) {
                                        $retval = $thisSetting[$wiki];
                                        break;
-                               } elseif( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
+                               } elseif ( array_key_exists( "+$wiki", $thisSetting ) && is_array($thisSetting["+$wiki"]) ) {
                                        $retval = $thisSetting["+$wiki"];
                                }
                                
                                // Do tag settings
-                               foreach( $params['tags'] as $tag ) {
-                                       if( array_key_exists( $tag, $thisSetting ) ) {
-                                               if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$tag] ) ) {
-                                                       $retval = self::arrayMerge( $retval, $thisSetting[$tag] );
+                               foreach ( $wikiTags as $tag ) {
+                                       if ( array_key_exists( $tag, $thisSetting ) ) {
+                                               if ( isset($retval) && is_array($retval) && is_array($thisSetting[$tag]) ) {
+                                                       $retval = array_merge( $retval, $thisSetting[$tag] );
                                                } else {
                                                        $retval = $thisSetting[$tag];
                                                }
                                                break 2;
-                                       } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array($thisSetting["+$tag"]) ) {
-                                               if( !isset( $retval ) )
+                                       } elseif ( array_key_exists( "+$tag", $thisSetting ) && is_array($thisSetting["+$tag"]) ) {
+                                               if (!isset($retval))
                                                        $retval = array();
-                                               $retval = self::arrayMerge( $retval, $thisSetting["+$tag"] );
+                                               $retval = array_merge( $retval, $thisSetting["+$tag"] );
                                        }
                                }
+                               
                                // Do suffix settings
-                               $suffix = $params['suffix'];
-                               if( !is_null( $suffix ) ) {
-                                       if( array_key_exists( $suffix, $thisSetting ) ) {
-                                               if ( isset($retval) && is_array($retval) && is_array($thisSetting[$suffix]) ) {
-                                                       $retval = self::arrayMerge( $retval, $thisSetting[$suffix] );
-                                               } else {
-                                                       $retval = $thisSetting[$suffix];
-                                               }
-                                               break;
-                                       } elseif( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
-                                               if (!isset($retval))
-                                                       $retval = array();
-                                               $retval = self::arrayMerge( $retval, $thisSetting["+$suffix"] );
+                               if ( array_key_exists( $suffix, $thisSetting ) ) {
+                                       if ( isset($retval) && is_array($retval) && is_array($thisSetting[$suffix]) ) {
+                                               $retval = array_merge( $retval, $thisSetting[$suffix] );
+                                       } else {
+                                               $retval = $thisSetting[$suffix];
                                        }
+                                       break;
+                               } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+                                       if (!isset($retval))
+                                               $retval = array();
+                                       $retval = array_merge( $retval, $thisSetting["+$suffix"] );
                                }
                                
                                // Fall back to default.
-                               if( array_key_exists( 'default', $thisSetting ) ) {
-                                       if( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
-                                               $retval = self::arrayMerge( $retval, $thisSetting['default'] );
+                               if ( array_key_exists( 'default', $thisSetting ) ) {
+                                       if ( isset($retval) && is_array($retval) && is_array($thisSetting['default']) ) {
+                                               $retval = array_merge( $retval, $thisSetting['default'] );
                                        } else {
                                                $retval = $thisSetting['default'];
                                        }
                                        break;
                                }
+                               $retval = null;
                        } while ( false );
+               } else {
+                       $retval = NULL;
                }
 
-               if( !is_null( $retval ) && count( $params['params'] ) ) {
-                       foreach ( $params['params'] as $key => $value ) {
+               if ( !is_null( $retval ) && count( $params ) ) {
+                       foreach ( $params as $key => $value ) {
                                $retval = $this->doReplace( '$' . $key, $value, $retval );
                        }
                }
                return $retval;
        }
 
-       /**
-        * Type-safe string replace; won't do replacements on non-strings
-        * private?
-        */
+       /** Type-safe string replace; won't do replacements on non-strings */
        function doReplace( $from, $to, $in ) {
                if( is_string( $in ) ) {
                        return str_replace( $from, $to, $in );
@@ -163,20 +118,19 @@ class SiteConfiguration {
         * @param $wikiTags Array The tags assigned to the wiki.
         * @return Array Array of settings requested.
         */
-       public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
-               $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
+       function getAll( $wiki, $suffix, $params, $wikiTags = array() ) {
                $localSettings = array();
-               foreach( $this->settings as $varname => $stuff ) {
+               foreach ( $this->settings as $varname => $stuff ) {
                        $append = false;
                        $var = $varname;
                        if ( substr( $varname, 0, 1 ) == '+' ) {
                                $append = true;
                                $var = substr( $varname, 1 );
                        }
-
-                       $value = $this->getSetting( $varname, $wiki, $params );
-                       if ( $append && is_array( $value ) && is_array( $GLOBALS[$var] ) )
-                               $value = self::arrayMerge( $value, $GLOBALS[$var] );
+                       
+                       $value = $this->get( $varname, $wiki, $suffix, $params, $wikiTags );
+                       if ( $append && is_array($value) && is_array( $GLOBALS[$var] ) )
+                               $value = array_merge( $value, $GLOBALS[$var] );
                        if ( !is_null( $value ) ) {
                                $localSettings[$var] = $value;
                        }
@@ -193,7 +147,7 @@ class SiteConfiguration {
         * @param $wikiTags Array The tags assigned to the wiki.
         * @return bool The value of the setting requested.
         */
-       public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
+       function getBool( $setting, $wiki, $suffix, $wikiTags = array() ) {
                return (bool)($this->get( $setting, $wiki, $suffix, array(), $wikiTags ) );
        }
 
@@ -215,7 +169,7 @@ class SiteConfiguration {
         * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
         * @param $wikiTags Array The tags assigned to the wiki.
         */
-       public function extractVar( $setting, $wiki, $suffix, &$var, $params = array(), $wikiTags = array() ) {
+       function extractVar( $setting, $wiki, $suffix, &$var, $params, $wikiTags = array() ) {
                $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
                if ( !is_null( $value ) ) {
                        $var = $value;
@@ -230,18 +184,13 @@ class SiteConfiguration {
         * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
         * @param $wikiTags Array The tags assigned to the wiki.
         */
-       public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
-               $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
-               $this->extractGlobalSetting( $setting, $wiki, $params );
-       }
-
-       public function extractGlobalSetting( $setting, $wiki, $params ) {
-               $value = $this->getSetting( $setting, $wiki, $params );
+       function extractGlobal( $setting, $wiki, $suffix, $params, $wikiTags = array() ) {
+               $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
                if ( !is_null( $value ) ) {
                        if (substr($setting,0,1) == '+' && is_array($value)) {
                                $setting = substr($setting,1);
                                if ( is_array($GLOBALS[$setting]) ) {
-                                       $GLOBALS[$setting] = self::arrayMerge( $GLOBALS[$setting], $value );
+                                       $GLOBALS[$setting] = array_merge( $GLOBALS[$setting], $value );
                                } else {
                                        $GLOBALS[$setting] = $value;
                                }
@@ -258,87 +207,23 @@ class SiteConfiguration {
         * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
         * @param $wikiTags Array The tags assigned to the wiki.
         */
-       public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
-               $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
+       function extractAllGlobals( $wiki, $suffix, $params, $wikiTags = array() ) {
                foreach ( $this->settings as $varName => $setting ) {
-                       $this->extractGlobalSetting( $varName, $wiki, $params );
-               }
-       }
-
-       /**
-        * Return specific settings for $wiki
-        * See the documentation of self::$siteParamsCallback for more in-depth
-        * documentation about this function
-        *
-        * @param $wiki String
-        * @return array
-        */
-       protected function getWikiParams( $wiki ){
-               static $default = array(
-                       'suffix' => null,
-                       'lang' => null,
-                       'tags' => array(),
-                       'params' => array(),
-               );
-
-               if( !is_callable( $this->siteParamsCallback ) )
-                       return $default;
-
-               $ret = call_user_func_array( $this->siteParamsCallback, array( $this, $wiki ) );
-               # Validate the returned value
-               if( !is_array( $ret ) )
-                       return $default;
-
-               foreach( $default as $name => $def ){
-                       if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) )
-                               $ret[$name] = $default[$name];
+                       $this->extractGlobal( $varName, $wiki, $suffix, $params, $wikiTags );
                }
-               
-               return $ret;
-       }
-
-       /**
-        * Merge params beetween the ones passed to the function and the ones given
-        * by self::$siteParamsCallback for backward compatibility
-        * Values returned by self::getWikiParams() have the priority.
-        *
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in
-        *                all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
-        * @return array
-        */
-       protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ){
-               $ret = $this->getWikiParams( $wiki );
-
-               if( is_null( $ret['suffix'] ) )
-                       $ret['suffix'] = $suffix;
-
-               $ret['tags'] = array_unique( array_merge( $ret['tags'], $wikiTags ) );
-
-               // Automatically fill that ones if needed
-               if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) )
-                       $ret['params']['lang'] = $ret['lang'];
-               if( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) )
-                       $ret['params']['site'] = $ret['suffix'];
-       
-               $ret['params'] += $params;
-               return $ret;
        }
 
        /**
         * Work out the site and language name from a database name
         * @param $db
         */
-       public function siteFromDB( $db ) {
-               // Allow override
-               $def = $this->getWikiParams( $db );             
-               if( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) )
-                       return array( $def['suffix'], $def['lang'] );
-
-               $site = null;
-               $lang = null;
+       function siteFromDB( $db ) {
+               $site = NULL;
+               $lang = NULL;
+               
+               // Only run hooks if they *can* be run.
+               if (function_exists( 'wfRunHooks' ) && !wfRunHooks( 'SiteFromDB', array( $db, &$site, &$lang ) ) )
+                       return array( $site, $lang );
                foreach ( $this->suffixes as $suffix ) {
                        if ( $suffix === '' ) {
                                $site = '';
@@ -354,37 +239,9 @@ class SiteConfiguration {
                return array( $site, $lang );
        }
 
-       /**
-        * Returns true if the given vhost is handled locally.
-        * @param $vhost String
-        * @return bool
-        */
-       public function isLocalVHost( $vhost ) {
+       /** Returns true if the given vhost is handled locally. */
+       function isLocalVHost( $vhost ) {
                return in_array( $vhost, $this->localVHosts );
        }
-       
-       /**
-        * Merge multiple arrays together.
-        * On encountering duplicate keys, merge the two, but ONLY if they're arrays.
-        * PHP's array_merge_recursive() merges ANY duplicate values into arrays,
-        * which is not fun
-        */
-       static function arrayMerge( $array1/* ... */ ) {
-               $out = $array1;
-               for( $i=1; $i < func_num_args(); $i++ ) {
-                       foreach( func_get_arg( $i ) as $key => $value ) {
-                               if ( isset($out[$key]) && is_array($out[$key]) && is_array($value) ) {
-                                       $out[$key] = self::arrayMerge( $out[$key], $value );
-                               } elseif ( !isset($out[$key]) || !$out[$key] && !is_numeric($key) ) {
-                                       // Values that evaluate to true given precedence, for the primary purpose of merging permissions arrays.
-                                       $out[$key] = $value;
-                               } elseif ( is_numeric( $key ) ) {
-                                       $out[] = $value;
-                               }
-                       }
-               }
-       
-               return $out;
-       }
 }
 }