Implement DerivativeContext. Can be used to inherit context from another context...
authorDaniel Friesen <dantman@users.mediawiki.org>
Thu, 15 Sep 2011 15:47:15 +0000 (15:47 +0000)
committerDaniel Friesen <dantman@users.mediawiki.org>
Thu, 15 Sep 2011 15:47:15 +0000 (15:47 +0000)
includes/RequestContext.php

index 298ab27..2d2dc66 100644 (file)
@@ -444,3 +444,191 @@ abstract class ContextSource implements IContextSource {
                return call_user_func_array( array( $this->getContext(), 'msg' ), func_get_args() );
        }
 }
+
+/**
+ * An IContextSource implementation which will inherit context from another source
+ * but allow individual pieces of context to be changed locally
+ * eg: A ContextSource that can inherit from the main RequestContext but have
+ *     a different Title instance set on it.
+ */
+class DerivativeContext extends ContextSource {
+
+       /**
+        * @var WebRequest
+        */
+       private $request;
+
+       /**
+        * @var Title
+        */
+       private $title;
+
+       /**
+        * @var OutputPage
+        */
+       private $output;
+
+       /**
+        * @var User
+        */
+       private $user;
+
+       /**
+        * @var Language
+        */
+       private $lang;
+
+       /**
+        * @var Skin
+        */
+       private $skin;
+
+       /**
+        * Constructor
+        * @param $context IContextSource Context to inherit from
+        */
+       public function __construct( IContextSource $context ) {
+               $this->setContext( $context );
+       }
+
+       /**
+        * Set the WebRequest object
+        *
+        * @param $r WebRequest object
+        */
+       public function setRequest( WebRequest $r ) {
+               $this->request = $r;
+       }
+
+       /**
+        * Get the WebRequest object
+        *
+        * @return WebRequest
+        */
+       public function getRequest() {
+               if ( !is_null( $this->request ) ) {
+                       return $this->request;
+               } else {
+                       return $this->getContext()->getRequest();
+               }
+       }
+
+       /**
+        * Set the Title object
+        *
+        * @param $t Title object
+        */
+       public function setTitle( Title $t ) {
+               $this->title = $t;
+       }
+
+       /**
+        * Get the Title object
+        *
+        * @return Title
+        */
+       public function getTitle() {
+               if ( !is_null( $this->title ) ) {
+                       return $this->title;
+               } else {
+                       return $this->getContext()->getTitle();
+               }
+       }
+
+       /**
+        * @param $o OutputPage
+        */
+       public function setOutput( OutputPage $o ) {
+               $this->output = $o;
+       }
+
+       /**
+        * Get the OutputPage object
+        *
+        * @return OutputPage object
+        */
+       public function getOutput() {
+               if ( !is_null( $this->output ) ) {
+                       return $this->output;
+               } else {
+                       return $this->getContext()->getOutput();
+               }
+       }
+
+       /**
+        * Set the User object
+        *
+        * @param $u User
+        */
+       public function setUser( User $u ) {
+               $this->user = $u;
+       }
+
+       /**
+        * Get the User object
+        *
+        * @return User
+        */
+       public function getUser() {
+               if ( !is_null( $this->user ) ) {
+                       return $this->user;
+               } else {
+                       return $this->getContext()->getUser();
+               }
+       }
+
+       /**
+        * Set the Language object
+        *
+        * @param $l Mixed Language instance or language code
+        */
+       public function setLang( $l ) {
+               if ( $l instanceof Language ) {
+                       $this->lang = $l;
+               } elseif ( is_string( $l ) ) {
+                       $l = self::sanitizeLangCode( $l );
+                       $obj = Language::factory( $l );
+                       $this->lang = $obj;
+               } else {
+                       throw new MWException( __METHOD__ . " was passed an invalid type of data." );
+               }
+       }
+
+       /**
+        * Get the Language object
+        *
+        * @return Language
+        */
+       public function getLang() {
+               if ( !is_null( $this->lang ) ) {
+                       return $this->lang;
+               } else {
+                       return $this->getContext()->getLang();
+               }
+       }
+
+       /**
+        * Set the Skin object
+        *
+        * @param $s Skin
+        */
+       public function setSkin( Skin $s ) {
+               $this->skin = clone $s;
+               $this->skin->setContext( $this );
+       }
+
+       /**
+        * Get the Skin object
+        *
+        * @return Skin
+        */
+       public function getSkin() {
+               if ( !is_null( $this->skin ) ) {
+                       return $this->skin;
+               } else {
+                       return $this->getContext()->getSkin();
+               }
+       }
+
+}
+