Wikini

RenommerUnePage

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-54-81-166-199.compute-1.amazonaws.com

Renommer une page


Qu'en pensez-vous... ? -- PatrickPaul

Le grand interet de la chose (AMHA) : corriger une faute d'orthographe !
-- Emmanuel C

Oui, pour l'instant il est toujours possible de supprimer une page après avoir sauvegardé son contenu puis d'en créer une nouvelle avec le contenu sauvegardé.
-- DavidDelon

D'accord mais que deviennent les liens vers la page ? Et aussi je vise l'utilisateur "moyen" voir "newbie"...
-- PatrickPaul

En fait, seules les pages orphelines peuvent etre supprimées, donc pas de lien vers la page. Sinon, pour moi pas de problème pour une fonction "renommer page" ... -- DavidDelon

Il existe une action rename.php chez Wacko. Evitons de réinventer la roue. Hélas , je n'ai pas la connaissance suffisante de php pour la transplanter -- FidelioEspoir


Outil d'administration : Renommer une page


D'un point de vue purement pratique j'avais besoin de pouvoir renommer des pages.
J'ai donc mis en place une page AdministrationDuSite? chez moi avec le tag {{RenamePage}}

Au niveau droits, personnellement je trouve qu'il faut rester très très simple.
Du coup je me suis fait une page AdministrationDuSite?, avec seulement l'accès autorisés en lecture à certaines personnes (ou groupes si vous avez des groupes).
Du coup, la validation sur les autres pages d'admin se fait tout simplement en vérifiant que l'utilisateur en cours, si jamais il utilisait le handler directement, a bel et bien accès en lecture à cette page AdministrationDuSite?. C'est beaucoup moins poussé et élégant que les notions que vous évoquez d'administrateurs techniques, fonctionnels, de droits d'accès à ces fonctions,etc cell phone spare parts., mais çà marche et c'est rapide à mettre en place (et çà me suffit largement).

Mettre dans actions/ une page renamepage.php
<?php

  
// File : exportdb.php
  // Written by SergiO

  
$strings['fr']['S_RENAME_PAGE'] = 'Renommer la page';
  
$strings['fr']['S_FROM'] = 'Downloader';
  
$strings['fr']['S_TO'] = 'en';
  
$strings['fr']['S_RENAME'] = 'Renommer';
  
  
$strings['fr']['S_NO_ADMIN'] = "Vous n'&ecirc;tes pas autoris&eacute; &agrave; lire cette page";
  

  
// === Array set to current strings definitions with the current selected language
  //    (this array is to be used later like this : $lng_strings['STRING_LABEL'])
  
$lng_strings $strings['fr']; // strtolower($this->GetConfigValue('language'))

//  print_r($this->LoadAllPages());
  // === Begining of this script ...
  
$result "<form action=\"".$this->href('renamepage',$this->GetPageTag(),"")."\" method=\"post\">\n";
  print 
"
    <table cellpadding=\"0\" cellspacing=\"0\">
      <tr>
        <td>
          <strong>$lng_strings[S_RENAME_PAGE]</strong>&nbsp<br />
        </td>
        <td colspan='4' valign='top' align='right' nowrap>
          $result
          <select name=\"input_old_pagename\" style=\"padding: 0px; margin: 0px; font-size: 10px\">"
;
  
  
/// === Affichage de toutes les pages
  
foreach ($this->LoadAllPages() as $page)
  {
    if ( ! 
eregi('^comment'$page[tag]) )
    {
      print 
"<option name=\"\">" $page[tag];
    }
  }
  
//
  
print "
          </select>
          &nbsp;$lng_strings[S_TO]&nbsp;
          <input name=\"input_new_pagename\" value=\"\" type=\"text\" size=\"25\" cols=\"25\" style=\"padding: 0px; margin: 0px; font-size: 10px\">&nbsp;
          <input name=\"submit_rename_page\" type=\"submit\" value=\" $lng_strings[S_RENAME] \" style=\"padding: 0px; margin: 0px; font-size: 10px\">
          "
.$this->FormClose()."
        </td>
      </tr>
    </table>"
;

?>

et dans handlers/page une autre page renamepage.php (oui, le même nom !) :
<?php
/*
renamepage.php

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

//vérification de sécurité
if (!eregi("wakka.php"$_SERVER['PHP_SELF'])) {
    die (
"acc&egrave;s direct interdit");
}
echo 
$this->Header();
?>
<div class="page">
<?php


  
if ( $this->HasAccess('+''AdministrationDuSite'$this->GetUserName()) )
  {
  
    
$old_pagename $_POST['input_old_pagename'];
    
$new_pagename $_POST['input_new_pagename'];

    
$ok TRUE;

    
// Is old_pagename really in DB ?
    
$res $this->Query("select count(*) from ".$this->config["table_prefix"]."pages where tag = '".mysql_escape_string($old_pagename)."' ");
    if ( 
mysql_result($res0) == 0)
    {
      echo 
$this->Format("**Erreur !** La page demandée **$old_pagename** n'a pas été retrouvée dans la base.");
      
$ok FALSE;
    }
    else 
    { 
      
// Is new_pagename blank or incorrect ?
      
if ( empty($new_pagename) || ! isset($new_pagename) )
      {
        echo 
"<b>Erreur !</b> Le nom de page cible est vide.<br />";
        
$ok FALSE;
      }
      else
      {
        if ( ! 
$this->IsWikiName($new_pagename) )
        {
          echo 
$this->Format("**Erreur !** Le nom de page cible est n'est pas un nom WiKi conforme.");
          echo 
"<br />";
          echo 
$this->Format("Pour rappel, un nom WiKi conforme doit se composer d'au moins deux majuscules.");
          
$ok FALSE;
        }
        else
        {
          
// Is new pagename already in DB
          
$res $this->Query("select count(*) from ".$this->config["table_prefix"]."pages where tag = '".mysql_escape_string($new_pagename)."' ");
          if ( 
mysql_result($res0) != 0)
          {
            echo 
$this->Format("**Erreur !** Le nom de la nouvelle page demandée **$new_pagename** existe déjà.");
            
$ok FALSE;
          }
          else
          {
            
// Is new pagename part of another wikki name ?
            
$res $this->Query("select count(*) from ".$this->config["table_prefix"]."pages where tag like '".mysql_escape_string($new_pagename)."%' ");
            if ( 
mysql_result($res0) != 0)
            {
              echo 
$this->Format("**Erreur !** Le nom de la nouvelle page demandée **$new_pagename** existe déjà comme racine d'une ou plusieurs autres pages. De ce fait, le renommage modifierait également ces autres pages !");
              echo 
"<br /><br />";
              echo 
$this->Format("Les pages concernées sont :");
              
$res $this->Query("select * from ".$this->config["table_prefix"]."pages where tag like '".mysql_escape_string($new_pagename)."%' ");
              while ( 
$other_page mysql_fetch_array($res) )
              {
                echo 
$this->Format("  - " $other_page['tag']);
              }
              echo 
"<br />";
              echo 
$this->Format("Veuillez supprimer les pages en question ou choisir un autre nom cible pour la page à renommer.");

              
$ok FALSE;
            }

          }

        }
      }
    }

    if ( 
$ok )
    {
      echo 
"Vous avez demandé à renommer la page <b>$old_pagename</b> en <b>$new_pagename</b>.";
      echo 
"<br /><br />";
      echo 
"Opérations en cours ... <br />";
      echo 
"<ul>";

      
      echo 
"<li>Renommage des droits en cours ... ";
      
$sql "update " $this->config["table_prefix"]."acls set page_tag = '".mysql_escape_string($new_pagename)."' where page_tag = '".mysql_escape_string($old_pagename)."' ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées.';
      
      
      echo 
"<li>Renommage des liens entre pages cours ... ";
      
$sql "update " $this->config["table_prefix"]."links set from_tag = '".mysql_escape_string($new_pagename)."' where from_tag = '".mysql_escape_string($old_pagename)."' ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées + ';
      
$sql "update " $this->config["table_prefix"]."links set to_tag = '".mysql_escape_string($new_pagename)."' where to_tag = '".mysql_escape_string($old_pagename)."' ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées.';
      
      
      echo 
"<li>Renommage du nom des pages en cours ... ";
      
$sql "update " $this->config["table_prefix"]."pages set tag = '".mysql_escape_string($new_pagename)."' where tag = '".mysql_escape_string($old_pagename)."' ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées.';
      
      
      echo 
"<li>Reaffectation des commentaires sur les bonnes pages en cours ... ";
      
$sql "update " $this->config["table_prefix"]."pages set comment_on = '".mysql_escape_string($new_pagename)."' where comment_on = '".mysql_escape_string($old_pagename)."' ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées.';
      
      
      echo 
"<li>Renommage du contenu des pages en cours ... ";
      
$sql "update " $this->config["table_prefix"]."pages set body = REPLACE(body,'" mysql_escape_string($old_pagename) . "','" mysql_escape_string($new_pagename) . "') ";
      
$res $this->Query($sql);
      echo 
'<b>' . @mysql_affected_rows($this->dblink) . '</b> pages modifiées.';
      
      
      echo 
"</ul>";

    }
  }
  else
  {
    echo 
$this->Format("**Erreur !** Vous n'avez pas accès à cette page");
    
$ok FALSE;
  }
  echo 
"<br /><br />";
  echo 
$this->Format("Retour à la page ".$this->GetPageTag());

?>
</div>
<?php echo $this->Footer(); ?>


Lors de la demande de renommage on vérifie :
- que la page source est bien dans la base ;
- que la page cible n'existe pas déjà / a un nom valide (non-vide et nom WiKi) ;

Ca marche bien ... le seul problème est le REPLACE dans la base, car si je renomme une page MaPage par PageToto alors qu'il y a parfois des mots comme MaPageEnCours, je vais me retrouver avec PageTotoEnCours (ce qui n'est pas le comportement attendu, à priori). Une idée sur ce point ?
Ajout : finalement, je vérifie simplement qu'il n'y ait pas déjà une page avec une racine commune (le cas devrait être relativement rare auquel cas je demande de choisir un autre nom cible.

-- Sergio

Réponse au problème de la racine commune: on peut obtenir facilement de ne remplacer que des mots "entiers": ie entourés par des caractères qui ne font pas partie du mot. Dans une expression régulière, ça peut ressembler à [^A-Za-z0-9] avant et après le mot.

-- RipouneT

le problème, c'est quand quand on utilise la fonction "Attach file" pour insérer des images dans les pages, les images ne suivent pas lors du renommage !

Y a une solution ?

Il y a aussi un problème au niveau des modifications à l'intérieur des fonctions .
J'avais une page nommée ToC?? que j'ai renommé en ListePages??
Ma fonction "Trail toc=toc" est devenue "Trail ListePages??=Listepages"
AnDre
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]