Modelo CakePhp

Siguiendo con el tema de CakePhp, ahora toca la introducción al tema de modelos,

El Modelo en el paradigma MVC, es el primer concepto con el que nos toparemos, y básicamente proveé un acceso a los datos de nuestra aplicación o sitio, estén estos en una base de datos mysql, sql server, oracle, xml, directorio ldap o cualquier otro al que php pueda conectarse. Todo lo referente a la manipulación de datos (obtención, modificación, eliminación, etc).

La primera parte será definir una conexión a nuestro origen de datos, en mi caso utilizaré mysql. todo lo que tiene que hacer es guardar el archivo database.php.default con el nombre de database.php y editarlo.

Encontrará al final del archivo la clase DATABASE_CONFIG con 2 variables: $default y $test, la primera como su nombre lo indica será la conexión predeterminada en caso no se especifique, y la segunda la que se utilizará en las pruebas unitarias (unit test) en caso las utilice. En mi caso estoy utilizando mysql y quedó así mi variable $default

var $default = array(
‘driver’ => ‘mysql’,
‘persistent’ => false,
‘host’ => ‘192.168.1.1′,
‘login’ => ‘usuarioDB’,
‘password’ => ‘miPassword’,
‘database’ => ‘MiBD_Ejemplo’,
‘prefix’ => ”,
);

Guarda su archivo y está listo para continuar. (con la utilidad bake de cake también podrá configurar este archivo, pero se verá más adelante).

Los modelos deben ser creados con la palabre clave de php “class” y deben heredar de la clase “AppModel”, que es una clase que cakephp nos brinda en el directorio cake/libs/model.php

Los modelos deben ser almacenados en la carpeta “Models” de nuestra aplicación, aunque hay 2 cosas a tener en cuenta. El nombre de la tabla debe ser escrita en plural, y El nombre nuestra clase debe ser en singular y almacenada en un archivo con el mismo nombre.

Por ejemplo, el controlador para la tabla “Actividades” debe almacenarse en el archivo models/actividad.php y el contenido del archivo sería el siguiente:

class Actividad extends AppModel {
var $name = ‘Actividad’;
}

Si intentara usar este modelo en CakePhp obtendría un error, ya que éste espera que los nombres de las tablas estén en inglés, pero no se preocupe, la gente de CakePhp sabía que el inglés no es el único idioma así que proveen un mecanimos para que cakephp sepa buscar la clase en base al nombre de la tabla cuando esta está en español.

Edite el archivo Config/inflections.php de la carpeta de su aplicación y agregue las siguientes líneas justo antes de ?> :

$pluralRules = array(
‘/([aieou])$/i’ => ‘\1s’, # dependencia
‘/(d|r|n)$/i’ => ‘\1es’, # unidad(es)
);
$singularRules = array(
‘/(d|r|n)es$/i’ => ‘\1′,
‘/([aeiou])s$/i’ => ‘\1′, # dependencia
);

Y ya tiene un modelo creado, aunque este en particular no valida datos, podría escribir sus reglas de validación para esta tabla, pero eso escapa de este post, pero puede leerlo en la documentación de de cakePhp.

Ahora la forma más sencilla de crear un modelo y sus validaciones respetando además el nombre y locación del archivo es usando la shell de cakephp, así que vaya a inicio /ejecutar y escriba cmd y presione enter.
muevase a la carpeta en que almacena su aplicación (en mi ejemplo c:\cakephp\miProyecto)

cd C:\cakephp\miProyecto
cake bake

cakephp_modelo1

Si no configuró su base de datos, puede seguir el asistente que le permitirá hacerlo en su proyecto cómo se muestra en la siguiente imagen

cakephp_modelo2

Una vez configurada la base de datos con el asistente debemos volver a ejecutar “Cake Bake” y nos mostrará el siguiente menú, desde el que selecionaremos la opción M (Modelo)
donde nos desplegará una opción por cada tabla que exista en nuestra base de datos, escribiremos el número asignado a nuestra tabla “actividades” que en mi caso ha sido “1″, luego nos preguntará si queremos crear las validaciones de nuestros campos, escribimos “y” y nos preguntará por cada campo qué tipo de validación queremos.
cakephp_modelo3

