miércoles, 11 de septiembre de 2013

Yii Framework, conectar a la Base de Datos y generar modelos (Parte 3)

Holas de nuevo >_<, ahora que ya conocemos los conceptos básicos de Yii, podemos pasar al momento de generar los modelos para comenzar a trabajar en el "desarrollo" de la aplicación.
Crearemos pues, una base de datos que llamaremos pruebayii en Mysql con la siguiente estructura:

CREATE TABLE persona (
   id SERIAL NOT NULL ,

   nombre VARCHAR (40) NOT NULL ,
   app VARCHAR (50) NOT NULL ,
   apm VARCHAR (50) ,
   profesion VARCHAR (20),
   fecha_nacimiento DATE NOT NULL ,
   sexo BOOL NOt NULL,
   documento_identidad VARCHAR (15) NOT NULL ,
   CONSTRAINT persona_PK PRIMARY KEY (
      id
   )
) ;

CREATE TABLE telefono (
   id SERIAL NOT NULL ,
   numero VARCHAR (20) NOT NULL ,
   persona_id INTEGER NOT NULL ,
   CONSTRAINT telefono_PK PRIMARY KEY (
      id
   )
);

ALTER TABLE telefono ADD CONSTRAINT telefono_persona_FK FOREIGN KEY (
   persona_id
)
REFERENCES persona (
   id
)
ON DELETE RESTRICT ;


Para permitir a la aplicación conectarse a una base datos en Mysql se debe editar el archivo "main.php" (ubicado en la ruta "c:/ruta/nombreproyecto/protected/config"). Buscamos la linea de conexión a la Base de Datos, por defecto la aplicación esta configurada para conectar con una Base de datos sqlite pero podemos escoger el DBMS en  el archivo de configuración. La estructura para configurar la conexión con una Base de Datos en Mysql es la siguiente:

'db'=>array(
   'connectionString' => 'mysql:host=localhost;dbname=nombrebd',
   'emulatePrepare' => true,
   'username' => 'usuario',
   'password' => 'contraseña',
   'charset' => 'utf8',
)

donde:
  • localhost: es la ubicación de la Base de Datos, puede ser localhost para configurar el equipo local o la dirección ip del equipo que tiene la Base de Datos instalada. OJO: Es necesario configurar la instancia de mysql para aceptar pedidos fuera del equipo local de Base de Datos si se utilizara una dirección ip en este parámetro.
  • nombrebd: el nombre de la Base de Datos a la que nos conectaremos.
  • usuario: el usuario de la Base de Datos Mysql. Usualmente "root" por defecto.
  • contraseña: la contraseña para conectar a la Base de Datos. Usualmente un campo vacío por defecto ("").


El archivo de configuración para nuestro ejemplo se debería ver de la siguiente manera:

/* conexion con sqlite comentada
'db'=>array(
   'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',),
*/         

'db'=>array(
    'connectionString' => 'mysql:host=localhost;dbname=pruebayii',
    'emulatePrepare' => true,
    'username' => 'root',
    'password' => '70599020',
    'charset' => 'utf8',
),

Ahora habilitaremos una herramienta gráfica que nos permitira generar los modelos de la base de datos, se llama Gii (una gran imaginación para llamar a sus herramientas XD). Para habilitar esta "herramienta" se debe editar nuevamente el archivo de configuración, buscamos en el archivo de configuración la palabra "gii" y descomentamos la configuración. El archivo deberia quedar de la siguiente manera:

'gii'=>array(
        'class'=>'system.gii.GiiModule',
        'password'=>'123',
    // If removed, Gii defaults to localhost only. Edit carefully to taste.              'ipFilters'=>array('127.0.0.1','::1'),
)

Ahora ingresamos a la aplicación, con uno de los siguientes URLs (dependendiendo de su configuración):
http://yiiproject.dev/index.php?r=gii
http://localhost/yiiproject/index.php?r=gii
Se muestra la pagina de inicio de Gii que nos pedira el password que configuramos en el paso anterior.

Le damos el password que configuramos en el paso anterior y presionamos el boton "Enter".
Nos aparece la pantalla donde podremos generar Controladores, Crud, Formularios, Modelos y Módulos. Presionamos en el enlace (link) "Model Generator" y nos aparece el formulario para generar modelos. En "Table Name" anotamos "*" y presionamos el boton "Preview", se muestra los archivos que se generaran y presionamos el boton "Generate".

Y listo >_<, ya tenemos los modelos generados, los podemos encontrar en la carpeta "protected/models", así que a darles un vistazo. En la siguiente parte del tutorial veremos como generar formularios y ajustarlos a nuestras necesidades.


