Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Хак. Фильтр по

Модерирует : Antuan

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

ivank



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посмотреть в работе можно здесь: http://www.forum-oszone.m-9.net/forums.cgi?forum=14
 


 
Хак "Фильтр по "

 
Фильтр по названию, описанию и автору темы.
 
 
Файл forums.cgi
 
В самом начале после:
 

Код:
 
$bypass         = &stripMETA("$bypass");
$inforum        = &stripMETA("$inforum");
$intopic        = &stripMETA("$intopic");
$action         = &stripMETA("$action");
$inshow         = &stripMETA("$inshow");
$jumpto         = &stripMETA("$jumpto");
 

 
Добавить:
 

Код:
 
######  Фильтр тем by ivank start
$filterby       = $query -> param('filterby');  
$filterstring   = $query -> param('filterstring');  
chomp $filterstring;  
if($filterby ne '')  
{  
    $filterpart = "&filterby=$filterby&filterstring=$filterstring";  
}  
###### Фильтр тем by ivank end
 

 
 
После:
 

Код:
 
  # Open up the forum threads list
 
    $filetoopen = "$ikondir" . "forum$inforum/list.cgi";
    $filetoopen = &stripMETA($filetoopen);
    if (-e $filetoopen) {
        open(FILE, "$filetoopen") or &error("$ibtxt{'0618'}&$ibtxt{'0619'}");
          flock (FILE, 2);
        @topics = <FILE>;
        close(FILE);
        }
 

 
Добавить:
 

Код:
 
 ##### Фильтр топиков. by ivank start
