Extension:Hierachy of categories
From MediaWiki.org
|
Hierachy of categories Release status: experimental |
|
|---|---|
| Implementation | Special page |
| Description | Shows dynamically the category structure |
| License | No license specified |
| Download | #Source |
|
Check usage (experimental) |
|
|
|
This extension stores its code inside a wiki page. Please be aware that MediaWiki developers do not review or keep track of extensions that put their code on the wiki.
|
This extension gives an overview about the root, currently 4 levels of sub and the incorrectly (cycles creating) categorized items. In addition the number of associated pages are given.
[edit] Source
copy the following to extensions/Hierachy.php and extensions/SpecialHOC.php respectively
moreover, add the following to lines to your LocalSettings.php:
require_once("extensions/SpecialHOC.php"); include("extensions/Hierachy.php");
[edit] Hierachy.php
<?php /* * @author Christoph Sawade * @date 20.12.2006 */ // no error reporting error_reporting( 0 ); class Hierachy { var $db; function __construct() { $db = &wfGetDB(DB_SLAVE); } function getNumberOfSubpages( $category ) { $query = 'SELECT count(*) FROM categorylinks WHERE cl_to = "' . $category . '"'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) $res[] = $row[0]; return $res[0]; } function getCategories() { $query = 'SELECT DISTINCT cl_to FROM categorylinks;'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) $res[] = $row[0]; return $res; } function getSubCategories( $category ) { // namespace 14 = category $query = 'SELECT page_title FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14 AND cl_to = "' . $category . '"'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) { $res[] = $row[0]; } return $res; } function getAllSubCategories() { // namespace 14 = category $query = 'SELECT page_title FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) { $res[] = $row[0]; } return $res; } function getParentCategories( $category ) { // namespace 14 = category $query = 'SELECT cl_to FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14 AND page_title = "' . $category . '"'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) { $res[] = $row[0]; } return $res; } function getAllParentCategories() { // namespace 14 = category $query = 'SELECT cl_to FROM categorylinks JOIN page on cl_from = page_id WHERE page_namespace=14'; $result = mysql_query($query) or die('Query failed: ' . mysql_error() . "\n"); while ($row = mysql_fetch_array($result)) { $res[] = $row[0]; } return $res; } function getRootCategories() { return array_diff($this->getCategories(), $this->getAllSubCategories()); } }
[edit] SpecialHOC.php
<?php /* * @author Christoph Sawade */ /* Log: * * 04.01.2007 1.0.2 * - remove underscores * - extend credit * * 26.12.2006 1.0.1 * - recursive category building * - memorize items with higer level (avoid cycles), mark wrong categorized items * - legend * * 20.12.2006 1.0.0 * - first version */ if (!defined('MEDIAWIKI')) die(); $wgExtensionFunctions[] = "HOC"; $wgExtensionCredits['specialpage'][] = array( 'name' => 'Hierachy of Categories', 'description' => 'shows dynamically the category structure', 'url' => 'http://www.mediawiki.org/wiki/Extension:Hierachy_of_categories', 'author' => 'Christoph Sawade', 'version' => '1.0.1' ); function HOC() { global $IP, $wgMessageCache; require_once( "$IP/includes/SpecialPage.php" ); require_once( "Hierachy.php" ); class HOC extends SpecialPage { function HOC() { SpecialPage::SpecialPage( 'HOC' ); $this->includable( true ); } function execute() { global $wgOut, $wgRequest, $wgUser; $color = array("-1" => "#FF0000", "#7777FF", "#55AA55", "#77CC77","#BBFFBB", "#FFFFFF"); $coldef = array("-1" => "incorrectly categorized", "Root Category", "Subcategory Level 1", "Subcategory Level 2", "Subcategory Level 3", "Subcategory Level 4"); $this->setHeaders(); $wgOut->setPagetitle('Hierachy of Categories'); $out = $question; $Hrch = new Hierachy(); $root = $Hrch->getRootCategories(); // categories $out .= '<table border = "0"><tr align="left">'; // rootcategories foreach ($root as $item) { $subcat[$item] = $this->getList($item, 0); $out .= $this->getBoxText($item, $color[0], $subcat[$item][0][article], $subcat[$item][0][subcategories]); } $out .= '</tr>'; // subcategories $change = true; $i = 0; while ($change) { $i++; $change = false; $out .= '<tr align="left">'; foreach($root as $r) { $item = $subcat[$r][$i]; if (isset($item)) { $change = true; $out .= $this->getBoxText($item[name], $color[$item[level]], $item[article],$item[subcategories]); } else $out .= '<td width="10%" />'; } $out .= '</tr>'; } $out .= '</table>'; // legend $out .= '<table border="0">'; foreach ($color as $key => $c) $out .= '<tr align="left"><td width = "20px" height = "20px" bgcolor="'.$c.'"></td> <td>' . $coldef[$key] . '</td></tr>'; $out .= '</table>'; $wgOut->addHTML($out); } function getBoxText($cat, $color, $art, $subcat) { $info = '<th width="10%" bgcolor="' . $color . '"><a href="/w/Category:' . $cat . '" style="color: #000000;">' . str_replace('_', ' ', $cat) . '</a><font size="-5">'; if ($art != -1) $info .= '<br />Articles: ' . $art; if ($subcat != -1) $info .= '<br />Subcategories: ' . $subcat; return $info . '</font></th>'; } function getList($cat, $level, $err = array()) { $Hrch = new Hierachy(); $sc = $Hrch->getSubCategories($cat); $list[] = array("name" => $cat, "level" => $level, "article" => $Hrch->getNumberOfSubpages($cat) - count($sc), "subcategories" => count($sc)); foreach ($sc as $item) { if (in_array($item, $err)) $list[] = array("name" => $item, "level" => "-1", "article" => -1, "subcategories" => -1); else $list = array_merge($list, $this->getList($item, $level + 1, array_merge($err, array($item)))); } return $list; } } SpecialPage::addPage( new HOC ); $wgMessageCache->addMessage('hoc' ,'Hierachy of Categories'); }