From: Daniel Friesen Date: Thu, 15 Sep 2011 15:47:15 +0000 (+0000) Subject: Implement DerivativeContext. Can be used to inherit context from another context... X-Git-Tag: 1.31.0-rc.0~27639 X-Git-Url: http://git.cyclocoop.org/%22.%24h.%22?a=commitdiff_plain;h=900a0adad944ca6e694dd22d42aa8a2b8a502234;p=lhc%2Fweb%2Fwiklou.git Implement DerivativeContext. Can be used to inherit context from another context while overriding only parts of the context. --- diff --git a/includes/RequestContext.php b/includes/RequestContext.php index 298ab275ca..2d2dc66dd5 100644 --- a/includes/RequestContext.php +++ b/includes/RequestContext.php @@ -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(); + } + } + +} +