Keep Coding!!!

domingo, 8 de septiembre de 2013

Buenas prácticas para MVC (Modelo-Vista-Controlador)

Bueno, si bien todos conocen el concepto de MVC (Modelo-Vista-Controlador), me pareció pertinente dar una lista de buenas prácticas para el desarrollo de aplicaciones MVC pues en las pasadas semanas conocí a un gran número de personas que malinterpretaban este concepto.
Entonces, los puntos a tener en cuenta cuando se desarrolla una aplicación MVC:

Los modelos deben representar la estructura de datos de la aplicación Web. Así pues los modelos deberían contener:
  • Propiedades para representar datos específicos.
  • Lógica del negocio que nos permita asegurar que los datos representados cumplen los requisitos del diseño.
  • Adicionalmente, podría contener código para realizar la manipulación de los datos. 
  • En general los modelos no deberían contener lógica que trata directamente con el usuario final. Más específicamente, los modelos no deberían contener:
    • Ningún tipo de acceso a variables con datos del usuario final.
    • Código HTML o cualquier tipo de lógica de presentación (pues esto debería ser realizado en las vistas)
Las vistas son las encargadas de presentar los modelos en el formato que el usuario requiera. Algunas características importantes a tomar en cuenta son:
  • La mayor parte del contenido será HTML, pudiendo contener partes de php, javascript o css.
  • Puede acceder a datos de los controladores y modelos de manera directa pero debería ser solamente con propósitos de presentación.
  • Se debe evitar el acceso a variables que representan alguna petición del usuario.
  • Se debe evitar cualquier código que realice alguna consulta a la Base de Datos.
Los controladores son la "unión" entre las vistas, los modelos y cualquier otro componente. Son el componente que debe "comprender" las peticiones que realiza el usuario. Entonces:
  • Pueden lidiar con variables de pedido de los usuarios (de llamadas ajax por ejemplo).
  • Pueden instanciar los modelos.
  • Se debe evitar el uso de peticiones SQL pues estas peticiones van en los modelos.
  • Se debe evitar el uso de HTML pues es mejor mantener este código en las vistas.
Una característica importante en aplicaciones MVC es que los controladores usualmente solo tienen una pequeña cantidad de código, siendo los modelos los que acumulas la mayor "carga" de la aplicación.

Yii Framework, conceptos básicos (Parte 2)

Antes de iniciar con nuestro viaje por el framework, es necesario conocer un poco más de su funcionamiento interno para luego no perdernos. Entonces, veamos algunas cosas importantes que se debe saber:
1. Ciclo de vida del Framework. Cuando se maneja un pedido (request), la aplicación sigue el siguiente ciclo de vida:

  • La aplicación se preinicializa con una llamada a CApplication::preinit().
  • Se configura el autoloader y el manejo de errores.
  • Se registran los componentes del nucleo de la aplicación.
  • Se carga la configuración de la aplicación.
  • Se inicializa la aplicación con una llamada a CApplication::init() - Se registran los comportamientos de la aplicación y se cargan componentes estáticos.
  • Se lanza un evento onBeginRequest.
  • Se procesa el pedido del usuario (request) - Se colecta la información del pedido, se crea un controlador y se corre el controlador creado.
  • Se lanza un evento onEndRequest.

Algunos términos que se deben conocer son:

  • Un controlador (controller) es una instancia de CController o una clase que extiende (hereda) a CController
  • Una acción (action) es un método de una clase controlador cuyo nombre comienza con la palabra "action". También es posible definir una acción como una clase que extienda a CAction que luego sería instanciada en el controlador. Esto permite a las acciones poder ser utilizadas en diferentes controladores y aumenta la reusabilidad.
  • La acción por defecto de una clase es la acción Index (Puede modificarse estableciendose la variable CController::defaultAction).
  • Una ruta es formada concatenando el ID del controlador con el ID de la acción separados por una barra (/). 
Por ejemplo:
http://www.ejemplo.com/index.php?r=nomcontrolador/nomaccion 
donde:
nomcontrolador: es el ID del controlador (básicamente es el nombre del controlador)
nomaccion: es el id de la acción (el nombre del método de un controlador que define a la acción sin la palabra "action". Si el método es actionIndex el ID de la acción es "index").
OJO: por defecto los nombres de las acciones distinguen entre mayúsculas y minúsculas.

  • Un filtro es una parte del código de YII que se puede ejecutar antes y/o después de que una acción se ejecuta. Una acción puede tener múltiples filtros. Puede ser definido como un método en un controlador.
  • Un modelo es una instancia de CModel o una clase que extiende CModel. Los modelos se utilizan para mantener datos y sus respectivas reglas de negocio.
  • Una vista es la parte del framework que contiene los elementos de la interfaz de usuario, si bien puede contener PHP se recomienda que este código se mantenga relativamente simple. Grandes cambios en los datos deberían realizarse en los modelos o controladores y no así en las vistas. En una vista se puede acceder al la instancia del controlador con la palabra reservada $this. 
  • Un layout es una vista especial que se usa para decorar las vistas. Contiene las partes de la interfaz de usuario que se repiten entre las acciones, como el encabezado (header), pie (footer) o menús de un pagina web. Se aplica implícitamente al llamar al método render(), pero se puede evitar su aplicación llamando a renderPartial().
  • Un widget es una instancia de CWidget o una clase que extiende a CWidget. Es un componente que se usa para fines de presentación. Por el ejemplo el widget de presentación de datos en una tabla.
  • Las vistas de sistema se refieren a las vistas usadas por el framework para mostrar errores información de errores y registro.
  • Los componentes son objetos escritos específicamente para una tarea. Yii es un framework contrudio sobre componentes.
  • Los eventos de componentes son propiedades especiales que toman métodos como sus propiedades. Asignar un método a un evento causara que este método se ejecute cuando el evento suceda. Por ejemplo, el evento de definir un valor a un select puede lanzar un método de validación.

Para determinar cual es la clase del controlador que se debe instanciar y donde se encuentra Yii realiza los siguientes pasos:
  • Si se ha especificado CWebApplication::catchAllRequest entonces se instancia el controlador definido en la variable. Esta variable es especialmente útil cuando se esta dando mantenimiento a la aplicación pues todos los pedidos son redireccionados a la acción definida en esta variable.
  • Si el ID se encuentra en CWebApplication::controllerMap, se usara la configuración correspondiente para crear la instancia del controlador.
  • Si el Id tiene el formato "una/ruta/nombrecontrolador se asume que el controlador tiene el nombre "nombrecontrolador" y se encuentra en "protected/controllers/una/ruta" (Ubicación física).
Ahora revisaremos el flujo de trabajo definido por Yii para desarrollar un aplicación Web:
  1. Crear la el esqueleto de la aplicación (la estructura de directorios), que puede crearse automáticamente con la consola.
  2. Configurar la aplicación. Esto se realiza modificando el archivo '/application/config/main.php'.
  3. Crear un modelo para cada tipo de dato que sera utilizado. Se puede acelerar el proceso con la herramienta Gii.
  4. Crear un controlador para cada tipo de pedido (request) del usuario. Se puede acelerar el proceso con la herramienta Gii.
  5. Implementar las acciones y sus correspondientes vistas.
  6. Configurar los filtros necesarios el los controladores.
  7. Crear temas o modificar los existentes (Podría no ser necesario).
  8. Traducir los mensajes si se requiere internacionalización.
  9. Ver datos y vistas que pueden cachearse e implementar técnicas de cacheo apropiadas.
  10. Puesta en marcha >_<
Puede ser necesario crear pruebas para cada paso mencionado.

Y al fin, lo mínimo necesario para entender una aplicación Yii ya se explicó. El próximo paso, crear una aplicación real. Hasta la próxima XD
Keep Coding!!!!!


martes, 3 de septiembre de 2013

Escoger un editor de texto para realizar HTML

Comenzar a escribir HTML, pero ¿Que editor puedo usar?. Las opciones son muchas, sin embargo dos de los editores de texto que probé son los ideales (para mi XD), notepad++ y Sublime Text.
La elección no fue sencilla, pero el ganador es (sonido de tambores)... Sublime Text, ehhhhh.
La característica más interesantes de Sublime Text es el autocompletado del código, prueben a teclear html, presionen tab y listo, el cuerpo de la estructura html ya esta ahí, lo mismo pasa con la mayoría de los tags de HTML, se autocompletan facilmente. Todavía debo probar más pero por ahora me quedo con este editor.
Ahora unas pantallas en toda su gloria >_<. Keep Coding.

lunes, 2 de septiembre de 2013

HTML escrito a mano ¿Porqué?

Pues hace mucho tiempo que no escribo a mano XD, pero es un tiempo aún mayor desde que no escribo código HTML a mano. Y aquí esta mi "obra de arte"
Una tarea interesante para que cualquiera haga, pues permite memorizar los tags de HTML. Al principio no importa si uno se equivoca, la clave es hacerlo hasta que nada falle. La foto que subí es bastante simple, pero es suficiente para recordar la estructura básica que un código HTML funcional debe tener.
Hasta la próxima. Keep Coding >_<