Entre las validaciones existentes podemos escojer que ingresen un número(numeric), que no dejen el campo vacío(notEmpty), que el valor esté entre un rango de dos valores (Between) y también crear nuestras propias validaciones.

Una vez que terminemos con las validaciones, nos preguntará si queremos agregar las relaciones de nuestras tablas, esto es para que genere el código necesario para poder integrar las búsquedas de los datos en las tablas relacionadas, por ejemplo obtener el detalle de la factura (obtener los registros hijos de la tabla).

En mi caso ha creado el siguiente modelo:

class Actividad extends AppModel {
var $name = ‘Actividad’;
var $validate = array(
‘nombre_actividad’ => array(’notempty’),
‘minimo_llamada’ => array(’numeric’),
‘maximo_llamada’ => array(’numeric’),
‘num_clientes’ => array(’numeric’)
);
}

Ahora el siguiente paso será crear un Controlador.

Iniciando con CakePhp

CakePHP es un framework escrito en php que implementa un modelo vista controlador (MVC), su uso es sumamente sencillo y nos ayuda a desarrollar código y aplicaciones más rápido.

Puede bajar la última versión estable de CakePhp o bien obtener la versión más actualizada (en desarrollo) vía SVN (si no conoce o nunca ha utilizado SubVersion (SVN) puede leer estos 2 tutoriales: Instalación y Configuración de SVN).
Antes de iniciar el tutorial, asegúrese de tener corriendo un servidor web(IIS, apache, etc) y tener correctamente configurado PHP.

En mi caso utilizaré la versión de desarrollo de CakePHP que obtuve vía SVN (versión 1.2.3.8166). No importa cómo lo obtiene, todo lo que necesita es extraer CakePhp a un directorio en su computadora, digamos a c:\CakePHP y ver que su estructúra de directorios sea similar a lo siguiente:

Estructura de directorios de CakePhp

Rápidamente veremos que hay en cada carpeta

App -> donde nosotros haremos que nuestra magia suceda, acá guardaremos nuestras funciones, códigos, páginas, controladores, etc.

Cake-> acá está el núcleo de CakePhp, al estar separado del código de nuestra o nuestras apps, podemos compartir una sola instalación de cakephp con varias aplicaciones (sitios web)

Vendors -> Si tenemos algún componente de terceros que vayamos a utilizar (foros php, componentes para php, etc) lo debemos guardar acá.

La carpeta Cake y Vendors no la tocaremos en este tutorial, así que vamos a examinar la carpeta App, esta es la carpeta de la aplicación default, si necesitamos una aplicación más (otro sitio web o una sub aplicación en un sitio web existente) lo único que debemos hacer es copiar el contenido de APP a una nueva carpeta dentro de c:\cakephp.

Yo no recomiendo utilizar la carpeta App para nuestro primer desarrollo, siempre prefiero que la carpeta tenga el nombre de mi proyecto. Así que empezaremos a configurar nuestro entorno para crear nuestra estructura y aplicación.

Estoy utilizando Xampp en windows, así que luego de instalarlo ya tengo Apache+php+mysql en mi pc instalado y configurado. Lo único que me resta hacer es agregar a la ruta de búsqueda (path en inglés)  la carpeta donde tengo Php y CakePhp:

Damos clic derecho sobre mi pc y luego seleccionamos Propiedades luego seleccionamos la página de Opciones Avanzadas (si está en windows vista o windows 7 debe seleccionar primero la opción que dice “configuración avanzada del sistema”) y finalmente vamos al botón que dice “Variables del Entorno”:

