Les archives de FluxBB.fr
Vous n'êtes pas identifié(e).
Bonjour à tous.
Après avoir cherché durant des heures, j'ai réussi à établir un bouton qui serait mis en place sur tous les premiers posts de chaque topics qui permettrait de déplacer un topic dans un forum nommé corbeille (comme on le voit souvent sur divers board).
Seule les admin et modérateur verront le bouton et pourront mettre le topic à la corbeille.
L'id du forum "Corbeille" devra être défini dans le fichier corbeille.php.
Voici un screen pour voir ou serait le bouton :

Il faudra modifier :
- viewtopic.php
- corbeille.php (à créer)
- french/misc.php
- french/common.php
Dans le viewtopic.php
1) Trouver (ligne 327 environ):
<h3><?php if (($post_count + $start_from) > 1) echo ' Re: '; ?><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></h3>
<div class="postmsg">
<?php echo $cur_post['message']."\n" ?>
<?php if ($cur_post['edited'] != '') echo "\t\t\t\t\t".'<p class="postedit"><em>'.$lang_topic['Last edit'].' '.pun_htmlspecialchars($cur_post['edited_by']).' ('.format_time($cur_post['edited']).')</em></p>'."\n"; ?>
</div>
<?php if ($signature != '') echo "\t\t\t\t".'<div class="postsignature"><hr />'.$signature.'</div>'."\n"; ?>
</div>
<div class="clearer"></div>
<div class="postfootleft"><?php if ($cur_post['poster_id'] > 1) echo '<p>'.$is_online.'</p>'; ?></div>Ajouter ensuite :
<?php
if ($post_count==1)/* Mettre le bouton que sur le premier post du topic */
{
if ($is_admmod) /* Si le membre est un modérateur ou un admin */
{
echo "<form action='corbeille.php' method='post'>
<p align='right'><input type='submit' name='corbeille' value='".$lang_common['Corbeille']."' />
<input type='hidden' name='t_id' value='".$id."' />
</p></form>"; /* On affiche le bouton "Mettre à la corbeille" */
};
};
?> Dans le fichier corbeille.php (à créer) :
2) Ajouter ceci :
<?php
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
define('ID_CORBEILLE', 9); /* Mettre l'id du forum "corbeille" */
$arr_lang = array();
$arr_lang['msg1'] = 'Impossible de recenser les modérateurs';
$arr_lang['msg2'] = 'On ne peut deplacer le topic !';
$arr_lang['msg3'] = $lang_misc['Move topic redirect'];
$arr_lang['msg4'] = $lang_misc['Pas_droit'];
$corbeille_id = ID_CORBEILLE;
if (isset($_POST['corbeille'])) /* Si on a cliqué sur le bouton */
{
$efface_id = (isset($_POST['t_id'])? intval($_POST['t_id']) : 0); /* On définit la variable $efface_id */
if($efface_id > 0)
{
$result = $db->query('SELECT f.moderators, f.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id='.$efface_id) or error($arr_lang['msg1'], __FILE__, __LINE__, $db->error());
if($db->num_rows($result))
{
$corbeille_requete = $db->fetch_assoc($result);
$forum_id = $corbeille_requete['id'];
$mods_array = ($corbeille_requete['moderators'] != '') ? unserialize($corbeille_requete['moderators']) : array();
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
if ($is_admmod)
{
// Mettre à la corbeille
$db->query('UPDATE '.$db->prefix.'topics SET forum_id='.$corbeille_id.' WHERE id = '.$efface_id) or error($arr_lang['msg2'], __FILE__, __LINE__, $db->error());
update_forum($forum_id);
update_forum($corbeille_id);
redirect('viewforum.php?id='.$corbeille_id, $arr_lang['msg3']); /*On redirige vers la corbeille */
}
}
}
}
/* si on n'est pas passé par le précédent redirect, on est redirigé vers l'index */
redirect('index.php', $arr_lang['msg4']);
?>
Dans le fichier french/misc.php
3) Chercher (ligne 58 59 environ) :
'Stick topic redirect' => 'Discussion épinglée. Redirection ...',
'Unstick topic redirect' => 'Discussion détachée. Redirection ...',Ajouter ensuite :
'Pas_droit' => 'Vous n\'avez pas le droit d\'être là, vous allez être redirigé',
Dans le fichier french/common.php
4) Chercher (ligne 131 environ) :
// Stuff for the page footerAjouter ensuite :
'Corbeille' => 'Mettre à la corbeille',Et vouala c'est fini 
J'espère qu'elle vous sera utile 
Cordialement, WinuX
PS : Pensez à changer l'id du forum corbeille dans le fichier corbeille par l'id de votre forum corbeille à vous 
Dernière modification par WinuX (03-10-2010 13:44:02)
Hors ligne
Très bonne astuce ! 
Hors ligne
Et pourquoi ne pas en faire une mod officielle ?
Hors ligne
Euh il manque pas une requête pour définir la variable $mods_array ? Je suis pas sûr que ce soit défini partout.
Et pour définir le $mods_array, tu dois d'abord avoir l'id du topic à effacer (le $efface_id) donc ya probablement les if à changer d'ordre.
(et faut mettre $efface_id dans la requête, pas $_POST['t_id'])
En l'état, ça ne doit marcher que pour un admin (à moins que je me trompe et que la variable soit définie partout, mais je crois que c'est dépendant du forum où l'on est)
Bouh !
StarShip Renaissance
Hors ligne
Euh il manque pas une requête pour définir la variable $mods_array ? Je suis pas sûr que ce soit défini partout.
Et pour définir le $mods_array, tu dois d'abord avoir l'id du topic à effacer (le $efface_id) donc ya probablement les if à changer d'ordre.
(et faut mettre $efface_id dans la requête, pas $_POST['t_id'])En l'état, ça ne doit marcher que pour un admin (à moins que je me trompe et que la variable soit définie partout, mais je crois que c'est dépendant du forum où l'on est)
Tu as raison, je corrige ça, merci de la remarque 
En plus yavait une erreur dans l'url d'une redirection xD j'avais écrit "index?php", fin bref :m:
Et pourquoi ne pas en faire une mod officielle ?
Pourquoi pas 
Je corrige d'abord ça, après je vois pour la traduction en anglais.
EDIT : Fichier corbeille.php corrigé et testé avec un compte modo 
EDIT 2 : J'ai oublié de prendre en compte le dernier post qui n'est pas mis à jour, je m'en charge 
Dites, pour la mis à jour du dernier posteur, il faut updater la table forum en retirant le nombre de post du topic déplacer, et enlever 1 au nombre de topic. Cependant je suis pas sur que ca soit tout, et j'ai tenter une requete en joignant la table post à la table forum avec une condition qui est que l'id du topic du post doit être l'id du topic à envoyer à la corbeille. Cependant je patauge.
La redirection fonctionne, et le déplacement de forums aussi, le seul problème, c'est juste qu'il est afficher le dernier posteur au mauvais endroit. Une piste?
Dernière modification par WinuX (28-09-2010 16:42:07)
Hors ligne
Merci....:D
Hors ligne
Dites, pour la mis à jour du dernier posteur, il faut updater la table forum en retirant le nombre de post du topic déplacer, et enlever 1 au nombre de topic. Cependant je suis pas sur que ca soit tout, et j'ai tenter une requete en joignant la table post à la table forum avec une condition qui est que l'id du topic du post doit être l'id du topic à envoyer à la corbeille. Cependant je patauge.
La redirection fonctionne, et le déplacement de forums aussi, le seul problème, c'est juste qu'il est afficher le dernier posteur au mauvais endroit. Une piste?
Pour la mise à jour de la date, du dernier posteur, etc d'un forum, fluxbb utilise la fonction update_forum().
Pour connaitre l'id du forum précédent, remplace ta première requête dans corbeille.php par :
'SELECT f.moderators, f.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id='.$efface_idL'id de l'ancien forum sera $corbeille_requete['id]
Bouh !
StarShip Renaissance
Hors ligne
Ta requête est incomplète non?
Fin j'ai rajouter des truc de toute facon
(ptete inutile mais bon)
Voici le nouveau code de corbeille.php
<?php
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php'; /* On inclu le common.php contenant les infos necessaires sur le membre */
$efface_id = (isset($_POST['t_id'])? intval($_POST['t_id']) : 0); /* On défini la variable $efface_id */
$result = $db->query('SELECT t.forum_id, t.id, f.moderators, f.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id="'.$efface_id.'"') or error('Impossible de rescencer les modérateurs', __FILE__, __LINE__, $db->error());
$corbeille_requete = $db->fetch_assoc($result);
$forum_id = $corbeille_requete['forum_id'];
$mods_array = ($corbeille_requete['moderators'] != '') ? unserialize($corbeille_requete['moderators']) : array(); /*On défini la variable $mods-array */
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false; /* On defini la variable $is_admod */
$corbeille_id = '1'; /* Mettre l'id du forum "corbeille" */
if ($is_admmod) { /* si le membre est un admin ou un modérateur */
if (isset($_POST['corbeille'])) /* Si on a cliqué sur le bouton */
{
if($efface_id > 0){
update_forum($forum_id) ;
// Mettre à la corbeille
$db->query('UPDATE '.$db->prefix.'topics SET forum_id= "'.$corbeille_id.'" WHERE id = "'.$efface_id.'"') or error('On ne peut deplacer le topic !', __FILE__, __LINE__, $db->error());
redirect('viewforum.php?id='.$corbeille_id, $lang_misc['Move topic redirect']); /*On redirige vers la corbeille */
}
}
}
else { redirect('index?php', $lang_misc['Pas_droit']);}; /* Si on est un membre hors staff, on est redirigé vers l'index */
?>Je dois me tromper quelques part, mais ça ne met rien à jour ..
PS : l'id de l'ancien forum c'est $corbeille_requete['forum_id'] et non $corbeille_requete['id']
car la requête récupère 2 id, celle du topic et celle du forum, fin c'est juste pour te préciser 
Hors ligne
Ma requête suffisait.
* t.id est déjà connu, c'est la variable $efface_id
* t.forum_id et f.id sont identiques
Truc en double = truc inutile
Pour la mise à jour, insère la fonction update_forum après la requête qui fait l'update, ça devrait aller mieux
Et oublie pas d'updater l'ancien forum et le forum corbeille.
Dernière modification par PascL (30-09-2010 10:52:21)
Bouh !
StarShip Renaissance
Hors ligne
Oki, merci beaucoup 
Je vais faire ça 
Et t'as raison, "Truc en double = truc inutile" 
Si j'en fais une mod officiel, ca te dérangera pas si je mets ton nom dans les auteurs vu que tu m'as très bien aidé
?
Hors ligne
Si j'en fais une mod officiel, ca te dérangera pas si je mets ton nom dans les auteurs vu que tu m'as très bien aidé
?
Avoir mon nom dans les auteurs ne me dérange pas, ne pas l'avoir ne me dérange pas non plus. A toi de voir 
Bouh !
StarShip Renaissance
Hors ligne
Oki bah il le sera
Fin faut encore que j'arrive a faire cette update 
J'ai suivi ton conseil, après avoir plus ou moins galéré avec des erreurs de syntaxe de merde -__-", j'ai réussi à entrer les requettes de maj pour le forum et pour la corbeille.
Problème c'est qu'encore une fois, ca ne fait rien =\
Voici le code (qui commence à prendre de l'ampleur
).
Comme d'hab' le déplacement fonctionne, mais en index j'ai toujours les anciennes stats =\
<?php
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php'; /* On inclu le common.php contenant les infos necessaires sur le membre */
$efface_id = (isset($_POST['t_id'])? intval($_POST['t_id']) : 0); /* On défini la variable $efface_id */
$result = $db->query('SELECT f.moderators, f.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id="'.$efface_id.'"') or error('Impossible de rescencer les modérateurs', __FILE__, __LINE__, $db->error());
$corbeille_requete = $db->fetch_assoc($result);
$forum_id = $corbeille_requete['forum_id'];
$mods_array = ($corbeille_requete['moderators'] != '') ? unserialize($corbeille_requete['moderators']) : array(); /*On défini la variable $mods-array */
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false; /* On defini la variable $is_admod */
$corbeille_id = '9'; /* Mettre l'id du forum "corbeille" */
if ($is_admmod) { /* si le membre est un admin ou un modérateur */
if (isset($_POST['corbeille'])) /* Si on a cliqué sur le bouton */
{
if($efface_id > 0)
//Fonction update forum
$result = $db->query('SELECT COUNT(id), SUM(num_replies) FROM '.$db->prefix.'topics WHERE forum_id="'.$forum_id.'"') or error('Impossible de recuperer les stats des topics', __FILE__, __LINE__, $db->error());
list($num_topics, $num_posts) = $db->fetch_row($result);
$num_posts = $num_posts + $num_topics; // $num_posts is only the sum of all replies (we have to add the topic posts)
$result = $db->query('SELECT last_post, last_post_id, last_poster FROM '.$db->prefix.'topics WHERE forum_id="'.$forum_id.'" AND moved_to IS NULL ORDER BY last_post DESC LIMIT 1') or error('Unable to fetch last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
if ($db->num_rows($result)){ // S'il y a des topics
list($last_post, $last_post_id, $last_poster) = $db->fetch_row($result);
$db->query('UPDATE '.$db->prefix.'forums SET num_topics="'.$num_topics.'", num_posts="'.$num_posts.'", last_post="'.$last_post.'", last_post_id="'.$last_post_id.'", last_poster=\''.$db->escape($last_poster).'\' WHERE id="'.$forum_id.'"') or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
}
else // S'il n'y a pas de topics
$db->query('UPDATE '.$db->prefix.'forums SET num_topics="'.$num_topics.'", num_posts="'.$num_posts.'", last_post=NULL, last_post_id=NULL, last_poster=NULL WHERE id="'.$forum_id.'"') or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
//Fonction update forum
// Mettre à la corbeille
$db->query('UPDATE '.$db->prefix.'topics SET forum_id= "'.$corbeille_id.'" WHERE id = "'.$efface_id.'"') or error('On ne peut deplacer le topic !', __FILE__, __LINE__, $db->error());
//Fonction update corbeille
$result = $db->query('SELECT COUNT(id), SUM(num_replies) FROM '.$db->prefix.'topics WHERE forum_id="'.$corbeille_id.'"') or error('Impossible de recuperer les stats des topics', __FILE__, __LINE__, $db->error());
list($num_topics, $num_posts) = $db->fetch_row($result);
$num_posts = $num_posts + $num_topics; // $num_posts is only the sum of all replies (we have to add the topic posts)
$result = $db->query('SELECT last_post, last_post_id, last_poster FROM '.$db->prefix.'topics WHERE forum_id="'.$corbeille_id.'" AND moved_to IS NULL ORDER BY last_post DESC LIMIT 1') or error('Unable to fetch last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
if ($db->num_rows($result)) { // S'il y a des topics
list($last_post, $last_post_id, $last_poster) = $db->fetch_row($result);
$db->query('UPDATE '.$db->prefix.'forums SET num_topics="'.$num_topics.'", num_posts="'.$num_posts.'", last_post="'.$last_post.'", last_post_id="'.$last_post_id.'", last_poster=\''.$db->escape($last_poster).'\' WHERE id="'.$forum_id.'"') or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
}
else // S'il n'y a pas de topics
$db->query('UPDATE '.$db->prefix.'forums SET num_topics="'.$num_topics.'", num_posts="'.$num_posts.'", last_post=NULL, last_post_id=NULL, last_poster=NULL WHERE id="'.$corbeille_id.'"') or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
//Fonction update corbeille
redirect('viewforum.php?id='.$corbeille_id, $lang_misc['Move topic redirect']); /*On redirige vers la corbeille */
}
}
else { redirect('index?php', $lang_misc['Pas_droit']);}; /* Si on est un membre hors staff, on est redirigé vers l'index */
?>Je vois pas pourquoi il vient m'embêter cet index 
Dernière modification par WinuX (03-10-2010 11:38:34)
Hors ligne
J'ai modifié ton fichier corbeille:
<?php
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
define('ID_CORBEILLE', 9); /* Mettre l'id du forum "corbeille" */
$arr_lang = array();
$arr_lang['msg1'] = 'Impossible de recenser les modérateurs';
$arr_lang['msg2'] = 'On ne peut deplacer le topic !';
$arr_lang['msg3'] = $lang_misc['Move topic redirect'];
$arr_lang['msg4'] = $lang_misc['Pas_droit'];
$corbeille_id = ID_CORBEILLE;
if (isset($_POST['corbeille'])) /* Si on a cliqué sur le bouton */
{
$efface_id = (isset($_POST['t_id'])? intval($_POST['t_id']) : 0); /* On définit la variable $efface_id */
if($efface_id > 0)
{
$result = $db->query('SELECT f.moderators, f.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id='.$efface_id) or error($arr_lang['msg1'], __FILE__, __LINE__, $db->error());
if($db->num_rows($result))
{
$corbeille_requete = $db->fetch_assoc($result);
$forum_id = $corbeille_requete['id'];
$mods_array = ($corbeille_requete['moderators'] != '') ? unserialize($corbeille_requete['moderators']) : array();
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
if ($is_admmod)
{
// Mettre à la corbeille
$db->query('UPDATE '.$db->prefix.'topics SET forum_id='.$corbeille_id.' WHERE id = '.$efface_id) or error($arr_lang['msg2'], __FILE__, __LINE__, $db->error());
update_forum($forum_id);
update_forum($corbeille_id);
redirect('viewforum.php?id='.$corbeille_id, $arr_lang['msg3']); /*On redirige vers la corbeille */
}
}
}
}
/* si on n'est pas passé par le précédent redirect, on est redirigé vers l'index */
redirect('index.php', $arr_lang['msg4']);
?>La variable $forum_id était fausse (c'est devenu ['id'], plus ['forum_id']), les update_forum doivent être faits après l'update du topic voulu (tu en faisais un avant et un après, et utiliser directement la fonction, c'est mieux que de la réécrire).
Et j'ai fait une vérif en plus (le $db->num_rows) et placé tous les messages affichés dans un tableau que j'ai défini au début du fichier (pour une mod officielle, faut créer un fichier lang pour ça).
Bouh !
StarShip Renaissance
Hors ligne
Alors là merci 
Ca marche impec 
Hors ligne
merci
Dernière modification par agendatour (25-10-2010 03:58:20)
Hors ligne
Merci pour cette article, un info utile merci
Hors ligne
Bonjour,
agendatour et natalie1, il ne faudrait pas prendre les enfants du bon dieu pour des canards sauvages.
Stop au publicités sauvages. Encore une seule réponse de ce style dont le seul but est la pub et vous serez radiés de ce forum.
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche
Hors ligne
Bonjour
J'ai essayé cette mode sur un forum V 1.4.6 qui fonctionne; mais qui est inopérante pour 1 Modérateur non affecté a la catégorie. ( Il a bien accès au bouton [Mettre à la corbeille]).
Mon souhait serait de rendre ce bouton opérant pour TOUS les Modérateurs de façon a garder les Modérateurs en charge de leurs catégories et pouvoir être suppléé par le premier Modérateur qui constate une anomalie sur une discussion.
Merci aux Contributeurs de cette mode ainsi qu'a tous pour votre aide et explication
.
Hors ligne
@Retraité:
En version 1.2, il faudrait remplacer la ligne
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;par
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD)) ? true : false;Ça doit fonctionner aussi pour la 1.4, mais ça marchera seulement pour ceux qui sont dans le groupe modérateurs. Comme on peut définir d'autres groupes de modération en 1.4, il faut tester la variable $pun_user['g_moderator']. Etant toujours personnellement en 1.2 et n'ayant pas testé à fond la 1.4, je ne sais pas à quoi est égal cette variable mais quelqu'un d'autre pourra sûrement répondre à cette question.
La ligne deviendrait alors:
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD) || ($pun_user['g_moderator'] == QQCHOSE)) ? true : false;où QQCHOSE est à remplacer par la bonne valeur...
Bouh !
StarShip Renaissance
Hors ligne
$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || $pun_user['g_id'] == PUN_MOD ||($pun_user['g_moderator'] == 1) ? true : false;voila , j'utilise cette mod sur 1.4.5, et j'avoue ne pas avoir pensé au fait que les modérateurs verraient le lien, mais que cela produirait une erreur ... je pense sortir une astuce sur cette mod, en 1.4.*
Dernière modification par thib3113 (14-11-2011 16:46:06)
Hors ligne
Bonsoir
Merci PascL, j'ai fait le changement que tu proposes en premier, et le résultat est parfait.
J'ai mené différents test avec plusieurs Modérateurs non affectés aux catégories; ils peuvent agir. Les discussions dans les sous forums peuvent aussi être déplacées. Les Administrateurs peuvent réaffecter les discussions sans problème.
Grand merci 
Dernière modification par Retraité (14-11-2011 21:48:51)
Hors ligne