lunes, 4 de febrero de 2013

Crear un proyecto Zend Framework 2.1

Vamos a crear un proyecto con la nueva versión de Zend Framework 2.1 a través de composer, personalmente puedo decir que ahora este framework PHP me parece más cool.

Es necesario tomar en cuenta en tener la versión de nuestro PHP >= 5.3.3 por temas de namespaces y el composer.

Para esto vamos a ser lo más ordenado posible, estoy usando Ubuntu12.10 con un editor Sublime Text 2 y un terminal de comando.

estoy gratamente sorprendido por los nuevos cambios de Zend con la integración  frameworks front-end, y  la orientación modular explicita  que ahora es, y el fácil trabajo con Doctrine.

Paso 1: creando nuestra raíz para nuestros proyectos en Zend Framework2.1

Lo que haremos en este primer paso será crear una carpeta de proyectos para Zend Framework 2.1 en nuestro directorio personal. En mi caso la ruta será /home/johnny/, abrimos nuestro terminal y por defecto estaremos en nuestro directorio personal ya listo para crear nuestra carpeta raíz.


Y tendremos este resultado:


Paso 2: Descargando el Zend Framework Tool (ZFTool)

El ZfTool es una herramienta de gran utilidad para administrar nuestros módulos, crear proyectos, etc.
comparto este link para que vean las diferentes formas que  el portal de Zend enseña a usarlo.

Según el portal podemos descargar un archivo PHAR para generar nuestros proyectos, así que eso es lo que haremos.

Por nuestro terminal ingresamos a nuestra carpeta generada


Descargamos el archivo PHAR en nuestro directorio raíz:



Paso 3: generamos proyecto con zftool.phar

Ahora que descargamos el archivo zftool.phar abrimos nuestro terminal y ejecutaremos el comando:

php zftool.phar create project proyecto1


Al ejecutar el comando anterior, se generará una carpeta llamada proyecto1 ahí dentro estará nuestros archivos para nuestro respectivo proyecto.

También nos indica que a través del terminal ingresemos al directorio generado y que ejecutemos esa linea de comando:

php composer.phar install


Ahí observamos que se ha instalado Zend Framework 2.1 que por ahora es lo que nos interesa.

Paso 4: Configuramos nuestro Virtual Host para Zend Framework 2.1


1. sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/local.proyecto1.com
2. sudo gedit /etc/apache2/sites-available/local.proyecto1.com
3. sudo gedit /etc/hosts
4. sudo a2ensite local.proyecto1.com
5. sudo /etc/init.d/apache2 restart

El comando número 2 se debe configurar el archivo de tal manera indicándole donde está nuestro directorio algo así.


El comando número 3 debe quedar algo así:


Ahora vamos a un navegador y escribimos la dirección para ver nuestro proyecto.



Ahora levantamos el proyecto con un editor en este caso lo haré con Sublime Text 2


En la imagen anterior vemos que ahora si Zend Framework 2.1 es orientado a modulos y tiene el modulo Application por defecto, si queremos crear nuevos módulos lo haremos con el archivo zftool.phar pero ¿cómo?

Hay que recordar que nuestro archivo lo tenemos en la raíz de nuestro proyecto, así que haremos una copia de este archivo a nuestro "proyecto1" por terminal sería algo así:


Para constatar verificamos la versión y la lista te módulos que tenemos:


Paso 5: creamos módulos con ZFTool en Zend Framework 2.1


Esto ahora es super sencillo por el zftool.phar :
Por nuestro terminal entramos a la carpeta de nuestro proyecto "proyecto1" en nuestro caso
Ahí ejecutamos el comando:

php zftool.phar create module moduletest




En mis siguientes post haremos algo sencillo para la comunicación del modelo a la vista administrador por el controlador, en fin, existe un ejemplo en la pagina oficial del framework.


Espero sus comentarios.



domingo, 20 de enero de 2013

Bootstrap en Symfony2.1 con Twig

Ahora vamos a crear un Bundle para configurar una especie de tema con Bootstrap de twitter, primero vamos a definir que es un Bundle, para esto les dejo este link Bundle.

Crearé un Bundle dentro de una carpeta src/themes, donde integraré con el framework front-end Bootstrap para armar una vista de un portal de eventos con HTML5, CSS3 y aplicando Responsive Design.

Debo recordar que Symfony trabaja con un sistema moderno de motor de plantillas llamando twig, es necesario leer un poco de esto.

Paso 1: Creación de un Bundle.

nos dirigimos a través de nuestra consola a la carpeta de nuestro proyecto generado, que se llama colegio, para los que quieren ver los post anterior para que entren en contexto.
1. Crear proyecto con Symfony2.1
2. YUI Compressor con Symfony2.1

Ejecutamos el comando:

php app\console generate:bundle

