From OrganicDesign Wiki
<?php
# Extension:ListView
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]
# - Started: 2008-04-16
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('LISTVIEW_VERSION','0.0.0, 2008-04-16');
$egListViewAction = 'list';
$egRecordTemplatesCat = 'Record_templates'; # DBkey of category that valid record templates are members of
$wgExtensionFunctions[] = 'efSetupListView';
$wgExtensionCredits['other'][] = array(
'name' => 'ListView',
'author' => '[http://www.organicdesign.co.nz/nad User:Nad]',
'description' => 'Allows categories or articles containing lists of article links to be rendered as a sortable list',
'url' => 'http://www.organicdesign.co.nz/Extension:ListView.php',
'version' => LISTVIEW_VERSION
);
function efSetupListView() {
global $wgHooks,$wgOut,$wgUser;
$wgHooks['SkinTemplateTabs'][] = 'efListViewUpdateActions';
$wgHooks['UnknownAction'][] = 'efListViewUnknownAction';
}
function efListViewUpdateActions(&$skin,&$actions) {
global $wgTitle,$wgRequest,$egListViewAction;
$selected = $wgRequest->getText('action') == $egListViewAction ? 'selected' : false;
$url = $wgTitle->getLocalURL("action=$egListViewAction");
if (is_object($wgTitle)) {
$actions[$egListViewAction] = array(
'text' => 'list', # todo: should use wfMsg($egListViewAction)
'class' => $selected,
'href' => $url
);
}
return true;
}
function efListViewUnknownAction($action,&$article) {
global $wgOut,$wgUser,$wgTitle,$wgParser,$wgRequest,$egRecordTemplatesCat,$egListViewAction;
if ($action != $egListViewAction) return true;
# Get the list of titles
if ($wgRequest->getText('template')) {
# Template was specified, list comes from template and query if specified
# - also other parameters incl. query=DPL|SMW
}
else {
# Read the valid links into $links array
$title = $article->getTitle();
if ($title->getNamespace() == NS_CATEGORY) {
$links = array();
$dbr = &wfGetDB(DB_SLAVE);
$cl = $dbr->tableName('categorylinks');
$to = $title->getDbKey();
$res = $dbr->select($cl,'cl_from',"cl_to = '$to'",__METHOD__,array('ORDER BY' => 'cl_sortkey'));
while ($row = $dbr->fetchRow($res)) {
$t = Title::newFromID($row[0]);
$u = $t->getLocalURL();
$t = $t->getPrefixedText();
$links[] = array(1 => "<a title=\"$t\" href=\"$u\">$t</a>");
}
}
else {
if (is_object($wgParser)) { $psr = $wgParser; $opt = $wgParser->mOptions; }
else { $psr = new Parser; $opt = NULL; }
if (!is_object($opt)) $opt = ParserOptions::newFromUser($wgUser);
$html = $psr->parse($article->fetchContent(),$title,$opt,true,true)->getText();
preg_match_all("|<li>\\s*(<a[^>]+title=[\"'](.*?)[\"'][^>]*>(.+?)</a>)|s",$html,$links,PREG_SET_ORDER);
}
}
# Render a generic selection form (a dropdown of all the record types found in Category:Record templates)
# - later add generic query form
$select = '<option selected>Select record type</option>';
$dbr = &wfGetDB(DB_SLAVE);
$cl = $dbr->tableName('categorylinks');
$res = $dbr->select($cl,'cl_from',"cl_to = '$egRecordTemplatesCat'",__METHOD__,array('ORDER BY' => 'cl_sortkey'));
while ($row = $dbr->fetchRow($res)) $select .= '<option>'.(Title::newFromID($row[0])->getText()).'</option>';
$select = "<select name=\"template\">\n$select\n</select>";
$wgOut->addHtml($select);
# Pager
# - todo: add pager links accounting for limit and offset
$pager = '....';
# PreProcess the list
# - get common templates
# - calculate totals
# Get meta information (if any) from templates
# - could be useful to allow record templates to contain parameters for list-view
# Render the list
# - todo: add limit and offset
$wgOut->setPageTitle($title);
$wgOut->addHtml($pager);
$wgOut->addHtml("<table>\n");
$class = 'even';
foreach ($links as $link) {
$class = $class == 'even' ? 'odd' : 'even';
$wgOut->addHtml("<tr class=\"$class\">");
$wgOut->addHtml("<td><input type=\"checkbox\" /></td>");
$wgOut->addHtml("<td>$link[1]</td>");
$wgOut->addHtml("</tr>\n");
}
$wgOut->addHtml($totals);
$wgOut->addHtml("</table>\n");
$wgOut->addHtml($pager);
return false;
}