TigerZF
🌐Español

38.6. Zend_Http_UserAgent

38.6.1. Resumen

Con la gran cantidad de dispositivos móviles disponibles en el mercado, es cada vez más importante poder identificar las capacidades de esos dispositivos para poder presentar el contenido de una manera adecuada. Por ejemplo, si el dispositivo no es capaz de mostrar imágenes, es posible que desee omitirlas del marcado; alternativamente, si un dispositivo es capaz de usar Flash, tal vez desee proporcionar una interfaz de usuario basada en Flash.

El proceso de identificar las capacidades de un dispositivo típicamente requiere primero conocer el User Agent HTTP, y luego comparar ese user agent con una base de datos de capacidades de user agents. Zend_Http_UserAgent fue creado para proporcionar estas capacidades a sus aplicaciones. Consta de varias funciones principales:

  • La clase principal Zend_Http_UserAgent, que detecta el User Agent, y le proporciona un objeto de dispositivo, además de persistir ese objeto de dispositivo para su posterior recuperación.

  • Una interfaz Zend_Http_UserAgent_Device, y varias implementaciones que la implementan. Estos objetos utilizan un adaptador de características para descubrir las capacidades del dispositivo, y luego le permiten inspeccionar dichas capacidades.

  • Una interfaz Zend_Http_UserAgent_Features_Adapter; las implementaciones concretas proporcionan la capacidad de descubrir las capacidades, o características, del dispositivo.

  • Una interfaz Zend_Http_UserAgent_Storage, que se utiliza para persistir los dispositivos descubiertos para usuarios determinados, permitiendo un descubrimiento de capacidades del dispositivo más rápido en visitas de página posteriores.

  • Un ayudante de vista que se puede usar dentro de sus scripts de vista y layouts para ramificar la lógica de presentación según las capacidades del dispositivo.

  • Un recurso de Zend_Application para configurar e instanciar el objeto user agent, además de suministrar al ayudante de vista la instancia del objeto user agent.

En el momento de escribir esto, el componente UserAgent proporciona tres adaptadores:

38.6.2. Inicio rápido

Primero, deberá descargar el php_browscap.ini si aún no lo tiene instalado en su sistema:

Sugerimos que coloque el archivo en el mismo directorio que su php.ini.

A continuación, notifique a PHP sobre el archivo browscap mediante el ajuste browscap. Debido a que este ajuste es de tipo PHP_INI_SYSTEM, esto debe hacerse en su php.ini o en la configuración de su servidor web; no puede hacerse en htaccess ni mediante ini_set(). Recomendamos añadirlo a su php.ini.

browscap = /path/to/php_browscap.ini

Si colocó php_browscap.ini en el mismo directorio que su php.ini, esto se puede reducir simplemente a:

browscap = php_browscap.ini

Ahora, edite su application.ini para añadir las siguientes líneas en su sección [production]:

resources.useragent.mobile.features.classname = "Zend_Http_UserAgent_Device_Features_Browscap"

Llegados a este punto, todo está configurado. Cada solicitud contendrá información detallada sobre el user agent.

Puede acceder a esta información de varias maneras. Desde dentro de la parte MVC de su aplicación, puede acceder a ella a través del bootstrap. Dentro de los plugins, esto se hace obteniendo el bootstrap desde el controlador frontal.

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$userAgent = $bootstrap->getResource('useragent');

Desde su controlador de acción, use getInvokeArg() para obtener el bootstrap, y desde ahí, el objeto user agent.

$bootstrap = $this->getInvokeArg('bootstrap');
$userAgent = $bootstrap->getResource('useragent');

Dentro de su vista, puede obtenerlo usando el ayudante de vista UserAgent.

$userAgent = $this->userAgent();

Una vez que tenga el objeto user agent, puede consultarlo para conocer las distintas capacidades. Como ejemplo, puede que desee usar un script de layout alternativo según las capacidades del user agent.

$device = $userAgent->getDevice();

$cssSupport    = $device->getFeature('cssversion');
$jsSupport     = $device->getFeature('javascript');