Al ejecutar esto nos dará la bienvenido al generador de Bundle en consola y nos pedirá el namespace ahí escribiremos: Themes/BootstrapBundle

Esto quiere decir que creará una carpeta llamada themes dentro de la carpeta src/ y dentro de la carpeta Themes/ creará una carpeta llamada BootstrapBundle que es nuestro nuevo Bundle.

Enter y después nos pedirá un nombre para nuestro nuevo Bundle:


En la imagen anterior el generador nos recomiendo un nombre, así que le damos enter aceptando la sugerencia. Ahora nos pedirá donde es que se creará los directorios de los Bundles, el generador nos recomendará dentro de la carpeta src/ asi que haciendo ENTER lo aceptamos.


Ahora nos pedirá el formato que deseamos que tenga nuestro nuevo Bundle, el generador nos recomienda Anotaciones y haciendo enter también lo aceptamos.


Ahora nos pedirá si queremos generar todo el conjunto de directorios escribimos "yes", por que mas adelante también querremos usar las traducciones.


Luego nos pide confirmación y le damos entes al "yes",  también nos pide si queremos que actualicemos el kernel y le damos enter al "yes,  de ahí nos pide para actualizar el routing y también le daremos enter al yes


Ahora vemos nuestra estructura de nuestro nuevo Bundle:



Ahora por que he creado una carpeta Themes y dentro recién crear un Bundle para Bootstrap, bueno sucede q es un tema de orden, si desarrollo un Bundle para  solo pintar entonces lo empaqueto dentro de Themes y así puedo organizar mis Bundles por tipos, algunos colegas no piensan que esa es la funcionalidad de un Bundle, pero en temas de análisis me parece que es la mejor forma.

Paso 2: Descargamos Bootstrap

Descargamos las librerías de Bootstrap  y descomprimimos y ahí veremos 3 carpetas css, js, img, el contenido de cada uno de estas carpetas lo copiamos y lo pegamos dentro de la carpeta public de nuestro Bundle que coincidente mente también tiene carpetas con los mismos nombres excepto con la carpeta img no existe para ello creamos la carpeta img y pegamos el contenido debería quedar así la estructura:



En la imagen anterior vemos la estructura con los archivos del bootstrap añadidos y he seleccionado los archivos con extensión .min ello pueden borrarla no los necesitamos, por que? bueno por que seguramente editaremos y ademas contamos con el YUI Compressor para comprimir nuestros CSS y JS, esto lo explique en mi post anterior.

Paso 3: Editamos la base.html.twig

Este archivo se encuentra en app/Resources/views/base.html.twig Este archivo es la base de nuestra plantilla y la llenaremos de codigo HTML5 con bloques de twig. Vemos que ya tiene los bloques por defecto así que lo dejamos tal cual pueden agregar los metas que crean necesarios le agregué el lang y un meta por mi parte.


Ahora vamos a crear el layout.html.twig en esta ruta:  verán que esta dentro de la carpeta views y fuera de la carpeta Default.



En la imagen anterior señalamos un archivo que estará vacío y lo codificamos y dejamos de la siguiente manera:


En la imagen anterior definimos 3 bloques principales una para los css el otro para el contenido html y el tercero para archivos js, también vemos el uso de los YUI Compressor para comprimir todos los archivos que usemos, también vemos en la linea 17 que agregué el jquery descargate el código no compreso y pégalo en la carpeta public/js/jquery.js, ahora dentro de la carpeta Default está un archivo llamado index.html.twig
este archivo solo tiene un saludo con una variable lo editarems y quedará así mas o menos:


En la imagen anterior vemos como estoy heredando el layout.html.twig que está fuera y dentro del bloque body pongo la variable que estaba.

Paso 4: Ejecutando nuestro controlador

Cuando creamos nuestro Bundle por defecto crea un controlador Default en la carpeta Controller y sus vistas por controlador en la carpeta views/Default/, el controlador tiene su metodo index que envía un saludo y para problar todo Bundle recién creado lo hacemos con la siguiente ruta:
 http://local.colegio.com/app_dev.php/hello/Johnny

por que hello/Johnny, bueno si recuerdan cuando creamos un Bundle dijimos que por el formato anotaciones, bueno esto hace que sobre cada método se indique la forma de como llegar a ese metodo vemos el indexAction de nuestro controlador Default:


En la imagen anterior vemos que para llegar a este metodo tiene que ser concatenando al nuestra URL http://local.colegio.com/app_dev.php + /hello/Johnny, en este caso {name} es variable puede ir cualquier texto. Ahora vayamos al navegador y vemos que sale con esa URL.



Ahora vemos el código fuente como lo ha comprimido :

Vemos en la imagen anterior que solo ha creado un archivo CSS y un archivo JS apesar que usamos varios, sucede que el YUI Compressor lo comprimió todos mis assets a un solo archivo respectivamente.

