Salut tout le monde,
Je m'appelle Pol, je suis étudiant à Mons en Belgique.
Je code principalement en PHP, j'ai déjà qques patch à mon actif dans
gallery,
phpmyadmin et fondateur du project
myq3log (un peu a l'abandon).
Je suis tout simplement peu triste quand je vois que le developpement de wikini n'est pas très rapide... surtout quand je vois sa structure modulaire !
Pour me contacter:
Voila mon adresse jabber: pol [at[ amessage.de
Mon email est: d.paolino [at[ gmail.com
@ bientot
Mes réalisations pour wikini:
- * Amélioration du ModeleDeDonneesDeWikini avec CharlesNepote.
- * Ajouter un suivi par email et par utilisateurs des pages modifiées. Pour cela ajouter une table contenant: id, nomDeLaPage, Utilisateur
- Tellement simple que je viens de terminer le hack. Ca m'a pris 1 heure.
- 3 fonctions en plus dans la class wiki, 2 handlers en plus, subscribe.php et unsubscribe.php, modification du fichier footer.php pour afficher les boutons "S'abonner" et "Se desabonner" et une action supplémentaire: subscriptions.php pour affichier la liste des pages auquels nous sommes abonnés.
- Pour s'abonner a une page, il suffit d'ajouter /subscribe et pour se desabonner: /unsubscribe ou bien de cliquer sur le lien correspondant dans le footer.
- Fonctionnel à 100%
- * Integrer un système de bookmark:
Mes idées pour wikini:
- * Confirmation de publication par email pour tous les utilisateurs anonymes.
- * Statistiques pour chaque pages. see code for a page counter at Wikka
- * Integrer un forum phpBB2 (en cours)
- * Integrer gallery (en cours) (there's code for gallery software at wikka too)
- * Creer un système de module performant (en cours)
Mes mod pour wikini:
- Ces mods ont besoin d'une table supplémentaire appellée wikini_triples (dixit CharlesNepote).
- la voici:
- CREATE TABLE `wikini_triples` (
- `ressource` varchar(50) NOT NULL default '',
- `property` varchar(50) NOT NULL default '',
- `value` varchar(50) NOT NULL default ''
- ) TYPE=MyISAM?;
Abonnements:
- Ce mod permet de s'abonner à une page... càd, dès qu'une modification a lieu, toutes les personnes qui sont abonnées à cette page recevront une notification par courriel.
- Editer le fichier /wakka.php et remplacer la fonction SavePage?() par ma fonction SavePage?() ci dessous:
function SavePage($tag, $body, $comment_on = "") {
// get current user
$user = $this->GetUserName();
//die($tag);
// TODO: check write privilege
if ($this->HasAccess("write", $tag))
{
// is page new?
if (!$oldPage = $this->LoadPage($tag))
{
// create default write acl. store empty write ACL for comments.
$this->SaveAcl($tag, "write", ($comment_on ? "" : $this->GetConfigValue("default_write_acl")));
// create default read acl
$this->SaveAcl($tag, "read", $this->GetConfigValue("default_read_acl"));
// create default comment acl.
$this->SaveAcl($tag, "comment", $this->GetConfigValue("default_comment_acl"));
// current user is owner; if user is logged in! otherwise, no owner.
if ($this->GetUser()) $owner = $user;
}
else
{
// aha! page isn't new. keep owner!
$owner = $oldPage["owner"];
}
// set all other revisions to old
$this->Query("update ".$this->config["table_prefix"]."pages set latest = 'N' where tag = '".mysql_Escape_string($tag)."'");
// add new revision
$this->Query("insert into ".$this->config["table_prefix"]."pages set ".
"tag = '".mysql_escape_string($tag)."', ".
($comment_on ? "comment_on = '".mysql_escape_string($comment_on)."', " : "").
"time = now(), ".
"owner = '".mysql_escape_string($owner)."', ".
"user = '".mysql_escape_string($user)."', ".
"latest = 'Y', ".
"body = '".mysql_escape_string(chop($body))."'");
// Email watchers
$results = $this->LoadAll("SELECT value FROM ".$this->config["table_prefix"]."triples WHERE ".
"property = '".mysql_escape_string('subscriptions')."' AND ".
"ressource = '".mysql_escape_string($tag)."' ");
$currentuser = $this->GetUser();
$currentuseremail = $currentuser['email'];
$currentusername = $currentuser['name'];
foreach ($results as $record)
{
$useremail = $record['value'];
// Ne pas envoyer d'email a la personne qui viens de modifier la page.
if ($currentuseremail != $useremail)
{
$this->sendEmailPageMod($tag, $currentusername, $useremail);
}
}
}
}
- Ajouter dans /wakka.php les 3 fonctions suivantes:
function SendEmailPageMod($tag, $username, $useremail)
{
if ($username == '')
{
$username = $this->getUserName();
}
$url = $this->config["base_url"].$tag;
$unwatch = $this->config["base_url"]."$tag/unsubscribe";
$msg = "
Bonjour,
La page $url a ete modifiee par $username.
Si vous ne voulez plus surveiller ce suject rendez vous ici: $unwatch
@bientot
";
mail($useremail,"Wikini: la page $tag a ete modifiee !",$msg);
}
function Subscribe($tag, $user) {
$useremail = $user['email'];
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('subscriptions')."' AND ".
"value = '".mysql_escape_string($useremail)."'");
if ($result['count'] >= 1)
{
$msg = "Vous surveillez deja cette page.";
}
else
{
$this->Query("insert into ".$this->config["table_prefix"]."triples set ".
"ressource = '".mysql_escape_string($tag)."', ".
"property = '".mysql_escape_string('subscriptions')."', ".
"value = '".mysql_escape_string($useremail)."' ");
$msg = "Vous surveillez maintenant cette page.";
}
return $msg;
}
function UnSubscribe($tag, $user) {
// get current user
//print_r($user);
$useremail = $user['email'];
//die($tag);
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('subscriptions')."' AND ".
"value = '".mysql_escape_string($useremail)."'");
if ($result['count'] == 0)
{
$msg = "Vous ne surveillez pas cette page.";
}
else
{
$this->Query("DELETE FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('subscriptions')."' AND ".
"value = '".mysql_escape_string($useremail)."'");
$msg = "Vous ne surveillez plus cette page.";
}
return $msg;
}
- dans handlers/page/ ajouter les 2 fichiers suivants:
- Le fichier subscribe.php:
-
- et le fichier unsubscribe.php:
-
- Dans actions/ ajouter le fichiers subscriptions.php:
<?php
if ($user = $this->GetUser())
{
echo "<b>Liste des pages ou vous êtes abonnés:</b><br /><br />\n" ;
$my_pages_count = 0;
$useremail = $user['email'];
if ($pages = $this->LoadAll("SELECT * FROM wikini_triples WHERE property='subscriptions' AND value='$useremail'"))
{
foreach ($pages as $page)
{
echo $this->ComposeLinkToPage($page["ressource"]),"<br />\n" ;
$my_pages_count++;
}
if ($my_pages_count == 0)
{
echo "<i>Vous n'êtes inscrit a aucune page.</i>";
}
}
}
else
{
echo "<i>Vous n'êtes pas identifié : impossible d'afficher la liste des pages ou vous êtes abonnés.</i>" ;
}
?>
- Modifier actions/footers.php pour qu'il affiche les liens d'abonnements:
<div class="footer">
<?php
/* footer.php
Copyright (c) 2002, Hendrik Mans <hendrik@mans.de>
Copyright 2002, 2003, 2004 David DELON
Copyright 2002, 2003 Charles NEPOTE
Copyright 2002, 2003 Patrick PAUL
Copyright 2003 Eric DELORD
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
echo $this->FormOpen("", "RechercheTexte", "get");
echo $this->HasAccess("write") ? "<a href=\"".$this->href("edit")."\" title=\"Cliquez pour éditer cette page.\">Éditer cette page</a> ::\n" : "";
$user = $this->getUser();
if ($this->getUser())
{
$user = $this->getUser();
$useremail=$user['email'];
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($this->tag)."' AND ".
"property = '".mysql_escape_string('subscriptions')."' AND ".
"value = '".mysql_escape_string($useremail)."'");
if ($result['count'] >= 1)
{
$msg = "<a href=\"".$this->href("unsubscribe")."\" title=\"Cliquez pour ne plus recevoir les dernières modifications sur cette page.\">Se desabonner</a>";
}
else
{
$msg = "<a href=\"".$this->href("subscribe")."\" title=\"Cliquez pour recevoir les dernières modifications sur cette page.\">S'abonner</a>";
}
echo "$msg :: ";
}
echo $this->GetPageTime() ? "<a href=\"".$this->href("revisions")."\" title=\"Cliquez pour voir les dernières modifications sur cette page.\">".$this->GetPageTime()."</a> ::\n" : "";
// if this page exists
if ($this->page)
{
// if owner is current user
if ($this->UserIsOwner())
{
echo
"Propriétaire : vous :: \n",
"<a href=\"",$this->href("acls")."\" title=\"Cliquez pour éditer les permissions de cette page.\">Éditer permissions</a> :: \n",
"<a href=\"",$this->href("deletepage")."\">Supprimer</a> :: \n";
}
else
{
if ($owner = $this->GetPageOwner())
{
echo "Propriétaire : ",$this->Format($owner);
}
else
{
echo "Pas de propriétaire ";
echo ($this->GetUser() ? "(<a href=\"".$this->href("claim")."\">Appropriation</a>)" : "");
}
echo " :: \n";
}
}
?>
<a href="<?php echo $this->href("referrers") ?>" title="Cliquez pour voir les URLs faisant référence à cette page.">
Références</a> ::
Recherche : <input name="phrase" size="15" class="searchbox" />
<?php echo $this->FormClose(); ?>
</div>
<div class="copyright">
<a href="http://validator.w3.org/check/referer">XHTML 1.0 valide ?</a> ::
<a href="http://jigsaw.w3.org/css-validator/check/referer">CSS valide ?</a> ::
-- Fonctionne avec <?php echo $this->Link("WikiNi:PagePrincipale", "", "WikiNi ".$this->GetWikiNiVersion()) . "\n"; ?>
</div>
<?php
if ($this->GetConfigValue("debug")=="yes")
{
echo "<span class=\"debug\"><b>Query log :</b><br />\n";
$t_SQL=0;
foreach ($this->queryLog as $query)
{
echo $query["query"]." (".round($query["time"],4).")<br />\n";
$t_SQL = $t_SQL + $query["time"];
}
echo "</span>\n";
echo "<span class=\"debug\">".round($t_SQL, 4)." s (total SQL time)</span><br />\n";
list($g2_usec, $g2_sec) = explode(" ",microtime());
define ("t_end", (float)$g2_usec + (float)$g2_sec);
echo "<span class=\"debug\"><b>".round(t_end-t_start, 4)." s (total time)</b></span><br />\n";
echo "<span class=\"debug\">SQL time represent : ".round((($t_SQL/(t_end-t_start))*100),2)."% of total time</span>\n";
}
?>
</body>
</html>
- Voila c'est fini ! Je pense que tout doit fonctionner, si il y a le moindre problème n'hésitez pas à me contacter !
Favoris:
- Ce mod permet de gerer des favoris, càd, une liste de pages que vous aimez bien et que vous aimez garder dans vos favoris pour ne pas les oublier.
- Editer le fichier /wakka.php et ajouter les 2 fonctions ci dessous:
function addbookmark($tag, $user) {
$username = $user['name'];
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('bookmarks')."' AND ".
"value = '".mysql_escape_string($username)."'");
if ($result['count'] >= 1)
{
$msg = "Vous avez deja cette page en bookmark.";
}
else
{
$this->Query("insert into ".$this->config["table_prefix"]."triples set ".
"ressource = '".mysql_escape_string($tag)."', ".
"property = '".mysql_escape_string('bookmarks')."', ".
"value = '".mysql_escape_string($username)."' ");
$msg = "Bookmark ajoute.";
}
return $msg;
}
function DeleteBookmark($tag, $user) {
$username = $user['name'];
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('bookmarks')."' AND ".
"value = '".mysql_escape_string($username)."'");
if ($result['count'] == 0)
{
$msg = "Cette page n'est pas dans vos bookmarks.";
}
else
{
$this->Query("DELETE FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($tag)."' AND ".
"property = '".mysql_escape_string('bookmarks')."' AND ".
"value = '".mysql_escape_string($username)."'");
$msg = "Cette page n'est plus dans vos bookmarks";
}
return $msg;
}
- Ajouter dans handlers/page/ les 2 fichiers suivants:
- addtobookmark.php
<?php
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("accès direct interdit");
}
echo $this->Header();
?>
<div class="page">
<?php
if ($this->getUser())
{
// Nom de la page: $this->tag;
$result = $this->addbookmark($this->tag,$this->getUser());
echo "$result";
}
?>
</div>
<?php echo $this->Footer(); ?>
- et deletebookmark.php:
-
- dans actions/ ajouter le fichier:
- bookmarks.php:
<?php
if ($user = $this->GetUser())
{
echo "<b>Vos pages favorites:</b><br /><br />\n" ;
$my_pages_count = 0;
$username = $user['name'];
if ($pages = $this->LoadAll("SELECT * FROM wikini_triples WHERE property='bookmarks' AND value='$username'"))
{
foreach ($pages as $page)
{
echo $this->ComposeLinkToPage($page["ressource"]),"<br />\n" ;
$my_pages_count++;
}
if ($my_pages_count == 0)
{
echo "<i>Vous n'avez aucun bookmark.</i>";
}
}
else
{
echo "<i>Vous n'avez aucun bookmark.</i>";
}
}
else
{
echo "<i>Vous n'êtes pas identifié : impossible d'afficher la liste de vos bookmarks.</i>" ;
}
?>
- Modifier actions/footers.php pour qu'il ajouter un nouveau lien pour les favoris:
<div class="footer">
<?php
/* footer.php
Copyright (c) 2002, Hendrik Mans <hendrik@mans.de>
Copyright 2002, 2003, 2004 David DELON
Copyright 2002, 2003 Charles NEPOTE
Copyright 2002, 2003 Patrick PAUL
Copyright 2003 Eric DELORD
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
echo $this->FormOpen("", "RechercheTexte", "get");
echo $this->HasAccess("write") ? "<a href=\"".$this->href("edit")."\" title=\"Cliquez pour éditer cette page.\">Éditer cette page</a> ::\n" : "";
$user = $this->getUser();
if ($this->getUser())
{
$user = $this->getUser();
$username=$user['name'];
$result = $this->LoadSingle("SELECT COUNT(*) as count FROM ".$this->config["table_prefix"]."triples WHERE ".
"ressource = '".mysql_escape_string($this->tag)."' AND ".
"property = '".mysql_escape_string('bookmarks')."' AND ".
"value = '".mysql_escape_string($username)."'");
//echo "Resultat: {$result['count']}";
//print_r($result);
if ($result['count'] >= 1)
{
$msg = "[<a href=\"".$this->href("deletebookmark")."\" title=\"Cliquez pour supprimer cette page de vos bookmark.\">-</a>]";
}
else
{
$msg = "[<a href=\"".$this->href("addtobookmark")."\" title=\"Cliquez ajouter cette page a vos bookmarks.\">+</a>]";
}
echo "Bookmark: $msg :: ";
}
echo $this->GetPageTime() ? "<a href=\"".$this->href("revisions")."\" title=\"Cliquez pour voir les dernières modifications sur cette page.\">".$this->GetPageTime()."</a> ::\n" : "";
// if this page exists
if ($this->page)
{
// if owner is current user
if ($this->UserIsOwner())
{
echo
"Propriétaire : vous :: \n",
"<a href=\"",$this->href("acls")."\" title=\"Cliquez pour éditer les permissions de cette page.\">Éditer permissions</a> :: \n",
"<a href=\"",$this->href("deletepage")."\">Supprimer</a> :: \n";
}
else
{
if ($owner = $this->GetPageOwner())
{
echo "Propriétaire : ",$this->Format($owner);
}
else
{
echo "Pas de propriétaire ";
echo ($this->GetUser() ? "(<a href=\"".$this->href("claim")."\">Appropriation</a>)" : "");
}
echo " :: \n";
}
}
?>
<a href="<?php echo $this->href("referrers") ?>" title="Cliquez pour voir les URLs faisant référence à cette page.">
Références</a> ::
Recherche : <input name="phrase" size="15" class="searchbox" />
<?php echo $this->FormClose(); ?>
</div>
<div class="copyright">
<a href="http://validator.w3.org/check/referer">XHTML 1.0 valide ?</a> ::
<a href="http://jigsaw.w3.org/css-validator/check/referer">CSS valide ?</a> ::
-- Fonctionne avec <?php echo $this->Link("WikiNi:PagePrincipale", "", "WikiNi ".$this->GetWikiNiVersion()) . "\n"; ?>
</div>
<?php
if ($this->GetConfigValue("debug")=="yes")
{
echo "<span class=\"debug\"><b>Query log :</b><br />\n";
$t_SQL=0;
foreach ($this->queryLog as $query)
{
echo $query["query"]." (".round($query["time"],4).")<br />\n";
$t_SQL = $t_SQL + $query["time"];
}
echo "</span>\n";
echo "<span class=\"debug\">".round($t_SQL, 4)." s (total SQL time)</span><br />\n";
list($g2_usec, $g2_sec) = explode(" ",microtime());
define ("t_end", (float)$g2_usec + (float)$g2_sec);
echo "<span class=\"debug\"><b>".round(t_end-t_start, 4)." s (total time)</b></span><br />\n";
echo "<span class=\"debug\">SQL time represent : ".round((($t_SQL/(t_end-t_start))*100),2)."% of total time</span>\n";
}
?>
</body>
</html>
- Fini :) Si il y a un problème n'hésitez pas à me contacter pour signaler les bugs et/ou mise à jour !
Bienvenue Pol ! C'est vrai que le développement n'avance pas rapidemment... (les développeurs ont une vie en dehors de
WikiNi ;). Par ailleurs, nous "payons", d'une certaine manière, le poids généré par un développement consensuel. En outre, nous ne souhaitons pas que
WikiNi devienne une usine à gaz. En revanche le développement est vraiment très ouvert : aucun des développeurs actuels ne se connaissaient avant
WikiNi. Si nous ne sommes pas toujours réactifs c'est aussi parce qu'il y a beaucoup de sujets en cours... Et puis il arrive que les participant ne soient pas intéressés par une proposition :( (Ca m'est souvent arrivé.) Pour susciter l'intérêt, il est alors nécessaire d'expliquer au mieux (avec proposition et code à l'appui). Personnellement, je ne suis pas convaincu de l'intégration à phpBB2 pour les raisons suivantes :
- cela implique une modification de la base de données et nous souhaitons toucher le moins possible au modèle de données
Justement, non, j'ai ajouté les tables de la base de données des utilisateurs a phpbb_user et modifié le code de wikini pour qu'il utilise la base phpbb au lieu de wikini.
- cela implique un risque de voir l'intégration cassée par une nouvelle version de phpBB2 ; WikiNi devient alors dépendant d'un autre logiciel
Encore une fois, non, phpbb utilisent des variables globales ainsi que wikini. Je voudrais implementer un système tel quel celui de gallery. Meme si phpbb2 evolue, l'incorporation de gallery dans celui ci est transparente et très utile :)
- comment gère-t-on les identifiants sous forme de MotWiki ?
Ca c'est un problème ... et je n'ai pas encore trouvé comment le résoudre.
Je reste ouvert à la discussion et ce n'est évidemment pas moi qui décide ; tout le monde à son mot à dire. Pour ceux qui ne s'expriment pas on part du principe "qui ne dit mot consent".
--
CharlesNepote