LiveInternetMail.ru
Форум русской поддержки Joomla!® CMS
12.02.2012, 21:51:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 1.7 FAQ Joomla 1.5 FAQ Joomla 1.0 FAQ Правила форума Новости Joomla Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор Тема: Создаем AJAX поиск по сайту (jquery)  (Прочитано 8896 раз)
0 Пользователей и 1 Гость смотрят эту тему.
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« : 19.10.2009, 20:26:29 »

Итак, общие аспекты создания поиска по сайту с применением AJAX. В чем суть - при вводе\удалении каждого символа в поле поиска обращаемся к БД и показываем совпадения
Рабочий пример здесь (справа вверху поле поиска, можете искать по словам "егэ, приказ, министерство" и подобным для демонстрации)
Сообразил по быстрому инсталляционную бета версию - тут
На деталях останавливаться не буду, кому интересно без проблем разберутся

1 - подключаем Jquery (я беру с гугля версию 1.3.2)
Код
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

2 - в HEAD шаблона подключаем следующий JS
Код
function lookup(inputString) {
if(inputString.length == 0) {
$('#suggestions').fadeOut();
} else {
$.post("index.php?option=com_pbajax&amp;task=ajaxsearch&amp;no_html=1", {queryString: ""+inputString+""}, function(data) {
$('#suggestions').fadeIn();
$('#suggestions').html(data);
});
}
 
$("input").blur(function(){
$('#suggestions').fadeOut();
});
}
В моем случае я использую собственный компонент com_pbajax с набором определенных тасков, один из которых ajaxsearch и обрабатывает результаты поиска его код ниже

3 - модифицируем шаблон модуля поиска, в моем случае он выглядит так (готовый хтмл на выходе)
Код
<form action="index.php"  method="post" class="search" name="zform">
<input name="searchword" id="inputString" onkeyup="lookup(this.value);" maxlength="20" class="inputbox" type="text" size="20" value="поиск по сайту"  onblur="if(this.value=='') this.value='поиск по сайту';" onfocus="if(this.value=='поиск по сайту') this.value='';" />
<input type="hidden" name="option" value="com_search" />
<input type="hidden" name="task"   value="search" />
</form>
То есть по событию onkeyup вызываем нашу функцию lookup и отдаем ей на обработку введенное значение

4 - и собственно код обработчика (в моем случае это компонент com_pbajax и в нем кейс ajaxsearch
Код
case 'ajaxsearch';
$queryString = JRequest::getVar( 'queryString', 1, 'post' );
 
$db = JFactory::getDBO();
$user =& JFactory::getUser();
 
require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');
require_once(JPATH_SITE.DS.'libraries/phputf8/utf8.php');
 
  $nullDate = $db->getNullDate();
$date =& JFactory::getDate();
$now = $date->toMySQL();
 
$query = 'SELECT a.*, '
. ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,'
. ' CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug'
. ' FROM #__content AS a'
. ' INNER JOIN #__categories AS cc ON cc.id = a.catid'
. ' INNER JOIN #__sections AS s ON s.id = a.sectionid'
. ' WHERE a.title LIKE "%'.$queryString.'%" OR a.introtext LIKE "%'.$queryString.'%" '
. ' AND a.state = 1'
. ' AND cc.published = 1'
. ' AND s.published = 1'
. ' AND a.access <= '.(int) $user->get( 'aid' )
. ' AND cc.access <= '.(int) $user->get( 'aid' )
. ' AND s.access <= '.(int) $user->get( 'aid' )
. ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )'
. ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )'
. ' ORDER BY title  LIMIT 10'
;
 
if ($queryString != '') {
$db->setQuery($query);
$rows = $db->loadObjectList();
$html = '<div id="searchresults">';
       $n = count($rows);
       $i = '1';
if ($n) {
$html .= '<ul class="searchresultsli">';
foreach ( $rows as $row )
{
$link = ContentHelperRoute::getArticleRoute($row->slug, $row->catslug, $row->sectionid);
 
$class = '';
if ($i%'2'=='0') {
$class = 'odd';
} else {
   $class = 'even';
}
 
$html .= '<li class="'.$class.'">';
$html .= $i.' - ';
$title = str_replace($queryString, '<span class="highlight">'.$queryString.'</span>', utf8_strtolower($row->title));
$html .= '<a href="'.$link.'">'.$title.'</a>';
$html .= '</li>';
$i++;
}
$html .= '</ul>';
} else {
        $html .= 'По Вашему запросу ничего не найдено';
}
$html .= '</div>';
} else {}
 
