Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
Новости
Последние поступления
Книжный магазин
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



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

Раздел: Programming / PHP @ 19.08.2008 | Ключевые слова: php яндекс.xml версия для печати

Автор: Антон Шевчук
Источник: habrahabr

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

!: Данный пост есть развитие диалога в топике 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/

Это интересно:








версия для печатиРаспечатать статью


Вернуться в раздел: Programming / PHP


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.