switch (true) {
    case ($jsSupport && $cssSupport >= 3):
        $layout->setLayout('layout-html5');
        break;
    case ($jsSupport && $cssSupport < 3):
        $layout->setLayout('layout-xhtml');
        break;
    case (!$jsSupport && $cssSupport < 3):
        $layout->setLayout('layout-html-transitional');
        break;
    default:
        $layout->setLayout('layout-web-1');
        break;
}

Finalmente, cada dispositivo a menudo tendrá un gran número de capacidades no representadas de inmediato en la interfaz del dispositivo. Puede consultarlas usando los métodos hasFeature() y getFeature(), o simplemente obtenerlas todas con getAllFeatures().

if ($userAgent->hasFeature('mp3') && $userAgent->getFeature('mp3')) {
    // embed HTML5 audio tag...
}

38.6.3. Opciones de configuración

Opciones de UserAgent

Las siguientes opciones pueden pasarse al constructor o dentro de la configuración de su aplicación. Un "." indica otro nivel de profundidad en el array de configuración.

Cada adaptador de características también tiene sus propias opciones disponibles, las cuales se pueden combinar con las opciones generales de UserAgent.

browser_type

Se utiliza para inicializar la lista de dispositivos que el componente buscará. Vea también identification_sequence; este valor se antepondrá a esa lista durante el descubrimiento del dispositivo user agent.

http_accept

El valor de la cabecera HTTP Accept; usado por algunos user agents para determinar capacidades. Establezca esto para inicializar el valor explícitamente.

identification_sequence

Una lista separada por comas de tipos de dispositivo a explorar en busca de coincidencias; por defecto es "mobile,desktop".

storage.adapter

El nombre de un adaptador de almacenamiento usado para persistir las capacidades del dispositivo, típicamente dentro de una sesión de usuario determinada. El valor puede ser un nombre de clase totalmente cualificado, o un nombre corto que resuelva el cargador de plugins para las clases de almacenamiento. Por defecto, usa "Session" como valor, resolviéndose a Zend_Http_UserAgent_Storage_Session.

storage.options[]

Un array de opciones a pasar al constructor de un adaptador de almacenamiento. Por defecto, la opción browser_type estará presente.

plugin_loader.[type] = [class]

Configuración del cargador de plugins; le permite especificar una clase de extensión de Zend_Loader_PluginLoader preconfigurada para usar en uno de los tipos de cargador de plugins gestionados por UserAgent (actualmente "storage" y "device").

server[]

Típicamente, no establecerá esto; simplemente permite la inyección de la superglobal $_SERVER (o una versión filtrada de la misma). El valor debe ser un array asociativo.

user_agent

La cadena real de User-Agent HTTP que desea intentar comparar. Típicamente, esto se descubrirá automáticamente a partir del array server.

[browser_type].device.classname

La clase de dispositivo a usar para un tipo de navegador determinado; típicamente, browser_type será uno de los dispositivos de navegador admitidos, incluyendo:

  • Bot

  • Checker

  • Console

  • Desktop

  • Email

  • Feed

  • Mobile

  • Offline

  • Probe

  • Spam

  • Text

  • Validator

El browser_type debe normalizarse a minúsculas para efectos de configuración.

[browser_type].device.path and [browser_type].device.prefix

Una forma alternativa de especificar la clase de dispositivo para un tipo de navegador determinado es asumir que se llama según el dispositivo, y que todas las clases de dispositivo están en la misma ruta compartiendo el mismo prefijo. Configure el prefijo y la ruta usando estas claves.

Como ejemplo, lo siguiente buscaría una clase llamada "Mobile_Device_Bot" en la ruta "Mobile/Device/" bajo la biblioteca de la aplicación.

resources.useragent.bot.device.path = APPLICATION_PATH '/../library/Mobile/Device"
resources.useragent.bot.device.prefix = "Mobile_Device"
[browser_type].features.path and [browser_type].features.classname

Estos ajustes se utilizan para cargar la clase de detección de capacidades de características para un tipo de navegador determinado. La clase se nombrará usando la clave classname, y se espera que exista en el archivo denotado por la clave path. La clase debe implementar Zend_Http_UserAgent_Features_Adapter.

38.6.4. Métodos disponibles

__construct($options = null);