Ahora ya tenemos el bootstrap integrado en un Bundle listo para usar todos sus componentes, haré algo para probar el estilo y el responsive design.

Después de repasar el código de Bootstrap en primera instancia obtengo esto:



El código es el siguiente:

{% extends 'ThemesBootstrapBundle::layout.html.twig' %}

{% block body -%}
<div class="container">
<div class="row">
<div class="span12">
LOGO
</div>
</div>
   <div class="navbar navbar-inverse">
   <div class="navbar-inner">
   <div class="container">
   
   <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
   <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
   <span class="icon-bar"></span>
   <span class="icon-bar"></span>
   <span class="icon-bar"></span>
   </a>
   
   <!-- Be sure to leave the brand out there if you want it shown -->
   <a class="brand" href="#">Project name</a>
   
   <!-- Everything you want hidden at 940px or less, place within here -->
   <div class="nav-collapse collapse">
   <!-- .nav, .navbar-search, .navbar-form, etc -->
   <ul class="nav">
   <li class="active">
   <a href="#">Home</a>
   </li>
   <li><a href="#">Link</a></li>
   <li><a href="#">Link</a></li>
   </ul>  
   </div>
   
   </div>
   </div>
   </div>
   <div class="row">
    <div class="span12">
   <div id="myCarousel" class="carousel slide">
   <!-- Carousel items -->
   <div class="carousel-inner">
   <div class="active item">
    <img src="http://lorempixel.com/800/250/nature/1/">
   </div>
   <div class="item"><img src="http://lorempixel.com/800/250/nature/2/"></div>
   <div class="item"><img src="http://lorempixel.com/800/250/nature/3/"></div>
   </div>
   <!-- Carousel nav -->
   <a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
   <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>
   </div>    
    </div>
   </div>
   <div class="row">
    <div class="span12">
    Hello {{ name }}!
    </div>
   </div>
</div>
{% endblock %}



Debo agregar q para que funcione el Slide o carrusel de imagenes he creado un archivo llamado script.js


Y contiene este código:


Y en el layout.html.twig agregamos la ruta del script para que lo comprima y lo agregue al script generado



Ahora solo limpie la caché del proyecto y recompile los assets nuevamente:

php app/console cache:clear

php app/console assets:install web --symlink

Como último paso vamos a poner a nuestro Bundle que cargue por defecto y eliminar del registro a nuestro DemoBundle ya que solo sirve de referencia.

en la ruta app/AppKernel.php eliminamos la instancia que hacen al Bundle DemoBundle



Una vez borrado esa linea de código, nos vamos al archivo app/config/routing_dev.yml ahí veremos 3 llamadas al AcmeBundle tambien lo eliminamos el siguiente segmento:


Ahora por último vamos a nuestro controlador Default y hacer modificaciones en la ruta de llegada al método indexAction y lo dejamos así:


Aya no olvidar que en la vista (index.html.twig) del controlador Default está imprimiendo Hello {name}, tienes que borrar {name} y eso es todo :)


Ahora solo limpie la caché del proyecto y recompile los assets nuevamente:

php app/console cache:clear

php app/console assets:install web --symlink

veremos el resultado:



Buenos ahora si puedes usar todas las bondades que te da Bootstrap para usar sus componentes queda en sus manos aplicar las diversas formas.

Espero mas adelante usar precompiladores de CSS y JS para trabajar Stylus y CoffeScript respectivamente espero tener tiempo.

espero sus comentarios. Nos leemos



YUI Compressor con Symfony2.1

Hola, continuando con mi post anterior de instalar y configurar symfony2.1 con composer en Ubuntu12.10 http://johnny1402.blogspot.com/2013/01/crear-proyecto-con-symfony-21-en-ubuntu.html

Ahora vamos a instalar y configurar nuestro proyecto para que trabaje con YUI Compressor para optimizar la carga de nuestros javascript y css reduciendo el tamaño de nuestros archivos.

Recordemos el proyecto anterior que lo dejamos instalado y listo para empezar a trabajar.

Paso 1: Configuración online

Ingresamos en el icono del centro que dice "CONFIGURE" para obtener los datos de la configuración para guardarlo en nuestro archivo parameters.yml. Después de hacer click  se muestra un formulario y ahí ponemos los datos de nuestra conexión y nombre de la Base de datos (no es necesario que exista, esa se creará automáticamente cuando ejecutemos nuestro comando de Doctrine mas adelante), next, next y al final te dirá que no pudo guardar en tu archivo parameters.yml por un tema de permisos y te da la opción de copiar y pegar manualmente que es lo mejor y listo. Lo importante de este primer paso es que se aya generado un código de token por temas de seguridad que lo explicamos después.




