Archives FluxBB.fr

Les archives de FluxBB.fr

Vous n'êtes pas identifié(e).

#1 27-02-2008 12:48:33

Fepalkon
Membre

Aide pour extension

Bonjour,

Je suis actuellement en train de créer une extension cependant je rencontre un petit probléme.

En effet dans cette extension je souhaite rajouter un champ lors de la création du post qui sera enregistrer dans la BDD dans la table "topics", de la même façon que "subject" ou "message".

si je comprend bien comment fonctionne punbb 1.3, maintenant toutes les infos du message sont mises dans un tableau dans la page posts.php :

// If it's a new topic
        else if ($fid)
        {
            add_topic(array(
                'is_guest'        =>    $pun_user['is_guest'],
                'poster'        =>    $username,
                'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                'subject'        =>    $subject,
                'message'        =>    $message,
                'hide_smilies'    =>    $hide_smilies,
                'posted'        =>    $now,
                'subscribe'        =>    ($pun_config['o_subscriptions'] == '1' && (isset($_POST['subscribe']) && $_POST['subscribe'] == '1')),
                'forum_id'        =>    $fid
                ),
                $new_tid,    // By ref
                $new_pid    // By ref
            );
        }

et rajouter à la BDD avec la fonctions add_topic du fichier functions.php ici :

