Вже тривалий час доступний сервіс Яндекс.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 “. sprintf($value[‘text’], $page+1) .’ | ‘;
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/