Seite 1 von 2

Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 04.02.2015 22:01
von freie-bildung
Hi zusammen

Ich glaube ehrlich gesagt nicht, dass so eine Möglichkeit besteht, möchte aber trotzdem nachfragen.

Bis vor kurzem konnte man in meinem Forum Texte nachträglich ändern. Das ging dann aber teilweise so weit, dass Beiträge so krass verändert wurde, dass diese komplett aus dem Zusammenhang gerissen wurden und die darauf folgenden Beiträge schlichtweg keinen Sinn mehr ergaben.

Nun habe ich das komplett deaktiviert, mit der Möglichkeit, dass sich die Nutzer über den "Diesen Beitrag melden" Button an mich wenden können, wenn sie eine nachträgliche Änderung wünschen.

Nun meine Frage: Gibt es die Möglichkeit, dass User ihre Beiträge ergänzen aber nicht verändern können?

Also z.B. als erster Beitrag

Hallo zusammen, meine Packliste besteht aus:

- Rucksack
- Schlafsack
- Matte


Ändern, bzw. löschen daran kann man nix, also an dem was bereits geschrieben wurde.

Ergänzen aber sehr wohl, also z.B.

Hallo zusammen, meine Packliste besteht aus:

- Rucksack
- Schlafsack
- Matte
- Flasche
- Feuerzeug


Gibt es irgendeine Möglichkeit?

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 05.02.2015 18:20
von paddle
Hi,

Eine Mod ist mir da jetzt nicht bekannt, aber du könntest den Beirag abfragen, bevor er in die Datenbank geschrieben wird.

Dazu suchst du in includes/functions_posting.php

Code: Alles auswählen

    else if ($mode == 'edit')
    {
        $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
    } 
und ersetzt es durch:

Code: Alles auswählen

    else if ($mode == 'edit')
    {
        $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
        
        if (!$auth->acl_gets('a_', 'm_'))
        {
            $cur_post_id = $data['post_id'];
        
            $sql = 'SELECT post_text, post_id FROM ' . POSTS_TABLE . ' WHERE post_id = ' . $cur_post_id;
        
            $result = $db->sql_query($sql);
    
            if ($row = $db->sql_fetchrow($result) )
            {
                $cur_message = $row['post_text'];
            }
                        
            //check, if user just append something, else forbid the edit
            if (stripos( $data['message'], $cur_message) !== 0)
            {
                trigger_error($user->lang['ONLY_ATTACHING_ALLOWED']);
            }
        }

    } 
Um den Error schön auszugeben müssen dann noch die language - Dateien angepasst werden:

Füge am Ende der Datei language/[sprache]/posting.php vor ?>ein:

Code: Alles auswählen

$lang = array_merge($lang, array(
    'ONLY_ATTACHING_ALLOWED'     => 'Du darfst an deinen ursprünglichen Post nur etwas weiteres anhängen',
)); 
Man kann die Fehlermeldung sicher schöner gestalten.


Will man das schöner gestalten, muss man aber sicherlich etwas mehr Aufwand betreiben ;)

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 05.02.2015 18:52
von freie-bildung
Vielen Dank paddle!

Funktioniert - gerade getestet :) Das einzige was noch schöner wäre, als diese Lösung, wenn man auch zwischen dem bereits geschriebenen Text ergänzen könnte, statt nur unter dem Text. Dafür hast nicht auch einen Tipp bereit?

Danke nochmals

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 05.02.2015 19:47
von paddle
Das einzige was mir dazu einfällt, was einfach umzusetzen wäre, wäre zu überprüfen, ob der neue Beitrag länger ist, als der alte, anstatt zu überprüfen, ob der alte Beitrag vorne steht.

Das hat allerdings den Nachteil, dass diejenigen, die Chaos stiften wollen, einfach ein Beitrag mit Zufallszeichen füllen um auf den alten Beitrag zu kommen.

---------------

Und 5 min weiter drüber nachgedacht, könnte man das auch so machen:

Code: Alles auswählen

else if ($mode == 'edit')
    {
        $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
        
        if (!$auth->acl_gets('a_', 'm_'))
        {
            $cur_post_id = $data['post_id'];
        
            $sql = 'SELECT post_text, post_id FROM ' . POSTS_TABLE . ' WHERE post_id = ' . $cur_post_id;
        
            $result = $db->sql_query($sql);
    
            if ($row = $db->sql_fetchrow($result) )
            {
                $cur_message = $row['post_text'];
            }
            
            //replace all spaces with a placeholder
            $message_pattern = str_replace(' ', '.*', $cur_message);
            $message_pattern = '/.*' . $message_pattern . '.*/';
            print $message_pattern;
                        
            //check, if user just append something, else forbid the edit
            if(preg_match($message_pattern, $data['message']) !== 1) {
                trigger_error($user->lang['ONLY_ATTACHING_ALLOWED']);
            }
            
        }

    } 
Nun muss im neuen Post jedes Wort des alten Posts in der gleichen Reihenfolge vorkommen. Allerdings darf an den Leerzeichen weitere Zeichen eingefügt werden. Ebenso vor und nach dem ursprünglichen Beitrag.

Den Code da ersetzt du mit dem Code, welchen du bereits ersetzt hast.

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 05.02.2015 20:06
von freie-bildung
Also hab ich dich richtig verstanden, dass ich den Code vom letzten Beitrag "über" den Code den du im ersten Beitrag geschrieben hast ersetzen soll?

Das gibt mir nämlich eine Warnung:

Warning: Cannot modify header information - headers already sent by (....../includes/functions_posting.php:1688) in .... includes/functions.php on line 4785, 4787, 4788, 4789

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 05.02.2015 20:19
von paddle
Genauso meint ich das.

