« Lea Linux:Listsubpages » : différence entre les versions
m (problème avec le cache de médiawiki) |
m (Uniformisation du tag pour encadrer le code) |
||
(11 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
= Description = | = Description = | ||
[[Catégorie:Extension mediawiki]] | |||
[[Catégorie:Script PHP]] | |||
Cette extension '''ListSubPages''', permet d'afficher pour la page sur laquelle elle est utilisée, la liste de toutes les sous pages de celle-ci. | Cette extension '''ListSubPages''', permet d'afficher pour la page sur laquelle elle est utilisée, la liste de toutes les sous pages de celle-ci. | ||
= Installation = | |||
C'est simple, il suffit | |||
# de copier le code ci-dessous dans <code>$MEDIAWIKIROOT/extensions/listsubpages.php</code> | |||
# d'ajouter dans le fichier <code>$MEDIAWIKIROOT/LocalSettings.php</code> la ligne : <code>include_once "extensions/listsubpages.php" ;</code> | |||
= Syntaxe mediawiki = | |||
Syntaxe : <code><listsubpages [paramètres]>[entête]</listsubpages></code><br /> | Syntaxe : <code><listsubpages [paramètres]>[entête]</listsubpages></code><br /> | ||
Où : | Où : | ||
Ligne 10 : | Ligne 18 : | ||
** <code>ordermode=asc|desc</code> : si <code>orderby</code> est spécifié et valide, <code>ordermode</code> précise s'il faut utiliser l'ordre croissant (''asc'') ou décroissant (''desc''), | ** <code>ordermode=asc|desc</code> : si <code>orderby</code> est spécifié et valide, <code>ordermode</code> précise s'il faut utiliser l'ordre croissant (''asc'') ou décroissant (''desc''), | ||
** <code>max=...</code> : indique le nombre maximum d'entrées à afficher, | ** <code>max=...</code> : indique le nombre maximum d'entrées à afficher, | ||
** <code>nocache</code> : force mediawiki à regénérer cette page à chaque chargement. | |||
* [entête] est un message annonçant les différentes sous pages. Dans cette chaine, l'utilisation de ''%1'' affiche le nombre d'entrées. | * [entête] est un message annonçant les différentes sous pages. Dans cette chaine, l'utilisation de ''%1'' affiche le nombre d'entrées. | ||
=== Exemple === | |||
<code><listsubpages showns orderby=name error=''>Cette page contient %1 sous pages</listsubpages></code> | |||
Affichera la liste des sous page avec leur espace de nom classée par "nom", aucun message d'erreur si cette page n'a pas de sous page. | |||
= Code = | = Code = | ||
<code multi> | <code multi> | ||
Ligne 20 : | Ligne 34 : | ||
# version 0.1.3 Fixed an problem for mediawiki installation using db-prefix | # version 0.1.3 Fixed an problem for mediawiki installation using db-prefix | ||
# Fix bug with upper and lower case ordering | |||
# This version uses the $input parameter to I18N the "This page has xxxx subpages" | # This version uses the $input parameter to I18N the "This page has xxxx subpages" | ||
# This version uses "error" parameter to I18N/customize the error message | # This version uses "error" parameter to I18N/customize the error message | ||
Ligne 31 : | Ligne 46 : | ||
# version 0.1.1 outputs "This page doesn't have any sub-pages" if there are none | # version 0.1.1 outputs "This page doesn't have any sub-pages" if there are none | ||
# version 0.1 Lists all sub-pages if there are any. If there are none it outputs nothing. | # version 0.1 Lists all sub-pages if there are any. If there are none it outputs nothing. | ||
# TODO (or actually just ideas): | # TODO (or actually just ideas): | ||
Ligne 56 : | Ligne 64 : | ||
global $wgTitle; | global $wgTitle; | ||
global $wgContLang; | global $wgContLang; | ||
$dbr =& wfGetDB( | $dbr =& wfGetDB( DB_SLAVE ); | ||
$output =""; #initialise output variable | $output =""; #initialise output variable | ||
$title = $wgTitle->getDBkey(); #get the pagename (without namespace) | $title = $wgTitle->getDBkey(); #get the pagename (without namespace) | ||
Ligne 68 : | Ligne 76 : | ||
if ($argv['orderby'] == 'name') { | if ($argv['orderby'] == 'name') { | ||
$order = 'ORDER BY page_title '.$ordertype ; | $order = 'ORDER BY LOWER(page_title) '.$ordertype ; | ||
} elseif ($argv['orderby'] == 'date') { | } elseif ($argv['orderby'] == 'date') { | ||
$order = 'ORDER BY page_touched '.$ordertype ; | $order = 'ORDER BY page_touched '.$ordertype ; | ||
Ligne 132 : | Ligne 140 : | ||
Cette extension est directement dérivée de celle écrite par : [http://meta.wikimedia.org/wiki/User:Juxo Juxo] | Cette extension est directement dérivée de celle écrite par : [http://meta.wikimedia.org/wiki/User:Juxo Juxo] | ||
disponible [http://meta.wikimedia.org/wiki/User:Juxo/Extensions/ListSubPages ici] | disponible [http://meta.wikimedia.org/wiki/User:Juxo/Extensions/ListSubPages ici] | ||
= Améliorations = | |||
J'ai apporté quelques améliorations à l'extension : | |||
* Ne liste pas les pages d'origine d'une page renommée | |||
* Affiche uniquement le nom de la sous-page sans la partie redondante de la page mère | |||
* Protège le guillemet simple, sinon un titre comportant un tel caractère provoque une erreur SQL | |||
Voici la patch : | |||
<code multi> | |||
--- listsubpages.php.orig 2007-02-14 13:09:26.000000000 -0500 | |||
+++ listsubpages.php 2007-02-14 13:01:05.000000000 -0500 | |||
@@ -59,8 +59,9 @@ | |||
} else { | |||
$limit = '' ; | |||
} | |||
- | |||
- $sql = "SELECT page_title FROM ".$dbr->tableName( 'page' )." where page_namespace='". $ns ."' and page_title LIKE '". $title."/%' ".$order.$limit; | |||
+ # Escape ' with \' to prevent SQL error when there are "'" caracter in the title | |||
+ $title = str_replace("'","\'",$title); | |||
+ $sql = "SELECT page_title FROM ".$dbr->tableName( 'page' )." where page_namespace='". $ns ."' and page_is_redirect='0' and page_title LIKE '". $title."/%' ".$order.$limit; | |||
$res = $dbr->query( $sql); | |||
$rowCount = $dbr->numRows($res); | |||
if ($rowCount == 0) { | |||
@@ -77,10 +78,15 @@ | |||
# (above comment by TimStarling) I suppose that $wgTitle->getDBkey(); gives the title encoded. | |||
$namespace = ($argv['showns']?$wgContLang->getNsText($ns).':':'') ; | |||
while ( $myrow = $dbr->fetchRow( $res ) ) { | |||
+ // Remove common prefix of sub-pages, before de first "/" | |||
+ $link_text_array = explode("/", $myrow[0]); | |||
+ $link_text_array[0] = ''; | |||
+ $link_text = implode("/", $link_text_array); | |||
+ | |||
$title = Title::newFromText($myrow[0], $ns ) ; | |||
if (is_object($title)) // may be useless but, just in case ... | |||
$output .= '<li><a href="' .$title->escapeLocalURL() . '">'. | |||
- $namespace.$myrow[0] . "</a></li>\n"; | |||
+ $link_text . "</a></li>\n"; | |||
} | |||
$output .= "</ul>"; | |||
} | |||
</code multi></code> |
Dernière version du 14 février 2007 à 19:18
Description
Cette extension ListSubPages, permet d'afficher pour la page sur laquelle elle est utilisée, la liste de toutes les sous pages de celle-ci.
Installation
C'est simple, il suffit
- de copier le code ci-dessous dans
$MEDIAWIKIROOT/extensions/listsubpages.php
- d'ajouter dans le fichier
$MEDIAWIKIROOT/LocalSettings.php
la ligne :include_once "extensions/listsubpages.php" ;
Syntaxe mediawiki
Syntaxe : <listsubpages [paramètres]>[entête]</listsubpages>
Où :
- [paramètres] est une combinaison de :
showns
: affiche les espaces de nom avec le nom des pages,error='...'
: si aucune sous page n'est trouvée, affiche le message d'erreur spécifié au lieu de celui par défaut, préciser : '' comme message d'erreur pour le désactiver,orderby=name|date
: affiche les sous pages triées par nom (name) ou par date d'édition (date),ordermode=asc|desc
: siorderby
est spécifié et valide,ordermode
précise s'il faut utiliser l'ordre croissant (asc) ou décroissant (desc),max=...
: indique le nombre maximum d'entrées à afficher,nocache
: force mediawiki à regénérer cette page à chaque chargement.
- [entête] est un message annonçant les différentes sous pages. Dans cette chaine, l'utilisation de %1 affiche le nombre d'entrées.
Exemple
<listsubpages showns orderby=name error=>Cette page contient %1 sous pages</listsubpages>
Affichera la liste des sous page avec leur espace de nom classée par "nom", aucun message d'erreur si cette page n'a pas de sous page.
Code
<?
- This code is copyright (C) by Juho Ville Heikkurinen (2005) and is licensed under the
- terms of the GNU General Public License, version 2
- (see http://www.fsf.org/licenses/gpl.html). Derivative works and later versions of
- the code will also be considered free software licensed under the same terms.
- version 0.1.3 Fixed an problem for mediawiki installation using db-prefix
- Fix bug with upper and lower case ordering
- This version uses the $input parameter to I18N the "This page has xxxx subpages"
- This version uses "error" parameter to I18N/customize the error message
- Setting "real" path of mediawiki isn't needed any more
- This version uses "orderby" parameter to order by 'date' or 'name'
- This version uses "ordermode" parameter to order 'asc' or 'desc'
- This version uses "max" parameter to limit the shown entries
- This version uses "showns" parameter to enable showing the namespace of shown pages
- (code from fred@lea-linux.org)
- version 0.1.2 Fixed a bug that caused the program to always say that there are no subpages
- version 0.1.1 outputs "This page doesn't have any sub-pages" if there are none
- version 0.1 Lists all sub-pages if there are any. If there are none it outputs nothing.
- TODO (or actually just ideas):
- 1) Enable the use of regular expressions to limit subpages to be viewed
$wgExtensionFunctions[] = "wfListSubPages";
function wfListSubPages ()
{
global $wgParser ;
global $wgTitle;
$wgParser->setHook ( "ListSubPages" , parse_subs );
}
- First extension written from scratch
function parse_subs ($input, $argv)
{
global $wgTitle;
global $wgContLang;
$dbr =& wfGetDB( DB_SLAVE );
$output =""; #initialise output variable
$title = $wgTitle->getDBkey(); #get the pagename (without namespace)
$ns = $wgTitle->getNamespace(); # get the namespace as a number
if (($argv['ordermode'] == 'asc') || ($argv['ordermode'] == 'desc')) {
$ordertype = $argv['ordermode'] ;
} else {
$ordertype = ;
}
if ($argv['orderby'] == 'name') {
$order = 'ORDER BY LOWER(page_title) '.$ordertype ;
} elseif ($argv['orderby'] == 'date') {
$order = 'ORDER BY page_touched '.$ordertype ;
} else {
$order = ;
}
if ($argv['max']) {
$limit = ' LIMIT '.(int)$argv['max'] ;
} else {
$limit = ;
}
$sql = "SELECT page_title FROM ".$dbr->tableName( 'page' )." where page_namespace='". $ns ."' and page_title LIKE '". $title."/%' ".$order.$limit;
$res = $dbr->query( $sql);
$rowCount = $dbr->numRows($res);
if ($rowCount == 0) {
if ($argv["error"])
return $argv["error"] ;
else
return "This page doesn't have any sub-pages";
}
else {
$output = str_replace("%1", $rowCount, $input);
$output .= "
";
# Make sure $ns is definitely a number and $title is encoded with wfStrencode()
# (above comment by TimStarling) I suppose that $wgTitle->getDBkey(); gives the title encoded.
$namespace = ($argv['showns']?$wgContLang->getNsText($ns).':':) ;
while ( $myrow = $dbr->fetchRow( $res ) ) {
$title = Title::newFromText($myrow[0], $ns ) ;
if (is_object($title)) // may be useless but, just in case ...
$output .= '- <a href="' .$title->escapeLocalURL() . '">'.
$namespace.$myrow[0] . "</a>
\n";
}
$output .= "
";
}
if ($argv['nocache']) {
# Do not cache this wiki page.
# for details see http://public.kitware.com/Wiki/User:Barre/MediaWiki/Extensions
global $wgTitle, $wgDBprefix;
global $wgVersion;
$ts = mktime();
$now = gmdate("YmdHis", $ts + 120);
$ns = $wgTitle->getNamespace();
$ti = wfStrencode($wgTitle->getDBkey());
$version = preg_replace("/^([1-9]).([1-9]).*/", "\\1\\2", $wgVersion);
if ($version>14) $sql = "UPDATE $wgDBprefix"."page SET page_touched='$now' WHERE page_namespace=$ns AND page_title='$ti'";
else $sql = "UPDATE $wgDBprefix"."cur SET cur_touched='$now' WHERE cur_namespace=$ns AND cur_title='$ti'";
wfQuery($sql, DB_WRITE, "");
}
return $output;
}
?>
Code original
Cette extension est directement dérivée de celle écrite par : Juxo disponible ici
Améliorations
J'ai apporté quelques améliorations à l'extension :
- Ne liste pas les pages d'origine d'une page renommée
- Affiche uniquement le nom de la sous-page sans la partie redondante de la page mère
- Protège le guillemet simple, sinon un titre comportant un tel caractère provoque une erreur SQL
Voici la patch :
--- listsubpages.php.orig 2007-02-14 13:09:26.000000000 -0500
+++ listsubpages.php 2007-02-14 13:01:05.000000000 -0500
@@ -59,8 +59,9 @@
} else {
$limit = ;
}
-
- $sql = "SELECT page_title FROM ".$dbr->tableName( 'page' )." where page_namespace='". $ns ."' and page_title LIKE '". $title."/%' ".$order.$limit;
+ # Escape ' with \' to prevent SQL error when there are "'" caracter in the title
+ $title = str_replace("'","\'",$title);
+ $sql = "SELECT page_title FROM ".$dbr->tableName( 'page' )." where page_namespace='". $ns ."' and page_is_redirect='0' and page_title LIKE '". $title."/%' ".$order.$limit;
$res = $dbr->query( $sql);
$rowCount = $dbr->numRows($res);
if ($rowCount == 0) {
@@ -77,10 +78,15 @@
# (above comment by TimStarling) I suppose that $wgTitle->getDBkey(); gives the title encoded.
$namespace = ($argv['showns']?$wgContLang->getNsText($ns).':':) ;
while ( $myrow = $dbr->fetchRow( $res ) ) {
+ // Remove common prefix of sub-pages, before de first "/"
+ $link_text_array = explode("/", $myrow[0]);
+ $link_text_array[0] = ;
+ $link_text = implode("/", $link_text_array);
+
$title = Title::newFromText($myrow[0], $ns ) ;
if (is_object($title)) // may be useless but, just in case ...
$output .= '
<a href="' .$title->escapeLocalURL() . '">'.
- $namespace.$myrow[0] . "</a>
\n";
+ $link_text . "</a>\n";
}
$output .= "";
}