viernes, 14 de octubre de 2011

Idioma español del teclado en Ubuntu Server 11

Hoy os traigo un apunte sencillo pero muy útil sobre como cambiar el idioma a español del teclado en linux, más concretamente en la consola de Ubuntu Server en su versión 11.
Cuando instalamos por primera vez el servidor Ubuntu, puede ocurrir que el teclado por defecto nos coja el estadounidense, donde no tendremos disponibles los acentos ni los guiones en el sistio original. Se pueden dar muchas vueltas y editar archivos de configuración, pero en este apunte vamos a ver una forma sencilla y fácil de hacerlo.
Comentar que para hacerlo debermos tomar el control del servidor como administradores; para ello desde la consola y una vez que nos hemos logueado en el sistema escribimos:
sudo su
El sistema nos pedirá nuestra contraseña y una vez proporcionada ya podemos ejecutar comandos de administración. Lo siguiente es cambiar el idioma del teclado a español. Para ello:
dpkg-reconfigure keyboard-configuration
Y nos iniciará el asistente para el teclado. Las siguientes imágenes que os pongo son autoexplicativas y podéis ver como configurar el teclado en español con el asistente.

Paso 1 del asistente
Paso 2 del asistente

Paso 3 del asistente

Paso 4 del asistente

Paso 5 del asistente (Final)
Espero que este apunte os sea útil cuando tengáis que instalar un servidor Ubuntu y cualquer cosa al respecto, no dudéis en preguntarme. 

jueves, 29 de septiembre de 2011

Creación de un widget basado en CPortlet con Yii Framework.

En un post anterior, estabamos comentando como Yii Framework puede ser extendido mediante componentes. Veiamos como los componentes extienden de uan clase base llamada CComponent y nos servían para crear nuevas clases integradas con el Framework.

Siguiendo con el tema de los componenetes y la extensibilidad en Yii Framework ahora veremos que existen otro tipo de componentes llamados Widgets con los que también podemos extender el framerow. La útilidad de los widgets es que nos permiten construir nuevos elementos visuales para nuestro sitio web. Los Widgets es la forma de extender la parte visual de Yii Framework.

Si quisieramos crear un widget completamente nuevo, la clase que creemos debe extender de CWidget . Esta clase es un componente contenedora de presentación, que permite visualizar datos del modelo. Sin embargo rara vez necesitaremos extender o crear un Widget desde cero. Lo más fácil es extender unos de los widgets que nos proporciona Yii y adaptarlo a nuestras necesidades y eso es lo que veremos a continuación.

lunes, 19 de septiembre de 2011

Extensión de Yii Framework mediante componentes

Una de las formas de extender Yii Framework es mediante los componentes. Los componentes son clases reutilizables, que podemos incluir en nuestra aplicación y que nos van a permitir agregar nuevas funcionalidades a Yii Framework.

Basándome en el artículo oficial de la web acerca de los componentes, he elaborado este artículo donde os explicaré la formas básicas de crear un componente y usarle en nuestras aplicaciones Yii. Es curioso que leyendo la guía en la web oficial del framework, la parte dedicada a componentes no está traducida al español, así que con este artículo, complementaré este información para los hispanohablantes :-)

Como nota final decir que en este artículo no me voy a limitar a traducir el artículo oficial de la web, si  no que lo orientaré a como construir un componente y usarlo. No obstante los conceptos básicos de lo que es un componente en Yii Framework están en ese  artículo, así que no haré mucho incapé en ello.

Componentes

Comencemos por el principio. Un componente en Yii es una instancia de la clase CComponent o de alguna de sus clases derivadas. La clase base CComponent nos va a dar las propiedades y eventos básicos del componente que vamos a crear. Por tanto todos los componentes, directa o indirectamente van a derivar de esta clase.

Propiedades de los componentes

Como todas las clases, los componentes podrán tener propiedades. Con como las propiedades de una clase, de hecho se pueden definir como propiedades públicas. No obstante la mejor manera de definir propiedades en un componente, es primero definir la propiedad como privada y después definir métodos para obtener y establecer la propiedad.

Un ejemplo: tenemos un componente Rectángulo que queremos que tenga una propiedad llamada ancho, que especifique el ancho del rectángulo. Lo definiremos de la siguiente manera:

class Rectangulo extends CComponet
{
  private $_ancho = 0;
  
  public function getAncho()
  {
    return $_ancho;
  }

  public function setAncho($ancho)
  {
    $this->_ancho = $ancho;
  }
}

