Антон Шевчук // Web-разработчик

PHP класс для работы с Яндекс.XML // PHP

Уже продолжительное время доступен сервис Яндекс.XML – сие есть не что иное, как поисковый сервис, который позволяет делать автоматические поисковые запросы к Яндексу и публиковать его ответы у себя на сайте и данный пост посвящен приручению сего зверя с использованием PHP.

Для начала нам необходимо зарегистрировать IP адрес сайта в базе Яндекса. После этого нам станет доступен бесплатный вариант поиска, который предполагает не более 1000 запросов в сутки с одного IP. Так же одним из условий использования сервиса является размещение фразы “Поиск реализован на основе Яндекс.XML” на странице результатов поиска.

Теперь приступим непосредственно к PHP, нам понадобится класс Yandex (скромное название – могут не понять), его Вы можете скачать со странички проекта на Code-Google, так же есть возможность установить используя composer.

Требования вполне приемлемые:

  • 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/

© Антон Шевчук 2007-2017