propiedades_sistema_path
Una vez en la ventana que aparecerá deberemos buscar en la lista inferior la variable que dice “path”, seleccionamos el botón de “editar”, nos movemos al final del valor y agregamos un ; y escribimos la ruta donde tenemos instalado PHP  con un ; al final. luego agregamos la ruta donde está CakePhp  y le agregamos la ruta cake\console para que se vea como lo siguiente:

modificar_path_php

Una vez que tengamos esto hecho haremos la prueba, desde menú inicio/ejecutar y escribimos “cmd” y aceptar, en la ventana de comandos que aparecerá escribiremos “php -v” sin las comillas y presionamos enter, la pantalla debería lucir más o menos así:

php_v
si aparece un mensaje de error con el texto

“php” no se reconoce como un comando interno o externo,programa o archivo por lotes ejecutable.

significa que no hemos establecido la ruta correctamente.

Si todo ha ido bien, escribiremos “cake” y presionamos enter, la salida debe ser algo similar a la ventana siguiente:
cake_exec

Si todo está bien configurado veremos esa pantalla. lo que significa que estamos listos para crear nuestro primero proyecto: nos moveremos al directorio que creamos inicialmente con

CD c:\cakePhp

y ejecutaremos

cake bake project c:\cakephp\miProyecto

donde “miProyecto” es el nombre del proyecto a crear, usen el nombre que gusten.

Revisen los valores que cake bake les presentará y si están de acuerdo escriban “y” y presionen enter, si les preguntan si desean “verbose output” pueden escribir “n” y presionar enter (simplemente muestra los archivos que va creando).

el resultado debe ser similar a esto:

creando_proyecto_bake

Vamos a ver nuestro directorio con el explorador de windows, abriremos C:\cakePhp\miProyecto
nueva_app_cake

El siguiente paso es configurar nuestro servidor web para que apunte a nuestro directorio
Cómo estoy usando apache he creado esta sección en el archivo C:\xampp\apache\conf\extra\httpd-vhosts.conf:

<VirtualHost *:80>
ServerName miServidor
DocumentRoot c:/cakephp/miProyecto/webroot
<Directory />
Options FollowSymLinks AllowOverride All
</Directory>
<Directory c:/cakephp/miProyecto/webroot>
Options Indexes FollowSymLinks
AllowOverride All Order allow,deny
Allow from all
</Directory>
</VirtualHost>

También necesité editar el archivo c:\windows\System32\drivers\etc\hosts agregando al final la siguiente línea

127.0.0.1 miServidor

Esto nos permitirá probar nuestra aplicación en la dirección http://miServidor/ si usa IIS quizá no necesite editar este archivo si usa un directorio virtual.

Ahora desde el navegador web abriremos http://miServidor y veremos una página similar a esta:
primer_proyecto_cakephp_inical

Para modificar el contenido de la página inicial basta con modificar el archivo en
C:\CakePhp\miProyecto\views\pages\home.ctp

Para modificar la apariencia y aplicar nuestro propio diseño al sitio, basta con modificar el archivo
C:\CakePhp\miProyecto\views\layouts\default.ctp

Bueno, en la siguiente artículo abordaremos el tema de la creación de Modelos, controladores y vistas.

Hasta la próxima.

Qué es Asp.Net MVC

Asp.Net MVC es una plataforma liberada por Microsoft que permite desarrollar sitios web utilizando un patrón Modelo-Vista-Controlador (MVC), lo que significa un mejor control en el código html de nuestras páginas, integración AJAX, Urls autodescriptivas (SEO urls), además nos permite tener una separación real de de nuestras capas para una más fácil de mantener y extenderlas y además nos permite agregar unidades de pruebas (unit tests) a nuestro proyecto.

MVC separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se ve frecuentemente en aplicaciones web, donde la vista es la página HTML y el código que provee de datos dinámicos a la página. El modelo es el Sistema de Gestión de Base de Datos y la Lógica de negocio, y el controlador es el responsable de recibir los eventos de entrada desde la vista.