echo $html;
 
break;
Чуть пошагово:
1 - подключили роутер контента и utf8.php для отработки utf8_strtolower (можете этого и не делать)
2 - запрос вытягивает заголовок материала и вступительный текст на предмет поиска совпадений с ключевым запросом $queryString
3 - регуляркой обрабатываем заголовок и подсвечиваем искомое слово в выдаче (в моем случае результат выдается только заголовком, потому если совпадение с $queryString найдено в introtext то в заголовке выдачи подсвечивать нечего)
4 - добавляем классы odd\even для чередования строк (можно и на квери делать, но почему то стало лень)

5 - в нужное место вешаем див для показа результатов поиска, у меня он висит в индексе шаблона
Код
<div id="suggestions"></div>
И оформляем CSS стили положение блока и собственно результатов поиска
Код
/* AJAX search */
#suggestions { position: absolute; width:350px; display:none; z-index: 100; right: 20px; top: 75px;}
#suggestions {border: 1px solid #ABD2DE; background-color: #DEEFF4; padding: 10px;text-align: left; color: #1F579A; font-size: 12px;}
#suggestions a, #suggestions li {color: #1F579A; font-size: 12px; text-decoration: none;}
#suggestions a:hover {text-decoration: underline;}
ul.searchresultsli, ul.searchresultsli li {margin: 0px; padding: 0px; background-image: none; list-style: none;}
ul.searchresultsli li {padding: 7px 5px 7px 3px;}
ul.searchresultsli li.odd {background-color: #F4F1E1;}
a.highlight {color: #FE9500 !important; font-weight: bold;}

После этого получаем красивый поиск и пищу для дальнейших модификаций
Мопед не мой, автор идеи Marco Kuiper, за что ему отдельное спасибо
Готового модуля делать не буду, разобраться думаю не составляем проблем

P.S. большая нагрузка на БД
« Последнее редактирование: 31.10.2009, 21:07:35 от beliyadm » Записан
Antosha
Завсегдатай
*****

Репутация: +50/-0
Offline Offline

Сообщений: 589


Плохо спорить плохо


« Ответ #1 : 19.10.2009, 20:45:02 »

AJAX начинает работать уже на первом же символе, надо сделать фильтр, и хотя бы до 4-5 символов поиск в базе не производить. Для аббревиатуры можно сделать и 3 символа, и обрабатывать что ввел пользователь, до того как посылать запросы к базе. То есть, если поисковое слово меньше 5 символов, то ищем в словаре аббревиатуру, остальные же слова должны быть больше 4 символов. Возможно так можно снизить нагрузку на БД. Может так? Так же было бы совсем не плохо сделать кешь для наиболее частых поисковых запросов.
Записан
Antosha
Завсегдатай
*****

Репутация: +50/-0
Offline Offline

Сообщений: 589


Плохо спорить плохо


« Ответ #2 : 19.10.2009, 20:47:35 »

и можно чуть подробнее, что сделать, если com_pbajax у меня нет?
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #3 : 19.10.2009, 20:47:56 »

В рабочем релизе поиск будет производится после 3-х набранных символов (то есть снижаем нагрузку)
По поводу кеширования пока в размышлениях как реализовать, будет обязательно.
Но данный топик показывает базово возможно данной реализации как пища для размышлений, дальше дело вашей фантазии и рук Azn
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #4 : 19.10.2009, 20:49:04 »

и можно чуть подробнее, что сделать, если com_pbajax у меня нет?
сделать собственный компонент с данной функцией либо добавить в любой другой. Можно оформить и отдельным файлом где подключать функции ядра, но мне было проще так (там много чего другого у меня написано).
Вопросы "как сделать этот компонент" я рассматривать не буду
Записан
Antosha
Завсегдатай
*****

Репутация: +50/-0
Offline Offline

Сообщений: 589


Плохо спорить плохо


« Ответ #5 : 19.10.2009, 21:04:09 »

Ок. Если я сделаю так:
Эту $.post("index.php?option=com_pbajax&amp;task=ajaxsearch&amp;no_html=1".... строчку перепишу так:

$.post("MYFILE.php?",.....

а в файл MYFILE помещу CASE из com_pbajax, ну соответственно без case будет работать? Просто самая основная работа делается в этом коде и он самый главный.... =((((
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #6 : 19.10.2009, 21:05:34 »

именно так
Записан
Antosha
Завсегдатай
*****

Репутация: +50/-0
Offline Offline

Сообщений: 589


Плохо спорить плохо


« Ответ #7 : 19.10.2009, 21:08:21 »

Спасибо за модную фичу. =))
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #8 : 20.10.2009, 04:51:08 »

P.S. если наберется больше 5 человек желающих - сделаю в виде готового модуля
Записан
Shustry
Группа развития
*****

Репутация: +129/-0
Offline Offline

Пол: Мужской
Сообщений: 1053


Император


« Ответ #9 : 21.10.2009, 09:27:55 »

+1 к желающим. Очень понравилась реализация  Cheesy
Записан
vdm
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 10


« Ответ #10 : 23.10.2009, 01:00:10 »

Так же присоединюсь к страждущим
Записан
MAXWELL
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 17



« Ответ #11 : 23.10.2009, 01:12:14 »

еще один Smiley
Cейчас все баиньки делают, а то б уже за 100 перевалило
« Последнее редактирование: 23.10.2009, 01:17:43 от MAXWELL » Записан
Yurets
Завсегдатай
*****

Репутация: +77/-0
Offline Offline

Пол: Мужской
Сообщений: 554


Губернатор острова Борнео


« Ответ #12 : 23.10.2009, 01:17:04 »

Не нажимать
Записан
MAXWELL
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 17



« Ответ #13 : 23.10.2009, 01:20:01 »

О еще один  Cheesy
Товарищ знал бы хоть каплю ява скрипты. Вообще бы молчал
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #14 : 23.10.2009, 01:27:48 »

Yurets - не боись, мне то в принципе дело недолгое модуль наваять из готового, а вот товарищам после разгребать конфликты на своих варезных шаблонах с кучей сторонних JS скриптов (проблемы коих я решать никак не собираюсь Azn)
Записан
MAXWELL
Захожу иногда
**

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 17



« Ответ #15 : 23.10.2009, 01:39:47 »

Вот и правильно
Записан
vdm
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 10


« Ответ #16 : 23.10.2009, 09:59:50 »

Ну, не у всех варезные шаблоны.
Записан
stadion
Осваиваюсь на форуме
***

Репутация: +4/-3
Offline Offline

Сообщений: 39


« Ответ #17 : 23.10.2009, 23:32:57 »

Присоединюсь пожалуй . Модуль оно как говорится - вещь хорошая Azn
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #18 : 25.10.2009, 05:48:58 »

Сообразил по быстрому инсталляционную бета версию - тут
Записан
SmokerMan
Профи
********

Репутация: +489/-19
Offline Offline

Пол: Мужской
Сообщений: 5078



« Ответ #19 : 04.01.2010, 17:59:57 »

Yurets - не боись, мне то в принципе дело недолгое модуль наваять из готового, а вот товарищам после разгребать конфликты на своих варезных шаблонах с кучей сторонних JS скриптов (проблемы коих я решать никак не собираюсь Azn)
а на стандартном mootools не вариант сделать, да? Azn
Записан
userxp
Администратор
*******

Репутация: +388/-6
Offline Offline

Пол: Мужской
Сообщений: 3193


Злой и ужасный бармалей


« Ответ #20 : 04.01.2010, 18:14:37 »

вот я тоже читаю и понять не могу - зачем тут "лишних" 50 кило от JQ, если в 1.5 уже есть МТ?
Записан
bzzik
JComments Tester
*

Репутация: +190/-0
Offline Offline

Пол: Мужской
Сообщений: 3489


Contra Gaming Community


« Ответ #21 : 04.01.2010, 18:17:35 »

вот я тоже читаю и понять не могу - зачем тут "лишних" 50 кило от JQ, если в 1.5 уже есть МТ?
Любим мы JQ, а MT - нет. Почему? Не знаю...

SmokerMan - сделай на MT, получишь + Wink
Записан
userxp
Администратор
*******

Репутация: +388/-6
Offline Offline

Пол: Мужской
Сообщений: 3193


Злой и ужасный бармалей


« Ответ #22 : 04.01.2010, 18:27:17 »

МТ я тож нелюблю, но элементарные функции можно сделать и без JQ, тем более, что они тут оч похожи.
а насчет сделать... ну дык у кого время-то есть?
 Roll Eyes
Записан
SmokerMan
Профи
********

Репутация: +489/-19
Offline Offline

Пол: Мужской
Сообщений: 5078



« Ответ #23 : 04.01.2010, 18:35:27 »

SmokerMan - сделай на MT, получишь + Wink
не думаю что это будет сложно.
О результатах доложу  Smiley
Записан
bzzik
JComments Tester
*

Репутация: +190/-0
Offline Offline

Пол: Мужской
Сообщений: 3489


Contra Gaming Community


« Ответ #24 : 04.01.2010, 18:37:34 »

не думаю что это будет сложно.
О результатах доложу  Smiley
Настоящий полковник  Yes!

МТ я тож нелюблю, но элементарные функции можно сделать и без JQ, тем более, что они тут оч похожи.
а насчет сделать... ну дык у кого время-то есть?
 Roll Eyes
В точку   dry
Записан
SmokerMan
Профи
********

Репутация: +489/-19
Offline Offline

Пол: Мужской
Сообщений: 5078



« Ответ #25 : 04.01.2010, 22:13:44 »

Пробуй
Записан
beliyadm
Профи
********

Репутация: +1432/-61
Offline Offline

Пол: Мужской
Сообщений: 9254


Севастополь==Россия


« Ответ #26 : 04.01.2010, 23:11:13 »

Большинство фишек что я делаю - делаю на jquery, потому что мне больше нравится, лучше 50 кБ сжатого с гугля квери, нежели 70 кБ стандартного мутулза. Ну и мутулз вырезается на уровне шаблона, так что ничего лишнего нет.
И кстати если мне не изменяет память, то поиск фофx\mootools уже есть, к примеру тут и где то еще встречал
МТ я тож нелюблю, но элементарные функции можно сделать и без JQ, тем более, что они тут оч похожи.
естессно, но если у меня весь сайт построен на JQ (табличный грид, верстка, эффекты и прочий ajax) - подумал что грех не поделится идеей
Записан
bzzik
JComments Tester
*

Репутация: +190/-0
Offline Offline

Пол: Мужской
Сообщений: 3489


Contra Gaming Community


« Ответ #27 : 05.01.2010, 00:16:10 »

Дык я просто так предложил Azn Я сам использую JQ для AJAX поиска в своем компоненте.
Записан
Sulpher
Support Team
*****

Репутация: +288/-8
Offline Offline

Пол: Мужской
Сообщений: 1697


Сайты на Joomla 2.5


« Ответ #28 : 07.02.2010, 00:49:05 »

Я практически на всех сайтах отключаю MT и подключаю JQ со всеми прелестями, следовательно, каждое решение под конкретный случай - вот мне такой модуль полезен. Те, кто хочет аналогичный модуль на Mootools, берите и используйте RokAjaxSearch (GNU/GPL).
Записан
SmokerMan
Профи
********

Репутация: +489/-19
Offline Offline

Пол: Мужской
Сообщений: 5078



« Ответ #29 : 07.02.2010, 01:40:59 »

Я практически на всех сайтах отключаю MT и подключаю JQ со всеми прелестями, следовательно, каждое решение под конкретный случай - вот мне такой модуль полезен. Те, кто хочет аналогичный модуль на Mootools, берите и используйте RokAjaxSearch (GNU/GPL).
да модулей поиска на mootools полно. Выбирай не хочу.
а уж какую библиотеку использовать это кому как по душе.
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Рейтинг@Mail.ru Rambler Top100 Powered by SMF 1.1.16 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet