PDA-версия. Часть 1. Определение типа устройства

Однажды мне потребовалось пристроить к сайту автоматическое перенаправление мобильных клиентов на соотв. версию. Лично я не люблю такие вещи: надо будет - перейду сам, а угадывать мои желания незачем - все равно ошибетесь) Но заказчик захотел...
UPD 15.01.2011: наконец-то, пришли к решению отказаться от этого безумия и дать пользователю возможность самому выбирать какую версию он хочет видеть.

Как оказалось, для таких целей Яндекс любезно дарит нам свой API Яндекс.Детектор

API Яндекс.Детектор предоставляет возможность определения модели и характеристик мобильного устройства пользователя сайта по заголовкам HTTP-запросов, передаваемых браузером его устройства.
API позволяет определить следующие параметры и настройки устройства:

  • модель и производитель;
  • разрешение экрана;
  • разновидность используемой платформы и тип дистрибутива J2ME (4 категории);
  • возможности Java-приложений (доступ к камере и файловой системе устройства, тип корневого сертификата и размер значка приложения).

 

Прикрутим его к ЮМИ.

 

В шапку страницы записываем макрос %custom wap_autoredirect()%

Сам макрос

<?php

public function wap_autoredirect(){

$headers = '';

//получаем все заголовки
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0 && $key != 'HTTP_HOST') {
$key = strtolower(strtr(substr($key, 5), '_', '-'));
$headers .= $key . ': ' . $value . "rn";
}
}

//упорядочиваем их
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=> $headers,
)
);

//отправляем Яндексу
$s = file_get_contents('http://phd.yandex.net/detect', false, stream_context_create($opts));

//из полученной строки делаем  xml
$s = <<<END
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{$s}
</root>
END;


$xml = simplexml_load_string($s);

$error = $xml->{'yandex-mobile-info-error'};

//если тип устройства определить не удалось - возвращаем пусткю строку
if($error == 'Unknown user agent and wap profile') return '';

//иначе делаем редирект на главную мобильной версии
umiHierarchy::getInstance()->__destruct();
outputBuffer::current()->redirect('http://pda.мой_домен/');


}
?>