Damit wir uns nicht missverstehen:

Datei: includes/functions_posting.php
Suche:

Code: Alles auswählen

    else if ($mode == 'edit')
    {
        $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
        
        if (!$auth->acl_gets('a_', 'm_'))
        {
            $cur_post_id = $data['post_id'];
        
            $sql = 'SELECT post_text, post_id FROM ' . POSTS_TABLE . ' WHERE post_id = ' . $cur_post_id;
        
            $result = $db->sql_query($sql);
    
            if ($row = $db->sql_fetchrow($result) )
            {
                $cur_message = $row['post_text'];
            }
                        
            //check, if user just append something, else forbid the edit
            if (stripos( $data['message'], $cur_message) !== 0)
            {
                trigger_error($user->lang['ONLY_ATTACHING_ALLOWED']);
            }
        }

    }
Ersetze mit:

Code: Alles auswählen

    else if ($mode == 'edit')
    {
        $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
        
        if (!$auth->acl_gets('a_', 'm_'))
        {
            $cur_post_id = $data['post_id'];
        
            $sql = 'SELECT post_text, post_id FROM ' . POSTS_TABLE . ' WHERE post_id = ' . $cur_post_id;
        
            $result = $db->sql_query($sql);
    
            if ($row = $db->sql_fetchrow($result) )
            {
                $cur_message = $row['post_text'];
            }
            
            //replace all spaces with a placeholder
            $message_pattern = str_replace(' ', '.*', $cur_message);
            $message_pattern = '/.*' . $message_pattern . '.*/';
            print $message_pattern;
                        
            //check, if user just append something, else forbid the edit
            if(preg_match($message_pattern, $data['message']) !== 1) {
                trigger_error($user->lang['ONLY_ATTACHING_ALLOWED']);
            }
            
        }

    }

Da sollte eigentlich keine Fehlermeldung erscheinen.

Poste ansonsten mal den eingefügten Code mit 10 Zeilen darüber und darunter.

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 06.02.2015 08:54
von freie-bildung
Guten Morgen :)

Okay, das hatte ich auch so gemacht. Der Fehler besteht:

Der Code sieht so aus:

Code: Alles auswählen

sync('topic_reported', 'topic_id', array($topic_id));
    }

    return $next_post_id;
}

/**
* Submit Post
* @todo Split up and create lightweight, simple API for this.
*/
function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)
{
    global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path;

    // We do not handle erasing posts here
    if ($mode == 'delete')
    {
        return false;
    }

    $current_time = time();

    if ($mode == 'post')
    {
        $post_mode = 'post';
        $update_message = true;
    }
    else if ($mode != 'edit')
    {
        $post_mode = 'reply';
        $update_message = true;
    }
            else if ($mode == 'edit')
        {
            $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
            
            if (!$auth->acl_gets('a_', 'm_'))
            {
                $cur_post_id = $data['post_id'];
            
                $sql = 'SELECT post_text, post_id FROM ' . POSTS_TABLE . ' WHERE post_id = ' . $cur_post_id;
            
                $result = $db->sql_query($sql);
        
                if ($row = $db->sql_fetchrow($result) )
                {
                    $cur_message = $row['post_text'];
                }
                
                //replace all spaces with a placeholder
                $message_pattern = str_replace(' ', '.*', $cur_message);
                $message_pattern = '/.*' . $message_pattern . '.*/';
                print $message_pattern;
                            
                //check, if user just append something, else forbid the edit
                if(preg_match($message_pattern, $data['message']) !== 1) {
                    trigger_error($user->lang['ONLY_ATTACHING_ALLOWED']);
                }
                
            }

        } 

    // First of all make sure the subject and topic title are having the correct length.
    // To achieve this without cutting off between special chars we convert to an array and then count the elements.
    $subject = truncate_string($subject);
    $data['topic_title'] = truncate_string($data['topic_title']);

    // Collect some basic information about which tables and which rows to update/insert
    $sql_data = $topic_row = array();
    $poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id'];

    // Retrieve some additional information if not present
    if ($mode == 'edit' && (!isset($data['post_approved']) || !isset($data['topic_approved']) || $data['post_approved'] === false || $data['topic_approved'] === false))
    {
        $sql = 'SELECT p.post_approved, t.topic_type, t.topic_replies, t.topic_replies_real, t.topic_approved
            FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
            WHERE t.topic_id = p.topic_id
                AND p.post_id = ' . $data['post_id'];
        $result = $db->sql_query($sql);
        $topic_row = $db->sql_fetchrow($result);
        $db->sql_freeresult($result);

        $data['topic_approved'] = $topic_row['topic_approved'];
        $data['post_approved'] = $topic_row['post_approved'];
    } 

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 06.02.2015 10:54
von paddle
Das verstehe ich nicht.

Bei mir lokal läuft das ohne Probleme.

Da ist noch eine Zeile zu viel sehe ich gerade, die ich zu Debug-Zwecken eingebaut hatte.

Die Zeile: print $message_pattern; kannst du getrost löschen, auch wenn sie nicht den Fehler verursachen sollte.


Der Code ist richtig eingefügt.

Welche Version von PHP und phpBB nutzt du denn?

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 15.02.2015 09:22
von freie-bildung
Hallo

Also ich nutze momentan noch 3.0.12 und PHP 5 läuft.

Re: Beitrag nachträglich ergänzen aber nicht ändern?

Verfasst: 17.02.2015 15:40
von paddle
Wann genau wird denn die Warnung ausgegeben?

Wenn du versuchst einen modifizierten Beitrag abzuschicken, oder schon beim Aufruf des Forums?

Ich kann die Warnung hier grad nicht nachvollziehen, dass macht ein Fehlerfinden recht schwer.