!: Данный пост есть развитие диалога в топике habrahabr.ru/blogs/php/36932/
Для начала нам необходимо зарегистрировать IP адрес сайта в базе Яндекса. После этого нам станет доступен бесплатный вариант поиска, который предполагает не более 1000 запросов в сутки с одного IP. Так же одним из условий использования сервиса является размещение фразы «Поиск реализован на основе Яндекс.XML» на странице результатов поиска.
Теперь приступим непосредственно к PHP, нам понадобится класс Yandex (скромное название — могут не понять), его Вы можете скачать со странички проекта на Code-Google, так же есть доступ к SVN репозиторию:
svn checkout yandex.googlecode.com/svn/trunk/ yandex-read-only
Требования вполне приемлемые:
- PHP 5.1+
- SimpleXML
- CURL
Приступим, для начала подключаем сам класс:
require_once `Yandex.php`;
Далее — нам необходимо забрать из реквеста поисковый запрос, номер страницы и сайт по которому будем искать (вполне вероятно Вам понадобится гораздо больше параметров, но будем считать это необходимым минимумом):
// забираем «query», «page» и «host» с request`а
$query = isset($_REQUEST[`query`])?$_REQUEST[`query`]:``;
$page = isset($_REQUEST[`page`]) ?$_REQUEST[`page`]:0;
$host = isset($_REQUEST[`host`]) ?$_REQUEST[`host`]: null;
Теперь непосредственно манипуляции с классом Yandex:
if ($query) { // создаем экземпляр класса Yandex $Yandex = new Yandex(); $Yandex -> query($query) // устанавливаем поисковый запрос -> host($host) // ограничиваемся поиском по сайту -> page($page) // текущая страница -> limit(10) // результатов на странице -> set(`max-title-length`, 160) // тонкая настройка поисковой выдачи (см. http://code.google.com/p/yandex/source/browse/trunk/Yandex.php#48) -> set(`max-passage-length`, 200) -> request() // отправляем запрос ; }
Если всё прошло гладко, то результат будет доступен в «$Yandex->result» — сие есть SimpleXML объект, ничем и никак не порезанный — дабы предоставить полную свободу действий для его обработки. Далее привожу пример вывода результатов поиска (HTML опущен):
// проверяем всё ли гладко if (isset($Yandex) && empty($Yandex->error)) : // вот таким образом мы стучимся к результатам foreach ($Yandex->result->response->results->grouping->group as $group) : // вывод URL echo $group->doc->url; // вывод заголовка - метод Yandex::highlight выделяет поисковую фразу Yandex::highlight($group->doc->title); // выводим пассажи foreach ($group->doc->passages->passage as $passage) : Yandex::highlight($passage); endforeach; endforeach; // далее выводим постраничную навигацию, она немного громоздка foreach ($Yandex->pageBar() as $page => $value) : // switch statement for $value[`type`] switch ($value[`type`]) { // ссылка на страничку case `link`: echo `<a href="`. $url .`&page=`. $page .`" title="Page `. ($page+1) .`">`. sprintf($value[`text`], $page+1) .`</a> | `; break; // текущая страница case `current`: echo sprintf($value[`text`], $page+1) .` | `; break; // текст разделителя - ".." case `text`: echo $value[`text`] .` | `; break; default: break; } endforeach; // если что-то не так - выводим ошибку elseif(isset($Yandex) && isset($Yandex->error)): echo $Yandex->error; endif;
В данном примере используются конструкции ввида «if (..):… endif;», т.к. они наиболее подходят для шаблонизаторов с нативным PHP синтаксисом, для оборачивания сего в Smarty Вам понадобиться заасайнить $Yandex в шаблон и далее переделываем пример:
// будет что-то типа:
$Smarty->assign(«Yandex», $Yandex);
Разбирать сам класс по запчастям, я думаю, особо не стоит — кто знает PHP и так поймет — благо комментарии присутствуют, да и ничего военного в нем нет — все достаточно просто. Если же есть пожелания иль замечания — пишите — будем обсуждать…
Попробывать скрипт на вкус можно на страничке http://yandex.hohli.com/