Strona 1 z 1

[szukam->propozycja]mod do automatycznego sklejania posto

: 03 sierpnia 2005, 09:01
autor: Lilly
Otoz, czy ktos wie, gdzie mozna znalesc moda, ktory automatycznie skleja posty (zaraz po napisaniu nowego dodajac date nowego wpisu) tego samego autora, jesli sa dwa kolejne po sobie :?: Chociaz podpowiedz, jak moze sie nazywac ;-) bo jak znajde chwilke to sama zaczne go szukac. Z gory dziekuje za pomoc :)

: 03 sierpnia 2005, 10:18
autor: Kokoosh
chodzi Ci o moda laczenie postów?
jesli tak to prosze
Otworz posting.php i znajdz:

Kod: Zaznacz cały

else if ( $submit || $confirm ) 
{ 

Kod: Zaznacz cały

niżej dodaj: 

   // Wlacz laczenie postow (true - wlaczone, false - wylaczone) 
   $split_messages = true; 

   // Wlacz laczenie postow dla adminow 
   $split_messages_admin = true; 

   // Wlacz laczenie postow dla moderatorow 
   $split_messages_mod = true; 

   // Nie lacz w forach (wartosci oddziel przecinkami np: '3, 6, 8'; 
   $split_messages_except = ''; 

   if ( $mode == 'reply' && $userdata['user_id'] != ANONYMOUS ) 
   { 
      $do_split = false; 
      if ( $userdata['user_level'] == ADMIN ) 
      { 
         $do_split = (!$split_messages_admin) ? false : true; 
      } 
      else 
      { 
         $do_split = ($userdata['user_level'] == MOD && !$split_messages_mod) ? false : true; 
      } 

      if ( !empty($split_messages_except) && $do_split ) 
      { 
         if ( strstr($split_messages_except, ',') ) 
         { 
            $fids = explode(',', $split_messages_except); 
            while( list($foo, $id) = each($fids) ) 
            { 
               $fid[] = intval( trim($id) ); 
            } 
         } 
         else 
         { 
            $fid[] = intval( trim($split_messages_except) ); 
         } 
         reset($fid); 
         $do_split = ( in_array($forum_id, $fid) == true ) ? false : true; 
      } 

      if ( $do_split ) 
      { 
         $poster_id = $userdata['user_id']; 

         $sql = "SELECT post_id, poster_id, MAX(post_time) FROM " . POSTS_TABLE . " 
            WHERE topic_id = $topic_id 
            GROUP BY post_time 
            ORDER BY post_time DESC LIMIT 1"; 
    
         if ( !($result = $db->sql_query($sql)) ) 
         { 
            message_die(GENERAL_ERROR, 'Could not obtain post', '', __LINE__, __FILE__, $sql); 
         } 
         $post_id_last_row = $db->sql_fetchrow($result); 
         $post_id = $post_id_last_row['post_id']; 
         $poster_topic_id = $post_id_last_row['poster_id']; 

         if ( $post_id_last_row['poster_id'] == $poster_id ) 
         { 
            $sql = "SELECT pt.post_text, pt.bbcode_uid, p.enable_bbcode, p.enable_html, p.enable_smilies 
               FROM " . POSTS_TEXT_TABLE . " pt, " . POSTS_TABLE . " p 
               WHERE p.post_id = $post_id 
               AND pt.post_id = $post_id"; 
            if ( !($result = $db->sql_query($sql)) ) 
            { 
               message_die(GENERAL_ERROR, 'Could not obtain post information', '', __LINE__, __FILE__, $sql); 
            } 
            $row = $db->sql_fetchrow($result); 

            $buid = $row['bbcode_uid']; 
            $add_data = create_date($board_config['default_dateformat'], time(), $board_config['board_timezone']); 
            $separator = " \n\n[size=9:" . $buid . "][ [i:" . $buid . "][b:" . $buid . "]Dodano[/b:" . $buid . "]: " . $add_data . "[/i:" . $buid . "] ][/size:" . $buid . "]\n"; 
            $message = prepare_message($HTTP_POST_VARS['message'], $row['enable_html'], $row['enable_bbcode'], $row['enable_smilies'], $buid, $forum_id); 
            $last_message = prepare_message(str_replace(array("'", "\\"), array("''", "\\\\"), unprepare_message($row['post_text'])), $row['enable_html'], $row['enable_bbcode'], $row['enable_smilies'], $buid, $forum_id); 
            $splited = $last_message . $separator . str_replace("\'", "''", $message); 

            if ( strlen($splited) > 65500 ) 
            { 
               message_die(GENERAL_MESSAGE, 'Your message is too long. It can not be more than 65500 chars.'); 
            } 

            if ( trim(str_replace("''", "\'", $last_message)) == trim(str_replace('\"', '"', $message)) ) 
            { 
               message_die(GENERAL_ERROR, 'Detected that same message !'); 
            } 

            $sql = "UPDATE " . POSTS_TEXT_TABLE . " 
               SET post_text = '$splited' 
               WHERE post_id = $post_id"; 
            if ( !($result = $db->sql_query($sql)) ) 
            { 
               message_die(GENERAL_ERROR, 'Could not update splited message', '', __LINE__, __FILE__, $sql); 
            } 

            include($phpbb_root_path . 'includes/functions_search.'.$phpEx); 
            add_search_words(0, $post_id, stripslashes($message)); 

            $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewtopic.$phpEx?" . POST_POST_URL . "=" . $post_id) . '#' . $post_id . '">'; 
            $return_message = $lang['Stored'] . '<br /><br />' . sprintf($lang['Click_view_message'], '<a href="' . append_sid("viewtopic.$phpEx?" . POST_POST_URL . "=" . $post_id) . '#' . $post_id . '">', '</a>') . '<br /><br />' . sprintf($lang['Click_return_forum'], '<a href="' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=$forum_id") . '">', '</a>'); 

            $template->assign_vars(array( 
               'META' => $meta . $return_meta) 
            ); 

            message_die(GENERAL_MESSAGE, $return_message); 
         } 
      } 
   } 

: 03 sierpnia 2005, 17:06
autor: Lilly
Fajno, zadzialalo za pierwszym zamachem bez bledow ;-)
Chociaz okazalo sie, ze ma to jedna wade - jak ktos napisze takiego nowego posta, nie widac, ze w topiku pojawilo sie cos nowego - chyba, ze zle sprawdzilismy. Wie ktos jak to rozwiazac :?:

: 03 sierpnia 2005, 17:53
autor: Kokoosh
hmm, jest na to rozwiązanie, tego hacka pisał Przemo..
trzeba byloby sie zglosic na phpbb2.pl i spytac sie jak zrobic zeby w laczeniu postow pokazywalo ze ktos dodal "dodatkowy" post ..

: 03 sierpnia 2005, 19:14
autor: Dark Magician Boy
Lilly pisze:hociaz okazalo sie, ze ma to jedna wade - jak ktos napisze takiego nowego posta, nie widac, ze w topiku pojawilo sie cos nowego - chyba, ze zle sprawdzilismy. Wie ktos jak to rozwiazac
to będzie trudne :(

: 03 sierpnia 2005, 19:25
autor: MSX2
Wystarczy tylko w dobrym miejscu UPDATE'a dać... Ale ja się w to nie bawię:P

: 03 sierpnia 2005, 19:45
autor: Lilly
To niech bedzie dla potomnych ;-)

Kod: Zaznacz cały

$time = time();
$sql = "UPDATE " . POSTS_TABLE . " SET post_time = $time WHERE post_id = $post_id";
if ( !($result = $db->sql_query($sql)) )
            {
               message_die(GENERAL_ERROR, 'Nie udalo sie zmienic czasu posta', '', __LINE__, __FILE__, $sql);
            }
Trzeba wstawic po:

Kod: Zaznacz cały

$sql = "UPDATE " . POSTS_TEXT_TABLE . "
               SET post_text = '$splited'
               WHERE post_id = $post_id";
            if ( !($result = $db->sql_query($sql)) )
            {
               message_die(GENERAL_ERROR, 'Could not update splited message', '', __LINE__, __FILE__, $sql);
            }
w tym kodzie, ktory powyzej napisal Kokoosh.
Zasada dzialania jest taka, ze zmienia sie data glownego posta. Jest to obejscie troche na okolo, ale poki co nie udalo mi sie wymyslic nic lepszego (trzeba by pewnie zmienic warunki wyswietlania "new_post" we view_forum.php, a na to chwilowo nie mam ochoty bo jeszcze nie rozgryzlam zbyt dobrze tego pliku).

EDIT: Za wczasu uprzedze, ze ta moja modyfikacja ma jeszcze drobne niedociagniecia w postaci zlego przekierowania do ostatniego posta z poziomu forum oraz zlego sortowania postow w subforum (ten nowy nie jeste na gorze). Kiedy to naprawie, umieszcze tutaj. Ewentualne pomysly i podpowiedzi mile widziane :)

