форум vBSupport.ru > vBSupport.ru > Гурушник > Кодер
Register Меню vBsupport Изображения Files Manager О рекламе Today's Posts Search
  • Родная гавань
  • Блок РКН снят
  • Premoderation
  • For English speaking users
  • Каталог Фрилансеров
  • If you want to buy some product or script
  • Администраторам
VBsupport перешел с домена .ORG на родной .RU Ура! Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже:
Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
 
 
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default Поиск по нескольким меткам
0

Не уверен, что в эту тему, но более соответствующей не нашел.
По мотивам тем на форуме, столкнулся с тем, что бюлетен дает возможность искать только по одной метке даже если вводишь несколько слов.
Решил поправить эту ситуацию.
Сделал несколько изменений в файл tags.php
PHP Code:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.4
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE & ~8192);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT''tags');
define('CSRF_PROTECTION'true);

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array('inlinemod''search');

// get special data templates from the datastore
$specialtemplates = array(
    
'tagcloud',
    
'iconcache'
);

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array(
    
'cloud' => array(
        
'tag_cloud_box',
        
'tag_cloud_headinclude',
        
'tag_cloud_link',
        
'tag_cloud_page'
    
),
    
'tag' => array(
        
'tag_search',
        
'threadadmin_imod_menu_thread',
        
'threadbit'
    
)
);

if (empty(
$_REQUEST['do']))
{
    if (empty(
$_REQUEST['tag']))
    {
        
$_REQUEST['do'] = 'cloud';
    }
    else
    {
        
$_REQUEST['do'] = 'tag';
    }
}

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');
require_once(
DIR '/includes/functions_bigthree.php');
require_once(
DIR '/includes/functions_forumdisplay.php');

if (!
$vbulletin->options['threadtagging'])
{
    
print_no_permission();
}

(
$hook vBulletinHook::fetch_hook('tags_start')) ? eval($hook) : false;

// #######################################################################
if ($_REQUEST['do'] == 'cloud')
{
    require_once(
DIR '/includes/functions_search.php');

    
$tag_cloud fetch_tagcloud('usage');
    if (
$tag_cloud)
    {
        eval(
'$tag_cloud_headinclude .= "' fetch_template('tag_cloud_headinclude') . '";');
    }
    else
    {
        
$tag_cloud_headinclude '';
    }

    
$navbits construct_navbits(array(
        
'' => $vbphrase['tags'],
    ));
    eval(
'$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_cloud_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_cloud_page') . '");');
}

