http://www.mediawiki.org/wiki/Special:Code/MediaWiki/90272

Revision: 90272
Author:   salvatoreingala
Date:     2011-06-17 15:15:37 +0000 (Fri, 17 Jun 2011)
Log Message:
-----------
- Moved the gadget preference info to a private member; had to use a hack, 
though.
- Minor changes.

Modified Paths:
--------------
    branches/salvatoreingala/Gadgets/ApiGetGadgetPrefs.php
    branches/salvatoreingala/Gadgets/Gadgets_body.php

Modified: branches/salvatoreingala/Gadgets/ApiGetGadgetPrefs.php
===================================================================
--- branches/salvatoreingala/Gadgets/ApiGetGadgetPrefs.php      2011-06-17 
15:07:51 UTC (rev 90271)
+++ branches/salvatoreingala/Gadgets/ApiGetGadgetPrefs.php      2011-06-17 
15:15:37 UTC (rev 90272)
@@ -32,6 +32,7 @@
                }
 
                $gadgetName = $params['gadget'];
+               
                $gadgets = Gadget::loadList();
                $gadget = $gadgets && isset( $gadgets[$gadgetName] ) ? 
$gadgets[$gadgetName] : null;
                
@@ -47,6 +48,10 @@
 
                $userPrefs = $gadget->getPrefs();
                
+               if ( $userPrefs === null ) {
+                       throw new MWException( __METHOD__ . ': $userPrefs 
should not be null.' );
+               }
+                               
                //Add user preferences to preference description
                foreach ( $userPrefs as $pref => $value ) {
                        $prefsDescription['fields'][$pref]['value'] = $value;

Modified: branches/salvatoreingala/Gadgets/Gadgets_body.php
===================================================================
--- branches/salvatoreingala/Gadgets/Gadgets_body.php   2011-06-17 15:07:51 UTC 
(rev 90271)
+++ branches/salvatoreingala/Gadgets/Gadgets_body.php   2011-06-17 15:15:37 UTC 
(rev 90272)
@@ -166,42 +166,35 @@
                        return true;
                }
 
-               //Remove gadget-*-config options, since they must not be 
delivered
-               //via mw.user.options like other user preferences
-               $gadgets = Gadget::loadList();
-               
-               if ( !$gadgets ) {
-                       return true;
-               }
-               
-               $existingPrefs = array();
+               //Find out all existing gadget preferences and save them in a 
map
+               $preferencesCache = array();
                foreach ( $options as $option => $value ) {
                        $m = array();
                        if ( preg_match( '/gadget-([a-zA-Z](?:[-_:.\w\d 
]*[a-zA-Z0-9])?)-config/', $option, $m ) ) {
                                $gadgetName = $m[1];
-                               $existingPrefs[$gadgetName] = $value;
+                               $preferencesCache[$gadgetName] = 
FormatJson::decode( $value, true );
                                unset( $options[$option] );
                        }
                }
                
