Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.

Lea Linux:Listsubpages


[Modifier cette page] [Page de discussion]

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

  1. de copier le code ci-dessous dans $MEDIAWIKIROOT/extensions/listsubpages.php
  2. 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 : si orderby 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 .= "<ul>";
                # 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 .= '<li><a href="' .$title->escapeLocalURL() . '">'. 
					$namespace.$myrow[0] . "</a></li>\n";
                }
                $output .= "</ul>";     
        }

         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 .= '<li><a href="' .$title->escapeLocalURL() . '">'. 
-                                       $namespace.$myrow[0] . "</a></li>\n";
+                                       $link_text . "</a></li>\n";
                 }
                 $output .= "</ul>";     
         }
</code multi>
Ajouter un commentaire|Ajouter une section