De esta manera tendremos bien definidos nuestros métodos get y set. Si solo hubiésemos definido la propiedad getAncho(), la propiedad ancho del componente sería de solo lectura. Como en el ejemplo hemos definido tanto el método get, como el set, la propiedad se puede leer y escribir.

Eventos en los componentes

Otra de las características importantes de los componentes que nos ofrece Yii Framework son los eventos. Los eventos son propiedades especiales, que pueden tomar métodos llamados even handlers (controladores de eventos), como valores. Asignando un método a un evento lo que haremos es que cuando el evento sea ejecutado, automáticamente se ejecutará su método asociado.

Los eventos en los componentes, van precedidos por on. Así si queremos definir un evento para cuando nuestro componente se cargue usaremos onLoad() como nombre de la función de evento.

Veamos un ejemplo, volviendo a nuestra clase rectángulo:

class Rectangulo extends CComponet
{
   public fuction onLoad($event)
   {
$this->_ancho = 10;
      $this->raiseEvent('onLoaded', $event);
   }
}

El parámetro $event será un objeto de la clase CEvent o una de sus clases derivadas que va a contener como mínimo información acerca de quien ha lanzado el evento. Nuestro ejemplo lo que hará es establecer el ancho del rectángulo a 10 cuando se cargue el componente y posteriormente, retransmite el evento a la función de callback que hayamos configurado.

¿Como configuramos la función de callback?. Bien esto se hace desde fuera de nuestro componente, es decir desde la clase donde vayamos a usar el componente. Llamaremos a esta clase clase cliente. Normalmente esta clase será un controlador de nuestra aplicación. En él podemos poner nuestra función de callback y asociarlo al componente de la siguiente manera:

$rectangulo->array($this,'callbackLoad')

Y la signatura de nuestra función de callback deberá ser la siguiente:

public function callbackLoad($event)
{
   // Acciones para cuando se carga el componente.
}

Con esto tenemos definido el esqueleto de la gestión de eventos para un componente de Yii Framework.

Un último tema. Los componentes que creemos, tienen que estar en el directorio protected/components de nuestra aplicación. De esta manera el motor de Yii Framework, cargará automaticamente todas las clases que tengamos en este directorio y podremos usarlos en cualquier parte de la aplicación.

Si tenéis cualquier tema que comentarme, no dudéis en dejar un comentario, o escribirme un correo.

jueves, 11 de agosto de 2011

Yii Framework: Uso de CDefaultValueValidator en el modelo

Una de las bondades de Yii Framework es la posibilidad de realizar validaciones de los datos de una base de datos, desde el modelo, sobrescribiendo el método rules() de la clase ActiveRecord. En este post os explico como usar estas validaciones para poner un valor por defecto, en un campo de una base de datos.

Escenario

Necesitamos poner un valor por defecto en un campo de la base de datos. Cuando el usuario no rellene el valor del campo en el formulario, a la hora de actualizar o dar de alta un nuevo registro, el ActiveRecord automáticamente debe insertar el valor por defecto en la base de datos.

Descripción de la solución

La solución pasa por poner en el método rules() de nuestra tabla, un validador de tipo CDefaultValueValidator que nos permite especificar un valor por defecto para el campo de manera dinámica. Tiene dos atributos para especificar:
  • setOnEmpty: valor booleano. Si es true entonces el valor predeterminado se establece sólo cuando el valor del atributo es una cadena nula o vacía. En caso de que sea false, se establece siempre. 
  • value: el valor por defecto a establecer.
Cada validador tiene un alias para hacer referencia al validador en el método rules() del ActiveRecord. En nuestro caso el alias de CDefaultValueValidator es 'default'.

Ejemplo: en el siguiente ejemplo hay un campo que se llama 'leido' en el ActiveRecord, el cual queremos que
como valor por defecto sera cero.

public function rules()
{
	return array(
		array('leido','default','value' => 0),
	);
}

domingo, 31 de julio de 2011

Como configurar RBAC con Yii Framework

En este articulo voy a resumir de manera concisa, los pasos a seguir para configurar RBAC (Role Base Access Control) en nuestra aplicación. Gracias a este sistema, podremos integrar en nuestra aplicación un control de acceso basado en los roles que tengan los usuarios de la aplicación.

Así en las clases controladoras solo tendremos que especificar que rol, tiene permisos para ejecutar una acción y solamente ejecutarán esa acción aquellos usuarios que tengan el rol especificado.

Pasos a seguir

