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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
durachka



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
УРА! Хоть какие-то подвижки. Пойду свою конфу мучить .
 
Добавлено

Цитата:
$notify         = $query -> param('notify');  
$notify         = &stripMETA("$notify");  

А у меня нет таких строк . Может чуть больше кода приведете?

Всего записей: 596 | Зарегистр. 20-05-2001 | Отправлено: 23:05 23-06-2002
pechalny



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank
Пашет
Тока очепятка у БигМака на борде, я ему уже кинул мессагу в асю

Цитата:
Фильр:


----------
cynicism is the only thing that keeps me sane

Всего записей: 1852 | Зарегистр. 29-07-2001 | Отправлено: 00:09 24-06-2002
durachka



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

Цитата:
<input type=hidden name=forum value="$inforum">Фильр:  

опечаточка. фильТр
А так все работает. Спасибо!

Всего записей: 596 | Зарегистр. 20-05-2001 | Отправлено: 00:20 24-06-2002
MVY

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ураааааааа . Наконец-то нашёлся хоть один добрый человек . Огроменное тебе спасибо ivank. А то все ломались поделиться им

Всего записей: 297 | Зарегистр. 02-02-2002 | Отправлено: 02:09 24-06-2002
Grey2002



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank
спасибо за хак огроомное

----------
Мой Блог

Всего записей: 1325 | Зарегистр. 24-12-2001 | Отправлено: 07:50 24-06-2002
ivank



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

Цитата:
Цитата:$notify         = $query -> param('notify');    
$notify         = &stripMETA("$notify");    
 
А у меня нет таких строк . Может чуть больше кода приведете?  
Сорри это остатки предыдущего самописанного хака. Добавлять
Цитата:
###### ХАК. Фильтр тем. by ivank  
$filterby       = $query -> param( 'filterby' );  
$filterstring   = $query -> param( 'filterstring' );  
chomp $filterstring;  
if( $filterby ne '' )  
{  
    $filterpart     = "&filterby=$filterby&filterstring=$filterstring";  
}  
###### Конец ХАКА
Надо после:
Код:
$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.
    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.
    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;
    }
    ##### Конец хака.
Вроде фсё.
 
Добавлено
И спасибо тем, кто сказал про очепятку.
 
Добавлено
pechalny
э-э-э.... Мог бы и мне в асю кинуть, я вроде как скриптами там и занимаюсь.
 
MVY, durachka, Grey2002
Фсегда пожалуйста

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

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 08:14 24-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ivank
Через Ж ты сделал, имхо.
У меня всё проще реализовано.
Во-первых, зачем лишний массив, а во-втором лучше в куки пихать, чем в урл...

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 11:05 24-06-2002
MVY

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ivank
А можно туда ещё добавить - "По описанию" и по "слову в сообщении" ? Было бы вообще прекрасно

Всего записей: 297 | Зарегистр. 02-02-2002 | Отправлено: 11:06 24-06-2002
Grey2002



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank
спасибо.. поставил нормально, а то этих строк тоже не нашёл

----------
Мой Блог

Всего записей: 1325 | Зарегистр. 24-12-2001 | Отправлено: 12:35 24-06-2002
ivank



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexander Ipp
В куки? Это идея... Но! А что если кто-то спросил, "что такое MySQL" у меня в форуме, допустим. И теперь я ему хочу сказать, что в инфы о MySQL Полно... И что я делаю? Прально даю урл типа http://forum/forums.cgi?forum=XXX&filterby=title&filterstring=MySQL , а как такое с куками провернуть? А то что через Ж написано это не страшно. Я на перле писать не умею На самом то деле при 250 темах оно фильтрует вполне себе быстро (время выполнения не возрастает даже на сотую). А как это сделать без извратов с временным массивом -- не представляю.
 
MVY
По "слову в собщении" -- это уже полноценный поиск... А по описанию легко... Меняй
Код:
    ##### ХАК. Фильтр топиков. by ivank.
    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;
    }
    ##### Конец хака.
На:
Код:
    ##### ХАК. Фильтр топиков. by ivank.
    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;
    }
    ##### Конец хака.
И поменяй
Код:
##### ХАК. Фильтр топиков. by ivank.
if( $filterby eq 'author' ) { $filterbyauthor = 'selected' }
if( $filterby eq 'title'  ) { $filterbytitle  = 'selected' }
 