domingo, 1 de septiembre de 2013

Yii, una introducción (Parte 1)

Pues son unos meses ya que escucho de un nuevo framework para PHP, Yii. Hoy haré una introducción bastante sencilla de como probar nuestro entorno, ver si se cumplen los requisitos mínimos para el correcto funcionamiento del framework y un poco del uso de la consola que facilitara bastante el desarrollo de nuestra aplicación web.
Entonces comencemos:
Primero necesitamos descargar el framework, que se encuentra en el link http://www.yiiframework.com/download/ y lo descomprimimos en alguna carpeta pública de nuestro servidor web (htdocs en XAMPP, www en WAMP u otro). En mi caso creare un host virtual (¿cómo?).
Revisemos ahora si se cumplen los requisitos para que Yii corra sin ningún problema, se debe acceder al sitio recién creado, a la carpeta requisitos. en mi caso: http://yii.dev/requirements/. Se vera la pantalla que se muestra a continuación:
Como se puede observar, en mi caso una mayoría están correctas y no necesito activar las extensiones para bases de datos que no utilizare así que todo marcha bien.
Ahora crearemos el primer proyecto de prueba.
Desde la consola (Windows+R, tecleamos cmd y enter >_<) navegamos hasta la carpeta donde se descomprimió yii, dentro existe una carpeta con el nombre "framework". Vayamos alla!!!
Ahora creemos nuestro proyecto, la sintaxis es:
yiic webapp c:\ubicacion\del\proyecto
Por último, probaremos si nuestro proyecto está listo. En el navegador deberíamos poder observar nuestro proyecto.
VirtualHost: http://yiiproject.dev/
Sin un host virtual: http://localhost/nombre-del-proyecto/
Y lo logramos!!!!! yey >_<. Si lograste ver la aplicación entonces todo esta funcionando correctamente. Siguiente paso, la conexión con la base de datos. Hasta la proxima :D
Keep Coding
PD. Si quieres continuar, puedes leer unos conceptos básicos en la parte 2.

jueves, 21 de marzo de 2013

pgAgent en Postgresql

Primero, para Windows se debe descargar la última versión de pgAgent desde StackBuilder (el ejecutable se encuentra en la carpeta bin del directorio donde se instalo PostgreSQL).

Si te funciona en cuanto lo instalas todo bien, pero si algo falla se puede probar la instalación manual.

Para ejecutar los comandos que se detallan a continuación debemos encontrarnos en el directorio donde esta el ejecutable de pgAgent (pgagent.exe).

En mi caso, el servicio fallo al momento de reiniciar el equipo, entonces lo primero es desinstalarlo:

pgagent REMOVE pgAgent

OJO: mantener en mayusculas "REMOVE"
OJO2: pgAgent es el nombre del servicio en mi caso, pero podría variar >_<

Habiendose desinstalado el servicio, procedemos a instalarlo "correctamente".

pgagent INSTALL pgAgent -u postgresusr -p password hostaddr=127.0.0.1 dbname=postgres user=postgres password=passpostgres

donde:
OJO: mantener en mayusculas "INSTALL"
postgresusr: el nombre del usuario de Windows con el que se instalo PostgreSQL.
password: la contraseña del usuario de Windows con el que se instalo PostgreSQL.
hostaddr: la ip del equipo donde esta corriendo postgres (localhost).
dbname=postgres: nombre de la Base de Datos
user=postgres: usuario de la Base de Datos
password=passpostgres: contraseña de la Base de Datos

Ahora si podemos iniciar el servicio de pgagent con el comando:
net start pgAgent

Si queremos detener el servicio:
net stop pgAgent

Y... eso es todo  >_<, en un blog posterior explicare como hacer un backup automatizado de la Base de Datos con la ayuda de pgAgent. See you soon...

jueves, 21 de febrero de 2013

Formularios en Zend Framework (Básico) - Parte 1

Pues me dispongo a iniciar un proyecto con Zend Framework y el manejo de los formularios es un tanto "complicado" así que detallare algunas cosillas básicas para ir comenzando.

Primero crearemos nuestro proyecto con la ayuda de la consola que provee Zend.
Entonces, en el directorio desde donde se "sirven" los sitios de apache ( c:\xampp\htdocs en mi caso) le damos al siguiente comando, cambiando proyectozend por el nombre de nuestro proyecto:

zf create project proyectozend

Se crea entonces la estructura de directorios que Zend maneja por defecto.

Para poner a punto todo debemos tener configurados nuestros hosts virtuales ( CREAR UN HOST VIRTUAL).