Paso 2: Otro requisito es que tengamos instalado Java en nuestro sistema si no lo tienen es necesario instalarlo, en google encontrarás mucha información igual comparto algún link de ayuda http://www.ubuntu-guia.com/2012/04/instalar-oracle-java-7-en-ubuntu-1204.html  bien al final una vez que tengamos java en nuestro sistema, necesitamos instalar el YUI Compressor como siguiente paso.

sudo apt-get install yui-compressor

Listo ahora tenemos lo necesario para que nuestro servidor pueda comprimir nuestros assets (css, js).

Paso 3: Mostrando la forma por defecto

Vamos a revisar el archivo app/config/config.yml en la sección Assetic que está así:

La instalación de Symfony 2.1 tiene por defecto un Bundle dentro de la carpeta src/Acme/DemoBundle.  Aquí un Bundle bueno definir un Bundle no es precisamente el objetivo de este post pero para resumir  es un conjunto de archivos y carpetas que manejan una estructura lógica para desarrollar una funcionalidad en otras palabras es una especie de módulo  xD.

Ahí buscaremos el archivo layout.html.twig: src/Acme/DemoBundle/Resources/views/



En el navegador vemos el código que genera:

Este es el código fuente que me genera :


Abrimos ese archivo demo.css  y vemos el siguiente código:


En la imagen anterior vemos como genera el código con espacios en blanco,  en fin hace que el archivo sea más pesado y carga lenta en cierto grado.

Paso 4: Configurando YUI Compressor en Symfony2.1



Ahora configuremos los archivo necesarios para que funcione esto.
Abrimos el archivo app/config/config.yml en la sección Assetic lo ponemos de la siguiente forma:


Ahora Abrimos el layout.html.twig para agregar un bloque de tipo stylesheets para decirle que generé un archivo css comprimido con un nombre configurable. Esta parte debería quedar de la siguiente manera:



En la Imagen anterior se agrego el código del bloque stylesheets:


    {% block stylesheets %}
        {% stylesheets output='css/mistyle.css' filter='cssrewrite, yui_css' debug=false 'bundles/acmedemo/css/demo.css' -%}
        <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
        {% endstylesheets %}
    {% endblock %} 

El comando "output" le decimos que se generrará un archivo llamado "mistyle.css" con un códifo css comprimido en las siguientes lineas le pasamos nuestros archivos css original que usaremos, podrían ser uno o mas archivos css.

Terminado de explicar esta parte  nos vamos a nuestra consola y ejecutamos unos comandos para ejecutar el compresor.

php app/console cache:clear

php app/console assets:install web --symlink


El primero limpia la caché y el segundo generá los assets a nuestra carpeta Web para que se muestra en nuestro proyecto.

Ahora vayamos a nuestro navegador y vemos el mismo resultado

Pero vemos nuestro código fuente, si estamos en firefox Ctrl + U


Hacemos click en el archivo css generado para ver el contenido:


Configurando YUI Compressor para JavaScript

En el archivo app/config/config.yml agregamos la siguiente linea:


Ahora en nuestro archivo layout.html.twig crearemos el bloque de javascript para cargar todos nuestros scripts y decirle que todos estos los comprima a un solo archivo js.

Nos dirigimos a src/Acme/DemoBundle/Resources/public y vemos que no existe la carpeta js/ así que lo creamos y dentro de ella creamos un archivo js llamamo "demo.js" donde podremos un codigo de javascript  con espacios y comentarios.




En la imagen anterior vemos 5 lineas de código, veremos como al final solo se hace una sola linea eliminando espacios en blanco y los comentarios, etc.

Para seguir con la configuración agregamos nuestro bloque javascripts en nuestro layout.html.twig para decirle que generé otro archivo js llamado "myscript.js " en la carpeta web.


En la cosola estando en nuestra carpeta colegio ejecutamos nuevamente nuestros comandos:



php app/console cache:clear


php app/console assets:install web --symlink

Ahora vamos a nuestro sitio web http://local.colegio.com y vemos lo mismo, vayamos a nuestro código fuente:


Vemos que se ha generado una llamada a nuestro archivo "myscript.js" ahora hacemos click ahí para ver que contiene:


La idea de todo esto es que ustedes pueden utilizar cualquier librería JS o CSS para su bundle o sus propios scripts  y juntarle todo en un solo comprimido.

Cuando usen otras librerías JS o CSS usen las que no tengan el formato .min ya que el YUI Compressor se encargará de ello y ademas para esta forma es mejor usarla ya que podrás hacer los cambios que creas necesario y al final comprimirla.

Para mi próximo post sera crear una especie de theme con Boostrap de twitter para usar sus componentes y hacer que nuestro proyecto sea Responsive Design

Espero sus comentarios y responder si es que hay preguntas, Nos leemos.