Wikini

DiscussionsActionRechercherRemplacer

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-3-145-97-248.us-east-2.compute.amazonaws.com
[à compléter]

Le développement de cette action n'est pas simple... je pense qu'on pourrait envisager dans un premier temps une version simple qui pourrait adopter l'une des solutions suivantes :
Qu'en pensez-vous ?
-- CharlesNepote

Version 0.1.0 en pre-pre-pre-alpha.
<?php
/*

Permet d'effectuer un rechercher/remplacer chirurgical

Copyright 2005 Charles Nepote

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
*/

/* Paramètres :
 -- page : nom wiki de la page a inclure (obligatoire)
 -- class : nom de la classe de style à inclure (facultatif)
*/ 


// Version 0.1.0 du 27/02/2005 à 21:32.

// TODO
// --

// Vérification de sécurité
if (!defined('WIKINI_VERSION'))
{
    die (
'acc&egrave;s direct interdit');
}


echo    
"\n<!-- == Action replace v 0.1.0 ============================= -->\n";
// La norme HTML interdit la balise style ailleurs que dans <head></head>
// on l'utilise ici à titre de débogage et pendant la construction de l'action
echo    "<style type=\"text/css\">",
    
"p { margin: 0; }",
    
".action_erasespam { background-color: yellow; }",
    
".action_erasespam td { text-align: right; vertical-align: top; }",
    
"</style>\n";


// Contrôle d'accès à cette action
/*
if (!$this->GetUser() == "CharlesNepote")
{
    echo    "<p class =\"action_erasespam\">",
        "Vous n'êtes pas autorisé à utiliser cette action.</p>";
    return;
}
/* */



// -- (1) Formulaire d'accueil de l'action -------------------------------
//
// Le formulaire est affiché si aucun spammer n'a encore été précisé ou
// si le champ a été laissé vide et validé
if(empty($_POST['searched']))
{
    echo    
"<div class=\"action_erasespam\">\n",
        
"<form method=\"post\" action=\""$this->Href() . "\" name=\"selection\">\n",
        
"<fieldset>\n",
        
"<legend>Recherche</legend>\n";
    
// Si le formulaire a été validé avec le champ vide, on alerte l'utilisateur
    
if(isset($_POST['searched']))
            echo    
"<p><em>Attention&nbsp;: ",
            
"veuillez préciser une chaîne recherchée</em></p>\n";
    echo    
"<p>\n",
        
"Rechercher&nbsp;: <input name=\"searched\" /> ",
        
"</p>\n";
/*    echo    "<p>\n",
        "ou\n",
        "</p>\n";*/
    
echo    "<p>\n",
        
"Remplacer&nbsp;: <input name=\"replaced\" /> ",
        
"<button name=\"search\" value=\"Valider\">Valider</button>\n",
        
"</p>\n";
    echo    
"</fieldset>\n",
        
"</form>\n",
        
"</div>\n\n";
}


