X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FAction.php;h=655598eedcf9a90583f4c2368862a45f3b5931ac;hb=53f96171cccb378824f8708c3fe41cfb0fcdd62e;hp=5fbb5c70133177320a1433a41af2bb780345e588;hpb=b71927823e7f38bcaa2a098cbc09b82f2e62e54d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Action.php b/includes/Action.php index 5fbb5c7013..655598eedc 100644 --- a/includes/Action.php +++ b/includes/Action.php @@ -25,25 +25,32 @@ */ abstract class Action { - // Page on which we're performing the action - // @var Article + /** + * Page on which we're performing the action + * @var Page + */ protected $page; - // RequestContext if specified; otherwise we'll use the Context from the Page - // @var RequestContext + /** + * IContextSource if specified; otherwise we'll use the Context from the Page + * @var IContextSource + */ protected $context; - // The fields used to create the HTMLForm - // @var Array + /** + * The fields used to create the HTMLForm + * @var Array + */ protected $fields; /** * Get the Action subclass which should be used to handle this action, false if * the action is disabled, or null if it's not recognised * @param $action String + * @param $overrides Array * @return bool|null|string */ - private final static function getClass( $action ) { + private final static function getClass( $action, array $overrides ) { global $wgActions; $action = strtolower( $action ); @@ -53,13 +60,11 @@ abstract class Action { if ( $wgActions[$action] === false ) { return false; - } - - elseif ( $wgActions[$action] === true ) { + } elseif ( $wgActions[$action] === true && isset( $overrides[$action] ) ) { + return $overrides[$action]; + } elseif ( $wgActions[$action] === true ) { return ucfirst( $action ) . 'Action'; - } - - else { + } else { return $wgActions[$action]; } } @@ -67,14 +72,15 @@ abstract class Action { /** * Get an appropriate Action subclass for the given action * @param $action String - * @param $page Article + * @param $page Page + * @param $context IContextSource * @return Action|false|null false if the action is disabled, null * if it is not recognised */ - public final static function factory( $action, Article $page ) { - $class = self::getClass( $action ); + public final static function factory( $action, Page $page, IContextSource $context = null ) { + $class = self::getClass( $action, $page->getActionOverrides() ); if ( $class ) { - $obj = new $class( $page ); + $obj = new $class( $page, $context ); return $obj; } return $class; @@ -87,15 +93,15 @@ abstract class Action { * @return Bool */ public final static function exists( $name ) { - return self::getClass( $name ) !== null; + return self::getClass( $name, array() ) !== null; } /** - * Get the RequestContext in use here - * @return RequestContext + * Get the IContextSource in use here + * @return IContextSource */ - protected final function getContext() { - if ( $this->context instanceof RequestContext ) { + public final function getContext() { + if ( $this->context instanceof IContextSource ) { return $this->context; } return $this->page->getContext(); @@ -106,8 +112,8 @@ abstract class Action { * * @return WebRequest */ - protected final function getRequest() { - return $this->getContext()->request; + public final function getRequest() { + return $this->getContext()->getRequest(); } /** @@ -115,8 +121,8 @@ abstract class Action { * * @return OutputPage */ - protected final function getOutput() { - return $this->getContext()->output; + public final function getOutput() { + return $this->getContext()->getOutput(); } /** @@ -124,8 +130,8 @@ abstract class Action { * * @return User */ - protected final function getUser() { - return $this->getContext()->user; + public final function getUser() { + return $this->getContext()->getUser(); } /** @@ -133,8 +139,8 @@ abstract class Action { * * @return Skin */ - protected final function getSkin() { - return $this->getContext()->skin; + public final function getSkin() { + return $this->getContext()->getSkin(); } /** @@ -142,25 +148,49 @@ abstract class Action { * * @return Skin */ - protected final function getLang() { - return $this->getContext()->lang; + public final function getLanguage() { + return $this->getContext()->getLanguage(); + } + + /** + * Shortcut to get the user Language being used for this instance + * + * @deprecated 1.19 Use getLanguage instead + * @return Skin + */ + public final function getLang() { + wfDeprecated( __METHOD__, '1.19' ); + return $this->getLanguage(); } /** * Shortcut to get the Title object from the page * @return Title */ - protected final function getTitle() { + public final function getTitle() { return $this->page->getTitle(); } + /** + * Get a Message object with context set + * Parameters are the same as wfMessage() + * + * @return Message object + */ + public final function msg() { + $params = func_get_args(); + return call_user_func_array( array( $this->getContext(), 'msg' ), $params ); + } + /** * Protected constructor: use Action::factory( $action, $page ) to actually build * these things in the real world - * @param Article $page + * @param $page Page + * @param $context IContextSource */ - protected function __construct( Article $page ) { + protected function __construct( Page $page, IContextSource $context = null ) { $this->page = $page; + $this->context = $context; } /** @@ -172,8 +202,11 @@ abstract class Action { /** * Get the permission required to perform this action. Often, but not always, * the same as the action name + * @return String|null */ - public abstract function getRestriction(); + public function getRestriction() { + return null; + } /** * Checks if the given user (identified by an object) can perform this action. Can be @@ -184,18 +217,25 @@ abstract class Action { * @throws ErrorPageError */ protected function checkCanExecute( User $user ) { - if ( $this->requiresWrite() && wfReadOnly() ) { - throw new ReadOnlyError(); - } - - if ( $this->getRestriction() !== null && !$user->isAllowed( $this->getRestriction() ) ) { - throw new PermissionsError( $this->getRestriction() ); + $right = $this->getRestriction(); + if ( $right !== null ) { + $errors = $this->getTitle()->getUserPermissionsErrors( $right, $user ); + if ( count( $errors ) ) { + throw new PermissionsError( $right, $errors ); + } } if ( $this->requiresUnblock() && $user->isBlocked() ) { $block = $user->mBlock; throw new UserBlockedError( $block ); } + + // This should be checked at the end so that the user won't think the + // error is only temporary when he also don't have the rights to execute + // this action + if ( $this->requiresWrite() && wfReadOnly() ) { + throw new ReadOnlyError(); + } } /** @@ -221,7 +261,7 @@ abstract class Action { protected function setHeaders() { $out = $this->getOutput(); $out->setRobotPolicy( "noindex,nofollow" ); - $out->setPageTitle( $this->getTitle()->getPrefixedText() ); + $out->setPageTitle( $this->getPageTitle() ); $this->getOutput()->setSubtitle( $this->getDescription() ); $out->setArticleRelated( true ); } @@ -231,6 +271,15 @@ abstract class Action { * * @return String */ + protected function getPageTitle() { + return $this->getTitle()->getPrefixedText(); + } + + /** + * Returns the description that goes below the \ tag + * + * @return String + */ protected function getDescription() { return wfMsg( strtolower( $this->getName() ) ); } @@ -265,6 +314,10 @@ abstract class FormAction extends Action { * @return String HTML which will be sent to $form->addPreText() */ protected function preText() { return ''; } + + /** + * @return string + */ protected function postText() { return ''; } /** @@ -450,4 +503,4 @@ abstract class FormlessAction extends Action { } } } -} \ No newline at end of file +}