Tip gezocht over gebruik submit_post () functie

Hulp nodig bij een modificaties of op zoek naar een MOD?
Forumregels

LEES: Richtlijnen voor Support. Vul de support template in!
phpBB3.0.x
Verschaf iemand geen servertoegang tenzij het niet anders kan. Maak altijd eerst een volledige backup en verander de inloggevens na afloop. Eigen risico.
Plaats reactie
Awenger
Berichten: 2
Lid geworden op: 17 aug 2011, 14:26

Tip gezocht over gebruik submit_post () functie

Bericht door Awenger » 17 aug 2011, 15:07

  • Modificatie & Versie: Niet relevant
    Directe link naar de modificatie: Niet relevant
    Adres van je forum: http:// Niet relevant (nb. het is niet mijn forum/site, dus geef ik geen link)
    phpBB versie: 3.0.7
    Heb je onlangs een andere modificatie of stijl geïnstalleerd? Nee.

    Wat is het probleem?
Momenteel ben ik bezig met het overzetten van een forum van versie 2.x naar 3.x. In het 'oude' forum is er overvloedig gebruik gemaakt van html in de posts, dus deze posts moeten aangepast worden naar custom BB-tags die het gebruik van sommige html elementen weer mogelijk maken (zoals een tabel). Voor deze conversie stap heb ik al een (extern) werkend script geschreven. Probleem is nu om de aangepaste post met BB-codes weer netjes in de database te plaatsen...

Voor het terug plaatsen van de post wilde ik gebruik maken van de "submit_post ()" functie, die beschikbaar is in het bestand: "./includes/functions_posting.php" Hiervoor gebruik ik ook de tips die staan beschreven op de pagina: http://wiki.phpbb.com/Tutorial.Parsing_text

Even voor snelle referentie de aanroep van de functie:

Code: Selecteer alles

submit_post ( $mode,  $subject,  $username,  $topic_type,  &$poll,  &$data, [ $update_message = true])
Nu, submit_post() wil ik gebruiken in 'edit' mode, aangezien ik een post aanpas en geen nieuwe maak. De $data array heb ik netjes ingevuld en heeft alle correcte data. Alleen heb ik een 'probleem' met $subject en $username.

In de situatie dat een te converteren post niet de eerste post van een 'topic' is, veranderd bij het gebruik van deze functie de titel en 'owner' van ook de eerste post, niet alleen van de post die ik op dat moment aan het aanpassen ben. Heel frustrerend als de te bewerken post van oorsprong geen titel heeft, aangezien dan het topic niet meer 'klikbaar' is in het forum overzicht, omdat er geen titel meer staat.

Zoals te zien is op de wiki en tutorial pagina's, staan er heel mooi voorbeelden over het aanmaken van een nieuwe topic/post, maar ik kan nergens iets vinden over het 'bewerken' van de post en hoe je dit op een 'nette' manier doet.

Nu kan ik natuurlijk zelf 'handmatig' met een SQL query alle info in de database updaten zoals ik het wil, zonder deze functie te gebruiken. Maar ik wil het 'netjes' doen en de functies van phpBB gebruiken. En mogelijk wil ik deze methode ook gebruiken om vanuit een andere (externe) pagina (binnen de site) posts aan te maken en te bewerken.

Hoe voorkom ik dat de titel en 'eigenaar' van de eerste post in een 'topic' veranderd?
Heeft iemand tips/suggesties hoe dit aan te pakken?
Of zijn er andere oplossingen?

Alvast bedankt.

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Ander subject als voorbeeld

Bericht door Ger » 17 aug 2011, 16:18

Volgens mij zit de sleutel hier in de $data array. Die bevat de topic_title, en die staat in principe los van $subject. Binnen een topic moet de topic_title altijd gelijk blijven, maar $subject van veranderen. Zoals ik hier in mijn antwoord op jou heb gedaan ("Ander subject als voorbeeld").

Verder is het zo dat submit_post() altijd het huidige $user object gebruikt bij het posten. Ik ken je script natuurlijk niet, maar tenzij je iets specifieks bepaald voor de user, zal altijd het object van jouw user gebruikt worden voor de post.

Zie ook http://wiki.phpbb.com/Using_phpBB3%27s_ ... e_Messages

Awenger
Berichten: 2
Lid geworden op: 17 aug 2011, 14:26

Re: Tip gezocht over gebruik submit_post () functie

Bericht door Awenger » 17 aug 2011, 20:54

Bedankt voor het meedenken Ger. Helaas heeft je antwoord me nog geen 'soelaas' kunnen bieden.

dat $data['subject_title'] en $subject los van elkaar staan ben ik ondertussen achter. Maar de 'grap' is, is dat bij $mode='edit' zowel de hoofdtitel van het topic worden aangepast èn van de betreffende post.
Daarnaast gebruikt submit_post(); een string voor $username, niet het $user (class) object. En de naam die ik hier dan gebruik, wordt ook veranderd voor de 1e (hoofd) post.

Dus stel, de eerste post van het topic was van gebruiker "B" met als titel "Btitle". Vervolgens wil ik post 12 wil aanpassen dat oorspronkelijk gepost is door gebruiker "A" met als titel "Atitle", dan doe ik:

