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.




sábado, 12 de enero de 2013

Crear proyecto con Symfony 2.1 en Ubuntu 12.10

Hola, vamos a instalar y generar un proyecto con Symfony 2.1 en Ubuntu 12.10 con el composer, esta es una de las formas que nos enseña este framework php y me parece que es la más recomendada si vamos a trabajar con algún repositorio de sistemas de versión.

Tengo un Ubuntu 12.10 recién instalado con LAMP y como IDE trabajaré con Netbeans 7.2

Paso 1: Necesitaremos instalar git ya que el composer lo necesita para descargar, actualizar los archivos del gitHub.

sudo apt-get install git-core

Antes de pasar al paso siguiente quiero aclarar que es necesario que sepan configurar un virtualhost, en mi caso Netbeans crea un directorio de proyectos y es ahí donde trabajaré
Osea dentro de la carpeta NetbeansProjects estarán mis proyectos en sus respectivas carpetas.
Nota: Si no logras ver la carpeta trata de crear un proyecto nuevo con Netbeans New Project->PHP Application->Next->Finish   esto te creara la una carpeta PhpProject1 dentro de nuestra carpeta NetbeansProjects, lo importante para nuestro tutorial es que existe la carpeta NetbeansProjects las carpetas internas que acaba de generar Netbeans puedes borrarla y tendrás igual a la imagen que tengo aquí arriba.

Paso 2: Ahora pasamos a instalar composer en nuestra raiz que en este caso es en nuestra carpeta NetbeansProjects, quiero aclarar que puede ser cualquier ruta donde creas que es mejor para administrar tus proyectos. Para esto abrimos nuestro terminal y ejecutamos los siguientes comandos:

sudo apt-get install curl
cd /home/johnny/NetbeansProjects
curl -s http://getcomposer.org/installer | php

la primera linea es para asegurarnos que tengamos el curl instalado, despues de instalar ingresamos a nuestra raiz /home/johnny/NetbeansProjects y ejecutamos la tercera linea para instalar el composer.


Verificamos por el explorador de archivos y veremos que se desrcargo el archivo y está listo para generar mi proyecto en symfony :)


Paso 3: Pasamos a crear nuestro proyecto, en este caso lo llamare "colegio", en el terminal estamos en la raiz osea en la carpeta NetbeansProjects, ahí ejecutamos la siguiente linea:

php composer.phar create-project symfony/framework-standard-edition colegio/ 2.1.6

Es una sola linea que ejecuta el archivo que anteriormente descargamos, le damos la orden de generar un proyecto, le decimos que será en la carpeta colegio/ y el último parámetro es la versión del symfony




Paso 4: Por el terminal ingresamos a nuestra carpeta de proyecto y ahí necesitaremos ejecutar y hacer algunas acciones, así que ejecutamos estas lineas de comando:

curl -s http://getcomposer.org/installer | php
php composer.phar install

Esta parte es importante por que más adelante nos permitirá actualizar nuestro vendor, nuestros assets para nuestros futuros bundles.


Paso 5: Vamos a instalar algunas librerias que necesitará nuestro servidor web para que funcione bien y no tenga problemas.

para saber que tenemos o que nos falta solo es necesario ejecutar por el terminal.

php app/check.php

Ahí nos listará las cosas que faltan configurar o instalar
Lo que basicamente nos saldrá es que hay 2 tareas para configurar en los php.ini y 2 librerias para instalar:
Librerias:
sudo apt-get install php5-intl
sudo apt-get install php-apc

Configuración:
Vamos a moficiar los php.ini, hay que recordar que existen 2 archivos php.ini cuando lo utiliza apache y cuando lo utiliza la linea de comando, por ello modificaremos en ambos archivos.

los cambios serán así:
date.timezone = America/Lima
short_open_tag = Off

Busca cada una de estas lineas en tu php.ini y modificalos quedando de la manera anterior, estás son las rutas de los php.ini.

/etc/php5/cli/php.ini
/etc/php5/apache2/php.ini

Terminado estás configuraciones reinicias el servicio de apache:
sudo /etc/init.d/apache2 restart
ejecutas nuevamente

php app/check.php

Permisos:
Symfony pide que obligatoriamente le demos permisos a las carpetas de log y cache esto es muy importante y en su documentación nos brinda los comandos para ejecutar y los ejecutamos

sudo setfacl -R -m u:www-data:rwx -m u:johnny:rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:johnny:rwx app/cache app/logs


donde vean la palabra johnny cambien por tú usuario de ubuntu que están en sesión.



Listo ahora ya casi está listo, el siguiente paso es configurar un virtualHost para tu carpeta colegio.
Este tutorial no debería entrar en este tema de configurar, pero vamos hacer una excepción.
crearemos el dominio local.colegio.com para nuestro proyecto que tenemos.

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

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



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


Para finalizar abrimos el navegador y veremos nuestro proyecto corriendo perfectamente y listo para empezar a programar xD

Abriremos local.colegio.com/app_dev.php el entorno de desarrollo, en futuros tutos enseñaré como pasar de nuestro entorno dev a producción, limpiar caché, logs, crear bundle.



Espero sus comentarios...