En este punto asumiremos que tenéis el entorno de desarrollo montado y una aplicación Yii Framework generada (puede ser mediante la herramienta yiic ). También que la aplicación está configurada para acceder a una base de datos MySql.

En esta definición de pasos, nos vamos a centrar solo en roles. Si leeis la  Guia RBAC de Yii Framework, veréis que Yii nos permite una granularidad más fina que simples roles. Nos permite definir tareas, con un conjunto de operaciones a realizar, para completar una tarea.

Nosotros, solo vamos a configurar tres roles: administrador, usuario normal, invitado.

Paso1: Configurar la aplicacion para activar RBAC sobre una base de datos

El primer paso será activar RBAC. Para ello modificamos el archivo main.php que se encuentra en el directorio protected/config del proyecto.

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
    ),

Esto nos permitira decir a Yii que utilice como manager de autorización la clase CDbAuthManager. Este manager es un autorizador que guarda la información de autorización en base de datos. En nuestro caso en la base de datos MySql de la aplicación.

Paso 2: Creación de las tablas RBAC

El siguiente paso es crear la tablas en la base de datos. Para ello ejecutamos el scrip schema.sql que se encuentra en el directorio web/auth del directorio donde tengamos el framework Yii. El scrip es el siguiente:

/**
 * Database schema required by CDbAuthManager.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 * @since 1.0
 */
 
drop table if exists AuthAssignment;
drop table if exists AuthItemChild;
drop table if exists AuthItem;
 
create table AuthItem
(
   name                 varchar(64) not null,
   type                 integer not null,
   description          text,
   bizrule              text,
   data                 text,
   primary key (name)
);
 
create table AuthItemChild
(
   parent               varchar(64) not null,
   child                varchar(64) not null,
   primary key (parent,child),
   foreign key (parent) references AuthItem (name) on delete cascade on update cascade,
   foreign key (child) references AuthItem (name) on delete cascade on update cascade
);
 
create table AuthAssignment
(
   itemname             varchar(64) not null,
   userid               varchar(64) not null,
   bizrule              text,
   data                 text,
   primary key (itemname,userid),
   foreign key (itemname) references AuthItem (name) on delete cascade on update cascade
);

Los nombres de las tablas RBAC, se pueden cambiar, teniendo en cuenta que también habrá que cambiar los nombres a la hora de crear el manager de autenticación. Para ello deberemos añadir tres parámetros más, indicando los nombres de las tres tablas así:

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
        'itemTable'=>'AuthItem', // Tabla que contiene los elementos de autorizacion
        'itemChildTable'=>'AuthItemChild', // Tabla que contiene los elementos padre-hijo
        'assignmentTable'=>'AuthAssignment', // Tabla que contiene la signacion usuario-autorizacion
    
),

No es objeto de este artículo, comentar el proceso de autorización del RBAC de Yii. Para saber más acerca del significado de las tablas podéis condultar la Guia RBAC de Yii Framework (en inglés).

Paso 3: Poblar las tablas con los roles que necesitemos.

Para ello definimos un método en el controlador que nos permita, dar de alta los roles a través del AuthManager. Usamos CAuthManager::createRole() para crear cada uno de los roles. Esta función nos permite especificar un script de código PHP que se ejecutará cuando el sistema compruebe el rol.

function actionCrearRoles()
{
$auth=Yii::app()->authManager;
  $bizRule='return !Yii::app()->user->isGuest;';
  $auth->createRole('authenticated', 'authenticated user', $bizRule);
 
  $bizRule='return Yii::app()->user->isGuest;';
  $auth->createRole('guest', 'guest user', $bizRule);
}

En el ejemplo hemos creado dos roles: el rol de usuario autenticado, y el rol de invitado.

Paso 4 : Comprobación de roles

Para comprobar los roles de usuario simplemente tenemos que llamar al método checkAccess en los lugares de la aplicación donde queramos comprobar permisos, de la siguiente manera:

if(Yii::app()->user->checkAccess('guest'))
{
    // codigo para el usuario invitado
}

viernes, 29 de julio de 2011

Yii Framework: Creacion de combo desplegable

Explico la creación de una combo desplegable para un formulario sencillo con Yii Framework.


El escenario


Necesitamos llenar un desplegable de un formuario de introducción ó actualización de datos con datos de un modelo. En este escenario consideramos que los datos del modelo a obtener son distintos del modelo para el que estamos obteniendo los datos. 
Pasos de la solución
 Ejemplo




<?php 
 $estadosArray = CHtml::listData(Estado::model()->findAll(),'id','estado');
 echo $form->DropDownList($model,'estado',$estadosArray);
