X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FAction.php;h=fd4a0a6e2349fbec7d57201badfa0589bb919d59;hb=fd03a2922af901d5c12e1039aed84647efd757f6;hp=5fbb5c70133177320a1433a41af2bb780345e588;hpb=b71927823e7f38bcaa2a098cbc09b82f2e62e54d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Action.php b/includes/Action.php index 5fbb5c7013..fd4a0a6e23 100644 --- a/includes/Action.php +++ b/includes/Action.php @@ -23,27 +23,34 @@ * * @file */ -abstract class Action { +abstract class Action extends ContextSource { - // Page on which we're performing the action - // @var Article + /** + * Page on which we're performing the action + * @var Article + */ 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]; } } @@ -71,8 +76,8 @@ abstract class Action { * @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 ) { + $class = self::getClass( $action, $page->getActionOverrides() ); if ( $class ) { $obj = new $class( $page ); return $obj; @@ -87,79 +92,15 @@ abstract class Action { * @return Bool */ public final static function exists( $name ) { - return self::getClass( $name ) !== null; - } - - /** - * Get the RequestContext in use here - * @return RequestContext - */ - protected final function getContext() { - if ( $this->context instanceof RequestContext ) { - return $this->context; - } - return $this->page->getContext(); - } - - /** - * Get the WebRequest being used for this instance - * - * @return WebRequest - */ - protected final function getRequest() { - return $this->getContext()->request; - } - - /** - * Get the OutputPage being used for this instance - * - * @return OutputPage - */ - protected final function getOutput() { - return $this->getContext()->output; - } - - /** - * Shortcut to get the User being used for this instance - * - * @return User - */ - protected final function getUser() { - return $this->getContext()->user; - } - - /** - * Shortcut to get the Skin being used for this instance - * - * @return Skin - */ - protected final function getSkin() { - return $this->getContext()->skin; - } - - /** - * Shortcut to get the user Language being used for this instance - * - * @return Skin - */ - protected final function getLang() { - return $this->getContext()->lang; - } - - /** - * Shortcut to get the Title object from the page - * @return Title - */ - protected final function getTitle() { - return $this->page->getTitle(); + return self::getClass( $name, array() ) !== null; } /** * Protected constructor: use Action::factory( $action, $page ) to actually build * these things in the real world - * @param Article $page + * @param Page $page */ - protected function __construct( Article $page ) { + protected function __construct( Page $page ) { $this->page = $page; } @@ -184,18 +125,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 +169,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 +179,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 +222,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 +411,4 @@ abstract class FormlessAction extends Action { } } } -} \ No newline at end of file +}