Followup to r64962: Fixed watchlist parameter in API. User options watchdeletions...
[lhc/web/wiklou.git] / includes / api / ApiBase.php
index 1cc1e30..1d31f6f 100644 (file)
@@ -475,8 +475,10 @@ abstract class ApiBase {
                $params = $this->getFinalParams();
                $results = array();
 
-               foreach ( $params as $paramName => $paramSettings ) {
-                       $results[$paramName] = $this->getParameterFromSettings( $paramName, $paramSettings, $parseLimit );
+               if( $params ) { // getFinalParams() can return false
+                       foreach ( $params as $paramName => $paramSettings ) {
+                               $results[$paramName] = $this->getParameterFromSettings( $paramName, $paramSettings, $parseLimit );
+                       }
                }
 
                return $results;
@@ -532,24 +534,62 @@ abstract class ApiBase {
 
                return $mValidNamespaces;
        }
+
        /**
-       * Handle watchlist settings
-       */
-       protected function getWatchlistValue ( $watchlist, $titleObj ) {
+        * Return true if we're to watch the page, false if not, null if no change.
+        * @param $watchlist String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+        * @param $titleObj Title the page under consideration
+        * @param $userOption The user option to consider when $watchlist=preferences. 
+        *      If not set will magically default to either watchdefault or watchcreations
+        * @returns mixed
+        */
+       protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
                switch ( $watchlist ) {
                        case 'watch':
                                return true;
+
                        case 'unwatch':
                                return false;
+
                        case 'preferences':
-                               if ( $titleObj->exists() ) {
-                                       global $wgUser;
-                                       return $wgUser->getOption( 'watchdefault' ) || $titleObj->userIsWatching();
+                               global $wgUser;
+                               # If the user is already watching, don't bother checking
+                               if ( $titleObj->userIsWatching() ) {
+                                       return null;
                                }
-                               return false;
+                               # If no user option was passed, use watchdefault or watchcreation
+                               if ( is_null( $userOption ) ) {
+                                       $userOption = $titleObj->exists() 
+                                               ? 'watchdefault' : 'watchcreations';
+                               }
+                               # If the corresponding user option is true, watch, else no change
+                               return $wgUser->getOption( $userOption ) ? true : null;
+
                        case 'nochange':
+                               return null;
+
                        default:
-                               return $titleObj->userIsWatching();
+                               return null;
+               }
+       }
+
+       /**
+        * Set a watch (or unwatch) based the based on a watchlist parameter.
+        * @param $watch String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+        * @param $titleObj Title the article's title to change
+        * @param $userOption The user option to consider when $watch=preferences
+        */
+       protected function setWatch ( $watch, $titleObj, $userOption = null ) {
+               $value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
+               if( $value === null ) { 
+                       return;
+               }
+
+               $articleObj = new Article( $titleObj );
+               if ( $value ) {
+                       $articleObj->doWatch();
+               } else {
+                       $articleObj->doUnwatch();
                }
        }