?>


En el ejemplo usamos Estado::model() para acceder al modelo y llamamos a la función que obtiene los datos de la base de datos. En nuestro caso findAll(), y después hay que especificar el nombre del campo clave, y del campo del modelo que se va a mostrar en el desplegable. 

Una vez hecho esto, a la hora de construir el DropDownList, debemos especificar el modelo actual, y el campo del modelo al que se asocia el resultado de lo que haya elegido en el campo desplegable.

martes, 14 de junio de 2011

STSADM: ErrorFatal Guid deberia contener 32 digitos con 4 guiones

Estos dias ando dandole vueltas a un error que me ha ocurrido con el STSADM de SharePoint 2007, intentando exportar un sitio para posteriormmente importarlos en SharePoint 2010.

La segunda operación no se si saldrá correctamente, pero la operación de esportación del sitio da el error: FatalError: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Curiosamente este error lo da cuando está intentando exportar los campos del sitio.

Aun así la soución es bastante sencilla, aunque a mi parecer no la más adecuada, pero nos puede salvar para salir del paso.

Consiste en modificar el archivo fields.xml que se encuentra en el directorio que yo llamo "del infierno" en SharePoint "C:\Archivos de programa\Archivos Comunes\web server extensions\12\TEMPLATE\FEATURE\TSATypes\" (conviene tener un acceso directo en el escritorio a este directorio).

Antes de modificar nada de estos archivos de sistema, conviene recordar hacer una copia de seguridad del mismo.

Abrimos Fields.xml con nuestro editor favorito, y reemplazamos todas las apariciones de }" por " . Lo guardamos y volvemos a ejecutar el comando de exportación:

stsadm -o export -url <URL name> -filename <export file name>

Documentación completa: http://technet.microsoft.com/en-us/library/cc262759(office.12).aspx

Con esto tendremos solucionado el problema.

viernes, 27 de mayo de 2011

Errores al eliminar objetos programando en SharePoint 2010

La eliminación es la tarea de liberar los recursos que consumen los objetos. Esta tarea es esencial en el código no administrado, como C + +. Sin embargo, la mayoría de las veces cuando estás construyendo soluciones NET, no tienes que preocuparte de la recolección de basura. Un excelente recolector de basura integrado se hará cargo de eso por ti.

Eso no es así en todos los casos con SharePoint. Algunos objetos en SharePoint están fuera de la comodidad del código administrado de .NET. Es necesario eliminar estos objetos manualmente... bueno, al menos la mayoría de las veces... y bajo ciertas condiciones.

Los dos objetos de este tipo más comunes son SPWeb y SPSite. Desafortunadamente, estos son también objetos de uso común. De hecho detrás de muchos escenarios, puede haber más objetos SPWeb de lo que uno  cree.

La noticia todavía peor es que en algunos casos, cuando eliminar los objetos puede causar fallos en otras partes de SharePoint que son completamente ajenos a todo lo que está haciendo.

No obstante, no hay que preocuparse demasiado por ello. Por suerte, Microsoft ha publicado una buena guía de orientación acerca de este tema y una herramienta que hace más llevadera la pesadilla de eliminar objetos manualmente.

SPDisposeCheck es una herramienta que ayuda a los desarrolladores y administradores a comprobar que las soluciones SharePoint personalizadas, que usan el modelo de objetos de SharePoint, cumplen con las buenas prácticas en la tarea de recolección manual de basura.

Os dejo también un enlace a la guía, en inglés.
Guía: Best Practices: Using Disposable Windows SharePoint Services Objects

jueves, 26 de mayo de 2011

Error al cargar la plantilla TaxonomyPicker en SharePoint 2010.

Síntomas:En el visor de eventos aparece el siguiente error:

Error al cargar el archivo de plantilla de control /_controltemplates/TaxonomyPicker.ascx: No se puede cargar el tipo 'Microsoft.SharePoint.Portal.WebControls.TaxonomyPicker' del ensamblado'Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'.

Solución:
Ir a  C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\CONTROLTEMPLATES,


Abrir TaxonomyPicker.ascx con el notepad.

Localizar la ocurrencia $#44; y cambiarla por una coma. Guardar y salir.

lunes, 7 de marzo de 2011

Tutoriales de JQuery Mobile framework

Recientemente se ha liberado la versión 1.0 Alpha2 de JQuery Mobile. JQuery Mobile es la versión para móviles del popular framework JQuery para desarrollar la parte visual de sitios web en JavaScript.