La ventaja principal que obtendremos al desarrollar bajo MVC es no utilizar Forms de Asp.Net y nuestro código html resultante será más liviano, también nos permitiría por ejemplo cambiar de motor de datos sin afectar a nuestra capa de presentación.

No crea que MVC es solo para asp.net, este está implementado en muchos frameworks de varios lenguajes como Ruby,Php o Perl. El framework más famoso para Ruby es Ruby on Rails, de php existen muchísimos como CakePhp o Zend Framework, uno bastante sencillo de implementar para Perl es Catalyst.

Una vez conoce y se familiariza con MVC programar en cualquier lenguaje siguiendo este esquema es sumamente fácil, Olvídese de tener que aprender con cada lenguaje una forma distinta de separar sus capas.

Puede obtener Asp.Net MVC desde el sitio de Microsoft.

MVC no es exclusivo de Asp.Net
Algunos links de interés sobre MVC
http://msdn.microsoft.com/es-es/magazine/cc337884.aspx
http://www.asp.net/mvc/whatisaspmvc/

Mostrando datos fácilmente con SubSonic

Una de las ventajas de usar SubSonic es el poder mostrar datos de una manera fácil con él.

Si necesitamos mostrar varios registros de una tabla, solo basta con agregar a nuestro toolbox de controles a subsonic.dll y utilizaremos el control “QuickTable”

<subsonic:QuickTable ID="QuickTable1" runat="server" ColumnList="Campo1,Campo2" TableName="Tabla" />

Este es la forma más básica de usar este control, y nos mostrará los datos de nuestra tabla:

Demo QuickTable sencilla

Demo QuickTable sencilla

La tabla nos permite ordenar por el campo que querramos, sin que tengamos que agregar nada. En el caso que los encabezados de nuestros campos necesiten personalizar, podremos cambiarlos de la siguiente manera Campo:Título

<subsonic:QuickTable ID="QuickTable1" runat="server" ColumnList="Campo1:Título,Campo2;Nuevo Título" TableName="Tabla" />
Títulos personalizados en QuickTable

Si son demasiados datos podríamos paginarlos también agregando el atributo PageSize=”##” donde ## es el número de registros que queremos mostrar a la vez:

<subsonic:QuickTable ID="QuickTable2" runat="server" ColumnList="Nombre:Título,Apellidos:Nuevo Título" TableName="Socios"  PageSize="12"/>

Paginando con QuickTable y Subsonic

Podríamos agregar un link a algún campo para editar un registro, pero entonces se necesita agregar el campo llave a la lista de campos que se seleccionan con “ColumnList”

<subsonic:QuickTable ID="QuickTable2" runat="server" ColumnList="ID_PK:Llave,Nombre:Título,Apellidos:Nuevo Título" TableName="Socios"  PageSize="12" LinkToPage="Pagina.aspx" LinkOnColumn="Nombre" />

Link en QuickTable

Y eso es todo, en el siguiente post trataré de mostrar como usar un combo para seleccionar un registro de una tabla sin lidiar con el databind y demás.

SubSonic y C# (2)

Si no ha leído la primera parte, puede hacerlo ahora SubSonic y C# (1)

Algunos ejemplos prácticos de uso de SubSonic son

Obtener un listado ordenado de alguna tabla para usar con RadioButtons, ComboBox,ListBoxes:

MyComboBox.DataSource= Category.GetListItems();

Donde Category es el nombre de la clase generada a partir de mi tabla “Category”.

Ejecutar Querys y pasarle parámetros:

SqlQuery qry = new SqlQuery().From<Product>().Where( "categoryname" ).
          IsEqualTo( "miParámetro de búsqueda" );

