Zend Framework – wersja mobilna

Zend FrameworkW październiku 2010 roku wspominałem Wam, że wraz z pojawieniem się Zend Frameworka w wersji 1.11.0 ułatwiono nam dostosowanie aplikacji opartej o ZF dla moblinych przeglądarek.

Dzięki pomocy Raphaela w frameworku pojawiły się m.in. Zend_Http_UserAgent oraz Zend_View_Helper_UserAgent. Dzisiaj chciałbym szybko Wam pokazać jak w łatwy sposób wykryć czy mamy doczynienia z mobilną przeglądarką (zbliża się wersja bilancio dla mobilnych).

WURFL, czyli powtarzamy kroki z manuala

Zasób UserAgent korzysta z zewn. biblioteki – WURFL (Wireless Universal Resource File). Ściągamy wersję 1.1 i rozpakowujemy w dowolnym miejscu. W naszej aplikacji tworzymy /library/wurfl-php-1.1 i kopiujemy tam katalog WURFL (reszty ze ściągniętej paczki tutaj nie potrzebujemy).

Aby zakończyć ten krok musimy jeszcze skopiować plik z informacjami o urządzeniach mobilnych. Plik wurfl-latest.zip znajduje się w paczce, w ścieżce tests/resources/. Tworzymy katalog w naszej aplikacji /data/wurfl oraz /data/wurfl/cache (w tym miejscu będzie przechowywał zawartość pliku zip). Do /data/wurfl kopiujemy plik wurfl-latest.zip (kopiujemy również web_browsers_patch.xml). W skrócie (project to nazwa naszego projektu ZF):

[source language=”bash”]

wget "http://downloads.sourceforge.net/project/wurfl/WURFL%20PHP/1.1/wurfl-php-1.1.tar.gz?r=&ts=1296984042&use_mirror=sunet" -O wurfl-php-1.1.tar.gz

tar -xvf wurfl-php-1.1.tar.gz

mkdir project/library/wurfl-php-1.1

mkdir project/data

mkdir project/data/wurfl

mkdir project/data/wurfl/cache

chmod a+w project/data/wurfl

cp -R wurfl-php-1.1/WURFL project/library/wurfl-php-1.1/

cp wurfl-php-1.1/tests/resources/wurfl-latest.zip project/data/wurfl

cp wurfl-php-1.1/tests/resources/web_browsers_patch.xml project/data/wurfl
[/source]

Konfiguracja WURFL

Pliki mamy skopiowane, skonfigurujmy teraz samego WURFL. Zróbmy to wg tutorialu:

[source language=”php”]
<?php
$resourcesDir = dirname(__FILE__) . ‚/../../data/wurfl/’;

$wurfl[‚main-file’] = $resourcesDir . ‚wurfl-latest.zip’;
$wurfl[‚patches’] = array($resourcesDir . ‚web_browsers_patch.xml’);

$persistence[‚provider’] = ‚file’;
$persistence[‚dir’] = $resourcesDir . ‚/cache/’;

$cache[‚provider’] = null;

$configuration[‚wurfl’] = $wurfl;
$configuration[‚persistence’] = $persistence;
$configuration[‚cache’] = $cache;
[/source]

Konfiguracja chyba jest jasna? Wskazujemy głównie miejsca plików, które wcześniej kopiowaliśmy.

Na koniec konfiguracja projektu Zend Framework. Jak ostatnio wspominałem we wpisie Zend Framework i Symfony – subiektywnie, obecnie jesteśmy w stanie zrobić większość w application.ini. W takim razie dodajmy do niego informację, że chcemy skorzystać z UserAgent i powiedzmy, gdzie umieściliśmy WURFL, który jest odpowiedzialny za „rozszyfrowanie” danych o urządzeniu mobilnym:

[source language=”php”]
resources.useragent.wurflapi.wurfl_api_version = "1.1"
resources.useragent.wurflapi.wurfl_lib_dir = APPLICATION_PATH "/../library/wurfl-php-1.1/WURFL/"
resources.useragent.wurflapi.wurfl_config_file = APPLICATION_PATH "/configs/wurfl-config.php"
[/source]
W tym momencie zasób UserAgent już działa i możemy z niego korzystać.

Plugin

Nasza cała aplikacja ma uwzględniać urządzenia mobilne dlatego stworzymy plugin, który w przypadku wersji mobilnej zmieni nam layout na mobilny:

[source language=”php”]
class Zextend_Controller_Plugin_Mobile extends Zend_Controller_Plugin_Abstract
{

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$bootstrap = Zend_Controller_Front::getInstance()->getParam(‚bootstrap’);
$userAgent = $bootstrap->getResource(‚useragent’);
$device = $userAgent->getDevice();
if($device->getType() == ‚mobile’) {
Zend_Layout::getMvcInstance()->setLayout(‚mobile’);
}
}
}
[/source]
$device udostępnia nam nie tylko typ urządzenia (getType()), ale również jego szerokość ekranu (getPhysicalScreenWidth());
W bilancio będzie to po prostu przekierowanie na osobą domenę (pobierana z application.ini z app.mobileUrl), ponieważ udostępniona funkcjonalność będzie różnić się od standardowej wersji:
[source language=”php”]
class Zextend_Controller_Plugin_Mobile extends Zend_Controller_Plugin_Abstract
{

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$config = Zend_Registry::get(‚config’);
$bootstrap = Zend_Controller_Front::getInstance()->getParam(‚bootstrap’);
$userAgent = $bootstrap->getResource(‚useragent’);
$device = $userAgent->getDevice();
$mobileUrl = $config->app->mobileUrl;
if($mobileUrl && $device->getType() == ‚mobile’) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper(‚redirector’);
$redirector->setGoToUrl($mobileUrl);
$redirector->redirectAndExit();
}
}
}
[/source]

Zaznaczę, że dla obsułgi wurfl-latest.zip potrzebujemy rozszerzenia ZIP w PHP. Możemy plik rozpakować, ale wtedy nie skorzystamy z cachowania.