Code: Selecteer alles

submit_post($mode='edit', $subject="Atitle", $username="A", POST_NORMAL,$poll=false,$data)
Nu veranderd dus in het forumoverzicht de titel van het topic van "Btitle" naar "Atitle" en de gebruiker van "B" naar "A".

Misschien is het ook handiger als ik een stuk van m'n script post:

Eerst een stuk van de aanhef voor de conversie:

Code: Selecteer alles

define('IN_PHPBB', true);

//$phpbb_root_path = $_SERVER['SCRIPT_FILENAME'];
$phpbb_root_path = '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_user.' . $phpEx);

// Start session management
$user->session_begin();

$auth->acl($user->data);
$user->setup();

/* DB connect stuff */

$query = "Select post_text, bbcode_uid, poster_id, post_subject FROM phpbb_posts WHERE post_id = {$postid} LIMIT 1";

$result = mysqli_query($cxn, $query);
$row = mysqli_fetch_assoc($result);

// Decoden van de BB-tags van het bericht... (zie http://wiki.phpbb.com/Tutorial.Parsing_text)
decode_message($row['post_text'], $row['bbcode_uid']);

// Converteren van de tags (custom functie)
$message =  html_to_bb( html_entity_decode($row['post_text']) );

//$txt = getAllTags( html_entity_decode($row['post_text']) );

// We kiezen de juiste fora...
$forumid = 1; 
$topicid = 2;

$poster_id = $row['poster_id']; //Vanuit DB gehaald--> oorspronkelijke poster
$post_subject = $row['post_subject']; // Vanuit DB gehaald --> oorspronkelijke post title

//En nu weer terug posten. 
sendphpbbpost($message,$poster_id,$post_subject,$forumid,$topicid, 'edit', $postid, $poster_id);
 
En dit is de functie om 'makkelijk' het $data structure op te bouwen het uiteindelijk te posten (ergens opgeduikeld):

Code: Selecteer alles

function sendphpbbpost($posttext,$userid,$postsubject,$forumid,$topicid, $action='reply', $postid = false, $poster_id = false) {
    global $phpbb_root_path;
    global $phpEx;
    global $sql_data;
    global $user;
    
    include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
    
    $postsubject     = utf8_normalize_nfc($postsubject, '', true);
    $posttext         = utf8_normalize_nfc($posttext, '', true);
    $uid = $bitfield = $options = '';
    $allow_bbcode = $allow_smilies = true;
    $allow_urls = true;
    
    generate_text_for_storage($postsubject, $uid, $bitfield, $options, false, false, false);
    generate_text_for_storage($posttext, $uid, $bitfield, $options, $allow_bbcode, $allow_urls, $allow_smilies);
    
    $data = array(
        // General Posting Settings
        'forum_id'          => $forumid,    // The forum ID in which the post will be placed. (int)
        'topic_id'          => $topicid,            // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead.
        'icon_id'           => false,    // The Icon ID in which the post will be displayed with on the viewforum, set to false for icon_id. (int)

        // Defining Post Options
        'enable_bbcode'     => true, // Enable BBcode in this post. (bool)
        'enable_smilies'    => true, // Enabe smilies in this post. (bool)
        'enable_urls'       => false, // Enable self-parsing URL links in this post. (bool)
        'enable_sig'        => true, // Enable the signature of the poster to be displayed in the post. (bool)

        // Message Body
        'message'           => $posttext,     // Your text you wish to have submitted. It should pass through generate_text_for_storage() before this. (string)
        'message_md5'   => md5($posttext),    // The md5 hash of your message

        // Values from generate_text_for_storage()
        'bbcode_bitfield'   => $bitfield,    // Value created from the generate_text_for_storage() function.
        'bbcode_uid'        => $uid,     // Value created from the generate_text_for_storage() function.

        // Other Options
        'post_edit_locked'  => 0,
        'topic_title'       => $postsubject,
        
        // Email Notification Settings
        'notify_set'        => false,        // (bool)
        'notify'            => false,        // (bool)
        'post_time'         => 0,        // Set a specific time, use 0 to let submit_post() take care of getting the proper time (int)
        'forum_name'        => '',       // For identifying the name of the forum in a notification email. (string)

        // Indexing
        'enable_indexing'   => true,
        'force_approved_state' => true,
        );
        if($postid && $poster_id){
            $data['post_id'] = $postid;
            $data['poster_id'] = $poster_id;
            $data['post_edit_user'] = 'xxx'; //Usernumber of an admin.
            $data['post_edit_reason'] = '';
            $data['topic_replies_real'] = '';
            $data['post_edit_count'] = 0;

        }
        else
        {
            die('Missing parameters for sendphpbbpost!');    
        }
        //Now send that post...
        //submit_post('reply', '', '', POST_NORMAL, $poll, $data, $update_message = true);
        submit_post($action, $postsubject, $user->data['username'], POST_NORMAL, $poll=false, $data, $update_message = true);

}

 
ja, ik weet het: het kan netter. Maar ik heb nu dus nog alleen 'snel' geprogrammeerd voor eigen gebruik (lokaal om te testen).

Schiet maar. ;-)

Plaats reactie