Extension:BreadCrumbsBar/it
From MediaWiki.org
|
Release status: beta |
|||
|---|---|---|---|
| Implementation | User interface | ||
| Description | Creates a bread crumbs navigation bar | ||
| Author(s) | Alessandra Bilardi (BilardiTalk) | ||
| Last Version | 0.1 (2009-11-26) | ||
| MediaWiki | 1.14.0 or higher (tried and true) | ||
| License | GPL | ||
| Download | no link | ||
| Example | CRIBI Genomics | ||
|
|||
Contents |
[edit] Introduzione
BreadCrumbsBar è una vera barra di navigazione come le estensioni dell'ultimo paragrafo. Queste estensioni usano global $wgUser;.. perciò se setti $wgGroupPermissions['*']['read'] = false; o simili, gli utenti anonimi non hanno la barra di navigazione anche se esiste $wgWhitelistRead.. beh sì, è un caso limite.. ma è la mia situazione.
In più, molti siti wiki hanno un albero di categorie complesso e ciascuna pagina appartiene a più categorie. In questi casi, l'estensione come decide la barra di navigazione? Ho risolto questo problema pensando che ci sono alcune categorie più importanti di altre. Queste potrebbero appartenere a categorie root aggiunte in $wgBreadCrumbsBarRoot.
Nell'esempio limite ho pagine pubbliche e private (due categorie 'root') e ho creato pagine redirect alle pagine delle categorie pubbliche.. perciò necessito di alcune opzioni: se voglio la barra di navigazione sulle pagine speciali (vedi $wgBreadCrumbsBarTitle), se voglio il namespace nel link e/o dell'etichetta di ciascuna categoria (vedi $wgBreadCrumbsBarLink e $wgBreadCrumbsBarLabel) e cosa far vedere come primo link (vedi $wgBreadCrumbsBarHome).
[edit] Commenti e Feedback
Commenti e Feedback nella pagina di discussione (in inglese).
[edit] Impostazioni
In LocalSettings.php aggiungere il codice che segue:
// add BreadCrumbsBar // delimiter between links $wgBreadCrumbsBarDelimiter = ' > '; // categories root names $wgBreadCrumbsBarRoot = 'Site_Map;Archive'; // HTML code about first link omnipresent $wgBreadCrumbsBarHome = '<a href="Main_Page">Home</a>'; // true: all pages have got bar; false: only pages created from users have got bar $wgBreadCrumbsBarTitle = false; // true: all links have got namespace category; false: all links have not got namespace category $wgBreadCrumbsBarLink = true; // true: all links labels have got namespace category; false: all links labels have not got namespace category $wgBreadCrumbsBarLabel = true; require_once("extensions/BreadCrumbsBar/BreadCrumbsBar.php");
In Monobook.php cambiare le linee:
<div id='content'> <a name='top' id='top'></a>
con:
<div id='content'> $BreadCrumbsBar=new BreadCrumbsBar(); $Title=Title::newFromId($this->data['articleid']); echo $BreadCrumbsBar->displayBar($Title); <a name='top' id='top'></a>
Se usi lo skin ltrMenuPlus, allora cambiare le linee:
<div id='content'> <a name='top' id='top'></a>
con:
$BreadCrumbsBar=new BreadCrumbsBar(); $Title=Title::newFromId($this->data['articleid']); echo $BreadCrumbsBar->displayBar($Title); <div id='content'> <a name='top' id='top'></a>
[edit] BreadCrumbsBar.php
<?php /* * BreadCrumbsBar is an extension for providing an * bread crumbs navigation bar. */ //Not a valid entry point, skip unless MEDIAWIKI is defined if (!defined('MEDIAWIKI')) { echo <<<EOT To install my extension, put the following line in LocalSettings.php: require_once( "$IP/extensions/BreadCrumbsBar/BreadCrumbsBar.php" ); EOT; exit( 1 ); } /** * The Credits Extension */ $wgExtensionCredits['parserhook'][] = array( 'name' => 'Bread Crumbs Bar', 'version' => '0.1', 'author' => '[http://www.mediawiki.org/User:Bilardi Alessandra Bilardi]', 'url' => 'http://www.mediawiki.org/wiki/Extension:BreadCrumbsBar', 'description' => "Creates a bread crumb navigation bar." ); /** * Definition of the class */ class BreadCrumbsBar { /** * constructor */ function __construct() { global $wgScript; global $wgBreadCrumbsBarDelimiter, $wgBreadCrumbsBarRoot, $wgBreadCrumbsBarHome, $wgBreadCrumbsBarTitle, $wgBreadCrumbsBarLink, $wgBreadCrumbsBarLabel; /** * This is the configuration file for this extension */ if (is_null($wgBreadCrumbsBarDelimiter)) $wgBreadCrumbsBarDelimiter = ' > '; if (is_null($wgBreadCrumbsBarRoot)) $wgBreadCrumbsBarRoot = 'Site_Map'; if (is_null($wgBreadCrumbsBarHome)) $wgBreadCrumbsBarHome = '<a href="'.$wgScript.'">Home</a>'; if (is_null($wgBreadCrumbsBarTitle)) $wgBreadCrumbsBarTitle = false; if (is_null($wgBreadCrumbsBarLink)) $wgBreadCrumbsBarLink = true; if (is_null($wgBreadCrumbsBarLabel)) $wgBreadCrumbsBarLabel = true; } /** * get categories links and create hash */ private function createHash($dbr) { // Query the database. $res = $dbr->select( array('page', 'categorylinks'), array('page_title', 'page_namespace', 'cl_sortkey', 'cl_to'), 'cl_from = page_id','','' ); if ($res === false) return array_keys(); // Convert the results list into an array. $hash = array_keys(); while ($x = $dbr->fetchObject($res)) { if ($hash[$x->cl_sortkey]) $hash[$x->cl_sortkey] .= ','.$x->cl_to; else $hash[$x->cl_sortkey] = $x->cl_to; //Underconstruction: Make a Title for this item. //$title = Title::makeTitle($l->page_namespace, $l->page_title); } // Free the results. $dbr->freeResult($res); return $hash; } /** * is there root? */ private function isThereRoot($cat,&$hash) { global $wgBreadCrumbsBarRoot; $loop = true; while ($loop) { if (!$cat) return false; if (strstr($wgBreadCrumbsBarRoot,$cat)) return true; $cat = str_replace("_", " ", $cat); if (strstr($hash[$cat],",")) { $matches = explode(",",$hash[$cat]); foreach ($matches as $ct) if ($this->isThereRoot($ct,$hash)) return true; } else $cat = $hash[$cat]; } return true; } /** * get category */ private function getCat($page,&$hash) { $cat = ''; $page = str_replace("_", " ", $page); if (strstr($hash[$page],",")) { $matches = explode(",",$hash[$page]); foreach ($matches as $ct) if ($this->isThereRoot($ct,$hash)) { $cat = $ct; break; } } else { $cat = $hash[$page]; } return $cat; } /** * back root */ private function backRoot($page,&$hash) { global $wgBreadCrumbsBarRoot; $cts = array(); if (strstr($wgBreadCrumbsBarRoot,$page) === false) { $loop = true; while ($loop) { $cat = $this->getCat($page,$hash); if ($cat && strstr($wgBreadCrumbsBarRoot,$cat) === false) { $cts[] = $cat; $page = $cat; } else $loop = false; } } return $cts; } /** * create array of categories */ private function createArray($title) { global $wgBreadCrumbsBarDelimiter, $wgBreadCrumbsBarRoot; // Query the database. $dbr =& wfGetDB(DB_SLAVE); $hash = array_keys(); $matches = array(); $array = array(); $backcat = ''; $hash=$this->createHash($dbr); $page = str_replace("_", " ", $title); $array=$this->backRoot($page,$hash); return $array; } /** * displayBar */ public function displayBar($Title) { global $wgBreadCrumbsBarDelimiter, $wgBreadCrumbsBarRoot, $wgBreadCrumbsBarHome, $wgBreadCrumbsBarTitle, $wgBreadCrumbsBarLink, $wgBreadCrumbsBarLabel; $links = array(); $links = $this->createArray($Title); $bar= ''; foreach ($links as $l) { $l = str_replace("_", " ", $l); if ($wgBreadCrumbsBarLink) $nl = ':Category:'.$l; else $nl = $l; if ($wgBreadCrumbsBarLabel) $l = 'Category:'.$l; $link = '<a href="'.$nl.'">'.$l.'</a>'; $bar = $bar ? $link.' '.$wgBreadCrumbsBarDelimiter.' '.$bar : $link; } //if( get_class( $Title ) !="Title") return ""; if ($Title != "Main Page" && ($wgBreadCrumbsBarTitle || get_class( $Title ) == "Title")) $bar = $bar ? // '<div id="BreadCrumbsBar">'.$wgBreadCrumbsBarHome.' '.$wgBreadCrumbsBarDelimiter.' '.$bar.' '.$wgBreadCrumbsBarDelimiter.' '.$Title.'</div>' '<div id="BreadCrumbsBar">'.$wgBreadCrumbsBarHome.' '.$wgBreadCrumbsBarDelimiter.' '.$bar.'</div>' // : '<div id="BreadCrumbsBar">'.$wgBreadCrumbsBarHome.' '.$wgBreadCrumbsBarDelimiter.' '.$Title.'</div>'; : '<div id="BreadCrumbsBar">'.$wgBreadCrumbsBarHome.'</div>'; return $bar; } }