VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
Не уверен, что в эту тему, но более соответствующей не нашел.
По мотивам тем на форуме, столкнулся с тем, что бюлетен дает возможность искать только по одной метке даже если вводишь несколько слов.
Решил поправить эту ситуацию.
Сделал несколько изменений в файл tags.php
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 = $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
";
// Корректировки для поиска по нескольким меткам
// Начало было
// $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 . ")");
}
}
// Конец нового кода
// Конец корректировок для поиска по нескольким меткам
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['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false : true;
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'] ? "&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'] ? "&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'])
));
// Конец нового кода
// Конец корректировок для поиска по нескольким меткам
Так как я не очень большой специалист в PHP и с бюлетене, то прошу покритиковать мое творчество, может быть что сделал не так или может быть надо что то добавить.
SMak044, Судя по данному коду будет искаться любая из перечисленных меток. А на практике чаще надо найти темы со всеми указанными метками (т.е. в коде условие ИЛИ, а обычно нужно И ).
Также метки могут состоять из нескольких слов, поэтому в качестве разделителя меток лучше использовать только запятую (стандарт для булки при добавлении тегов)
Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.
P.S. Я делал на заказ такой хак, но не знаю согласится ли заказчик на то чтобы я выложил в паблик.
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1705
Репутация в разделе: 132
0
Yoskaldyr, По поводу поиска не любой а всех, я думал. Но решил пока начать с этого.
Думаю правильней будет иметь чек бокс с выбором, что именно надо по всем или все.
И с запятыми тоже согласен. Но так как это первый блин, то я решил пока оставить все знами для тестирования.
Quote:
Originally Posted by Yoskaldyr
Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.
Опа.. про это не подумал...
Буду ковырять.
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 166
1
Quote:
Originally Posted by SMak044
Буду ковырять
в шаблоне tag_cloud_page после:
HTML Code:
tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
Сделал по аналогии с '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
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1705
Репутация в разделе: 132
0
Немного переделал код. Добавил возможность поиска с логикой "И", убрал все разделители, оставил только запятую.
Огромное спасибо Yoskaldyr за помощь с предугадыванием меток при наборе, реализовано.
Потребовалось изменить немного шаблон tag_cloud_page.
В шаблоне tag_cloud_page после:
HTML Code:
tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
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;
}
$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
";
// Корректировки для поиска по нескольким меткам
// Начало было
// $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 . ")");
}
}
// Конец нового кода
// Конец корректировок для поиска по нескольким меткам
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['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false : true;
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'] ? "&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'] ? "&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'])
));
// Конец нового кода
// Конец корректировок для поиска по нескольким меткам
Впрос:
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?
Вопрос к гуру:
Я понимаю, что в таком виде это не есть продукт даже в приближенном виде. Посоветуйте как можно его оптимизировать для простоты инсталляции и последующей возможности деинсталляции. Или в данном случае в этом нет смысла?
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 166
1
Quote:
Originally Posted by SMak044
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?
Это полностью правильная логика. Первый ентер - выбор (вставка в форму ввода) какого либо тега, второй отправка запроса, потому что по умолчанию запрос отправляется именно по enter-у и насколько я знаю это почти у всех поисковых систем по умолчанию.
P.S. код, если конечно я его правильно понял, не будет искать одновременно несколько меток
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1705
Репутация в разделе: 132
0
Quote:
Originally Posted by Yoskaldyr
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
И верно....
надо присоединять таблицу tagthread ... пошел присоединять ;)
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 166
1
Quote:
Originally Posted by SMak044
надо присоединять таблицу tagthread ... пошел присоединять ;)
Да нет же. Проблема в том что не может одно и то же поле равняться и одному значению и совсем другому одновременно.
Смотреть в сторону IN (...) и также в сторону количества вхождений для этого условия
SUM(IF (tagthread.tagid IN( набор_тегов_через запятую ),1,0)) as tagsum
и группировку по thread.threadid
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1705
Репутация в разделе: 132
0
Yoskaldyr, Да да!
Собака в другом запросе. Спасибо. Буду пробовать. Не судите строго, все постигается со временем.