Uno de los objetivos principales del proyecto es llegar a ser un framework multiplataforma y multibrowser, que sea capaz de proporcionar a los desarrolladores un entorno independiente del dispositivo móvil en el que se vaya a visualizar una aplicación web.

Actualmente JQuery Mobile ya proporciona soporte para los principales sistemas operativos móviles del mercado como IOS, Android, Windows Phone, Symbian o MeeGo.

Como detectar navegador móvil con WURFL en un sitio web

Introducción a WURFL

Cumplir con las normas no siempre es fácil, pero es muy importante que los navegadores muestren el contenido como su creador ha previsto y que los motores de búsqueda puedan interpretar las páginas de manera correcta.

El W3C inició la iniciativa Web Móvil en el año 2005. La iniciativa pretende, entre otras cosas, proporcionar un conjunto de buenas prácticas para asegurarse de que los desarrolladores web puedan crear sitios amigables para el entorno móvil.
 
Podéis leer las recomendaciones de la W3C y la guía “Switch On”, que serán de utilidad en caso de que quieras usar un dominio. mobi. El uso de un dominio. mobi es una manera fácil de asegurarse de que los visitantes sepan que el sitio web  está adaptado para dispositivos móviles. Por supuesto, no se necesita un dominio. mobi para desarrollar un sitio web móvil, pero su uso que hace que quede claro para cualquiera que lo visite, que se trata de un sitio móvil amigable.


Primeros pasos con WURFL y PHP

Lo primero que debemos hacer es estar preparado para detectar el navegador y el dispositivo (o computadora) que está de visita en nuestro sitio. Para ello existen dos bases de datos de dispositivos a las que podemos consultar.  Estas bases de datos sobre dispositivos, como DeviceAtlas o WURFL, registran información sobre los tipos de dispositivos móviles.

DeviceAtlas posee un API para acceder a la información en numerosos lenguajes de programación y es de pago si necesitamos actualización constante de los dispositivos.  No es necesario bajarse ningún archivo a nuestro sitio web, simplemente hacer uso de la API para acceder a los datos de los dispositivos. Para más información podéis visitar el sitio oficial de DeviceAtlas.

WURFL (Wireless Universal Resource File) es un archivo de configuración XML que contiene información sobre las capacidades y características de muchos dispositivos móviles. Gracias a WURFL podremos reconocer los navegadores y los dispositivos cuando accedan a nuestro sitio web y lo más importante: es open source.

En este artículo se cubre el uso de WURFL para realizar las comprobaciones con PHP.  Podremos saber la capacidad del dispositivo que visita el sitio, no solo de apoyar ciertas características y estándares tales como formatos de imagen, los márgenes, sino también el tamaño de la pantalla, los colores de la pantalla y así sucesivamente.

Como he comentado antes WURFL es un proyecto de código abierto y que no están obligados a pagar nada. Además, el proyecto proporciona bibliotecas para los lenguajes de programación más comunes, tales como Java, Python, Ruby, Perl. En este artículo vamos a ver cómo funciona con PHP.

Antes de empezar debemos descargarnos los archivos necesarios.
Sugiero una configuración básica para empezar; agregar  la ruta donde se almacena el wurfl.xml y desactivar la caché. Asegúrate de que el directorio que va a utilizar para los registros se puede escribir y que las secuencias de comandos tienen permisos de lectura sobre el fichero XML, por supuesto.

wurfl_config.php es el archivo que debe modificar y estos son los parámetros más importantes:

// Single define to be checked when starting the parser and/or the class
define("WURFL_CONFIG", true);
// Where all data is stored (wurfl.xml, cache file, logs, etc)
define("DATADIR", 'my/path/to/data/');
// Path and filename of wurfl_parser.php
define("WURFL_PARSER_FILE", '/my/path/to/wurfl_parser.php');
// Path and filename of wurfl_class.php
define("WURFL_CLASS_FILE", '/my/path/to/wurfl_class.php');
// Path and name of the wurfl
define ("WURFL_FILE", DATADIR."wurfl.xml");
// Path and name of the log file
define ("WURFL_LOG_FILE", DATADIR."wurfl.log");
define ("LOG_LEVEL", LOG_INFO);
// Set this true if you want to use cache.
define ("WURFL_USE_CACHE", false);
// Autoload set to false, I will load it when needed
define ("WURFL_AUTOLOAD", true);
// Configure a patch file
//define("WURFL_PATCH_FILE", DATADIR.'wurfl_patch.xml');
// Enable patch debug, NOT SUGGESTED for production environments
//define("WURFL_PATCH_DEBUG", false);

