mediawiki-extensions-Catego.../CategoryTreePage.php

200 lines
5.6 KiB
PHP
Raw Normal View History

<?php
/**
* Special page for the CategoryTree extension, an AJAX based gadget
* to display the category structure of a wiki
*
* @file
* @ingroup Extensions
* @author Daniel Kinzler, brightbyte.de
* @copyright © 2006 Daniel Kinzler
* @license GNU General Public Licence 2.0 or later
*/
class CategoryTreePage extends SpecialPage {
public $target = '';
/**
* @var CategoryTree
*/
public $tree = null;
2008-02-04 09:22:12 +00:00
function __construct() {
parent::__construct( 'CategoryTree', '', true );
}
2008-02-04 09:22:12 +00:00
/**
* @param $name
* @return mixed
*/
function getOption( $name ) {
global $wgCategoryTreeDefaultOptions;
if ( $this->tree ) {
return $this->tree->getOption( $name );
} else {
return $wgCategoryTreeDefaultOptions[$name];
}
}
/**
* Main execution function
* @param $par array Parameters passed to the page
*/
function execute( $par ) {
global $wgCategoryTreeDefaultOptions, $wgCategoryTreeSpecialPageOptions,
$wgCategoryTreeForceHeaders;
2008-02-04 09:22:12 +00:00
$this->setHeaders();
$request = $this->getRequest();
if ( $par ) {
$this->target = $par;
} else {
$this->target = $request->getVal( 'target' );
if ( $this->target === null ) {
$rootcategory = $this->msg( 'rootcategory' );
if ( $rootcategory->exists() ) {
$this->target = $rootcategory->text();
}
}
}
2008-02-04 09:22:12 +00:00
$this->target = trim( $this->target );
2008-02-04 09:22:12 +00:00
$options = [];
2008-02-04 09:22:12 +00:00
# grab all known options from the request. Normalization is done by the CategoryTree class
foreach ( $wgCategoryTreeDefaultOptions as $option => $default ) {
if ( isset( $wgCategoryTreeSpecialPageOptions[$option] ) ) {
$default = $wgCategoryTreeSpecialPageOptions[$option];
}
$options[$option] = $request->getVal( $option, $default );
}
2008-02-04 09:22:12 +00:00
$this->tree = new CategoryTree( $options );
2008-02-04 09:22:12 +00:00
$output = $this->getOutput();
$output->addWikiMsg( 'categorytree-header' );
2008-02-04 09:22:12 +00:00
$this->executeInputForm();
2008-02-04 09:22:12 +00:00
if ( $this->target !== '' && $this->target !== null ) {
if ( !$wgCategoryTreeForceHeaders ) {
CategoryTree::setHeaders( $output );
}
2008-02-04 09:22:12 +00:00
$title = CategoryTree::makeTitle( $this->target );
2008-02-04 09:22:12 +00:00
if ( $title && $title->getArticleID() ) {
$output->addHTML( Xml::openElement( 'div', [ 'class' => 'CategoryTreeParents' ] ) );
$output->addHTML( $this->msg( 'categorytree-parents' )->parse() );
$output->addHTML( $this->msg( 'colon-separator' )->escaped() );
$parents = $this->tree->renderParents( $title );
2008-02-04 09:22:12 +00:00
if ( $parents == '' ) {
$output->addHTML( $this->msg( 'categorytree-no-parent-categories' )->parse() );
} else {
$output->addHTML( $parents );
}
2008-02-04 09:22:12 +00:00
$output->addHTML( Xml::closeElement( 'div' ) );
$output->addHTML( Xml::openElement( 'div', [ 'class' => 'CategoryTreeResult' ] ) );
$output->addHTML( $this->tree->renderNode( $title, 1 ) );
$output->addHTML( Xml::closeElement( 'div' ) );
} else {
$output->addHTML( Xml::openElement( 'div', [ 'class' => 'CategoryTreeNotice' ] ) );
$output->addHTML( $this->msg( 'categorytree-not-found', $this->target )->parse() );
$output->addHTML( Xml::closeElement( 'div' ) );
}
}
}
2008-02-04 09:22:12 +00:00
/**
* Input form for entering a category
*/
function executeInputForm() {
$namespaces = $this->getRequest()->getVal( 'namespaces', '' );
// mode may be overriden by namespaces option
$mode = ( $namespaces == '' ? $this->getOption( 'mode' ) : CategoryTreeMode::ALL );
if ( $mode == CategoryTreeMode::CATEGORIES ) {
$modeDefault = 'categories';
} elseif ( $mode == CategoryTreeMode::PAGES ) {
$modeDefault = 'pages';
} else {
$modeDefault = 'all';
}
$formDescriptor = [
'category' => [
'type' => 'title',
'name' => 'target',
'label-message' => 'categorytree-category',
'namespace' => NS_CATEGORY,
],
'mode' => [
'type' => 'select',
'name' => 'mode',
'label-message' => 'categorytree-mode-label',
'options-messages' => [
'categorytree-mode-categories' => 'categories',
'categorytree-mode-pages' => 'pages',
'categorytree-mode-all' => 'all',
],
'default' => $modeDefault,
'nodata' => true,
],
'namespace' => [
'type' => 'namespaceselect',
'name' => 'namespaces',
'label-message' => 'namespace',
'all' => '',
],
];
$form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
->addHiddenFields( [ 'title' => $this->getPageTitle()->getPrefixedDbKey() ] )
->setWrapperLegendMsg( 'categorytree-legend' )
->setSubmitTextMsg( 'categorytree-go' )
->setMethod( 'get' )
->prepareForm()
->displayForm( false );
}
/**
* Return an array of subpages beginning with $search that this special page will accept.
*
* @param string $search Prefix to search for
* @param int $limit Maximum number of results to return (usually 10)
* @param int $offset Number of results to skip (usually 0)
* @return string[] Matching subpages
*/
public function prefixSearchSubpages( $search, $limit, $offset ) {
$title = Title::newFromText( $search, NS_CATEGORY );
if ( $title && $title->getNamespace() !== NS_CATEGORY ) {
// Someone searching for something like "Wikipedia:Foo"
$title = Title::makeTitleSafe( NS_CATEGORY, $search );
}
if ( !$title ) {
// No prefix suggestion outside of category namespace
return [];
}
// Autocomplete subpage the same as a normal search, but just for categories
$prefixSearcher = new TitlePrefixSearch;
$result = $prefixSearcher->search( $title->getPrefixedText(), $limit, [ NS_CATEGORY ], $offset );
return array_map( function ( Title $t ) {
// Remove namespace in search suggestion
return $t->getText();
}, $result );
}
protected function getGroupName() {
return 'pages';
}
}