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_Applicationpara 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:
Zend_Http_UserAgent_Features_Adapter_Browscap utiliza la función nativa de PHP
get_browser()junto con browscap. Aunque el conjunto de características de la base de datos no es tan detallado como el de otros proyectos, para la mayoría de los propósitos, proporciona resultados fiables y rápidos.Zend_Http_UserAgent_Features_Adapter_TeraWurfl consume la API de TeraWurfl, que está construida sobre WURFL, y está orientada a proporcionar un mecanismo de búsqueda de alta disponibilidad y alto rendimiento.
Zend_Http_UserAgent_Features_Adapter_DeviceAtlas consume la API de DeviceAtlas, que es una base de datos de capacidades de dispositivos móviles de pago, de nivel empresarial.
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...
}
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_typeestará presente.- plugin_loader.[type] = [class]
Configuración del cargador de plugins; le permite especificar una clase de extensión de
Zend_Loader_PluginLoaderpreconfigurada para usar en uno de los tipos de cargador de plugins gestionados porUserAgent(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_typeserá uno de los dispositivos de navegador admitidos, incluyendo:Bot
Checker
Console
Desktop
Email
Feed
Mobile
Offline
Probe
Spam
Text
Validator
El
browser_typedebe 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 clavepath. La clase debe implementarZend_Http_UserAgent_Features_Adapter.
-
__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); $typepuede ser "device" o "storage"; el primero se usa al intentar encontrar clases de dispositivo, el segundo para encontrar clases de almacenamiento.$loaderpuede ser una instancia deZend_Loader_PluginLoader, o una cadena con el nombre de clase de una clase de extensión deZend_Loader_PluginLoader.-
getPluginLoader($type); Recupera la instancia del cargador de plugins "device" o "storage".
Por el momento, vea el inicio rápido para ver ejemplos.