статья про массовое соединение топиков (нужна ли?)

Автор bbbbbb, 16 мая 2009, 23:28:46

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

bbbbbb

нужна ли статья для массового соединения топиков?

написал скрипты и соединил + юрл красивую сделал чтобы ссылка была на объединенную!!


скрипты были для соединения топиков (топики без ответа) но можно и меседжы из топиками...

Mavn

а чем стандартная функция соединения тем не устраивает??
SimpleMachines Russian Community Team
п.1 Пройду курсы гадалок для определения исходного кода по скриншоту.

п.2 У вас нет желания читать правила раздела, у меня нет желания одобрять темы, которые не соответствуют этим правилам.

bbbbbb

#2
если у тебя много тем в разделе, ты можешь указать в каком разделе эти темы находятся и указать диапазон тем от меньшей до большей по id, либо по другому но надо будет скритп стругать

если у тебя тем штук 500-1000 и более, разве есть возможность без гемороя соединить?

я сделал: чтобы первые сообщения в темах соединялись в одну тему, и чтобы новая тема в котрую мы соединяли все остальные была с одним сообщением...!!!!

допустим, если надо рейтинг построить, или еще как-то, или в архив отправить а ссылки оставить...

я не много не доделал, хотя фиг его знает

заготовка:

ИД от 4675130 и первые 250 которые больше, в разделе 15
можно обработать, убалить не нужное или например скрыть ссылки (или поставить почерквание перед ссылкой _http://www.simplemachines.ru )

#!/usr/bin/perl

use DBI;



$db_name = 's11_db';

    # user from db
   $db_user = 'root';
   $db_pass = '';
   $db_type = 'mysql';
   $db_host = 'localhost';

    $dbh = DBI->connect(
"DBI:$db_type:database=$db_name;host=$db_host",
        $db_user,
        $db_pass,
        { RaiseError => 1,
         PrintError => 1 }
    ) || die $DBI::errstr;
   
   
    $topic = '4675130';
   
       my $sth = $dbh->prepare(
       'select ID_TOPIC, body  from smf_sdfmessages  where ID_BOARD = 15 AND ID_TOPIC > ? limit 250'
                             );
        $sth->execute($topic);
       
        my $rows;
      push @{$rows}, $_ while $_ = $sth->fetchrow_hashref();
        $sth->finish();
       
       
        my $test;
       
       
       
        foreach $_ ( @{$rows} ) {


        $dbh->do(
            qq{DELETE FROM smf_sdfmessages
                         WHERE ID_TOPIC = ?
                         AND ID_TOPIC != ?
                         },
            undef, $_->{ID_TOPIC}, $topic
        );
             
             
             # тут можно обработать, убалить не нужное или например скрыть ссылки и т.д. и т.п.
       # $_->{body} =~ s/\<ul\>//g;
       # $_->{body} =~ s/\<p\>/>/g;
       # $_->{body} =~ s/\<\/p\>//g; 
       # $_->{body} =~ s/\<li\>//g;
       # $_->{body} =~ s/\<\/ul\>//g;
           
             
       #     $_->{body} =~ s/&amp;lt;/</g;
       # $_->{body} =~ s/&amp;gt;/>/g;
       # $_->{body} =~ s/&amp;quot;/"/g;
       
   # $_->{body} =~ s/Цитата//;
       
       
    #    $_->{body} =~ s/#3(.{1,6})//;
     #           $_->{body} =~ s/...//g;

      #   $_->{body} =~ s/\[b\] \[/b\]//;

       
      #  $_->{body} =~ s/#4(.{1,6})//;

       # $_->{body} =~ /(?:[http\:\/\/])(?:[\w\-]+\.)(\w+(?:[\.\-]))(?=[\.org.ru\.fff])/goi;
       
     #   $_->{body} =~ s/http\:\/\/bash.org.ru\/quote\/(.{1,6})//;
       
        $test .= " $_->{body} \n ======================================================  \n ";
       
       
       
        next if ($_->{ID_TOPIC} == 168);
       
       
        $dbh->do(
            qq{INSERT INTO bad_topic (bad_topic,
                             true_topic)
              VALUES (?,?)
              },       
                undef, $_->{ID_TOPIC}, $topic );
             
                         
       



        }
       
     
           

       my $sth = $dbh->prepare(
                   'UPDATE smf_sdfmessages
                           SET
                           body = ?
                     WHERE ID_TOPIC = ?'
                             );
        $sth->execute($test, $topic);
       


        $sth->finish();


в этом скрипте я удалил темы которые соединял!!!!!!!

для того чтобы отправить боты или пользователя на новую темы с удаленно, нужно записать все ИД удаленных тем на ту куда бы они ссылались

    CREATE TABLE bad_topic (
            bad_topic mediumint(8),
            true_topic mediumint(8),
            PRIMARY KEY (bad_topic, true_topic)
    );


load.php Как был:
// Hacker... you can't see this topic, I'll tell you that. (but moderators can!)
if (!empty($board_info['error']) && ($board_info['error'] != 'access' || !$user_info['is_mod']))
{
// The permissions and theme need loading, just to make sure everything goes smoothly.
loadPermissions();
loadTheme();

$_GET['board'] = '';
$_GET['topic'] = '';

// If it's a prefetching agent, just make clear they're not allowed.
if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch')
{
ob_end_clean();
header('HTTP/1.1 403 Forbidden');
die;
}
elseif ($user_info['is_guest'])
{
loadLanguage('Errors');
is_not_guest($txt['topic_gone']);
}
else
fatal_lang_error('topic_gone', false);
}

if ($user_info['is_mod'])
$user_info['groups'][] = 3;
}