SubSonic.SqlQuery provee de un método Where() que como primer parámetro nos permite indicar la columna por la cual queremos filtrar,algunos ejemplos:

  • Nos permite indicar que la columna debe tener el valor indicado.
    .Where("columna").IsEqualTo("valor")
  • Nos permite indicar que la columna no tenga el valor indicado
    .Where("columna").IsNotEqualTo("valor")
  • Nos permite construir una sentencia Like, el valor que pasemos al método Like puede incluír “%”
    .Where("columna").Like("valor")
  • Filtra todos los registros donde “columna” sea null.
    .Where("columna").isNull()
  • Filtra todos los registros donde “columna” no sea null.
    .Where("columna").isNotNull()
  • Filtra todos los registros donde “columna” sea mayor a “valor”.
    .Where("columna").IsGreaterThan(valor)
  • Filtra todos los registros en que “Columna” esté en el rango indicado de valores.
    .Where("columna").InValues(valor1,valor2,n…)
  • Nos permite hacer un subSelect dentro del actual, pasando como parámetro otro SqlQuery.
    .Where("columna").In(SqlQuery)
  • Para anidar instrucciones, usamos el Método And()
    .Where("columna").IsGreaterThan(valor)
    .And("columna2").IsNotNull();

Todo esta información y muchísima más la puede encontrar en la documentación de SubSonic

Descargar Proyecto demo SubSonic2

Hasta la próxima entrega

Subsonic y C# (1)

Bueno, este es el primer post de ejemplo para iniciar con SubSonic.

SubSonic es un componente o utilería que nos permite abstraernos del código necesario para conectarnos a una base de datos (Sql Server, Oracle, MySql, Etc) y también del código necesario para grabar/eliminar/actualizar un registro (hacer un ABM con SubSonic es facilísimo). Aunque no es tan potente como nHibernate, nos ayuda mucho en el desarrollo de nuestras aplicaciones/sitios web que necesitan conectar a una base de datos.

Primero necesitaremos bajar SubSonic, Una vez que lo tengamos instalado, podemos utilizar SubStage para generar la configuración para nuestra aplicación.

Pantalla principal de SubStage

Pantalla principal de SubStage

  • Crear Nuevo Proyecto
  1. Lo primero será dar clic en el primer botón para crear un nuevo proyecto (clic en la imagen para agrandar).
  2. cambiaremos el nombre por el de nuestro proyecto en Project Name.
  • Crear Nueva cadena de conexión
  1. Clic en el tercer botón para agregar una nueva cadena de conexión.
  2. En la propiedad ConnectionString debemos escribir la cadena de conexión a nuestra base de datos.Para efectos de prueba puede utilizar la cadena de conexión siguiente, si tiene Sql Server y las bases de datos de prueba instaladas.

    Data Source=(local); Database=Northwind; Integrated Security=true;

  3. En la propiedad Name debemos escribir un nombre descriptivo para esta conexión, o bien el nombre de la base de datos que usará, sobre todo si tendremos más de una conexión en la configuración de nuestro sitio web/aplicación .net.
  • Crear el Proveedor
  1. Seleccionamos el nombre de nuestro proyecto en la lista a la izquierda y damos Clic en el segundo botón para crear un nuevo Provider.
  2. Lo primero a hacer es modificar la propiedad Name nuevamente por un nombre descriptivo, o algo como “MiProyectoProviderPrincipal”, de tal manera que si necesitamos de más de un proveedor, pues podamos distinguirlos fácilmente.
  3. Estableceremos la propiedad ConnectionStringID al nombre de la conexión que creamos en el segundo punto.
  4. GeneratedNameSpace es de suma importancia seleccionar con cuidado el nombre del NameSpace bajo el que queremos que Subsonic nos genere el código para nuestras clases.Yo Acostumbro a Usar NombreDelCliente.Data.DS para poder reutilizar en distintos proyectos del mismo cliente mis librerías de acceso a datos, además puedo agregar más clases al NameSpace Data relacionadas con la base de datos, y finalmente DS que significa Data Source, únicamente las librerias de acceso a datos, por si necesito generar una librería con únicamente estos.
  5. Estableceremos la propiedad ProviderTypeID al tipo de motor de bases de datos que vayamos a utilizar, entre las opciones disponemos de
    • Sql Server
    • MySql (ISAM)
    • MySql (InnoDB)
    • Oracle
    • Enterprise Library
    • SqlLite
    • SqlCE

    Existe también un Proveedor de datos para Access.

  6. Con las opciones por default podríamos trabajar bien, pero algunas propiedades que les pueden interesar son:
    1. excludeTableList Permite indicar por medio de una mascara, lista o ambas las tablas que no queremos generar clases, ej: Lista*, p*, procesos,reportes,generados.
    2. generateRelatedTablesAsProperties Interesante opción que hace que podamos acceder desde una instancia de alguna clase a los registros hijos de otra tabla por medio de una propiedad.
    3. removeUnderscores Nos quita los “_” de los nombres de nuestras tablas al generar las clases, T_Ejemplo se generaría como TEjemplo.
  7. Una vez completado esto, tenemos que modificar la propiedad CodeGenerationPath en SubStage Configuration a la ruta donde queremos que nos genere el código.Luego, Utilizaremos el botón para generar el código.SubStage nos generará un archivo .cs por cada tabla/procedimiento almacenado en nuestra base de datos.En el apartado de EventLog de SubStage, podremos ver los posibles errores y sucesos al generar el código. Luego deberemos copiar de Configuration OutPut la configuracion a nuestro web.config o App.config.

    El Apartado Event Log nos mostrará el resultado de generar nuestras clases, Configuration Output la configuración utilizada y  Generated Files contiene nuestros archivos generados,

