miércoles, 17 de septiembre de 2014

El archivo _viewstart en MVC Razor

Actualmente tenemos varias opciones para establecer layouts en nuestras páginas MVZ Razor. La forma más fácil es especificar en cada archivo de vista el layout que queremos utilizar de la siguiente manera:
@model Razor.Models.Product 
@{ 
ViewBag.Title = "Product Name"; 
Layout = "~/Views/_BasicLayout.cshtml"; 
} 
Product Name: @Model.Name 

En este caso establecemos la propiedad Layout de la vista para establecer la ruta al archivo de plantilla. Usar layouts tiene muchos beneficios. Nos permite simplificar las vistas, creando código HTML común y aplicarlo a múltiples vistas. De esta manera el mantenimiento de nuestras páginas será más sencillo.

Sin embargo con el planteamiento anterior tenemos un pequeño inconveniente y es que si cambiamos el nombre del archivo de layout, deberemos también cambiar el nombre en todas las vistas donde se utilice. Establecer esto en las aplicaciones puede ser algo redundante, lo que va en contra del principio DRY (Don't Repeat Yourself).

Para resolver este problema Razor pone a nuestra disposición el archivo _viewstart. Podemos añadir un archivo llamado _ViewStart.cshtml (o _ViewStart.vbhtml para VB ) en el directorio View de nuestro proyecto. Cuando se renderiza una vista, MVC buscará este archivo de manera automática y el contenido de este archivo será tratado como si estuviera incluido en la vista. De esta manera podremos omitir de nuestro código anterior la línea que establece la propiedad Layout y MVC usará el archivo _viewstart que hemos creado, para establecer el layout de nuestra vista.


@model Razor.Models.Product 
@{ 
ViewBag.Title = "Product Name"; 
} 
Product Name: @Model.Name 

Dos cosas a tener en cuenta a la hora de usar el archivo _viewstart:
  1. El contenido de este archivo, se usará en todas las vistas de la aplicación, que no tengan establecida la propiedad Layout. Si queremos que en una de las vistas se use otro layout distinto al del archivo _viewstart, deberemos establecerlo explicitamente. La propiedad layout de la vista tiene precedencia respecto al archivo _viewstart.
  2. Hay una diferencia entre omitir la propiedad layout y establecerla a null. Si la vista es autocontenida y no queremos usar un layout, entonces estableceremos la propiedad layout a nulo, lo que provocará que no se use el archivo _viewstart. Si omitimos este valor entonces MVC usará el archivo _viewstart.

jueves, 3 de octubre de 2013

Añadir columnas de datos externos a definicion de lista Sharepoint 2010

Para los que hayan tenido contacto con SharePoint 2007, había un tipo de columna de lista de datos profesionales.

Ahora, en SharePoint 2010, esta columna está disponible para todas las listas de SharePoint (excepto las listas externas), se llama columna de datos externos y permite a los usuarios mostrar datos de cualquer tipo de contenido externo existente en el modelo del BCS, en una lista de SharePoint estándar.

En este artículo vamos a ver como incluir este tipo de columna de datos externos, en el esquema de una lista que tengamos en Visual Studio 2010.

¿Que conseguimos con esto?. Provisionar la columna de manera fácil y cómoda, sin tener que recurrir a un EventReciver para incluir la columna en la lista programándolo.

Escenario

Tenemos una lista SharePoint, llamada 'Sitios' donde queremos incluir una columna, llamada Country (Pais) cuyos valores vienen de una tabla externa donde tenemos definidos los paises. Asumimos que ya hemos definido el modelo BCS y lo hemos cargado en la administración central de SharePoint junto con todos los permisos necesarios.

Vamos a hacer el proceso para modificar el esquema de la lista desde VisualStudio 2010 e incluir el campo. El proceso es muy sencillo, pero la documentación para realizar esto es bastante escasa.

Solución

Abrimos el esquema de definición de la lista (Schema.xml) y nos vamos al apartado Fields para definir un nuevo campo de lists. Bueno en realidad vamos a definir dos campos: BCS requiere que haya un campo oculto con el identificador BCS del elemento seleccionado.

Por tanto definiremos:

<field baserenderingtype="Text" bdcfield="COUNTRY_DESC" colname="nvarchar1" 
description="Country" displayname="Country" entityname="COUNTRIES" entitynamespace="SAMPLES.BCS" hasactions="False" 
id="{9bc89f68-123d-3786-9283-c629a5a4383a}" name="Country" profile="" relatedfield="COUNTRIES_ID" relatedfieldbdcfield="" relatedfieldwssstaticname="COUNTRIES_ID" required="FALSE" rowordinal="1" secondaryfieldbdcnames="0" secondaryfieldswssstaticnames="0" secondaryfieldwssnames="0" sourceid="{549eb03c-9767-42e5-8360-8dddf6c34bd6}" staticname="Country" systeminstance="SAMPLES_DB" type="BusinessData">
</field>

Y también el campo que guardará el identificador:

<field bdcfield="COUNTRIES_ID" colname="ntext2" description="Country id for BCS Country field" displayname="COUNTRIES_ID" hidden="TRUE" id="{3ed8b785-737c-462a-9c17-7bdff65b9767}" name="COUNTRIES_ID" readonly="TRUE" rowordinal="0" sourceid="{549eb03c-9767-42e5-8360-8dddf6c34bd6}" staticname="COUNTRIES_ID" type="Note">
</field>

Notad que el campo que guarda el identificador, debe ser de tipo Note, es un campo oculto (Hidden=true) y de solo lectura (ReadOlny = true). De esta manera el usuario no lo ve en los formularios y no se puede modificar.

Como se puede ver en la definición del campo Country los atributos RelatedField y RelatedFieldWssStaticName son los que apuntan al campo que guarda el identificador. Esto es necesario para decirle a BCS donde debe ir a buscar el identificador del elemento que se ha seleccionado y donde va a guardar el identificador, cuando se seleccione.

Las propiedades más importantes son las siguientes:

  •  SystemInstance="SAMPLES_DB": Establece el LOB System del BCS donde está la entidad que queremos enlazar. 
  • EntityNamespace="SAMPLES.BCS": Es el espacio de nombres del modelo donde esta la entidad. 
  • EntityName="COUNTRIES": Es la entidad del modelo BCS que queremos cargar. En nuestro caso los paises (Countries). 
  • BdcField="COUNTRY_DESC": Es la columna de la tabla que vamos a mostrar. En nuestro caso la descripción.

Espero que esto os ayude un poco más en vuestras andaduras con el BCS de SharePoitn 2010.

miércoles, 1 de agosto de 2012

Backup en linea de comandos de una base de datos SQL Server

Una de las tareas que deberíamos hacer, ya no como desarrolladores si no como administradores son los backups de nuestras bases de datos. Da igual que sea SQL Server, Oracle o cualquer otro sistema. El hacerlas nos evitará muchos quebraderos de cabeza. Voy a enseñar un forma fácil de hacer los backups mediante linea de comandos de una base de datos SQL Server.

Y alguno de vosotros pensará: ¿Porque hacerlo mediante la linea de comandos si puedo hacer con el SQL Server Managment Studio?. Sencillo: podemos programar una tarea periodica que haga las copias de seguridad por nosotros. Para hacer esto lo mejor es programar un script que haga el backup en linea de comandos y que la tarea progrmada llame al script. Es lo que vamos a ver en este artículo.

Primero vamos a preparar el script que nos permita hacer el backup de la base de datos SQL Server mediante la linea de comandos. Podemos empezar creando un directorio ( por ejemplo C:\backupbd ). En este directorio almacenaremos el script y las copias de seguridad de nuestra base de datos. Lo ideal es que este directorio esté en un sitio de red, o en algún sitio fuera del equipo que tiene la base de datos. Si se "incencia" el equipo no perderemos las copias de seguridad je je je.

Para hacer una copia de seguridad usaremos el comando de T-Sql BACKUP DATABASE. Tiene bastrantes parámetros (poodéis verlos con detalle en la documentación de msdn) pero para este ejemplo lo usaremos de esta manera:

  BACKUP DATABASE [NOMBRE] TO DISC = N'RUTA' WITH COMPRESSION, NOFORMAT, INIT, NAME=N'DESCRIPCION' , SKIP, NOREWIND, NOUNLOAD,  STATS = 10
Un par de explicaciones:
  • <Nombre>: Es el nombre de la base de datos de la que queremos hacer el backup. Debe ir entre corchetes. 
  • N'RUTA': Escribiremos la ruta completa del archivo de copia de seguridad. En nuestro caso será por ejemplo: N'C:\backupdb\copia.bk'. Una aclaración: deberñemoos poner N' delante para especificar la ruta. 
  • COMPRESSION: Nos permite realizar una compresión de la copia de seguridad.
  • NAME=: Es una cadena con una descripción para la copia. 

La opción COMPRESSION es una caracteristica que solo está disponible a partir de SQL Server 2008 y solamente para las versiones Empresarial y Developer. En SQL Server Express, Workgoup y Standar, no podremos usar la caracteristica de compresión de las copias de seguridad.

Hasta aqui la parte teórica para entender como funciona BACKUP DATABASE, por si alguno no lo sabía. Prácticamente podemos generar la sentencia desde SQL Server Managment Studio mediante la opción "Generar Script" que se encuentra en la parte superior de la pantalla de copia de seguridad del Managment Studio.


Ejecución del script

Una vez generado el script, lo guardamos en el directorio de copia con el nombre 'script.sql' (o como queramos, la cosa es acordarse después del nombre del archivo).

Después simplemente cogemos nuestro editor de texto preferido, creamos un archivo .bat (si os acordáis, los archivos de secuencia de comandos del MSDOS ) con la siguiente sentencia de linea de comandos:

SQLCMD -S SERVIDOR-SQL -i C:\backupdb\script.sql

Guardamos el archivo bat en el mismo directorio que el script con el nombre "backup.bat". Ejecutando este archivo, podermos realizar la copia de seguridad.

Backup periódica de la base de datos

 Esta parte ya es opcional, pero una aplicación interesante de lo que hemos hecho en este artículo es poder automatizar la copia de la base de datos periódicamente. Esto lo podemos conseguir haciendo una tarea programada en windows. Voy a explicar el proceso, que es muy sencillo, para Windows 2008 Server. En Windows 7 se hace de la misma manera.

Primero vamos al programador de tareas y creamos una tarea básica. Nos aparecerá un asistente donde nos pedirá el nombre y la descripción de la tarea así como la frecuencia de ejecución. Cuando nos pregunte por la acción a realizar debemos decirle que queremos iniciar un programa.

Seleccionando esta opción nos pedirá la ruta del programa a ejecutar. Aqui seleccionaremos el archivo .bat que hemos creado en el apartado anterior.

También podemos hacer este proceso sin usar un archivo .bat. Simplemente programando la tarea para que ejecute el comando SQLCMD del apartado anterior, que hace la copia de seguridad. Esto se hace especificando el comando anterior en el campo del programa a iniciar.

Espero que este artículo os sirva de ayuda. Ahora no tenéis excusa para hacer copia de seguridad de vuestras bases de datos.

martes, 24 de julio de 2012

Visual Studio 2012 RC y Windows 8

Después de un tiempo apartado de los entornos Microsoft, he vuelto a interesarme por las nuevas herramientas de desarrollo de la compañía de Bill Gates, en parte por un nuevo proyecto en la empresa y me he encontrado con gratas sorpresas que esta preparando Microsoft, como Windows 8, Visual Studio 2012 RC, .Net Framework 4.0 y SharePoint 2013. Sin lugar a dudas una gran oportunidad para ponernos todos al día en lo que a plataforma Microsoft se refiere. Y ese es mi objetivo, y con ello daros a conocer toda la información a través de este blog.

Por el momento ya podemos descargarnos Windows 8 Release Preview para ver que está preparando Microsoft en el futuro inmediato. Una de las cosas más interesante que nos proporciona Windows 8 es el desarrollo de aplicaciones estilo Metro, de lo que hablaré próximamente en el blog. Estas aplicaciones, mejorarán la experiencia de usuario sobre todo para las aplicaciones orientadas a contenido, aprovechando la nuevas características táciles de Windows 8, controles integrados y animaciones.

Aún no he investigado todas las posibilidades del desarrollo de las aplicaciones estilo Metro, cosa que me gustaría, pero a priori suena bien. Sobre todo creo que aportará un nuevo marco de trabajo para el aspecto visual de las futuras aplicaciones y unos principios de estilo para el diseño de aplicaciones similares a lo que fue el paso de la linea de comandos a las ventanas de Windows. Ahora Microsoft da el siguiente paso, integrando contenido digital de la web, en el sistema operativo.

Visual Studio 2012Siguiendo con el hilo del desarrollo podemos descargarnos también Visual Studio 2012 RC (release candidate). Aunque no es más que una RC, nos servirá para comenzar a desarrollar y a familiarizarnos con todas la novedades que vendrán con el nuevo Visual Studio. En un principio tendremos las mismas ediciones que en VS2010: Ultimate, Premium, Professional, Express. A parte del Team Foundatio Server y Test Professional para pruebas de software.

Destacable la integración de LightSwitch en Visual Studio 2012, pero no creo que haya muchas diferencias con respecto a VS2010, a parte de avanzar en temas de desarrollo sobre Windows Phone y Azure. No obstante me falta probarlo y ya os contaré.

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.