El constructor intenta determinar el User-Agent actual basándose en las opciones proporcionadas, la información de la solicitud actual, y/o la información previamente descubierta y persistida en el almacenamiento. Una vez instanciado, el dispositivo detectado está disponible de inmediato.

Vea la sección de opciones de configuración para más detalles sobre el array $options.

serialize();

Definido por la interfaz Serializable, este método realiza la lógica necesaria para determinar qué dentro del objeto debe serializarse cuando el objeto es serializado por un adaptador de almacenamiento.

unserialize($serialized);

Definido por la interfaz Serializable, este método realiza la lógica necesaria para determinar cómo deserializar una instancia previamente serializada.

setOptions($options);

Inicializa el estado del objeto. Vea la sección de opciones de configuración para más información sobre el array $options.

getUserAgent();

Recupera la cadena de User-Agent descubierta. A menos que se establezca explícitamente, esto se autodescubrirá a partir del array server.

setUserAgent($userAgent);

Establece la cadena de User-Agent explícitamente. Una vez que se ha llamado a getDevice(), esta propiedad se marca como inmutable, y llamar a este método lanzará una excepción.

getHttpAccept($httpAccept = null);

Recupera el valor de la cabecera HTTP Accept.

setHttpAccept($httpAccept);

Establece explícitamente el valor de la cabecera HTTP Accept. Una vez que se ha llamado a getDevice(), esta propiedad se marca como inmutable, y llamar a este método lanzará una excepción.

getStorage($browser = null);

Recupera un objeto de almacenamiento persistente para un tipo de navegador determinado.

setStorage(Zend_Http_UserAgent_Storage $storage);

Use esto para establecer explícitamente el objeto de almacenamiento persistente. Una vez que se ha llamado a getDevice(), el almacenamiento se marca como inmutable (es decir: no puede inyectar un nuevo objeto de almacenamiento), y llamar a este método lanzará una excepción.

clearStorage($browser = null);

Borra cualquier información en el objeto de almacenamiento persistente.

getConfig();

Recupera los parámetros de configuración.

getDevice();

Use este método para obtener el objeto User-Agent Device; este es el objeto que contendrá las diversas capacidades descubiertas del dispositivo.

El descubrimiento del dispositivo User-Agent ocurre en este método. Una vez que se ha recuperado el dispositivo, el array server, el tipo de navegador, el user agent, el http accept, y las propiedades de almacenamiento se marcan como inmutables.

getBrowserType();

Recupera el tipo de navegador descubierto; normalmente uno de:

  • Bot

  • Checker

  • Console

  • Desktop

  • Email

  • Feed

  • Mobile

  • Offline

  • Probe

  • Spam

  • Text

  • Validator

A menos que se establezca explícitamente, el tipo de navegador es desconocido hasta que se ha llamado a getDevice().

setBrowserType($browserType);

Establece explícitamente el tipo de navegador a anteponer a la secuencia de identificación. Una vez que se ha llamado a getDevice(), el tipo de navegador se marca como inmutable, y llamar a este método lanzará una excepción.

getServer();

Recupera el array de cabeceras HTTP y variables de entorno usadas para realizar el descubrimiento del dispositivo. Si el array aún no se ha establecido, se inicializa con la superglobal $_SERVER.

setServer($server);

Establece explícitamente el array "server" de cabeceras HTTP y variables de entorno a usar durante el descubrimiento del dispositivo. Una vez que se ha llamado a getDevice(), el array server se marca como inmutable, y llamar a este método lanzará una excepción.

getServerValue($key);

Recupera un único valor del array server por clave.

setServerValue($key, $value);

Sobrescribe o define un valor en el array server interno. Una vez que se ha llamado a getDevice(), el array server se marca como inmutable, y llamar a este método lanzará una excepción.

setPluginLoader($type, $loader);

$type puede ser "device" o "storage"; el primero se usa al intentar encontrar clases de dispositivo, el segundo para encontrar clases de almacenamiento. $loader puede ser una instancia de Zend_Loader_PluginLoader, o una cadena con el nombre de clase de una clase de extensión de Zend_Loader_PluginLoader.

getPluginLoader($type);

Recupera la instancia del cargador de plugins "device" o "storage".

38.6.5. Ejemplos

Por el momento, vea el inicio rápido para ver ejemplos.