Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Помогите пожалуйста организовать такую вещь как "Поиск по теме",за раннее благодарен всем желающим помочь!
Offline
@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы
if (is_cjk($cur_word))
{
$where_cond = str_replace('*', '%', $cur_word);
$where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');
$result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
}
else
$result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы
if (is_cjk($cur_word)) { $where_cond = str_replace('*', '%', $cur_word); $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\''); $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error()); } else $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА
Спасибо,но я видимо не правильно выразил свою идею..
я хочу в viewtopic.php вставить мини-блок поиска
P.S Visman,могу я узнать твой email?
ибо тот что в профиле у тебя безответный..я написал,ответа нет
Offline
Размещай на странице темы форму
<form method="get" action="search.php">
<input type="hidden" name="action" value="search" />
<input type="hidden" name="topic" value="НОМЕР ТЕМЫ" />
<input type="text" name="keywords" maxlength="100" />
<p class="buttons"><input type="submit" name="search" value="Поиск по теме" /></p>
</form>
а в search.php добавляй изменения как я выше писал.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы
if (is_cjk($cur_word)) { $where_cond = str_replace('*', '%', $cur_word); $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\''); $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error()); } else $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА
Извини,но я не совсем понял что необходимо изменить...просто за мою недоходчивость(
Offline
Извини,но я не совсем понял что необходимо изменить...просто за мою недоходчивость(
Стандартный вариант форума не предоставляет возможности поиска по теме.
Из формы поиска в теме будет методом get передаваться не только поисковое слово keywords, но номер этой темы topic.
Т.е. нужно перед этими запросами проверить наличие этой переменной в get и если она там есть, то всунуть ее в условие. Примерно так
$dop_where = (isset($_GET['topic']) && $_GET['topic'] > 0) ? ' AND t.id='.intval($_GET['topic']) : '';
а $dop_where присоединить в запросы после уже имеющихся условий.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
if (is_cjk($cur_word))
{
$where_cond = str_replace('*', '%', $cur_word);
$dop_where = (isset($_GET['topic']) && $_GET['topic'] > 0) ? ' AND t.id='.intval($_GET['topic']) : '';
$where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');
$result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
}
else
$result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
То есть это в search.php..?
Как то ты сложно для моего ума выразился...ничего не понял я ((
Объясни пожалуйста последовательно,что и где изменить,за ранее спасибо тебе большое!
Редактировался Rookie (2011-12-17 08:09:12)
Offline
@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы
if (is_cjk($cur_word)) { $where_cond = str_replace('*', '%', $cur_word); $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\''); $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error()); } else $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА
Где именно условия вписывать в коде? В середине? В начале или просто новой строкой?
Offline
В запросе условие начинается с WHERE. Учим матчасть.
В первом случае меняем
WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql
на
WHERE ('.$where_cond.')'.$dop_where.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql
Во втором
WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql
на
WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.$dop_where.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
В запросе условие начинается с WHERE. Учим матчасть.
В первом случае меняем
Мне матчасть учитьне надо.
Просто решил помочь человеку, показав как верно было бы спросить. В противном случае тема растянулась бы надолго.
Сам ещё не разбирался ни с флюксбб, ни с пунбб - пока некогда.
С уважением хостер.
Offline
Страницы 1