Creamos una página de inicio en el directorio principal del servidor. Podemos llamarla index.php

Nota: Vamos a usar el servidor Apache para este ejemplo. El directorio raíz de apache normalmente se llama httdocs y se encuentra en el directorio de instalación de apache. Nbo obstante puedes revisar el manual del servidor.

Pon las siguientes líneas en el archivo index.php:

<?php
require_once('/my/path/to/wurfl_config.php');
require_once(WURFL_CLASS_FILE);


$wurflObj = new wurfl_class();


$wurflObj->GetDeviceCapabilitiesFromAgent("MOT-c350");


echo "<pre>";
var_export($wurflObj->capabilities);
echo "</pre>";


?> 

Esto imprimirá toda la información acerca del dispositivo Motorola C350. No es necesario conocer todas las capacidades de WURFL, nos limitaremos a utilizar un número limitado de ellas en este artículo y voy a tratar de explicarlas cuando sea necesario. En caso de que necesites saber más, puedes visitar el sitio de WURFL, donde hay una sección acerca de todas las capacidades que se exponen en la base de datos.
Este ejemplo es útil para comprobar que todo está bien y que hemos configurado de manera correcta WURFL.

La base de dato WURFL normalmente todo tipo de dispositivos y terminales móviles. En nuestro caso, queremos ser capaces de distinguir un dispositivo móvil de un navegador de escritorio. Por esta razón también es conveniente descargar el "parche web", disponible en el sitio WURFL. El "parche web" es una extensión de WURFL que enumera todos móviles más comunes así como los navegadores web para estos dispositivos, y especifica las características que nos permitirá saber que no es un teléfono móvil.

Guardaremos  el archivo descargado, en el mismo directorio donde tenemos el wurfl.xml inicial y cambiaremos la configuración de la siguiente manera:

define ("WURFL_PATCH_FILE", DATADIR 'web_browsers_patch.xml.);

La próxima vez que se cargue el index.php , se cargará y la información que contiene 'web_browsers_patch.xml ‘.

Eso es suficiente para descargar y configurar WURFL.

Detectando el navegador

Cada navegador, cuando se solicita una página Web, envía su "user-agent" como una variable. En PHP podemos obtener el valor de esta variable, como una variable global, $ _SERVER ['HTTP_USER_AGENT'].

WURFL nos proporciona una característica que nos dirá si el navegador es de un equipo de escritorio o un dispositivo inalámbrico. Toda la gama de ordenadores de sobremesa y portátiles son considerados como equipos de escritorio, dado que ejecutan sistemas operativos de escritorio Windows ó OS X. Los dispositivos PDA son considerados como dispositivos inalámbricos, porque podemos llevarlos en el bolsillo y salir con ellos a la calle.

Ahora vamos a modificar el ejemplo anterior.

Vamos a necesitar un nuevo método de la wurflObj que devuelve el valor de la característica solicitada: getDeviceCapability. El método espera un nombre de la característica como parámetro y devuelve el valor de la característica. Fácil, ¿no?

<? php
require_once ('/ mi / ruta / a / wurfl_config.php');
require_once (WURFL_CLASS_FILE);


$ WurflObj = wurfl_class nuevo ();
$ WurflObj-> GetDeviceCapabilitiesFromAgent ($ _SERVER ["HTTP_USER_AGENT"]);


if ($ wurflObj-> getDeviceCapability ('is_wireless_device')) {
    header ("Location: http://desktop.example.mobi/");
Else {}
    header ("Location: http://mobile.example.mobi/");
}


?>

Como podéis ver hemos usado la variable global de PHP “HTTP_USER_AGENT” para obtener  el agente de usuario.

Para probar el ejemplo desde un equipo de sobremesa podemos usar un addon en Firefox llamado “User Agent Switcher” que nos permitirá emular una petición desde distintos dispositivos, como por ejemplo un móvi.

 Si cargas la página con tu navegador favorito te redirigirá a www.example.com. Utilice el agente de usuario que usamos en el ejemplo anterior para simular un dispositivo móvil. Echa un vistazo a la extensión de Firefox llamada "User Agent Switcher" que le permitirá editar manualmente el agente de usuario.

Esto le permitirá desarrollar un sitio dedicado, para equipos de con recursos multimedia, animaciones, soporte de banda ancha, y además proporcionar acceso a otra parte del sitio web, adaptado para dispositivos móviles.

En menos de 10 líneas de código, pero salvará tu vida en el próximo año!