// #######################################################################
if ($_REQUEST['do'] == 'tag')
{
    
$vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,
        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
));

    if (!
$vbulletin->GPC['tag'])
    {
        
standard_error(fetch_error('invalidid'$vbphrase['tag'], $vbulletin->options['contactuslink']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $tag = $db->query_first("
//        SELECT *
//        FROM " . TABLE_PREFIX . "tag
//        WHERE tagtext = '" . $db->escape_string($vbulletin->GPC['tag']) . "'
//    ");
// Конец было
// Начало нового кода
  
$tag_string $vbulletin->GPC['tag'];                         // Получаем строку поиска

  
$tag_separate = array();                                      // Объвляем массив
  
$tok strtok($tag_string' ,.;:(){}[]|"');                  // Отделяем слова

  
while ($tok)                                                  // Заносим отдельные слова в массив
  
{
    
$tag_separate[] = $tok;
    
$tok strtok(' ,.;:(){}[]|"');
  }

    foreach (
$tag_separate AS $key => $tagvalue)                   // Создаем строку для вставки в запрос
    
{
    if(
$key != 0)
    {
    
$tags_where .= ', "' $tagvalue '"';
    }
    if(
$key == 0)
    {
      
$tags_where .= '"' $tagvalue '"';
    }
    }

    
$tag $db->query("
        SELECT *
        FROM " 
TABLE_PREFIX "tag
        WHERE tagtext in (" 
$tags_where ")
    "
);

    
$tagid_where = array();
    while (
$tags $db->fetch_array($tag))
    {
        
$tagid_where[] = $tags['tagid'];
    }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
if (!$tag)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

    
// get forum ids for all forums user is allowed to view
    
$forumids array_keys($vbulletin->forumcache);
    
$self_only = array();

    foreach (
$forumids AS $key => $forumid)
    {
        
$forum $vbulletin->forumcache["$forumid"];

        
$forumperms fetch_permissions($forumid);
        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canview']) OR !verify_forum_password($forumid$forum['password'], false))
        {
            unset(
$forumids["$key"]);
            continue;
        }

        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canviewothers']))
        {
            
$self_only[] = $forumid;
        }
    }

    if (!
$forumids)
    {
        
print_no_permission();
    }

    
// needed to prevent mass amounts of queries
    
require_once(DIR '/includes/functions_forumlist.php');
    
cache_moderators();

    
$coventry fetch_coventry('string');
    
$globalignore = ($coventry "AND thread.postuserid NOT IN ($coventry) " '');

    if (
$vbulletin->userinfo['userid'] AND in_coventry($vbulletin->userinfo['userid'], true))
    {
        
$tachyjoin "
            LEFT JOIN " 
TABLE_PREFIX "tachythreadpost AS tachythreadpost ON
                (tachythreadpost.threadid = thread.threadid AND tachythreadpost.userid = " 
$vbulletin->userinfo['userid'] . ")
            LEFT JOIN " 
TABLE_PREFIX "tachythreadcounter AS tachythreadcounter ON
                (tachythreadcounter.threadid = thread.threadid AND tachythreadcounter.userid = " 
$vbulletin->userinfo['userid'] . ")
        "
;
        
$tachy_columns "
            IF(tachythreadpost.userid IS NULL, thread.lastpost, tachythreadpost.lastpost) AS lastpost,
            IF(tachythreadpost.userid IS NULL, thread.lastposter, tachythreadpost.lastposter) AS lastposter,
            IF(tachythreadpost.userid IS NULL, thread.lastpostid, tachythreadpost.lastpostid) AS lastpostid,
            IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount) AS replycount,
            IF(thread.views<=IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount), IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount)+1, thread.views) AS views
        "
;

    }
    else
    {
        
$tachyjoin '';
        
$tachy_columns 'thread.lastpost, thread.lastposter, thread.lastpostid, thread.replycount, IF(thread.views<=thread.replycount, thread.replycount+1, thread.views) AS views';
    }

    
$hook_query_joins $hook_query_where '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_limit')) ? eval($hook) : false;

// Корректировки для поиска по нескольким меткам
// Начало было
//    $threadid_sql = $db->query_read_slave("
//        SELECT thread.threadid, $tachy_columns
//        FROM " . TABLE_PREFIX . "thread AS thread
//        INNER JOIN " . TABLE_PREFIX . "tagthread AS tagthread ON
//            (tagthread.tagid = $tag[tagid] AND tagthread.threadid = thread.threadid)
//        $tachyjoin
//        $hook_query_joins
//        WHERE thread.forumid IN(" . implode(', ', $forumids) . ")
//            " . ($self_only ? 'AND IF(thread.forumid IN (' . implode(',', $self_only) . '), thread.postuserid = ' . $vbulletin->userinfo['userid'] . ', 1)' : '') . "
//            AND thread.visible = 1
//            AND thread.sticky IN (0, 1)
//            AND thread.open <> 10
//            $globalignore
//            $hook_query_where
//        ORDER BY lastpost DESC
//        LIMIT " . intval($vbulletin->options['maxresults'])
//    );
// Конец было
// Начало нового кода
    
$threadid_sql $db->query_read_slave("
        SELECT thread.threadid, 
$tachy_columns
        FROM " 
TABLE_PREFIX "thread AS thread
        INNER JOIN " 
TABLE_PREFIX "tagthread AS tagthread ON
            (tagthread.tagid IN (" 
implode(','$tagid_where) . ") AND tagthread.threadid = thread.threadid)
        
$tachyjoin
        
$hook_query_joins
        WHERE thread.forumid IN(" 
implode(', '$forumids) . ")
            " 
. ($self_only 'AND IF(thread.forumid IN (' implode(','$self_only) . '), thread.postuserid = ' $vbulletin->userinfo['userid'] . ', 1)' '') . "
            AND thread.visible = 1
            AND thread.sticky IN (0, 1)
            AND thread.open <> 10
            
$globalignore
            
$hook_query_where
        ORDER BY lastpost DESC
        LIMIT " 
intval($vbulletin->options['maxresults'])
    );

// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$totalthreads $db->num_rows($threadid_sql);
    if (!
$totalthreads)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    if ($vbulletin->GPC['pagenumber'] <= 1)
//    {
//        $db->query_write("INSERT INTO " . TABLE_PREFIX . "tagsearch (tagid, dateline) VALUES ($tag[tagid], " . TIMENOW . ")");
//    }
// Конец было
// Начало нового кода
  
if ($vbulletin->GPC['pagenumber'] <= 1)
  {
    while (
$tagsid $db->fetch_array($tag))
    {
      
$tags_id $tagsid['tagid'];
          
$db->query_write("INSERT INTO " TABLE_PREFIX "tagsearch (tagid, dateline) VALUES (" $tags_id", " TIMENOW ")");
      }
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$pagenumber $vbulletin->GPC['pagenumber'];
    
$perpage $vbulletin->GPC['perpage'];

    
sanitize_pageresults($totalthreads$pagenumber$perpage200$vbulletin->options['maxthreads']);

    if (
$pagenumber 1)
    {
        
$db->data_seek($threadid_sql, ($pagenumber 1) * $perpage);
    }

    
$threadids = array();
    
$resultnum 0;
    while (
$thread $db->fetch_array($threadid_sql))
    {
        
$threadids[] = $thread['threadid'];

        
$resultnum++;
        if (
$resultnum >= $perpage)
        {
            break;
        }
    }
    
$db->free_result($threadid_sql);

    if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
    {
        
// we need this for forum read times
        
cache_ordered_forums(1);
    }

    
// now move on to actual display code

    
$hook_query_fields $hook_query_joins '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_data')) ? eval($hook) : false;

    
$thread_sql $db->query_read_slave("
        SELECT
            thread.threadid, thread.title AS threadtitle, thread.forumid, pollid, open, postusername, postuserid, thread.iconid AS threadiconid,
            thread.dateline, notes, thread.visible, sticky, votetotal, thread.attach, 
$tachy_columns,
            thread.prefixid, thread.taglist, hiddencount, deletedcount
            " 
. ($vbulletin->options['threadpreview'] > ', post.pagetext AS preview' '') . "
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ? ", NOT ISNULL(subscribethread.subscribethreadid) AS issubscribed" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? ", threadread.readtime AS threadread" "") . "
            
$hook_query_fields
        FROM " 
TABLE_PREFIX "thread AS thread
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ?  " LEFT JOIN " TABLE_PREFIX "subscribethread AS subscribethread ON(subscribethread.threadid = thread.threadid AND subscribethread.userid = " $vbulletin->userinfo['userid'] . " AND canview = 1)" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? " LEFT JOIN " TABLE_PREFIX "threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = " $vbulletin->userinfo['userid'] . ")" "") . "
            " 
. ($vbulletin->options['threadpreview'] > "LEFT JOIN " TABLE_PREFIX "post AS post ON(post.postid = thread.firstpostid)" '') . "
            
$tachyjoin
            
$hook_query_joins
        WHERE thread.threadid IN (" 
implode(','$threadids) . ")
    "
);

    
$threads = array();
    
$lastread = array();
    
$managethread $movethread $deletethread $approvethread $openthread = array();

    
$dotthreads fetch_dot_threads_array(implode(','$threadids));
    if (
$vbulletin->options['showdots'] AND $vbulletin->userinfo['userid'])
    {
        
$show['dotthreads'] = true;
    }
    else
    {
        
$show['dotthreads'] = false;
    }

    while (
$thread $db->fetch_array($thread_sql))
    {
        
$threads["$thread[threadid]"] = $thread;

        
// get forum read times if needed
        
if (!isset($lastread["$thread[forumid]"]))
        {
            if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
            {
                
$forum $vbulletin->forumcache["$thread[forumid]"];
                
$lastread["$thread[forumid]"] = max($forum['forumread'], (TIMENOW - ($vbulletin->options['markinglimit'] * 86400)));
            }
            else
            {
                
$forumview intval(fetch_bbarray_cookie('forum_view'$thread['forumid']));
                
$lastread["$thread[forumid]"] = ($forumview $vbulletin->userinfo['lastvisit'] ? $forumview $vbulletin->userinfo['lastvisit']);
            }
        }

        
// check inline mod stuff
        
if (can_moderate($thread['forumid'], 'canmanagethreads'))
        {
            
$movethread["$thread[threadid]"] = 1;
            
$show['movethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'candeleteposts') OR can_moderate($thread['forumid'], 'canremoveposts'))
        {
            
$deletethread["$thread[threadid]"] = 1;
            
$show['deletethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canmoderateposts'))
        {
            
$approvethread["$thread[threadid]"] = 1;
            
$show['approvethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canopenclose'))
        {
            
$openthread["$thread[threadid]"] = 1;
            
$show['openthread'] = true;

        }
        if (
$vbulletin->forumcache["$thread[forumid]"]['options'] & $vbulletin->bf_misc_forumoptions['allowicons'])
        {
            
$show['threadicons'] = true;
        }
    }
    
$db->free_result($thread_sql);

    if (!empty(
$managethread) OR !empty($movethread) OR !empty($deletethread) OR !empty($approvethread) OR !empty($openthread))
    {
        
$show['inlinemod'] = true;
        
$show['spamctrls'] = $show['deletethread'];
    }

    
$columncount 6;
    if (
$show['threadicons'])
    {
        
$columncount++;
    }
    if (
$show['inlinemod'])
    {
        
$columncount++;
    }

    
$show['forumlink'] = true;
    
$threadbits '';

    (
$hook vBulletinHook::fetch_hook('tags_list_threads')) ? eval($hook) : false;

    foreach (
$threadids AS $threadid)
    {
        
$thread $threads["$threadid"];

        
$forumperms fetch_permissions($thread['forumid']);
        if (
$vbulletin->options['threadpreview'] > AND !($forumperms $vbulletin->bf_ugp_forumpermissions['canviewthreads']))
        {
            
$thread['preview'] = '';
        }

        
$thread process_thread_array($thread$lastread["$thread[forumid]"]);

        
$show['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false true;

        eval(
'$threadbits .= "' fetch_template('threadbit') . '";');
    }

    if (
$show['popups'] AND $show['inlinemod'])
    {
        eval(
'$threadadmin_imod_menu = "' fetch_template('threadadmin_imod_menu_thread') . '";');
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $pagenav = construct_page_nav($pagenumber, $perpage, $totalthreads,
//        'tags.php?tag=' . urlencode(unhtmlspecialchars($tag['tagtext']))
//        . ($perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage" : '')
//    );
//
//    $navbits = construct_navbits(array(
//        'tags.php' . $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
//        '' => construct_phrase($vbphrase['threads_tagged_with_x'], $tag['tagtext'])
//    ));
// Конец было
// Начало нового кода
    
$pagenav construct_page_nav($pagenumber$perpage$totalthreads,
        
'tags.php?tag=' urlencode(unhtmlspecialchars($vbulletin->GPC['tag']))
        . (
$perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage'')
    );

    
$navbits construct_navbits(array(
        
'tags.php' $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
        
'' => construct_phrase($vbphrase['threads_tagged_with_x'], $vbulletin->GPC['tag'])
    ));
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
eval('$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_list_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_search') . '");');
}

/*======================================================================*\
|| ####################################################################
|| # NulleD - FintMax
|| # CVS: $RCSfile$ - $Revision: 31381 $
|| ####################################################################
\*======================================================================*/
?>
Так как я не очень большой специалист в PHP и с бюлетене, то прошу покритиковать мое творчество, может быть что сделал не так или может быть надо что то добавить.

На локалке у меня работает.
Attached Files
File Type: php tags.php (16.0 KB, 0 views)
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
 
 
Yoskaldyr
Специалист
Default
1

SMak044, Судя по данному коду будет искаться любая из перечисленных меток. А на практике чаще надо найти темы со всеми указанными метками (т.е. в коде условие ИЛИ, а обычно нужно И ).
Также метки могут состоять из нескольких слов, поэтому в качестве разделителя меток лучше использовать только запятую (стандарт для булки при добавлении тегов)

Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.

P.S. Я делал на заказ такой хак, но не знаю согласится ли заказчик на то чтобы я выложил в паблик.
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

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

Quote:
Originally Posted by Yoskaldyr View Post
Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.
Опа.. про это не подумал...
Буду ковырять.
 
 
Yoskaldyr
Специалист
Default
1

Quote:
Originally Posted by SMak044 View Post
Буду ковырять
в шаблоне tag_cloud_page после:
HTML Code:
tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
добавить:
HTML Code:
tag_comp.allow_multiple = true;
tag_comp.set_delimiters('');

Last edited by Yoskaldyr : 10-08-2009 at 03:44 PM.
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Заработало.
Пошел модифицировать для поиска с И

SMak044 добавил 08.10.2009 в 17:39
Что то не могу разобраться... Наверно еще чего то не понимаю
Я создал в шаблоне меток чекбокс
HTML Code:
<input type="checkbox" id="tag_all" name="tag_all">
в php файле я его вроде объявил
PHP Code:
    $vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,

        
'tag_all' => TYPE_NOHTML,    

        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
)); 
Сделал по аналогии с 'tag'
Теперь хочу получить его значение. $vbulletin->GPC['tag_all']; И ничего не получаю.
У меня смутная догадка, что тип TYPE_NOHTML не правильный. Может быть использовать TYPE_BOOL?
Но я попробовал и все равно значение не передается.
Подскажите, что не так делаю.

SMak044 добавил 08.10.2009 в 17:56
Разобрался... Учите HTML ... надо было установить значение value="1" ну и обновить страницу.

Last edited by SMak044 : 10-08-2009 at 06:56 PM. Reason: Добавлено сообщение
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Немного переделал код. Добавил возможность поиска с логикой "И", убрал все разделители, оставил только запятую.
Огромное спасибо Yoskaldyr за помощь с предугадыванием меток при наборе, реализовано.
Потребовалось изменить немного шаблон tag_cloud_page.
  1. В шаблоне tag_cloud_page после:
    HTML Code:
    tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
    добавить:
    HTML Code:
    tag_comp.allow_multiple = true;
    tag_comp.set_delimiters('');
  2. В шаблоне tag_cloud_page заменить:
    HTML Code:
    		<span id="tag_wrapper"><input type="text" id="tag_input" name="tag" size="25" style="width: 80%" class="bginput" /></span>
    		<input type="submit" class="button" value="$vbphrase[search]" />
    На:
    HTML Code:
    		<table border="0" cellspacing="0" cellpadding="0" width="100%">
    		<tr><td colspan="3" align="center">Для поиска по меткам разделяйте метки запятыми</td></tr>
    			<tr>
    				<td>
    					<span id="tag_wrapper">
    						<input type="text" id="tag_input" name="tag" size="25" style="width: 95%" class="bginput" />
    					</span>
    				</td>
    				<td width=160px>
    					<input type="checkbox" id="tag_all" name="tag_all" value="1">&nbsp;Со&nbsp;всеми&nbsp;метками
    				</td>
    				<td width=1px>
    					<input type="submit" class="button" value="$vbphrase[search]" />
    				</td>
    			</tr>
    		</table>

PHP код файла tags.php:
PHP Code:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.4
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE & ~8192);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT''tags');
define('CSRF_PROTECTION'true);

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array('inlinemod''search');

// get special data templates from the datastore
$specialtemplates = array(
    
'tagcloud',
    
'iconcache'
);

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array(
    
'cloud' => array(
        
'tag_cloud_box',
        
'tag_cloud_headinclude',
        
'tag_cloud_link',
        
'tag_cloud_page'
    
),
    
'tag' => array(
        
'tag_search',
        
'threadadmin_imod_menu_thread',
        
'threadbit'
    
)
);

if (empty(
$_REQUEST['do']))
{
    if (empty(
$_REQUEST['tag']))
    {
        
$_REQUEST['do'] = 'cloud';
    }
    else
    {
        
$_REQUEST['do'] = 'tag';
    }
}

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');
require_once(
DIR '/includes/functions_bigthree.php');
require_once(
DIR '/includes/functions_forumdisplay.php');

if (!
$vbulletin->options['threadtagging'])
{
    
print_no_permission();
}

(
$hook vBulletinHook::fetch_hook('tags_start')) ? eval($hook) : false;

// #######################################################################
if ($_REQUEST['do'] == 'cloud')
{
    require_once(
DIR '/includes/functions_search.php');

    
$tag_cloud fetch_tagcloud('usage');
    if (
$tag_cloud)
    {
        eval(
'$tag_cloud_headinclude .= "' fetch_template('tag_cloud_headinclude') . '";');
    }
    else
    {
        
$tag_cloud_headinclude '';
    }

    
$navbits construct_navbits(array(
        
'' => $vbphrase['tags'],
    ));
    eval(
'$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_cloud_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_cloud_page') . '");');
}

// #######################################################################
if ($_REQUEST['do'] == 'tag')
{
    
$vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,
        
'tag_all' => TYPE_NOHTML,    
        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
));

    if (!
$vbulletin->GPC['tag'])
    {
        
standard_error(fetch_error('invalidid'$vbphrase['tag'], $vbulletin->options['contactuslink']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $tag = $db->query_first("
//        SELECT *
//        FROM " . TABLE_PREFIX . "tag
//        WHERE tagtext = '" . $db->escape_string($vbulletin->GPC['tag']) . "'
//    ");
// Конец было
// Начало нового кода
  
$tag_type_search 0;
    
  if (
$vbulletin->GPC['tag_all'] == 1)  
    {
    
$tag_type_search 1;
    }

  
$tag_string $vbulletin->GPC['tag'];

  
$tag_separate = array(); 
  
$tok strtok($tag_string','); 

  while (
$tok)
  {
    
$tag_separate[] = $tok;
    
$tok strtok(',');
  }

  if (
$tag_type_search == 0)
  {
    
$tag_tok_count count($tag_separate);
    
$tag_tok_last $tag_tok_count 1;

      foreach (
$tag_separate AS $key => $tagvalue)
      {
      if(
$key == 0)
      {
        
$tags_where .= 'tagtext in ("' trim ($tagvalue) . '"';
      }
      if(
$key && $key $tag_tok_last)
      {
      
$tags_where .= ', "' trim ($tagvalue) . '"';
      }
      if(
$key == $tag_tok_last)
      {
      
$tags_where .= ', "' trim ($tagvalue) . '")';
      }
      }
  }

  if (
$tag_type_search == 1)
  {
      foreach (
$tag_separate AS $key => $tagvalue)
      {
      if(
$key == 0)
      {
        
$tags_where .= 'tagtext = "' trim ($tagvalue) . '"';
      }
      if(
$key 0)
      {
      
$tags_where .= ' AND tagtext = "' trim ($tagvalue) . '"';
      }
      }
  }

  
$tag $db->query("
      SELECT *
      FROM " 
TABLE_PREFIX "tag
      WHERE " 
$tags_where "
    "
);
  
  
$tagid_where = array();
  while (
$tags $db->fetch_array($tag))
  {
      
$tagid_where[] = $tags['tagid'];
  }

  
$tagid_where_count count($tagid_where);
  
$tagid_where "tagthread.tagid IN (" implode(','$tagid_where) . ") AND "

  if(
$tagid_where_count == 0)
  {
    
$tagid_where "tagthread.tagid IN (Null) AND ";
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
if (!$tag)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

    
// get forum ids for all forums user is allowed to view
    
$forumids array_keys($vbulletin->forumcache);
    
$self_only = array();

    foreach (
$forumids AS $key => $forumid)
    {
        
$forum $vbulletin->forumcache["$forumid"];

        
$forumperms fetch_permissions($forumid);
        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canview']) OR !verify_forum_password($forumid$forum['password'], false))
        {
            unset(
$forumids["$key"]);
            continue;
        }

        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canviewothers']))
        {
            
$self_only[] = $forumid;
        }
    }

    if (!
$forumids)
    {
        
print_no_permission();
    }

    
// needed to prevent mass amounts of queries
    
require_once(DIR '/includes/functions_forumlist.php');
    
cache_moderators();

    
$coventry fetch_coventry('string');
    
$globalignore = ($coventry "AND thread.postuserid NOT IN ($coventry) " '');

    if (
$vbulletin->userinfo['userid'] AND in_coventry($vbulletin->userinfo['userid'], true))
    {
        
$tachyjoin "
            LEFT JOIN " 
TABLE_PREFIX "tachythreadpost AS tachythreadpost ON
                (tachythreadpost.threadid = thread.threadid AND tachythreadpost.userid = " 
$vbulletin->userinfo['userid'] . ")
            LEFT JOIN " 
TABLE_PREFIX "tachythreadcounter AS tachythreadcounter ON
                (tachythreadcounter.threadid = thread.threadid AND tachythreadcounter.userid = " 
$vbulletin->userinfo['userid'] . ")
        "
;
        
$tachy_columns "
            IF(tachythreadpost.userid IS NULL, thread.lastpost, tachythreadpost.lastpost) AS lastpost,
            IF(tachythreadpost.userid IS NULL, thread.lastposter, tachythreadpost.lastposter) AS lastposter,
            IF(tachythreadpost.userid IS NULL, thread.lastpostid, tachythreadpost.lastpostid) AS lastpostid,
            IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount) AS replycount,
            IF(thread.views<=IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount), IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount)+1, thread.views) AS views
        "
;

    }
    else
    {
        
$tachyjoin '';
        
$tachy_columns 'thread.lastpost, thread.lastposter, thread.lastpostid, thread.replycount, IF(thread.views<=thread.replycount, thread.replycount+1, thread.views) AS views';
    }

    
$hook_query_joins $hook_query_where '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_limit')) ? eval($hook) : false;

// Корректировки для поиска по нескольким меткам
// Начало было
//    $threadid_sql = $db->query_read_slave("
//        SELECT thread.threadid, $tachy_columns
//        FROM " . TABLE_PREFIX . "thread AS thread
//        INNER JOIN " . TABLE_PREFIX . "tagthread AS tagthread ON
//            (tagthread.tagid = $tag[tagid] AND tagthread.threadid = thread.threadid)
//        $tachyjoin
//        $hook_query_joins
//        WHERE thread.forumid IN(" . implode(', ', $forumids) . ")
//            " . ($self_only ? 'AND IF(thread.forumid IN (' . implode(',', $self_only) . '), thread.postuserid = ' . $vbulletin->userinfo['userid'] . ', 1)' : '') . "
//            AND thread.visible = 1
//            AND thread.sticky IN (0, 1)
//            AND thread.open <> 10
//            $globalignore
//            $hook_query_where
//        ORDER BY lastpost DESC
//        LIMIT " . intval($vbulletin->options['maxresults'])
//    );
// Конец было
// Начало нового кода
    
$threadid_sql $db->query_read_slave("
        SELECT thread.threadid, 
$tachy_columns
        FROM " 
TABLE_PREFIX "thread AS thread
        INNER JOIN " 
TABLE_PREFIX "tagthread AS tagthread ON
            (" 
$tagid_where "tagthread.threadid = thread.threadid)
        
$tachyjoin
        
$hook_query_joins
        WHERE thread.forumid IN(" 
implode(', '$forumids) . ")
            " 
. ($self_only 'AND IF(thread.forumid IN (' implode(','$self_only) . '), thread.postuserid = ' $vbulletin->userinfo['userid'] . ', 1)' '') . "
            AND thread.visible = 1
            AND thread.sticky IN (0, 1)
            AND thread.open <> 10
            
$globalignore
            
$hook_query_where
        ORDER BY lastpost DESC
        LIMIT " 
intval($vbulletin->options['maxresults'])
    );
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$totalthreads $db->num_rows($threadid_sql);
    if (!
$totalthreads)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    if ($vbulletin->GPC['pagenumber'] <= 1)
//    {
//        $db->query_write("INSERT INTO " . TABLE_PREFIX . "tagsearch (tagid, dateline) VALUES ($tag[tagid], " . TIMENOW . ")");
//    }
// Конец было
// Начало нового кода
  
if ($vbulletin->GPC['pagenumber'] <= 1)
  {
    while (
$tagsid $db->fetch_array($tag))
    {
      
$tags_id $tagsid['tagid'];
          
$db->query_write("INSERT INTO " TABLE_PREFIX "tagsearch (tagid, dateline) VALUES (" $tags_id", " TIMENOW ")");
      }
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$pagenumber $vbulletin->GPC['pagenumber'];
    
$perpage $vbulletin->GPC['perpage'];

    
sanitize_pageresults($totalthreads$pagenumber$perpage200$vbulletin->options['maxthreads']);

    if (
$pagenumber 1)
    {
        
$db->data_seek($threadid_sql, ($pagenumber 1) * $perpage);
    }

    
$threadids = array();
    
$resultnum 0;
    while (
$thread $db->fetch_array($threadid_sql))
    {
        
$threadids[] = $thread['threadid'];

        
$resultnum++;
        if (
$resultnum >= $perpage)
        {
            break;
        }
    }
    
$db->free_result($threadid_sql);

    if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
    {
        
// we need this for forum read times
        
cache_ordered_forums(1);
    }

    
// now move on to actual display code

    
$hook_query_fields $hook_query_joins '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_data')) ? eval($hook) : false;

    
$thread_sql $db->query_read_slave("
        SELECT
            thread.threadid, thread.title AS threadtitle, thread.forumid, pollid, open, postusername, postuserid, thread.iconid AS threadiconid,
            thread.dateline, notes, thread.visible, sticky, votetotal, thread.attach, 
$tachy_columns,
            thread.prefixid, thread.taglist, hiddencount, deletedcount
            " 
. ($vbulletin->options['threadpreview'] > ', post.pagetext AS preview' '') . "
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ? ", NOT ISNULL(subscribethread.subscribethreadid) AS issubscribed" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? ", threadread.readtime AS threadread" "") . "
            
$hook_query_fields
        FROM " 
TABLE_PREFIX "thread AS thread
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ?  " LEFT JOIN " TABLE_PREFIX "subscribethread AS subscribethread ON(subscribethread.threadid = thread.threadid AND subscribethread.userid = " $vbulletin->userinfo['userid'] . " AND canview = 1)" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? " LEFT JOIN " TABLE_PREFIX "threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = " $vbulletin->userinfo['userid'] . ")" "") . "
            " 
. ($vbulletin->options['threadpreview'] > "LEFT JOIN " TABLE_PREFIX "post AS post ON(post.postid = thread.firstpostid)" '') . "
            
$tachyjoin
            
$hook_query_joins
        WHERE thread.threadid IN (" 
implode(','$threadids) . ")
    "
);

    
$threads = array();
    
$lastread = array();
    
$managethread $movethread $deletethread $approvethread $openthread = array();

    
$dotthreads fetch_dot_threads_array(implode(','$threadids));
    if (
$vbulletin->options['showdots'] AND $vbulletin->userinfo['userid'])
    {
        
$show['dotthreads'] = true;
    }
    else
    {
        
$show['dotthreads'] = false;
    }

    while (
$thread $db->fetch_array($thread_sql))
    {
        
$threads["$thread[threadid]"] = $thread;

        
// get forum read times if needed
        
if (!isset($lastread["$thread[forumid]"]))
        {
            if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
            {
                
$forum $vbulletin->forumcache["$thread[forumid]"];
                
$lastread["$thread[forumid]"] = max($forum['forumread'], (TIMENOW - ($vbulletin->options['markinglimit'] * 86400)));
            }
            else
            {
                
$forumview intval(fetch_bbarray_cookie('forum_view'$thread['forumid']));
                
$lastread["$thread[forumid]"] = ($forumview $vbulletin->userinfo['lastvisit'] ? $forumview $vbulletin->userinfo['lastvisit']);
            }
        }

        
// check inline mod stuff
        
if (can_moderate($thread['forumid'], 'canmanagethreads'))
        {
            
$movethread["$thread[threadid]"] = 1;
            
$show['movethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'candeleteposts') OR can_moderate($thread['forumid'], 'canremoveposts'))
        {
            
$deletethread["$thread[threadid]"] = 1;
            
$show['deletethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canmoderateposts'))
        {
            
$approvethread["$thread[threadid]"] = 1;
            
$show['approvethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canopenclose'))
        {
            
$openthread["$thread[threadid]"] = 1;
            
$show['openthread'] = true;

        }
        if (
$vbulletin->forumcache["$thread[forumid]"]['options'] & $vbulletin->bf_misc_forumoptions['allowicons'])
        {
            
$show['threadicons'] = true;
        }
    }
    
$db->free_result($thread_sql);

    if (!empty(
$managethread) OR !empty($movethread) OR !empty($deletethread) OR !empty($approvethread) OR !empty($openthread))
    {
        
$show['inlinemod'] = true;
        
$show['spamctrls'] = $show['deletethread'];
    }

    
$columncount 6;
    if (
$show['threadicons'])
    {
        
$columncount++;
    }
    if (
$show['inlinemod'])
    {
        
$columncount++;
    }

    
$show['forumlink'] = true;
    
$threadbits '';

    (
$hook vBulletinHook::fetch_hook('tags_list_threads')) ? eval($hook) : false;

    foreach (
$threadids AS $threadid)
    {
        
$thread $threads["$threadid"];

        
$forumperms fetch_permissions($thread['forumid']);
        if (
$vbulletin->options['threadpreview'] > AND !($forumperms $vbulletin->bf_ugp_forumpermissions['canviewthreads']))
        {
            
$thread['preview'] = '';
        }

        
$thread process_thread_array($thread$lastread["$thread[forumid]"]);

        
$show['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false true;

        eval(
'$threadbits .= "' fetch_template('threadbit') . '";');
    }

    if (
$show['popups'] AND $show['inlinemod'])
    {
        eval(
'$threadadmin_imod_menu = "' fetch_template('threadadmin_imod_menu_thread') . '";');
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $pagenav = construct_page_nav($pagenumber, $perpage, $totalthreads,
//        'tags.php?tag=' . urlencode(unhtmlspecialchars($tag['tagtext']))
//        . ($perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage" : '')
//    );
//
//    $navbits = construct_navbits(array(
//        'tags.php' . $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
//        '' => construct_phrase($vbphrase['threads_tagged_with_x'], $tag['tagtext'])
//    ));
// Конец было
// Начало нового кода
    
$pagenav construct_page_nav($pagenumber$perpage$totalthreads,
        
'tags.php?tag=' urlencode(unhtmlspecialchars($vbulletin->GPC['tag']))
        . (
$perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage'')
    );

    
$navbits construct_navbits(array(
        
'tags.php' $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
        
'' => construct_phrase($vbphrase['threads_tagged_with_x'], $vbulletin->GPC['tag'])
    ));
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
eval('$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_list_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_search') . '");');
}

/*======================================================================*\
|| ####################################################################
|| # NulleD - FintMax
|| # CVS: $RCSfile$ - $Revision: 31381 $
|| ####################################################################
\*======================================================================*/
?>
Я специально не убирал родной код.

Впрос:
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?

Вопрос к гуру:
Я понимаю, что в таком виде это не есть продукт даже в приближенном виде. Посоветуйте как можно его оптимизировать для простоты инсталляции и последующей возможности деинсталляции. Или в данном случае в этом нет смысла?
Attached Files
File Type: php tags.php (17.2 KB, 0 views)
 
 
Yoskaldyr
Специалист
Default
1

Quote:
Originally Posted by SMak044 View Post
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?
Это полностью правильная логика. Первый ентер - выбор (вставка в форму ввода) какого либо тега, второй отправка запроса, потому что по умолчанию запрос отправляется именно по enter-у и насколько я знаю это почти у всех поисковых систем по умолчанию.

P.S. код, если конечно я его правильно понял, не будет искать одновременно несколько меток
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Quote:
Originally Posted by Yoskaldyr View Post
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
И верно....
надо присоединять таблицу tagthread ... пошел присоединять ;)
 
 
Yoskaldyr
Специалист
Default
1

Quote:
Originally Posted by SMak044 View Post
надо присоединять таблицу tagthread ... пошел присоединять ;)
Да нет же. Проблема в том что не может одно и то же поле равняться и одному значению и совсем другому одновременно.
Смотреть в сторону IN (...) и также в сторону количества вхождений для этого условия
SUM(IF (tagthread.tagid IN( набор_тегов_через запятую ),1,0)) as tagsum
и группировку по thread.threadid
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Yoskaldyr, Да да!
Собака в другом запросе. Спасибо. Буду пробовать. Не судите строго, все постигается со временем.
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 10:58 PM.


Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.