[à 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 :
- ne rien remplacer et éditer chaque page à la main (via un lien)
- remplacer tout ou rien dans chaque page
- remplacer la première occurence mais pas les autres qui sont réaffichées
- ne rien remplacer et proposer un formulaire d'édition pour chaque page
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è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 : ",
"veuillez préciser une chaîne recherchée</em></p>\n";
echo "<p>\n",
"Rechercher : <input name=\"searched\" /> ",
"</p>\n";
/* echo "<p>\n",
"ou\n",
"</p>\n";*/
echo "<p>\n",
"Remplacer : <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'] . "\" :\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 : <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 :</em></p>\n";
echo "<ul>\n";
echo !empty($deletedPages) ?
"<li>Pages définitivement effacées : " .
$this->Format($deletedPages) . ".</li>\n" :
"<li>Aucune page effacée.</li>\n";
echo !empty($restoredPages) ?
"<li>Pages restaurées : " .
$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'] . "] : " . $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();*/
}
}
?>