//
// Creates a new topic with its first post
//
function add_topic($post_info, &$new_tid, &$new_pid)
{
    global $db, $db_type, $pun_config, $lang_common;

    ($hook = get_hook('fn_add_topic_start')) ? eval($hook) : null;

    // Add the topic
    $query = array(
        'INSERT'    => 'poster, subject, posted, last_post, last_poster, forum_id',
        'INTO'        => 'topics',
        'VALUES'    => '\''.$db->escape($post_info['poster']).'\', \''.$db->escape($post_info['subject']).'\', '.$post_info['posted'].', '.$post_info['posted'].', \''.$db->escape($post_info['poster']).'\', '.$post_info['forum_id']
    );

    ($hook = get_hook('fn_qr_add_topic')) ? eval($hook) : null;
    $db->query_build($query) or error(__FILE__, __LINE__);
    $new_tid = $db->insert_id();

......

ce que je souhaite donc c'est rajouter une variable dans le tableau et qu'elle soit mise dans la table topics lors de la création du post, cependant je ne vois pas du tout comment faire avec les hooks, surtout dans la pages post.php.

J'espère être clair.

Merci par avance de votre aide.

Hors ligne

#2 27-02-2008 13:21:55

Apophis
Membre

Re : Aide pour extension

Je pense que vous devrez surement exploiter le hook fn_qr_add_topic (celui juste avant la requete dans votre deuxieme code).
Si vous comptez ajouter le contenu de votre variable dans un champ deja existant, vous n'aurez pas besoin de modifier la table topics pour ajouter un autre champ.

La meilleure exploitation selon moi de ce (cette ??)  hook serait de réécrire la requette ($query) en prenant en compte vos paramètres.
(mais n'entrerait-elle pas en conflit avec d'autres extensions voulants aussi exploiter ce hook?? faudrait demander à mieux connaisseur que moi).
Voici, voilou


Join us now and share the software, Hackers you'll be FREE!

Hors ligne

#3 27-02-2008 14:52:31

Fepalkon
Membre

Re : Aide pour extension

Pour ceux qui est de la requête je vois comment faire, c'est pas un problème suffit juste d'utiliser le hook fn_qr_add_topic comme tu l'as dit.

Mais le problème c'est que je souhaiterai que ce soit un autre champ, donc faudrait l'ajouter dans le tableau dans post.php et c'est la mon réel problème, je ne vois pas comment faire.

Hors ligne

#4 27-02-2008 20:58:13

Apophis
Membre

Re : Aide pour extension

Pas si compliqué que ça:
Il faudrait aussi exploiter le hook: po_pre_post_added (je met la source pour que vous vous situez)

// Did everything go according to plan?
    if (empty($errors) && !isset($_POST['preview']))
    {
        ($hook = get_hook('po_pre_post_added')) ? eval($hook) : null;

        // If it's a reply
        if ($tid)
        {
            add_post(array(
                    'is_guest'        =>    $pun_user['is_guest'],
                    'poster'        =>    $username,
                    'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                    'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                    'subject'        =>    $cur_posting['subject'],
                    'message'        =>    $message,
                    'hide_smilies'    =>    $hide_smilies,
                    'posted'        =>    $now,
                    'subscr_action'    =>    ($pun_config['o_subscriptions'] == '1' && $subscribe && !$is_subscribed) ? 1 : (($pun_config['o_subscriptions'] == '1' && !$subscribe && $is_subscribed) ? 2 : 0),
                    'topic_id'        =>    $tid,
                    'forum_id'        =>    $cur_posting['id']
                ),
                $new_pid    // By ref
            );
        }
        // If it's a new topic
        else if ($fid)
        {
            add_topic(array(
                'is_guest'        =>    $pun_user['is_guest'],
                'poster'        =>    $username,
                'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                'subject'        =>    $subject,
                'message'        =>    $message,
                'hide_smilies'    =>    $hide_smilies,
                'posted'        =>    $now,
                'subscribe'        =>    ($pun_config['o_subscriptions'] == '1' && (isset($_POST['subscribe']) && $_POST['subscribe'] == '1')),
                'forum_id'        =>    $fid
                ),
                $new_tid,    // By ref
                $new_pid    // By ref
            );
        }

        if (!$pun_user['is_guest'])
        {
            // If the posting user is logged in, increment his/her post count
            $query = array(
                'UPDATE'    => 'users',
                'SET'        => 'num_posts=num_posts+1, last_post='.$now,
                'WHERE'        => 'id='.$pun_user['id'],
                'PARAMS'    => array(
                    'LOW_PRIORITY'    => 1    // MySQL only
                )
            );

            ($hook = get_hook('po_qr_increment_num_posts')) ? eval($hook) : null;
            $db->query_build($query) or error(__FILE__, __LINE__);

            // Add/update the topic in our list of tracked topics
            $tracked_topics = get_tracked_topics();
            $tracked_topics['topics'][$tid ? $tid : $new_tid] = time();
            set_tracked_topics($tracked_topics);
        }

        redirect(pun_link($pun_url['post'], $new_pid), $lang_post['Post redirect']);
    }

Puisque vous avez accès à un hook avant tout appel aux fonctions add_post et add_topic, creez vous simplement une variable dans post.php (grace au hook) qui contiendra la valeur de $fid, dont vous fausserez la valeur par la suite (de manière à ce que le test sur $fid retourne faux et donc, on ne rentrera jamais dans le elseif).

Maintenant vous ferez un test sur cette variable, et si positif (ce qui signifie que vous auriez dû etre dans le cas $fid) alors vous faites appelle add_topic avec comme parametre un nouveau array semblable à celui du test sur $fid mais qui contiendra en plus vos champs à vous smile

Allez, je suis sur que vous n'avez pratiquement rien saisi à mon petit discours (lol), comme je ne suis pas tres fort en explications litteraires je vais vous faire le code tel qu'il devra apparaitre si on remplace l'appel du hook par son code,

// Did everything go according to plan?
    if (empty($errors) && !isset($_POST['preview']))
    {
        /* ($hook = get_hook('po_pre_post_added')) ? eval($hook) : null; */ // Ca c'est l'appel et je met donc juste en dessous en code ce que j'essayais de vous expliquer
               
               $fidbis = $fid;
               $fid = false; // ou bien $fid = 0 , car je me rappel plus de la syntaxe mais vous devrez vous retrouver

               // Si le test sur $fidbis est positif, alors le test sur $fid aurait dû l'etre aussi
               if($fidbis)
        {
            add_topic(array(
                'is_guest'        =>    $pun_user['is_guest'],
                'poster'        =>    $username,
                'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                'subject'        =>    $subject,
                'message'        =>    $message,
                'hide_smilies'    =>    $hide_smilies,
                'posted'        =>    $now,
                'subscribe'        =>    ($pun_config['o_subscriptions'] == '1' && (isset($_POST['subscribe']) && $_POST['subscribe'] == '1')),
                'forum_id'        =>    $fid

                                // Ici vous pourrez rajouter tous les champs que vous voulez en plus

                ),
                $new_tid,    // By ref
                $new_pid    // By ref
            );
        }


        // If it's a reply
        if ($tid)
        {
            add_post(array(
                    'is_guest'        =>    $pun_user['is_guest'],
                    'poster'        =>    $username,
                    'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                    'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                    'subject'        =>    $cur_posting['subject'],
                    'message'        =>    $message,
                    'hide_smilies'    =>    $hide_smilies,
                    'posted'        =>    $now,
                    'subscr_action'    =>    ($pun_config['o_subscriptions'] == '1' && $subscribe && !$is_subscribed) ? 1 : (($pun_config['o_subscriptions'] == '1' && !$subscribe && $is_subscribed) ? 2 : 0),
                    'topic_id'        =>    $tid,
                    'forum_id'        =>    $cur_posting['id']
                ),
                $new_pid    // By ref
            );
        }
        // If it's a new topic
        else if ($fid) // Ce test renverra toujours faux car on a faussé la valeur testée, et on ne rentrera jamais dans ce bloc
        {
            add_topic(array(
                'is_guest'        =>    $pun_user['is_guest'],
                'poster'        =>    $username,
                'poster_id'        =>    $pun_user['id'],    // Always 1 for guest posts
                'poster_email'    =>    ($pun_user['is_guest'] && $email != '') ? $email : null,    // Always null for non-guest posts
                'subject'        =>    $subject,
                'message'        =>    $message,
                'hide_smilies'    =>    $hide_smilies,
                'posted'        =>    $now,
                'subscribe'        =>    ($pun_config['o_subscriptions'] == '1' && (isset($_POST['subscribe']) && $_POST['subscribe'] == '1')),
                'forum_id'        =>    $fid
                ),
                $new_tid,    // By ref
                $new_pid    // By ref
            );
        }

        if (!$pun_user['is_guest'])
        {
            // If the posting user is logged in, increment his/her post count
            $query = array(
                'UPDATE'    => 'users',
                'SET'        => 'num_posts=num_posts+1, last_post='.$now,
                'WHERE'        => 'id='.$pun_user['id'],
                'PARAMS'    => array(
                    'LOW_PRIORITY'    => 1    // MySQL only
                )
            );

            ($hook = get_hook('po_qr_increment_num_posts')) ? eval($hook) : null;
            $db->query_build($query) or error(__FILE__, __LINE__);

            // Add/update the topic in our list of tracked topics
            $tracked_topics = get_tracked_topics();
            $tracked_topics['topics'][$tid ? $tid : $new_tid] = time();
            set_tracked_topics($tracked_topics);
        }

        redirect(pun_link($pun_url['post'], $new_pid), $lang_post['Post redirect']);
    }

Voila, maintenant il ne faut pas oublier de refaire la requette de la fonctions add_topic() dans functions.php comme je vous le disais plus haut pour prendre en compte tous les champs que vous voulez ajouter en plus.

Est-ce plus claire maintenant?


Join us now and share the software, Hackers you'll be FREE!

Hors ligne

#5 28-02-2008 11:49:01

Fepalkon
Membre

Re : Aide pour extension

merci beaucoup c'est très clair, je m'en vais essayer tout de suite.

Hors ligne

#6 28-02-2008 11:50:43

Apophis
Membre

Re : Aide pour extension

Mais de rien. Et revenez confirmer si ça marche comme vous le souhaitez smile


Join us now and share the software, Hackers you'll be FREE!

Hors ligne

#7 28-02-2008 13:23:17

Fepalkon
Membre

Re : Aide pour extension

alors j'ai encore un petit problème huh

pour modifier ma requéte j'utilise donc le hook : fn_qr_add_topic
j'ai donc mis ça dans mon fichier .xml :

<hook id="fn_qr_add_topic"><![CDATA[

if($post_info['var']!=null)
{
    $query['INSERT'] .= ', var';
    $query['VALUES'] .= ', \''.$db->escape($post_info['var']).'\'';
}

]]></hook>

pourtant quand je fait ça, lorsque je crée mon post j'ai cette erreur :

Notice: Undefined variable: base_url in /mnt/126/free.fr/3/2/o01/punbb13/include/functions.php(1240) : eval()'d code on line 4

mon post se crée quand même mais ma variable ne se met pas à jour dans la bdd. je comprend pas ce qu'est le "Undefined variable: base_url"

Merci encore pour votre aide.

Hors ligne

#8 28-02-2008 15:32:53

Apophis
Membre

Re : Aide pour extension

Moi je vous propose de refaire simplement toute la requete si votre test sur $post_info['var'] est concluant.


Join us now and share the software, Hackers you'll be FREE!

Hors ligne

#9 28-02-2008 16:44:27

Fepalkon
Membre

Re : Aide pour extension

bon alors en refaisant entièrement la requête après le test sur $post_info['var'], le post est bien crée, la variable var est bien mise à jour dans la BDD donc tout ce que je voulais marche ^^
mais j'ai toujours cette drôle d'erreur qui s'affiche lors de la redirection après avoir créé le post, ce : "Undefined variable: base_url" comprend pas à quoi c'est du.
je vais chercher par moi-même.

En tout cas merci beaucoup pour l'aide !!

Dernière modification par Fepalkon (28-02-2008 16:44:56)

Hors ligne

#10 28-02-2008 17:10:10

Apophis
Membre

Re : Aide pour extension

J'espère qu'on pourra bientot jeter un coup d'oeil à votre extension.

Dernière modification par Apophis (28-02-2008 17:10:25)


Join us now and share the software, Hackers you'll be FREE!

Hors ligne

Pied de page des forums