$output .= qq~
<div align=right><form action="$forumsprog" method=get>
<input type=hidden name=forum value="$inforum">Фильтр:
<input type=text size=10 name=filterstring value="$filterstring">
по <select name=filterby>
<option value=title $filterbytitle>названию темы
<option value=author $filterbyauthor>автору</select>
<input type=submit value="go">
~;
На
Код:
##### ХАК. Фильтр топиков. by ivank.
if( $filterby eq 'author' )       { $filterbyauthor       = 'selected' }
if( $filterby eq 'title'  )       { $filterbytitle        = 'selected' }
if( $filterby eq 'description'  ) { $filterbydescriprion  = 'selected' }
 
$output .= qq~
<div align=right><form action="$forumsprog" method=get>
<input type=hidden name=forum value="$inforum">Фильтр:
<input type=text size=10 name=filterstring value="$filterstring">
по <select name=filterby>
<option value=title $filterbytitle>названию темы
<option value=author $filterbyauthor>автору
<option value=description $filterbydescription>описанию темы</select>
<input type=submit value="go">
~;


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

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 18:39 24-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MVY
Первое без проблем, второе - уже сложнее...
Там надо поиск уже в самой теме делать...
По первому:
ivank уже всё сделал, так что я потёр.
Добавлено
ivank
Ой, пока писал - ты уже сделал... Сорря...
 
Добавлено
ivank
Хммм... Тоже верно. Ладно-с, подумаю.

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 18:44 24-06-2002 | Исправлено: Alexander Ipp, 18:58 24-06-2002
MVY

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ivank
Alexander Ipp
Большое спасибо

Всего записей: 297 | Зарегистр. 02-02-2002 | Отправлено: 00:26 25-06-2002
Shurik



Главком. флейма
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank
в натуре полезный хак.
фэнкс. сам хотел замутить себе такое (надеялся, что где-то есть уже такое).

----------
Metal Bands...

Всего записей: 3171 | Зарегистр. 11-06-2001 | Отправлено: 13:52 26-06-2002
ivank



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я офигиваю. Я слышал что, по крайней мере, четыре человека уже давно хотели что-нить подобное... И всё не писали, на это времени ушло -- 15 минут. Хот не, один написал, и даже обещал выложить, но как то... не выложил в обсчем =)

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

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 14:05 26-06-2002
Shurik



Главком. флейма
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank
15 минут? быстро че-то. мы быстро тебя запрягем нам хаки писать!

----------
Metal Bands...

Всего записей: 3171 | Зарегистр. 11-06-2001 | Отправлено: 14:19 26-06-2002
ivank



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Shurik
Это чистой воды кодирование, никаких мыслительных операций в течении написания кода я не совершал. У меня в голове крутится более продвинутый вариант фильтра, который будет работать го-о-ораздо быстрее, но в этом случае код придётся менять гораздо сильнее, а мне лень ибо то что есть и так нормально работает, пока...

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

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 18:35 26-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ivank
Хых, а с временным массивом ты был прав.
Правда, я немного попроще сделал, не так громоздко. Но принцип тот же.

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 19:51 26-06-2002
Shurik



Главком. флейма
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ivank

Цитата:
Это чистой воды кодирование, никаких мыслительных операций в течении написания кода я не совершал.  
код ведь тоже придумать надо...

----------
Metal Bands...

Всего записей: 3171 | Зарегистр. 11-06-2001 | Отправлено: 11:14 27-06-2002
Net_man

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то ничего не получается. Вроде все делаю как здесь, а получаю все время
Цитата:
Software error:
Missing right curly or square bracket at forums.cgi line 515, at end of line
syntax error at forums.cgi line 515, at EOF
Execution of forums.cgi aborted due to compilation errors.
 
Посмотрел 515-ю строку - это самая последняя в скрипте. Может кто подскажет чего?
 
Добавлено
Еще одно
Цитата:
&moderator;  
 &title;  


Цитата:
$output = qq~  
что-то  
Модератор: $modoutput  
что-то  
~;  

Не нашел.
Цитата:
Модератор
у меня вообще нет, нашел в одном месте $modoutput, но по-моему не там и по-другому. Пробовал ставить после той хреновины, где $modoutput; пробовал сразу после той бадьи, что идет сразу за
Цитата:
&moderator;  
 &title;  
- результат один.


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

Всего записей: 1150 | Зарегистр. 11-09-2002 | Отправлено: 23:06 24-08-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 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