Забобрить эту страницу!
Форум русской поддержки Joomla! CMS
03.09.2010, 11:32:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

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


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


Просмотр профиля WWW
« : 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 » Записан

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
Antosha
Завсегдатай
*****

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

Сообщений: 552


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


Просмотр профиля
« Ответ #1 : 19.10.2009, 20:45:02 »

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

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

Сообщений: 552


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


Просмотр профиля
« Ответ #2 : 19.10.2009, 20:47:35 »

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

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

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


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


Просмотр профиля WWW
« Ответ #3 : 19.10.2009, 20:47:56 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
beliyadm
Joomlapedia team
*

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

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


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


Просмотр профиля WWW
« Ответ #4 : 19.10.2009, 20:49:04 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
Antosha
Завсегдатай
*****

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

Сообщений: 552


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


Просмотр профиля
« Ответ #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
Joomlapedia team
*

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

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


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


Просмотр профиля WWW
« Ответ #6 : 19.10.2009, 21:05:34 »

именно так
Записан

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
Antosha
Завсегдатай
*****

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

Сообщений: 552


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


Просмотр профиля
« Ответ #7 : 19.10.2009, 21:08:21 »

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

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

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


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


Просмотр профиля WWW
« Ответ #8 : 20.10.2009, 04:51:08 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
Shustry
Захожу иногда
**

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

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



Просмотр профиля
« Ответ #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

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



Просмотр профиля
« Ответ #11 : 23.10.2009, 01:12:14 »

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

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

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


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


Просмотр профиля WWW
« Ответ #12 : 23.10.2009, 01:17:04 »

Не нажимать
Записан

MAXWELL
Захожу иногда
**

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

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



Просмотр профиля
« Ответ #13 : 23.10.2009, 01:20:01 »

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

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

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


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


Просмотр профиля WWW
« Ответ #14 : 23.10.2009, 01:27:48 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
MAXWELL
Захожу иногда
**

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

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



Просмотр профиля
« Ответ #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
Joomlapedia team
*

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

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


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


Просмотр профиля WWW
« Ответ #18 : 25.10.2009, 05:48:58 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
SmokerMan
Практически профи
*******

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

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



Просмотр профиля WWW
« Ответ #19 : 04.01.2010, 17:59:57 »

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

userxp
Администратор
*******

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

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


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


Просмотр профиля
« Ответ #20 : 04.01.2010, 18:14:37 »

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

bzzik
JComments Tester
*

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

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


Contra Gaming Community


Просмотр профиля WWW
« Ответ #21 : 04.01.2010, 18:17:35 »

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

SmokerMan - сделай на MT, получишь + Wink
Записан

userxp
Администратор
*******

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

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


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


Просмотр профиля
« Ответ #22 : 04.01.2010, 18:27:17 »

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

SmokerMan
Практически профи
*******

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

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



Просмотр профиля WWW
« Ответ #23 : 04.01.2010, 18:35:27 »

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

bzzik
JComments Tester
*

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

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


Contra Gaming Community


Просмотр профиля WWW
« Ответ #24 : 04.01.2010, 18:37:34 »

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

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

SmokerMan
Практически профи
*******

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

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



Просмотр профиля WWW
« Ответ #25 : 04.01.2010, 22:13:44 »

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

beliyadm
Joomlapedia team
*

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

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


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


Просмотр профиля WWW
« Ответ #26 : 04.01.2010, 23:11:13 »

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

Я в Париже. Живу, как денди. Женщин имею до ста. Мой чл*н, как сюжет в легенде, Переходит из уст в уста.
-=Joomla FAQ=- || Private Joomla Blog
bzzik
JComments Tester
*

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

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


Contra Gaming Community


Просмотр профиля WWW
« Ответ #27 : 05.01.2010, 00:16:10 »

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

Sulpher
Support Team
*****

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

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


Mercyful Fate's fan


Просмотр профиля WWW
« Ответ #28 : 07.02.2010, 00:49:05 »

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

Round Interactive - разработка сайтов под ключ на Joomla!
Joomla 1.5 FAQ   - вопросы и ответы по Joomla 1.5

Beer, sex & heavy metal.
В личку пишите по делу!
SmokerMan
Практически профи
*******

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

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



Просмотр профиля WWW
« Ответ #29 : 07.02.2010, 01:40:59 »

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

Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

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