// -- (2) Page de résultats et form. de sélection des pages à modifier ----
//
else if(isset($_POST['search']))
{
    
// Sélection de toutes les pages correspondant à la recherche
    
$requete =
        
"select *
        from "
.$this->config["table_prefix"]."pages
        where
        body like '%" 
addslashes($_POST['searched']) . "%'
        and latest = 'Y'
        order by `time` desc"
;

    
$pagesFound $this->LoadAll($requete);
    
    
// Affichage des pages pour validation
    
echo    "<div class=\"action_erasespam\">\n";
    echo    
count($pagesFound) . " résultats pour la recherche de \"" .
        
$_POST['searched'] . "\"&nbsp;:\n";
    echo    
"<form method=\"post\" action=\""$this->Href() . "\">\n";
    echo    
"<table>\n";
    foreach (
$pagesFound as $i => $page)
    {
        echo    
"<tr>\n",
            
"<td>",
            
$this->ComposeLinkToPage($page["tag"], """"0), "<br />\n",
            
"("$page["time"], ")<br />\n",
            
"(",$this->ComposeLinkToPage($page["tag"], "revisions""historique"0),") ",
            
"</td>\n";

        echo    
"<td>\n";
        
$pregString "/(.*?)(" $_POST["searched"] . ")(.*)/";
        
preg_match_all($pregString$page["body"], $result);

        echo 
count($result[0]) . " X " $pregString "<br /><br />\n";
        
//echo    htmlspecialchars($page["body"]);
        
echo    htmlspecialchars($result[1][0]) .
            
"<span style=\"background-color: red\">" .
            
htmlspecialchars($result[2][0]) .
            
"</span>" .
            
htmlspecialchars($result[3][0]);

        
        
/*// A chaque occurence de la chaîne recherchée...
        foreach ($page as $body)
        {
            //echo    "<input name=\"rev[]\" value=\"" . $body["body"] . "\" type=\"checkbox\" /> ";
            echo    "\n";
        }*/
        
echo    //" . . . . ",$this->Format($page["user"]),"</p>\n",
            
"</td>\n",
            
"</tr>\n",
            
"";
    }
    echo    
"</table>\n";
    echo    
"<p>Commentaire&nbsp;: <input name=\"comment\" style=\"width: 80%;\" /></p>\n";
    echo    
"<p>\n",
        
"<input type=\"hidden\" name=\"clean\" value=\"yes\" />\n",
        
"<button value=\"Valider\">Nettoyer >></button>\n",
        
"</p>\n";
    echo    
"</form>\n";
    echo    
"</div>\n\n";
}


// -- (3) Modification des pages et affichage de la page de résultats -------
//
else if(isset($_POST['clean']))
{
    
//echo "<script type=\"text/javascript\">alert('test');</script>";
    
$modifiedPages "";
    
$logPage $this->GetParameter("logpage");


    
// -- 3.1 Modification des pages sélectionnées ---
    
if (!empty($_POST['rev']))
    {
        
//print_r($_POST["rev"]);
        
foreach ($_POST["rev"] as $rev_id)
        {
            echo 
$rev_id."<br>";
            
// Sélectionne la révision
            
$revision $this->LoadPageById($rev_id);
    
            
// Fait de la dernière version de cette révision
            // une version archivée
            
$requeteUpdate =
                
"update " $this->config["table_prefix"] . "pages " .
                
"set latest = 'N' ".
                
"where latest = 'Y' " .
                
"and tag = '" $revision["tag"] . "' " .
                
"limit 1";
            
$this->Query($requeteUpdate);
            
$restoredPages .= $revision["tag"] . ", ";
    
            
// Fait de la version sélectionnée la nouvelle version active
            
$this->SavePage($revision["tag"], $revision['body']);
            
// */
        
}
        
$restoredPages trim($restoredPages", ");
    }


    
// -- 3.2 Affichage de la page des résultats ---
    //        par exemple :
    //        Pages effacées : BacASable WikiNi
    
echo    "<div class=\"action_erasespam\">\n";
    echo    
"<p><em>Résultats&nbsp;:</em></p>\n";
    echo    
"<ul>\n";
    echo    !empty(
$deletedPages) ?
        
"<li>Pages définitivement effacées&nbsp;: " .
        
$this->Format($deletedPages) . ".</li>\n" :
        
"<li>Aucune page effacée.</li>\n";
    echo    !empty(
$restoredPages) ?
        
"<li>Pages restaurées&nbsp;: " .
        
$this->Format($restoredPages) . ".</li>\n" :
        
"<li>Aucune page restaurée.</li>\n";
    echo    
"</ul>\n";
    echo    
"<p><a href=\""$this->Href(), "\">Retour au formulaire de départ >></a></p>\n";
    echo    
"<p><a href=\"" .
        (!empty(
$logPage) ?
        
$this->Href(''$logPage) :
        
$this->Href()) . "\">Consultation du journal des nettoyages >></a></p>\n";
    echo    
"</div>\n\n";


    
// -- 3.3 Écriture du journal des actions ---
    //        S'il y a eu des pages nettoyées,
    //        on enregistre dans une page choisie qui a fait quoi
    
if ($deletedPages||$restoredPages)
    {
        
// -- Détermine quelle est la page de log :
        //    -- passée en paramètre (que se passe-t'il si elle n'existe pas ?)
        //    -- ou la page en cours par défaut
        
$reportingPage $logPage $logPage $this->GetPageTag();

        
// -- Ajout de la ligne de log
        // TODO : remplacer par une méthode AppendContent ?
        
$result $this->LoadPage($reportingPage);
        
$body $result['body'];
        
// Ajout de qui à fait quoi au corps de la page
        
$deletedPages $deletedPages $deletedPages." (effacée(s))" "";
        
$restoredPages $restoredPages $restoredPages." (restaurée(s))" "";
        if (
$deletedPages&&$restoredPages$liaison " et ";
        else 
$liaison "";
        
$body .= "\n("date("Y-m-d H:i:s") . ") Pages nettoyées par " .
            
$this->GetUserName() .
            
" [" $_POST['comment'] . "]&nbsp;: " $deletedPages .
            
$liaison $restoredPages"\n";

        
// -- Sauvegarde de la page
        //    Note : la page est sauvegardée même si l'utilisateur n'a pas accès
        //    à cette page
        
$this->SavePage($reportingPage$body);
        
// now we render it internally so we can write the updated link table.
        /*$this->ClearLinkTable();
        $this->StartLinkTracking();
        $this->Format($body);
        if($user = $this->GetUser())
        {
            $this->TrackLinkTo($user['name']);
        }
        if($owner = $this->GetPageOwner())
        {
            $this->TrackLinkTo($owner);
        }
        $this->StopLinkTracking();
        $this->WriteLinkTable();
        $this->ClearLinkTable();*/
    
}
    
}
?>

Commentaires [Cacher commentaires/formulaire]