Opciones de Generación de SubStage

Una vez agregado a su proyecto la configuración de SubSonic, y agregada la referencia a SubSonic.dll en su proyecto (Esto se verá más a fondo en la segunda parte de este artículo), un ejemplo de código es este: (Yo utilice la cadena de conexión a la base de datos de ejemplo “Northwind“, usted debe actualizar el nombre del NameSpace seleccionado y el nombre de sus tablas.

using SoloQuiero.Data.DS;

namespace SubSonic1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
CategoryCollection lista = new CategoryController()
.FetchAll();

string resultado = "";
foreach (Category categoria in lista) {
resultado += "\r\n" +categoria.CategoryName;
}
listado.Text = "Existen "+resultado+" Categorías" ;
listado.Text += resultado;
}

private void button2_Click(object sender, EventArgs e) {
int pk = 3;
Category categoria = new Category(pk);
listado.Text = "Tabla: " + categoria.TableName;
listado.Text += "\r\nCategoryName" + categoria.CategoryName;
listado.Text += "\r\nPrimary Key" + categoria.CategoryID;
listado.Text += "\r\nPrimary Key" + categoria.Description;
}
}
}

Notas Finales

SubSonic es gratuito y nos permite abstraernos del acceso a datos, evitándonos el tener que conectar a la base de datos, crear los parámetros para cada consulta, etc. Para ello, SubSonic nos provee de métodos para realizar ciertas acciones, por ejemplo:

Category miCategoria = new Categoria(3);

Nos crea una clase del tipo Category (una clase derivada de nuestra tabla) y se conecta a la base de datos, ejecuta un query (Where CategoryID=3) y establece las propiedades de la clase a los valores de los campos para ese registro.

Agregar un nuevo registro es tan fácil como esto:

Category miCategoria = new Categoria();
miCategoria.CategoryName= "Mi Nueva Categoría";
miCategoria.Description="Esta Categoría no debería usarse nunca";
miCategoria.Save();

Borrar un registro:

Category.Delete(3);

Si su aplicación es WinForm, deben agregar también las siguientes referencias a su proyecto
System.Web
System.Configuration

Bajar Proyecto Demo

Hasta la próxima entrega de SubSonic

Bienvenido

Bienvenido a este tu nuevo sitio de información, donde podrás encontrar información puntual para que aprendas a usar alguna técnica de programación, usar un control, o aprender algún nuevo tip!

Normalmente escribiré sobre C#, .Net, Asp.Net, SubSonic y quizá algo sobre Python  y VFP ;)