Lea Linux:Listsubpages

De Lea Linux
Aller à la navigation Aller à la recherche

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

<?

  1. This code is copyright (C) by Juho Ville Heikkurinen (2005) and is licensed under the
  2. terms of the GNU General Public License, version 2
  3. (see http://www.fsf.org/licenses/gpl.html). Derivative works and later versions of
  4. the code will also be considered free software licensed under the same terms.
  1. version 0.1.3 Fixed an problem for mediawiki installation using db-prefix
  2. Fix bug with upper and lower case ordering
  3. This version uses the $input parameter to I18N the "This page has xxxx subpages"
  4. This version uses "error" parameter to I18N/customize the error message
  5. Setting "real" path of mediawiki isn't needed any more
  6. This version uses "orderby" parameter to order by 'date' or 'name'
  7. This version uses "ordermode" parameter to order 'asc' or 'desc'
  8. This version uses "max" parameter to limit the shown entries
  9. This version uses "showns" parameter to enable showing the namespace of shown pages
  10. (code from fred@lea-linux.org)
  11. version 0.1.2 Fixed a bug that caused the program to always say that there are no subpages
  12. version 0.1.1 outputs "This page doesn't have any sub-pages" if there are none
  13. version 0.1 Lists all sub-pages if there are any. If there are none it outputs nothing.
  1. TODO (or actually just ideas):
  2. 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 );
       }
       
  1. 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 .= "";

            }