if( $filterby eq 'title'  )  
    {  
        @filtered_topics = ();  
        $lc_filterstring = $filterstring;  
        $lc_filterstring =~ tr/А-ЯЁЧ/а-яёч/;  
        foreach $topic ( @topics )  
        {  
            ($topicid, $lc_topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            $lc_topictitle =~ tr/А-ЯЁЧ/а-яёч/;  
            if( $lc_topictitle =~ /$lc_filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
    elsif($filterby eq 'author')  
    {  
        @filtered_topics = ();  
        foreach $topic ( @topics )  
        {  
($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            if( $startedby =~ /$filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
    elsif( $filterby eq 'description' )  
    {  
        @filtered_topics = ();  
        $lc_filterstring = $filterstring;  
        $lc_filterstring =~ tr/А-ЯЁЧ/а-яёч/;  
        foreach $topic ( @topics )  
        {  
($topicid, $topictitle, $lc_topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            $lc_topicdescription =~ tr/А-ЯЁЧ/а-яёч/;  
            if( $lc_topicdescription =~ /$lc_filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
 
    ##### filter end
 

 
При этом фильтр будет регистронезависимым.  
 
 
Выше был собственно хак. Теперь прикручиваем его к конференции.
Заменить:
 

Код:
 
        # Print the forum top bar
 
        $output .= qq~
            <table cellpadding=0 cellspacing=1 border=0 width=$tablewidth bgcolor=$tablebordercolor align=center>
            <tr>
                <td>
            <table cellpadding=6 cellspacing=0 border=0 width=100%>
                <tr>
                  <td valign=middle align=left width="100%" bgcolor="$menubackground" nowrap>$toptopicpages</td>
                  <td valign=middle align=right bgcolor="$menubackground" nowrap><font face="$font" color=$fontcolormisc size=$dfontsize1>
                   <b>$ibtxt{'0604'}</b> $modoutput
                    </td>
                </tr>
           </table>
           </tr>
          </td>
         </table>
        <br>
        ~;
 

 
На:
 

Код:
 
        # Print the forum top bar
 
 
if($filterby eq 'author') {$filterbyauthor = 'selected'; }  
if($filterby eq 'title') {$filterbytitle  = 'selected';}  
if($filterby eq 'description') {$filterbydescriprion  = 'selected';}  
 
 
        $output .= qq~
            <table cellpadding=0 cellspacing=1 border=0 width=$tablewidth bgcolor=$tablebordercolor align=center>
            <tr>
                <td>
            <table cellpadding=6 cellspacing=0 border=0 width=100%>
                <tr>
                  <td valign=middle align=left width="100%" bgcolor="$menubackground" nowrap>$toptopicpages</td>
                  <td valign=middle align=right bgcolor="$menubackground" nowrap><font face="$font" color=$fontcolormisc size=$dfontsize1>
                   <b>$ibtxt{'0604'}</b> $modoutput
                    </td>
                </tr>
<tr>
<td align="right" colspan="2">
<form action="$forumsprog" method=get>  
<input type=hidden name=forum value="$inforum">Фильтр:  
<input type=text size=14 name=filterstring value="$filterstring">  
по <select name=filterby>  
<option value=title $filterbytitle>названию темы  
<option value=author $filterbyauthor>автору
<option value=description $filterbydescriprion>описанию темы
</select>  
<input type=submit value="ok">  
           
~;
 
$output .= "<a href=\"$forumsprog?forum=$inforum\">Сбросить фильтр</a>" if($filterby ne '');  
 
$output .= qq~</td></tr></form></table></tr></td></table><br>~;
 
               
 
 
(c) ivank
 
 




----------
ivank
http://ivank.oszone.net

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 22:38 23-06-2002 | Исправлено: lynx, 01:27 26-08-2003
lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Net_man
 

Цитата:
Что-то ничего не получается.  Вроде все делаю как здесь, а получаю все время

 
Выложи свой forums.cgi в txt-файл и дай ссылку.

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 02:18 25-08-2003
Net_man

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lynx
http://net-man.narod.ru/baners/forums.txt

----------
Сканворды и кроссворды от Skanvord.com, генератор кроссвордов, кроссворды онлайн

Всего записей: 1150 | Зарегистр. 11-09-2002 | Отправлено: 20:11 25-08-2003
lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Net_man
 
Так.
 
Вот этот кусок:
 

Код:
 
#################--- Begin the program ---###################
$thisprog = "forums.cgi";
$query = new CGI;
$cookiepath     = $query->url(-absolute=>1);
$cookiepath     =~ s/$thisprog//sg;
$bypass         = $query -> param('bypass');
$inforum        = $query -> param('forum');
$intopic        = $query -> param('topic');
$action         = $query -> param('action');
$inshow         = $query -> param('show');
$jumpto         = $query -> param('jumpto');
###### ХАК. Фильтр тем. by ivank
$filterby       = $query -> param( 'filterby' );
$filterstring   = $query -> param( 'filterstring' );
chomp $filterstring;
if( $filterby ne '' )
{
    $filterpart     = "&filterby=$filterby&filterstring=$filterstring";
}
###### Конец ХАКА
die "Hack attempt!" unless $inforum =~ m!\A\d{1,3}\Z!;
die "Hack attempt!" if $intopic && $intopic !~ m!\A\d{1,7}\Z!;
$inmembername   = cookie("amembernamecookie");
$inpassword     = cookie("apasswordcookie");
$bypass         = &stripMETA("$bypass");
$inforum        = &stripMETA("$inforum");
$intopic        = &stripMETA("$intopic");
$action         = &stripMETA("$action");
$inshow         = &stripMETA("$inshow");
$jumpto         = &stripMETA("$jumpto");
 

 
 
Меняй на этот кусок:
 
 

Код:
 
#################--- Begin the program ---###################
 
$thisprog = "forums.cgi";
 
 
$query = new CGI;
 
$cookiepath     = $query->url(-absolute=>1);
$cookiepath     =~ s/$thisprog//sg;
$bypass         = $query -> param('bypass');
$inforum        = $query -> param('forum');
$intopic        = $query -> param('topic');
$action         = $query -> param('action');
$inshow         = $query -> param('show');
$jumpto         = $query -> param('jumpto');
die "Hack attempt!" unless $inforum =~ m!\A\d{1,3}\Z!;
die "Hack attempt!" if $intopic && $intopic !~ m!\A\d{1,7}\Z!;
 
 
$inmembername   = cookie("amembernamecookie");
$inpassword     = cookie("apasswordcookie");
 
$bypass         = &stripMETA("$bypass");
$inforum        = &stripMETA("$inforum");
$intopic        = &stripMETA("$intopic");
$action         = &stripMETA("$action");
$inshow         = &stripMETA("$inshow");
$jumpto         = &stripMETA("$jumpto");
 
###### ХАК. Фильтр тем. by ivank  
$filterby       = $query -> param( 'filterby' );  
$filterstring   = $query -> param( 'filterstring' );  
chomp $filterstring;  
if( $filterby ne '' )  
{  
    $filterpart     = "&filterby=$filterby&filterstring=$filterstring";  
}  
###### Конец ХАКА  
 
 

 
 
Далее. К фильтру отношения не имеет, но все-таки.
 
Кусок:
 

Код:
 
        if ($forumgraphic) {
        $forumgraphic = qq~<a href="$forumsprog?forum=$inforum"><img src="$imagesurl/images/$forumgraphic" border=0></a>~;
        }
        else {} ##Это что такое то?
 

 
 
Меняй на:
 
 

Код:
 
$forumgraphic = qq~<a href="$forumsprog?forum=$inforum"><img src="$imagesurl/images/$forumgraphic" border=0></a>~  if ($forumgraphic);
 

 
 
Это:
 

Код:
 
     ##### ХАК. Фильр топиков. by ivank.
    if( $filterby eq 'title' )
    {
        @filtered_topics = ();
        foreach $topic ( @topics )
        {
            ($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);
            if( $topictitle =~ /$filterstring/i )
            {
                push @filtered_topics, $topic;
            }
        }
        @topics = @filtered_topics;
    }
    elsif( $filterby eq 'author' )
    {
        @filtered_topics = ();
        foreach $topic ( @topics )
        {
            ($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);
            if( $startedby =~ /$filterstring/i )
            {
                push @filtered_topics, $topic;
            }
        }
        @topics = @filtered_topics;
    }
    ##### Конец хака.
 

 
 
Меняй на:
 

Код:
 
 ##### Фильр топиков. by ivank start
if( $filterby eq 'title'  )  
    {  
        @filtered_topics = ();  
        $lc_filterstring = $filterstring;  
        $lc_filterstring =~ tr/А-ЯЁЧ/а-яёч/;  
        foreach $topic ( @topics )  
        {  
            ($topicid, $lc_topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            $lc_topictitle =~ tr/А-ЯЁЧ/а-яёч/;  
            if( $lc_topictitle =~ /$lc_filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
    elsif($filterby eq 'author')  
    {  
        @filtered_topics = ();  
        foreach $topic ( @topics )  
        {  
($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            if( $startedby =~ /$filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
    elsif( $filterby eq 'description' )  
    {  
        @filtered_topics = ();  
        $lc_filterstring = $filterstring;  
        $lc_filterstring =~ tr/А-ЯЁЧ/а-яёч/;  
        foreach $topic ( @topics )  
        {  
($topicid, $topictitle, $lc_topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split(/\|/,$topic);  
            $lc_topicdescription =~ tr/А-ЯЁЧ/а-яёч/;  
            if( $lc_topicdescription =~ /$lc_filterstring/i )  
            {  
                push @filtered_topics, $topic;  
            }  
        }  
        @topics = @filtered_topics;  
    }  
 
    ##### filter end
 
   
 
Это делает фильтр регистронезависимым.
 
 
 
Попробуй.
 
 
 
Добавлено
Выложила все в первый пост. Протестировано на дефолтной конфе.

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 00:35 26-08-2003
Net_man

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lynx
Увы:

Цитата:
Software error:
Missing right curly or square bracket at forums.cgi line 535, at end of line
syntax error at forums.cgi line 535, at EOF
Execution of forums.cgi aborted due to compilation errors.
 

535 - последняя строчка. Сейчас попробую "с нуля" поставить то, что в шапке в бэкапный forum.cgi.
 
Добавлено
lynx
Ураааа!!! Получилось. Спасибо, тебе lynx огромное.

----------
Сканворды и кроссворды от Skanvord.com, генератор кроссвордов, кроссворды онлайн

Всего записей: 1150 | Зарегистр. 11-09-2002 | Отправлено: 03:35 26-08-2003
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народы, как по-вашему, этот фильтр сильно грузит? Стоит связываться при слабом сервачке?
Всем привет.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 01:21 17-02-2004
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Marilda  В отличии от поиска не очень, хорошая штучка.

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 01:31 17-02-2004
Net_man

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Marilda

Цитата:
фильтр сильно грузит?

Я лично особой разницы не заметил. Зато штука - супер-полезная.

----------
Сканворды и кроссворды от Skanvord.com, генератор кроссвордов, кроссворды онлайн

Всего записей: 1150 | Зарегистр. 11-09-2002 | Отправлено: 07:10 17-02-2004
lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Marilda

Цитата:
 этот фильтр сильно грузит? Стоит связываться при слабом сервачке?  

 
Не грузит совсем.

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 22:19 17-02-2004
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Огромное спасибо! Прекрасный хак.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 13:55 20-02-2004
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хак работает замечательно, но есть баг Если результат поиска - несколько страниц, то вместо ссылок на 2-ю и следующие страницы результатов стоят ссылки на страницы форума.  
Т.е., вместо ссылок на  

Код:
хттп://путь/cgi-bin/forum/forums.cgi?forum=1&show=20&filterby=author&filterstring=автор

стоит

Код:
хттп://путь/cgi-bin/forum/forums.cgi?forum=1&show=20

 
 
 
Добавлено
А, ну вроде поправила.
 
forums.cgi
Вхождения  

Код:
<a href="$thisprog?forum=$inforum&show=$pagestart">

заменить на

Код:
<a href="$thisprog?forum=$inforum&show=$pagestart$filterpart">






Молодца lynx.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 15:09 26-02-2004 | Исправлено: lynx, 04:49 27-02-2004
ALX



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хак работает прекрасно - спасибо.
 
Однако, у меня на странице с отфильтрованными результатами не сохраняется ключевое слово фильтра в форме.  Это только у меня такой глюк или это "by design" ?

Всего записей: 428 | Зарегистр. 30-01-2002 | Отправлено: 04:07 30-04-2004
Xnom



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ALX
а по какому критерию  фильтровал сохраняется?

Всего записей: 778 | Зарегистр. 09-10-2002 | Отправлено: 23:25 30-04-2004
ALX



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Xnom
по всем трем ситуация одниаковая - не сохраняется

Всего записей: 428 | Зарегистр. 30-01-2002 | Отправлено: 20:38 03-05-2004
lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ALX

Цитата:
Однако, у меня на странице с отфильтрованными результатами не сохраняется ключевое слово фильтра в форме.  Это только у меня такой глюк или это "by design" ?

 
Все сохраняется, видимо, проблема с локальными настройками. Попробуй на другом браузере и спроси у юзеров своих - как у них?

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 03:10 27-05-2004
Wozik



Ёж
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что бы форма фильтра появлялась не в отдельной таблице, а в той же самой где написан модератор форума (мне это показалось красивее),
Цитата:
 $output .= qq~  
            <table cellpadding=0 cellspacing=1 border=0 width=$tablewidth bgcolor=$tablebordercolor align=center>  
            <tr>  
                <td>  
            <table cellpadding=6 cellspacing=0 border=0 width=100%>  
                <tr>  
                  <td valign=middle align=left width="100%" bgcolor="$menubackground" nowrap>$toptopicpages</td>  
                  <td valign=middle align=right bgcolor="$menubackground" nowrap><font face="$font" color=$fontcolormisc size=$dfontsize1>  
                   <b>$ibtxt{'0604'}</b> $modoutput  
                    </td>  
                </tr>  
<tr>  
<td align="right" colspan="2">  
<form action="$forumsprog" method=get>  
<input type=hidden name=forum value="$inforum">Фильтр:  
<input type=text size=14 name=filterstring value="$filterstring">  
по <select name=filterby>  
<option value=title $filterbytitle>названию темы  
<option value=author $filterbyauthor>автору  
<option value=description $filterbydescriprion>описанию темы  
</select>  
<input type=submit value="ok">  
             
~;  
 
$output .= "<a href=\"$forumsprog?forum=$inforum\">Сбросить фильтр</a>" if($filterby ne '');  
 
$output .= qq~</td></tr></form></table></tr></td></table><br>~;

код рпедложенный иванком я заменил на
Цитата:
$output .= qq~
            <table cellpadding=0 cellspacing=1 border=0 width=$tablewidth bgcolor=$tablebordercolor align=center>
            <tr>
                <td>
            <table cellpadding=6 cellspacing=0 border=0 width=100%>
                <tr>
                  <td valign=middle align=left width="100%" bgcolor="$menubackground" nowrap>$toptopicpages</td>
                  <td valign=middle align=right bgcolor="$menubackground" nowrap><font face="$font" color=$tablebordercolor size=$dfontsize1>
                   
                 <form action="$forumsprog" method=get>  
<input type=hidden name=forum value="$inforum">Фильтр:  
<input type=text size=14 name=filterstring value="$filterstring">  
по <select name=filterby>  
<option value=title $filterbytitle>названию темы  
<option value=author $filterbyauthor>автору  
<option value=description $filterbydescriprion>описанию темы  
</select>  
<input type=submit value="ok">  
             
~;  
 
$output .= "<a href=\"$forumsprog?forum=$inforum\">Сбросить фильтр</a>" if($filterby ne '');    
 
$output .= qq~<b>&nbsp;&nbsp;$ibtxt{'0604'}</b>$modoutput</td></tr></form></table></tr></td></table><br>~;

Всего записей: 589 | Зарегистр. 02-01-2003 | Отправлено: 15:38 25-08-2004 | Исправлено: Wozik, 15:39 25-08-2004
panama



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А третий иконбоард такую штуку скушает?
 
В ветке "IkonBoard и другие форумы » Ikonboard v.3" такого хака нет
 
Кто-то может поделиться?

Всего записей: 12 | Зарегистр. 29-12-2003 | Отправлено: 19:21 13-06-2006
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
panama, не скушает, ИБ3 совсем по другому написан.


----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 12:23 14-06-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Хак. Фильтр по


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru