Les archives de FluxBB.fr
Vous n'êtes pas identifié(e).
Bonjour à tous,
Depuis quelques jours je tente d'ajouter des fonctions un peu plus avancées pour certains sujet du forum, en l'occurence il s'agit d'une sorte de fonction d'achat groupé qui serait activée par le créateur sur sujet lors du premier post.
Pour ça j'utilise un bbcode qui exécute une fonction php pour modifier le premier post du sujet en fonction de certaines valeurs stockées dans une table.
Aprés avoir rencontré pas mal de problème avec les "require common.php" par exemple j'ai choisi d'ajouter des fonctions dans le functions.php.
Mais ça cause un autre probléme, l'ajout de cette fonction limite le chargement des post à 1, 2, 3 ou 4 par sujets.....
J'ai testé avec une fonction qui n'accéde pas à la bdd, qui se contente de renvoyer un petit texte et là pas de problème.
J'imagine donc que ça vient du fait que je déclare en global $db qui interfére avec le résultat d'une autre requête mais je ne vois pas de différence avec d'autres fonctions à ce niveau là.
La seule différence est que je l'appelle dans un bbcode.
Donc voila, je ne sais pas si quelqu'un à déja eu ce soucis, ou voit l'erreur que j'ai pu faire.
Merci d'avance pour vos réponses.
Hors ligne
Bon mon explication n'était pas trés claire donc je post la fonction que j'ai ajouté dans fonction.php.
Cette fonction est appelée par un bbcode, elle est prévue pour être exécutée depuis le premier message d'un sujet, lorsque qu'elle est exécutée dans un sujet qui comporte plusieurs messages, il n'y a plus que le premier message qui s'affiche.
J'ai fais différents tests et le problème disparait si je ne fais pas de requête sql dans ma fonction.
function return_acheteurs($achat_id)
{
global $db;
$output = "Return acheteurs : ".$achat_id;
if ($achat_id == 1)
{
$result = $db->query('SELECT id, responsable, ouverture, topic_id FROM achats WHERE topic_id = '.$achat_id, true) or error('Unable to fetch achats list', __FILE__, __LINE__, $db->error());
$num_hits = $db->num_rows($result);
$output = "Aucun acheteur pour le moment";
if (!$num_hits)
{
$output = "<table><tr><td width=20><font color=#99cc00>Id</font></td><td width=10><font color=#99cc00>Nom</font></td><td width=10><font color=#99cc00>Quantité</font></td><td width=10><font color=#99cc00>Id Achat</font></td><td width=10><font color=#99cc00>Commentaire</font></td></font></tr>";
while ($liste_acheteurs = $db->fetch_assoc($result))
{
$output = $output.'<tr><td>'.$liste_acheteurs['id'].'</td><td>'.$liste_acheteurs['acheteur'].'</td><td>'.$liste_acheteurs['qt'].'</td><td>'.$liste_acheteurs['achat_id'].'</td><td>'.$liste_acheteurs['commentaire'].'</td></tr>';
}
$output = $output.'</table>';
}
}
return $output;
}Donc si vous avez des idées parce que là je séche et je suis certain que c'est un petit truc débile qui me bloque.
Merci d'avance.
Dernière modification par tecoxe (13-03-2008 11:40:45)
Hors ligne
Je n'ai pas tres bien saisi le problème (ni d'ailleurs pourquoi une fonction censée "utiliser du bbcode" se retrouve dans functions.php au lieu de parser.php). Pouvez me donner un lien vers votre forum pour que je regarde de plus pres?
Join us now and share the software, Hackers you'll be FREE!
Hors ligne
Appelle ta fonction avant la boucle parce que si j'ai bien compris tu n'en as besoin qu'une seule fois par topic, et avec un affichage uniquement au premier post du topic/de la page.
Bouh !
StarShip Renaissance
Hors ligne
En fait l'idée c'est que ce soit trés simple pour l'utilisateur, il crée son topic, insére un bbcode du genre "[achatgroupe]" dans son premier post et ensuite les fonctions appelées par le bbcode gére l'affichage et les ajouts/suppression de commandes dans le premier post.
Lorsque le parser.php trouve le bbcode "[achatgroupe]" il exécute la fonction achatgroupe(), et depuis cette fonction je traite tout l'achat groupé.
J'affiche la liste des inscrits à l'achat groupé, la possiblité de s'y inscrire ou de supprimer son inscription.
Pour moi le problème vient du fait (comme le souligne PascL) que je fais une nouvelle requête sql en plein milieu du viewtopic.php, puisque le parser.php renvoie le résultat de ma fonction. Du coup ça doit intéragir avec le résultat de la requête sql du viewtopic qui sert à afficher les posts.
J'ai testé avec un autre objet $db (nommé $db2) sans succés. J'ai également testé en initiant une nouvelle transaction mysql sans passer par les fonctions inégrées à punbb sans succés non plus.
Je précise que c'est un forum de test, il n'est pas en ligne pour le moment.
Hors ligne
Hum je vois un peu. Essaie de balancer toute ta fonction dans la fonction parse_message() de parser.php pour voir si ca passe.
L'idée serait de faire un pregmatch sur [achatgroupe] juste avant de renvoyer le texte (dans parse_message()) et si oui, alors tu transforme le message suivant tes desires.
En gros ca ressemblerait à ca:
function parse_message($text, $hide_smilies)
{
global $pun_config, $lang_common, $pun_user, $db;
if ($pun_config['o_censoring'] == '1')
$text = censor_words($text);
// Convert applicable characters to HTML entities
$text = pun_htmlspecialchars($text);
// If the message contains a code tag we have to split it up (text within
shouldn't be touched)
if (strpos($text, '
') !== false && strpos($text, '') !== false)
{
list($inside, $outside) = split_text($text, '
', '');
$outside = array_map('ltrim', $outside);
$text = implode('<">', $outside);
}
if ($pun_config['o_make_links'] == '1')
$text = do_clickable($text);
if ($pun_config['o_smilies'] == '1' && $pun_user['show_smilies'] == '1' && $hide_smilies == '0')
$text = do_smilies($text);
if ($pun_config['p_message_bbcode'] == '1' && strpos($text, '[') !== false && strpos($text, ']') !== false)
{
$text = do_bbcode($text);
if ($pun_config['p_message_img_tag'] == '1')
{
// $text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\.(jpg|jpeg|png|gif)\[/img\]#e', 'handle_img_tag(\'$1$3.$4\')', $text);
$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]#e', 'handle_img_tag(\'$1$3\')', $text);
}
}
// Deal with newlines, tabs and multiple spaces
$pattern = array("\n", "\t", ' ', ' ');
$replace = array('<br />', ' ', ' ', ' ');
$text = str_replace($pattern, $replace, $text);
// If we split up the message before we have to concatenate it together again (code tags)
if (isset($inside))
{
$outside = explode('<">', $text);
$text = '';
$num_tokens = count($outside);
for ($i = 0; $i < $num_tokens; ++$i)
{
$text .= $outside[$i];
if (isset($inside[$i]))
{
$num_lines = ((substr_count($inside[$i], "\n")) + 3) * 1.5;
$height_str = ($num_lines > 35) ? '35em' : $num_lines.'em';
$text .= '</p><div class="codebox"><div class="incqbox"><h4>'.$lang_common['Code'].':</h4><div class="scrollbox" style="height: '.$height_str.'"><pre>'.$inside[$i].'</pre></div></div></div><p>';
}
}
}
// Add paragraph tag around post, but make sure there are no empty paragraphs
$text = str_replace('<p></p>', '', '<p>'.$text.'</p>');
/* ICI LE CODE DE TA FONCTION AVEC UN PREGMATCH SUR LE BBCODE DANS LA VARIABLE $text */
return $text;
}
Dernière modification par Apophis (13-03-2008 16:16:48)
Join us now and share the software, Hackers you'll be FREE!
Hors ligne
Méme résultat, j'ai bien peur que ce ne soit pas faisable comme ça.
L'autre idée serait de détecter le bbcode depuis le viewtopic.php sans passer par le parser.php et d'afficher le résultat de ma fonction avant la boucle qui affiche les posts, comme le disait PascL mais bon c'est pas trés propre tout ça.
Hors ligne
Oui c'est possible et c'est le justement le concept de mes deux premieres extensions pour la branche 1.3.
En fait, en matière de mod, il n'y a rien qui ne soit vraiment propre lol puisque de toute façon on modifie le code. Mais tu peux tres bien modifier viewtopic en intégrant tout ton code directement.
Join us now and share the software, Hackers you'll be FREE!
Hors ligne
La solution que je verrai plutot à ton problème, c'est d'ajouter un champ 'achat groupé' à la table topic qui sera 0 ou 1 et qui est choisi à la création/édition d'un topic.
Un LEFT JOIN à ajouter à une requête de viewtopic et hop tu peux afficher tes liens d'acceptation/suppression de l'achat où tu veux ensuite.
Dernière modification par PascL (13-03-2008 20:20:43)
Bouh !
StarShip Renaissance
Hors ligne