меняем на:
// Hacker... you can't see this topic, I'll tell you that. (but moderators can!)
if (!empty($board_info['error']) && ($board_info['error'] != 'access' || !$user_info['is_mod']))
{
// The permissions and theme need loading, just to make sure everything goes smoothly.
loadPermissions();
loadTheme();

// $_GET['board'] = '';
// $_GET['topic'] = '';

// If it's a prefetching agent, just make clear they're not allowed.
if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch')
{
ob_end_clean();
header('HTTP/1.1 403 Forbidden');
die;
}
elseif ($user_info['is_guest'])
{

$request2 = db_query("
SELECT true_topic
  FROM bad_topic
WHERE bad_topic = " .$_GET['topic'] ." LIMIT 1 " , __FILE__, __LINE__);

//$user_settings = mysql_fetch_assoc($request2);


while ($row = mysql_fetch_assoc($request2))
{
    $topic2 = $row['true_topic'];

  // echo $row['true_topic'];
}

if ($topic2) {
     $topic = $topic2;
           } else {
loadLanguage('Errors');
is_not_guest($txt['topic_gone']);

}



}
else
// fatal_lang_error('topic_gone', false);
//$topic = '34'; // die('Hacking attempt...');

$request2 = db_query("
SELECT true_topic
  FROM bad_topic
WHERE bad_topic = " .$_GET['topic'] ." LIMIT 1 " , __FILE__, __LINE__);

//$user_settings = mysql_fetch_assoc($request2);


while ($row = mysql_fetch_assoc($request2))
{
    $topic2 = $row['true_topic'];

  // echo $row['true_topic'];
}

if ($topic2) {
     $topic = $topic2;
           } else {
fatal_lang_error('topic_gone', false);

}




}

if ($user_info['is_mod'])
$user_info['groups'][] = 3;
}


в обшем: для пользования надо доработать, но кому надо или горит это - сделаю

bbbbbb

#3
ВНИМАНИЕ! при использовании надо бэкап базы и каталогов с php
и (или) протестировать на тестовом форуме

Display.php
// Get all the important topic info.
$request = db_query("
SELECT
t.numReplies, t.numViews, t.locked, ms.subject, t.isSticky, t.ID_POLL,
t.ID_MEMBER_STARTED, t.ID_FIRST_MSG, t.ID_LAST_MSG,
" . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, -1) + 1') . " AS new_from
FROM ({$db_prefix}topics AS t, {$db_prefix}messages AS ms)" . ($user_info['is_guest'] ? '' : "
LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = $topic AND lt.ID_MEMBER = $ID_MEMBER)") ."
WHERE t.ID_TOPIC = $topic
AND ms.ID_MSG = t.ID_FIRST_MSG
LIMIT 1", __FILE__, __LINE__);
if (mysql_num_rows($request) == 0)
fatal_lang_error(472, false);
$topicinfo = mysql_fetch_assoc($request);
mysql_free_result($request);

// The start isn't a number; it's information about what to do, where to go.


меняем на

// Get all the important topic info.
$request = db_query("
SELECT
t.numReplies, t.numViews, t.locked, ms.subject, t.isSticky, t.ID_POLL,
t.ID_MEMBER_STARTED, t.ID_FIRST_MSG, t.ID_LAST_MSG,
" . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, -1) + 1') . " AS new_from
FROM ({$db_prefix}topics AS t, {$db_prefix}messages AS ms)" . ($user_info['is_guest'] ? '' : "
LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = $topic AND lt.ID_MEMBER = $ID_MEMBER)") ."
WHERE t.ID_TOPIC = $topic
AND ms.ID_MSG = t.ID_FIRST_MSG
LIMIT 1", __FILE__, __LINE__);

$topicinfo = mysql_fetch_assoc($request);
mysql_free_result($request);

if (mysql_num_rows($request) == 0) {

$request2 = db_query("
SELECT true_topic
  FROM bad_topic
WHERE bad_topic = ".$topic." LIMIT 1 " , __FILE__, __LINE__);

//$user_settings = mysql_fetch_assoc($request2);


while ($row = mysql_fetch_assoc($request2))
{
    $topic2 = $row['true_topic'];

  // echo $row['true_topic'];
}

mysql_free_result($request2);

if (isset($topic2)) {

$topic = null;

     $topic = $topic2;
     
    $request = null;
   
$request = db_query("
SELECT
t.numReplies, t.numViews, t.locked, ms.subject, t.isSticky, t.ID_POLL,
t.ID_MEMBER_STARTED, t.ID_FIRST_MSG, t.ID_LAST_MSG,
" . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.ID_MSG, -1) + 1') . " AS new_from
FROM ({$db_prefix}topics AS t, {$db_prefix}messages AS ms)" . ($user_info['is_guest'] ? '' : "
LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = $topic AND lt.ID_MEMBER = $ID_MEMBER)") ."
WHERE t.ID_TOPIC = $topic
AND ms.ID_MSG = t.ID_FIRST_MSG
LIMIT 1", __FILE__, __LINE__);     
   

      $topicinfo = null;
          //  fatal_lang_error(472, false);
$topicinfo = mysql_fetch_assoc($request);
mysql_free_result($request);
           
}
    } else {

fatal_lang_error(472, false);

}

bbbbbb

предыдущий пост откоректироавл, добавил чтобы удаленные ИД сообщения тоже ссылались (там проверялось предыдущие и слудющие темы)

пример работы можно посмотреть тут:
http://unixforum.org.ua/index.php?topic=7692.0
http://unixforum.org.ua/index.php?topic=18599.0

Mr. Anviss