No se debe olvidar copiar la carpeta de Zend al directorio library para que podamos usar todas las librerias que Zend pone a nuestra disposición.
Ahora crearemos un formulario. Para ello tecleamos desde la consola (c:\xampp\htdocs\proyectozend)

zf create form formulario

Editamos el formulario con el siguiente código:


<?php

class Application_Form_Formulario extends Zend_Form
{
    public function init()
    {
        // primero establecemos el metodo que utilizara nuestro formulario para enviarse (post o get)
        $this->setMethod('post');
       
        // añadimos un campo tipo texto
        $this->addElement(
                // elemento tipo text
                'text',
                // nombre del elemento
                'usuario',
                // vector con las opciones de configuracion y validacio de nuestro campo
                array(
                    // etiqueta que se mostrara con este campo
                    'label' => 'Nombre de Usuario',
                    // este elemento es requerido
                    'required' => true,
                    // filtros que se aplican al elemento
                    'filters'=> array(
                        // elimina los espacios extras al principio y al final de la cadena que se escriba enm este campo
                        'StringTrim'
                    ),
                    // validadores de nuestro campo
                    'validators' =>array (
                        // validamos que nuestro campo tenga entre 5 y 10caracteres
                        array('StringLength', true, array('min'=>5, 'max'=>10))
                    )
                )
        );
       
        // añadimos un boton de submit
        $this->addElement(
                // tipo boton submit
                'submit',
                // nombre de nuestro elemento
                'enviar'
        );
       
        // añadimos proteccion contra cross site request forgery (OPCIONAL)
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));      
    }
}

Ahora veamos el formulario, editamos el controlador index (C:\xampp\htdocs\proyectozend\application\controllers\IndexController.php)para que se muestre nuestro formulario:

public function indexAction()
    {
        // creamos el objeto formulario
        $form = new Application_Form_Formulario();
       
       
        // pasamos nuestro formulario a la vista (en una variable f) para que se muestre
        $this->view->f = $form;
    }


Y por ultimo lo mostramos en nuestra vista (C:\xampp\htdocs\proyectozend\application\views\scripts\index\index.phtml):

<?php
    // mostramos el formulario (recordar que lo pasamos desde el controlador)
    echo $this->f;
?>

Crearemos por ultimo una nueva acción de bienvenida en index. Para ello desde la consola ejecutamos
zf create action bienvenido index

El código que tendrá nuestra vista de bienvenida es simple (C:\xampp\htdocs\proyectozend\application\views\scripts\index\bienvenido.phtml):

<h1>BIENVENIDO</h1>
<br>
<h3>Lograste crear un formulario (muy simple) y manejaste el evento submit y lograste redireccionar a otra acción.</h3>

Por ultimo editaremos nuestra accion index con el siguiente código (C:\xampp\htdocs\proyectozend\application\controllers\IndexController.php):


public function indexAction()
    {
        // creamos el objeto formulario
        $form = new Application_Form_Formulario();
       
        // verificamos si se presiono el boton de submit
        if($this->getRequest()->isPost()){
            // verificamos si el formulario es valido con los parametros que se nos envia
            if( $form->isValid($this->getRequest()->getParams()) ){
                //aca podriamos guardar en la base de datos, validar, etc.
               
                // redireccionamos a la accion bienvenido
                $this->forward('bienvenido');
               
            }
        }
       
        // pasamos nuestro formulario a la vista (en una variable f) para que se muestre
        $this->view->f = $form;
    }


Con esta acción verificamos si se realizo el submit, validamos los datos del fórmulario (que nuestro campo tenga entre 5 y 10 caracteres) y si todo estuviera bien redireccionamos a la pantalla de bienvenida.
Pantallla con errores:
Pantalla con los datos correctos (bienvenida)

Qué hacer a partir de acá. Puedes revisar que
Eso es todo por hoy, en unas semanas más realizare la parte dos de este pequeño tutorial. Espero que les sirva y no olviden dejar sus comentarios >_< Keep coding...



lunes, 18 de febrero de 2013

¿Cómo ingresar al BIOS?

Pues la primera vez que intente entrar al BIOS no fue tan sencillo, así que les dejo algunas formas de ingresar en los tipos de BIOS más conocidos.
AMI BIOS
Tecla Supr durante el POST (auto-verificación al encendido)

Award BIOS
Teclas Ctrl+Alt+Esc o Supr durante el POST

DTK BIOS
Tecla Esc durante el POST

IBM PS/2 BIOS
Ctrl+Alt+Insert después Ctrl+Alt+Supr

Phoenix BIOS
Ctrl+Alt+Esc o Ctrl+Alt+S o F1