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!

lunes, 13 de diciembre de 2010

Usando Bing Maps en SharePoint

Al igual que Google tiene su propio framework para mostrar información geográfica a través de mapas (Google Maps), Microsoft también tiene el suyo propio. Primero Microsoft lanzó Bing, buscador diseñado para competir con Google.

Y como no también se lanzo una plataforma para competir con Google Maps, llamada Virtual Earth que ahora se llama Bing Maps. Practicamente con las mismas caracterisitcas al de Googole, nos ofrece también vista 3D, vista de carreteras, posibilidad de hacer rutas, vistas aereas y mucho más. Con una ventaja importante: el rendimiento de la plataforma de microsoft es mucho mejor que la de google.

Una vez introducido, vamos a integrar in visor para Bing Maps en la plataforma Sharepoint 2007. Para ello vamos a hacer uso del webpart editor de contenido que nos permite insertar contenido web en cualquier parte de nuestro sitio SharePoint.



Una vez añadido el elemento web editor de contenido lo editamos en el panel de control ( mediante editar -> modificar elemento web compartido) y abrimos el editor del codigo fuente. Una vez abierto introducimos el siguiente código:

<script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=5"></script> <script type="text/javascript">
  var map = null;   function GetMap()
  {
    map = new VEMap('myMap');
    map.LoadMap(new VELatLong(41.633333, -4.716667), 10,'r' ,false);
    AddPin(41.633333, -4.716667, 'ValladolidMap', '<strong>Nombre:</strong> Valladolid (España).');

  }   function AddPin(lat, lon, iconurl, title, desc)
  {
    var shape = new VEShape(VEShapeType.Pushpin,new VELatLong(lat,lon));
    shape.SetTitle(title);
    shape.SetDescription(desc);
    map.AddShape(shape);
  }   function addLoadEvent(func)
  {
    if(typeof window.onload != 'function')
    {
      window.onload = func;
    }
    else
    {
      window.onload = function()
        {
          func();
        }
    }
  }   addLoadEvent(GetMap);
</script>
<div id='myMap' style="position:relative; width:640px; height:480px;"></div>

Esto lo que hará es mostrarnos un mapa, centrado en Valladolid y con un apuntador rojo, también centrado en la ciudad. Si queremos cambiar la ubicación lo único que tendremos que hacer en este script es lo siguiente:
  • Función VElatLong(latitud,longitud): cordenadas del sitio en donde queramos apuntar el mapa inicialmente. Deben estar en decimal. por ejemplo, para sacar la de valladodolid yo he usado la siguiente página, donde se puede consultar la geolocalización de muchos puntos del mundo.  
  • Función AddPin(latitud,longitud,nombre,descripcion): Permite añadir el pin rojo apuntador en el punto del mapa donde queramos.
Y con estas nociones básicas podremos integrar fácil y rápidamene nuestro mapa de siguaci´n en cualquer sitio SharePoint, con la ayuda del elemento web editor de contenido. Pero este código perfectamente nos puede valer para integrar Bing Maps en cualquer sitio web.