+               //Record preferences for each gadget
+               $gadgets = Gadget::loadList();
                foreach ( $gadgets as $gadget ) {
-                       $prefsDescription = $gadget->getPrefsDescription();
-                       
-                       if ( $prefsDescription === null ) {
-                               continue;
+                       if ( isset( $preferencesCache[$gadget->getName()] ) ) {
+                               if ( $gadget->getPrefsDescription() !== null ) {
+                                       if ( isset( 
$preferencesCache[$gadget->getName()] ) ) {
+                                               $userPrefs = 
$preferencesCache[$gadget->getName()];
+                                       }
+                                       
+                                       if ( !isset( $userPrefs ) ) {
+                                               $userPrefs = array(); //no 
saved prefs (or invalid JSON), use defaults
+                                       }
+                                       
+                                       Gadget::matchPrefsWithDescription( 
$gadget->getPrefsDescription(), $userPrefs );
+                                       
+                                       $gadget->setPrefs( $userPrefs );
+                               }
                        }
-                       
-                       if ( isset( $existingPrefs[$gadget->getName()] ) ) { 
-                               $userPrefs = FormatJson::decode( 
$existingPrefs[$gadget->getName()], true );
-                       }
-                       
-                       if ( !isset( $userPrefs ) ) {
-                               $userPrefs = array(); //no saved prefs, use 
defaults
-                       }
-                       
-                       Gadget::matchPrefsWithDescription( $prefsDescription, 
$userPrefs );
-                       
-                       $gadget->setPrefs( $userPrefs );
                }
                
                return true;
@@ -291,15 +284,10 @@
                        $resourceLoaded = false,
                        $requiredRights = array(),
                        $onByDefault = false,
-                       $category;
+                       $category,
+                       $preferences = null;
 
 
-       //Map from gadget names to preferences of current user.
-       //This is needed because gadget preferences are retrieved and saved
-       //in UserLoadOptions and UserSaveOptions hooks handlers instead than
-       //in Gadget class constructor.
-       private static $preferencesCache = array();
-       
        //Syntax specifications of preference description language
        private static $prefsDescriptionSpecifications = array(
                'boolean' => array(
@@ -736,6 +724,7 @@
                return true; // empty array
        }
 
+
        /**
         * Loads list of gadgets and returns it as associative array of 
sections with gadgets
         * e.g. array( 'sectionnname1' => array( $gadget1, $gadget2),
@@ -748,14 +737,30 @@
                global $wgMemc;
 
                static $gadgets = null;
-               if ( $gadgets !== null && $forceNewText === null ) return 
$gadgets;
+                               
+               if ( $gadgets !== null && $forceNewText === null ) {
+                       return $gadgets;
+               }
 
                wfProfileIn( __METHOD__ );
+
+               $user = RequestContext::getMain()->getUser();
+               if ( $user->isLoggedIn() ) {
+                       //Force loading user options
+                       //HACK: this may lead to loadStructuredList being 
recursively called.
+                       $user->getOptions();
+
+                       //Check again, loadStructuredList may have been called 
from UserLoadOptions hook handler;
+                       //in that case, we should just return current value 
instead of rebuilding the list again.
+                       //TODO: is there a better design?
+                       if ( $gadgets !== null && $forceNewText === null ) {
+                               wfProfileOut( __METHOD__ );
+                               return $gadgets;
+                       }
+               }
+
                $key = wfMemcKey( 'gadgets-definition', 
self::GADGET_CLASS_VERSION );
 
-               //Force loading user options
-               RequestContext::getMain()->getUser()->getOptions();
-
                if ( $forceNewText === null ) {
                        //cached?
                        $gadgets = $wgMemc->get( $key );
@@ -905,7 +910,7 @@
        //Check if a preference is valid, according to description
        //NOTE: we pass both $prefs and $prefName (instead of just 
$prefs[$prefName])
        //      to allow checking for null.
-       private static function checkSinglePref( &$prefDescription, &$prefs, 
$prefName ) {
+       private static function checkSinglePref( $prefDescription, $prefs, 
$prefName ) {
 
                //isset( $prefs[$prefName] ) would return false for null values
                if ( !array_key_exists( $prefName, $prefs ) ) {
@@ -1034,8 +1039,7 @@
         * @return Mixed the array of preferences if they have been set, null 
otherwise.
         */
        public function getPrefs() {
-               $prefs = self::$preferencesCache[$this->getName()];
-               return self::$preferencesCache[$this->getName()];
+               return $this->preferences;
        }
 
        /**
@@ -1065,9 +1069,9 @@
                if ( !self::checkPrefsAgainstDescription( $prefsDescription, 
$prefs ) ) {
                        return false; //validation failed
                }
-               
-               self::$preferencesCache[$this->getName()] = $prefs;
 
+               $this->preferences = $prefs;
+
                if ( $savePrefs ) {
                        $user = RequestContext::getMain()->getUser();
                        $user->saveSettings();
@@ -1115,7 +1119,6 @@
        }
        
        public function getScript( ResourceLoaderContext $context ) {
-               
                $prefs = $this->gadget->getPrefs();
                
                //Enclose gadget's code in a closure, with "this" bound to the


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to