diff options
Diffstat (limited to 'includes/specials/SpecialCategories.php')
-rw-r--r-- | includes/specials/SpecialCategories.php | 72 |
1 files changed, 61 insertions, 11 deletions
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php index d01bfd7d..95f9efd2 100644 --- a/includes/specials/SpecialCategories.php +++ b/includes/specials/SpecialCategories.php @@ -26,18 +26,55 @@ */ class SpecialCategories extends SpecialPage { - function __construct() { + /** + * @var PageLinkRenderer + */ + protected $linkRenderer = null; + + public function __construct() { parent::__construct( 'Categories' ); + + // Since we don't control the constructor parameters, we can't inject services that way. + // Instead, we initialize services in the execute() method, and allow them to be overridden + // using the initServices() method. + } + + /** + * Initialize or override the PageLinkRenderer SpecialCategories collaborates with. + * Useful mainly for testing. + * + * @todo the pager should also be injected, and de-coupled from the rendering logic. + * + * @param PageLinkRenderer $linkRenderer + */ + public function setPageLinkRenderer( + PageLinkRenderer $linkRenderer + ) { + $this->linkRenderer = $linkRenderer; + } + + /** + * Initialize any services we'll need (unless it has already been provided via a setter). + * This allows for dependency injection even though we don't control object creation. + */ + private function initServices() { + if ( !$this->linkRenderer ) { + $lang = $this->getContext()->getLanguage(); + $titleFormatter = new MediaWikiTitleCodec( $lang, GenderCache::singleton() ); + $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter ); + } } - function execute( $par ) { + public function execute( $par ) { + $this->initServices(); + $this->setHeaders(); $this->outputHeader(); $this->getOutput()->allowClickjacking(); $from = $this->getRequest()->getText( 'from', $par ); - $cap = new CategoryPager( $this->getContext(), $from ); + $cap = new CategoryPager( $this->getContext(), $from, $this->linkRenderer ); $cap->doQuery(); $this->getOutput()->addHTML( @@ -63,7 +100,19 @@ class SpecialCategories extends SpecialPage { * @ingroup SpecialPage Pager */ class CategoryPager extends AlphabeticPager { - function __construct( IContextSource $context, $from ) { + + /** + * @var PageLinkRenderer + */ + protected $linkRenderer; + + /** + * @param IContextSource $context + * @param string $from + * @param PageLinkRenderer $linkRenderer + */ + public function __construct( IContextSource $context, $from, PageLinkRenderer $linkRenderer + ) { parent::__construct( $context ); $from = str_replace( ' ', '_', $from ); if ( $from !== '' ) { @@ -71,6 +120,8 @@ class CategoryPager extends AlphabeticPager { $this->setOffset( $from ); $this->setIncludeOffset( true ); } + + $this->linkRenderer = $linkRenderer; } function getQueryInfo() { @@ -120,19 +171,18 @@ class CategoryPager extends AlphabeticPager { } function formatRow( $result ) { - $title = Title::makeTitle( NS_CATEGORY, $result->cat_title ); - $titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) ); - $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped(); + $title = new TitleValue( NS_CATEGORY, $result->cat_title ); + $text = $title->getText(); + $link = $this->linkRenderer->renderHtmlLink( $title, $text ); - return Xml::tags( 'li', null, $this->getLanguage()->specialList( $titleText, $count ) ) . "\n"; + $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped(); + return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n"; } public function getStartForm( $from ) { - global $wgScript; - return Xml::tags( 'form', - array( 'method' => 'get', 'action' => $wgScript ), + array( 'method' => 'get', 'action' => wfScript() ), Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . Xml::fieldset( $this->msg( 'categories' )->text(), |