: 06 sierpnia 2005, 16:06
autor: MSX2
Lilly, może to zapytanie Cię naprowadzi na to, na to trzeba napisać update:

Kod: Zaznacz cały

$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time 
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
	WHERE t.forum_id = $forum_id
		AND t.topic_poster = u.user_id
		AND p.post_id = t.topic_first_post_id
		AND p2.post_id = t.topic_last_post_id
		AND u2.user_id = p2.poster_id 
		AND t.topic_type <> " . POST_ANNOUNCE . " 
		$limit_topics_time
	ORDER BY t.topic_type DESC, t.topic_last_post_id DESC 
	LIMIT $start, ".$board_config['topics_per_page'];
A chodzi mi dokładniej o fragment:

Kod: Zaznacz cały

t.topic_last_post_id DESC
:twisted: leniwy jestem, nie?

: 06 sierpnia 2005, 16:11
autor: Lilly
W sumie to wiem, ze trzeba zmienic post_id i last_post_id, bo wedlug nich na forum jest wszystko ukladane. Natomiast trzeba to zrobic przynajmniej w dwoch tabelach. Jedno zapytanie juz mam napisane, drugie chodzi po glowie, tylko musze i tak zrobic sobie forum testowe u siebie na kompie, bo jak sie nie daj boze pomyle w ktoryms z zapytan, to mi jeszcze jakis post zniknie, albo jeszcze cos gorszego :P Wiec czekam po prostu na chwilke czasu, zeby skonfigurowac u siebie Krasnala ;-)

: 06 sierpnia 2005, 16:12
autor: MSX2
Hehe, owszem... Dwie tabele, dwa pola do zmodyfikowania.
Co do testów forum - mi się najlepiej na żywca testuje :p...

: 06 sierpnia 2005, 16:14
autor: Lilly
Ja tez zazwyczaj testuje na zywca - ale tym razem przewiduje, ze moga pojawic sie konsekwencje nie do odwrocenia...

P.S. Masz plusika za dobre kombinowanie i checi ;-)