Yii2 – Como desarrollar una aplicación multilenguaje

Hace ya tiempo hablamos de cómo desarrollar una aplicación multilenguaje para yii versión 1, y hoy os traemos los pasos para realizarlo con la versión yii2:

Básicamente hay que seguir los siguientes pasos:

1 – Abrir una línea de comandos (cmd) y acceder a la raíz de nuestro proyecto. Y una vez ahí incluir la siguiente orden. Esto generará un archivo dentro de la ruta config/ llamado i18n.php, que será el que contenga los valores globales de la internacionalización.

yii message/config @app/config/i18n.php

2 – Tendremos que modificar la línea languages indicando los idiomas que queramos:

'languages' => ['es_ES','en_US'],

3 – También será necesario modificar el sourcePath y el messagePath con los siguiente valores:

'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',

4 – Será necesario crear la carpeta messages en el directorio raíz de la aplicación.
5 – Incluir dentro del congif/web.php la siguientes líneas dentro de components (en caso de que no se haga sólo se podrán introducir traducciones en el fichero app)

'i18n' => [
        'translations' => [
            '*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en',
                'fileMap' => [
                    //'main' => 'main.php',
                ],
            ],
        ],
    ],

6 – Una vez tengamos eso, tendremos que generar los ficheros de dichos idiomas (o cuando queramos actualizarlos). Para ello es necesario ejecutar:

yii message/extract @app/config/i18n.php

Recomendación:
En config/i18n.php si queréis que el extract de todos los mensajes vaya más rápido podéis introducir un except de los vender.

Yii2 – Redirecciones y Htaccess

Hoy toca incluir cómo hacer las redirecciones y htaccess en yii2 para que fácilmente se puedan hacer urls amigables. Lo saqué de está página (aunque hay unas modificaciones mías en el archivo web.php).

Básicamente es necesario hacer 3 pasos (recordar que {root} es el lugar donde hemos creado la plantilla básica:

Paso 1: Crear fichero {root}/.htaccess (para redireccionarlo todo a la carpeta web menos aquellos ficheros o directorios que existan)

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
 RewriteCond %{REQUEST_URI} ^/.*
 RewriteRule ^(.*)$ web/$1 [L]
 RewriteCond %{REQUEST_URI} !^/web/
 RewriteCond %{REQUEST_FILENAME} !-f [OR]
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^.*$ web/index.php
</IfModule>

Paso 2: Crear fichero {root}/web/.htaccess (para que pase todo por el index.php, menos como en el caso anterior aquellos ficheros o directorios que existan)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Paso 3: Actualizar fichero {root}/config/web.php (indicar a yii2 que se van a mostrar urls amigables y definir las primeras reglas). Estas reglas te permitirán también pasar un parámetro por get.

'request' => [
    'baseUrl' => '',
],
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '' => 'site/index',
        //'<action>'=>'site/<action>',
        '<controller:\w+>/<id:\d+>'=>'<controller>/view',
        '<controller:\w+><action:\w+>/<id:\d+>'=>'<controller>/<action>',
        '<controller:\w+><action:\w+>'=>'<controller>/<action>',
    ],
],

Yii2 vs Laravel 5

La eterna lucha entre diferentes frameworks… hoy la llevaremos al terreno de yii vs Laravel. Dejar claro que simplemente expondremos los puntos fuertes y débiles de cada uno, para ciertos aspectos de la programación puede que no sea importante o puede que sea vital que uno permita ciertas cosas y el otro no, pero eso ya es cosa de cada uno 😉

yii2-vs-laravel5

Laravel 5

Ventajas

  • Tiene un core muy sencillo, con componentes muy intuitivos.
  • Mucha gente escribe acerca ello (tiene una comunidad mayor a Yii2).
  • Utiliza componentes de frameworks muy tradicionales, como Symphony
  • Las últimas prácticas de programación en PHP son incorporadas en nuevas versiones.
  • Muy buena velocidad de procesamiento sin necesidad de instalar extensiones externas

Debilidades

  • No hay continuidad entre versiones. Si tenéis algo en Laravel 4 y lo queréis pasar al 5 todo cascará y tendréis que reprogramar (para mi esto es un handicap muy MUY grande).
  • Los generadores automáticos de código son demasiado básicos. Es más rápido el copia pega de otros sitios.
  • No hay generación estandar de vistas. Puedes dedicar horas de crear código antes de poder probarlo.
  • El sistema de autenticación está un poco incompleto (faltan roles, hay que definir cosas manualmente)
  • Al no utilizar las extensiones componentes nativos de Laravel eso significará que habrá redundancia de código.

Yii 2

Fortalezas

  • Se puede instalar descargándote un zip. Ni composer ni otros gestores de paquetes.
  • Tiene una generación CRUD con vistas, controladores, funciones de búsqueda, modelos,…
  • Tiene una autenticación montada con roles y permisos.
  • Permite crear widgets específicos y propios para PHP/HTML snippets.
  • Widgets internos que permiten hacer renders de tablas con HTML plano o usando vistas dinámicas en AJAX
  • Barra de debug donde te dice estadísticas e información a lo largo de la ejecución de código.
  • Tiene una gran documentación oficial.
  • En su web están centralizados muchos recursos.

Debilidades

  • Hay menos contribuciones de usuarios que en laravel (y también menos extensiones a la venta).
  • La versión 2 es todavía bastante nueva y le faltan para mi gusto bastantes manuales.
  • Yii2 es más o menos similar a Yii1 pero aun así hay que modificar varias cosas para que una aplicación de la primera versión de Yii funcione en la segunda.
  • El código de PHP parecerá más contaminado por el uso siempre de arrays en vez de objetos con sus propiedades.

Y eso es todo amigos, ¿cuál de los dos prefieres?

Día de hackaton (Edición 1, Marzo 2015)

Hoy tengo día libre, y ¿qué significa eso? Pues que lo voy a dedicar a realizar una idea que me lleva rondando la cabeza y que me hará la vida más fácil.

La idea en cuestión es simple, necesito una herramienta que, después de seleccionar varias recetas con el número de personas para los cuales quiero hacerlo, que me diga qué tengo que comprar en el supermercado juntando todos los ingredientes.

Esta idea tiene dos objetivos:

  • Sacar dicha idea y facilitarme la vida cada vez que voy al supermercado, en donde no se qué comprar y tardo muchísimo.
  • Aprender tecnologías que no utilizo, como pueden ser backbone.js, foundation,…

¿Qué pasos he de seguir para llevar a cabo mi idea?

  1. Primero necesito saber las pantallas principales que tendrá mi aplicación. En mi caso son fundamentalmente 2: La de la lista de recetas y la del listado de ingredientes a comprar. Como podéis ver deliberadamente me he dejado tanto la parte de gestión de usuarios como de introducción de recetas,… Al final lo que buscamos es el producto mínimo viable, y a partir de ahí ya iremos añadiendo funcionalidades si realmente tenemos tiempo. (9:00-9:15)
  2. Base de datos: Utilizaré mysql. Escribo en una hoja de papel o mediante el MySQL Workbench (gratuito) un esquema simple de cómo irá y de las relaciones de cada una de las tablas. Escribir un registro en cada tabla para hacer pruebas. (9:15-9:45)
  3. Instalar el framework MVC que utilizaré. He intentado utilizar symfony, pero no tengo una versión 5.4 o posterior de php, como lo cual me decantaré por yii (ya lo utilizo diariamente, con lo cual no me pillará de nuevas). Primeramente habrá que instalarlo, después pasarle el generador automático de modelos. (9:45-10:15)
  4. Empezar a crear la pantallas básica, sin nada gráfico (10:15-11:15)
  5. Hacer el API en sí. En principio tendré 4 funciones(que después por supuesto aumentarán): Función de tomar recetas y de buscar por un texto recetas (GET), recibiendo las recetas que queremos llevar a cabo juntar todos sus ingredientes y guardar el listado de elementos (POST), tomar el listado de ingredientes totales (GET). Aquí es en donde me encuentro con el primer desafío, entender qué es backbone js, ver cómo hacer peticiones get mediante este framework y ver como almacenar igualmente datos (11:15-14:15).

Resultado

Al final he conseguido tener las páginas y el funcionamiento hecho, aunque sin diseño alguno y todo de forma muy muy básica. Es una aplicación que tendré que mejorar muchísimo y que tendrá dos partes principales en una primera etapa, una de ellas es la de introducir más recetas y otra de ellas es la de darle un mínimo diseño.

Conforme pasen los días y lo mejore un poco pondré capturas de pantalla (ahora mismo me daría vergüenza hacerlo.

Problemas que me he encontrado

Backbone js: Me lo imaginaba más sencillo e intuitivo. Es cierto que se pueden hacer cosas interesantes, pero en el momento en que te sales un poco del standar (lo único que intentaba hacer era una vista de una colección) se complica un poco.

Como habilitar peticiones ajax en el yii2

Este es el estado: desde un js estoy realizando una petición post a un servidor yii2 (del modelo avanzado, el que tiene backend y frontend). Y el problema que me encontraba era que siempre me daba un CSRF (). En la versión 1 de yii no había ese problema puesto que por defecto no estaba habilitado, pero ahora así.

¿Cómo se deshabilita entonces el CSRF en el yii2?
Es algo muy simple, y se puede hacer de dos formas diferentes:

Forma 1: Sólo un controlador.
Es necesario entrar en el controlador en cuestión, y en la función beforeAction simplemente pegaremos este trozo de código:

public function beforeAction($event){
    $this->enableCsrfValidation = false;
    return true;
}

 

Forma 2: Toda la aplicación
Accediendo al main.php de la aplicación añadiremos dentro de components las líneas:

'request' => [
    'enableCsrfValidation' => false,
],

Una vez realizado ya funcionará todo correctamente y el javascript en cuestión recibirá los datos que le enviemos

Yii2 vs Yii

Como sabéis hace menos de un mes ha aparecido el nuevo framework yii2 en versión beta (hasta ahora estaba en versión alfa), y me han pedido que investigue más acerca de él. Hasta ahora había trabajado muy bien con yii, y la verdad, es que temblaba al pensar en los cambios que podían haberse sucedido. Como no he encontrado ningún post referente a yii2 en español (tampoco he encontrado ninguno en inglés con las diferencias entre la anterior versión y la nueva) pues me he aventurado a crear el post.

¿Donde puedo descargarme el yii2?
Muy fácil, en la web http://www.yiiframework.com/download/, veréis primeramente la versión estable 1.1.XX y más abajo la versión 2. Se puede descargar vía Composer o bien descargarse un archivo y deszipearlo donde deseeis.

¿Qué diferencias hay entre el yii y el yii2?

  • PHP: Yii 2.0 requiere PHP 5.4.0 o superior, y es que hace uso de las últimas características de PHP como los namespaces (forma de encapsular objetos), traits (sirve para reutilizar series de métodos en diferentes clases sin necesidad de extender o implementar, ver este artículo)
  • Yii 2.0 ha sido reescrito totalmente por lo cual se necesitará un proceso de migrado de las aplicaciones que estén en Yii 1.
  • La carpeta protected….. ha desaparecido, pero se encuentran gran parte de las carpetas que utilizabamos hasta ahora.
  • Actualmente hay dos modelos de yii2 que pueden descargarse, el básico (imaginaos algo más o menos similar al yii1) y el avanzado (imaginaos que tenéis 3 tipos de MVC, los del frontend, los del backend y los que se utilizan tanto en el front como en el back).
  • La forma de instalación hasta ahora es vía Composer, con lo cual toca instalarlo… si puedes (digo si puedes porque es muy fácil en linux, pero en Windows podéis temblar bien). Otra opción vía rápida es coger la aplicación básica o la avanzada y utilizarla para vuestros propósitos.

Entrando más en detalle de diferencias entre yii y yii2.

  • CcComponent: Yii 2.0 divide el CComponent en dos clases yii\base\Object(Permite definir propiedades de clase por medio de getters y setters) y yii\base\Component (extiende de Object y contiene los eventos y behavior)
  • Eventos: Ya no es necesario definir para los eventos un método on. Puedes utilizar cualquier nombre de evento. Eso sí, para adjuntar un handler a ese evento, si debes usar ese on method.
  • Alias para paths: En yii2 se ha dado más uso de los alias path
  • Render: Antes para mostrar una vista teníamos que simplemente llamar a render() o a renderPartial() pero ahora tenemos que hacer un echo de esto.
  • Console Applications: Las aplicaciones de consola están compuestas por controladoras.
  • Las extensiones de yii 1.1 no son compatibles con la versión 2.0
  • Y muchas más que podréis ver en la página oficial.

Para cualquier dato este es el link para la “Guía Definitiva del Yii 2.0”.

MongoDB y comparación con mySQL

Hoy me he puesto a averiguar un poquito más qué es MongoDB y a ver comparaciones con otro sistema de BBDD como mysql.

MongoDB es un sistema de base de datos NoSQL que es multiplataforma (Windows/Linux/OSx) y que está orientado a documentos (es de esquema libre, de otra forma… puedes meter lo que quieras sin ningún parecido entre unas cosas y otras). Está escrito en C++ con lo cual hace que se encuentre bastante cercano a la capa de hardware.

Las características más destacables de este sistema es su velocidad y su sistema de consulta de los contenidos de la base de datos.

La información se almacena en un tipo de jSON que se llama BSON (Binary jSON), y esto es así porque permite una búsqueda mucho más rápida de los datos (aunque siempre se trabajará con elementos jSON).

Por lo que he estado viendo en varias webs de rendimientos en todos los casos es más rápido que mySQL exceptuando cuando es necesario hacer queryes que tengan lo que llaman funciones de agregación (como por ejemplo groupby).

Links interesantes

Yii – Esquema de trabajo para crear una aplicación

Los pasos recomendables a seguir son los siguientes:

  1. Crear la estructura básica de directorios. Para ello se usa la herramienta yiic.
  2. Configurar la aplicación modificando el fichero de configuración de la aplicación (www/protected/config/main.php y www/protected/config/console.php). Puede que sea necesario escribir algunos componentes de la aplicación (como por ejemplo el componente de usuario).
  3. Crear un modelo por cada uno de los tipos de datos que se van a manejar. Utilizar la herramienta Gii para generar automáticamente esas clases para cada una de las tablas que interesen.
  4. Crear un controlador para cada uno de los tipos de peticiones de usuario.Como clasificar las peticiones de usuario depende en el requerimiento actual. En general, si un modelo necesita ser accedido por usuarios, tiene que tener su correspondiente controlador.
  5. Implementar actiones (en los controladores) y sus correspondientes vistas.
  6. Configurar los filtros de acción necesarios en las clases de los controladores.
  7. Crear temas si se requiere esa funcionalidad.
  8. Crear mensajes de traducción di la internacionalización es requerida.
  9. Estudiar los datos y las vistas que pueden ser cacheados y aplicar las técnicas de cacheado apropiadas.
  10. Habilitar la extensión APC, deshabilitar el modo debug, optimizar la base de datos, minimizar los ficheros js y css.
  11. ¡¡Paso a producción!!

Yii: Cómo utilizar las variables de sesión

La forma correcta de utilizar las variables de sesión cuando nos encontramos con Yii no sería como normalmente estamos acostumbrados (primeramente realizando un session_start() y posteriormente con $_SESSION[‘variable’]=’valor’). Lo que hay que hacer es simplemente:

Para escribir: Yii::app()->session[‘variable’] = ‘valor’;

Para leerlo: echo Yii::app()->session[‘variable’]

Yii: Cómo exportar información a pdf

Hoy veremos cómo se puede exportar determinada información a PDF desde el framework Yii.

Los pasos a seguir son los siguiente:

  • Descargar la última versión de mPDF e incluirlo dentro de la carpeta vendors (link).
  • Descargar la extensión EYiiPdf y situarlo en la carpeta extensions/yii-pdf (link).
  • Incluir el siguiente código en el config/main.php sustituyendo los librarySourcePath por los valores adecuados (Nota: se incluirá dentro del array components).

 

'ePdf' => array(
  'class'         => 'ext.yii-pdf.EYiiPdf',
  'params'        => array(
    'mpdf'     => array(
      'librarySourcePath' => 'application.vendors.mpdf.*',
      'constants'         => array(
        '_MPDF_TEMP_PATH' => Yii::getPathOfAlias('application.runtime'),
      ),
      'class'=>'mpdf',
    )
  ),
),
  •  Crear una acción como la siguiente (es un ejemplo)

 

public function actionGenerarPdf(){
  $model = Roles::model()->findAll(); //Ej
  $mPDF1 = Yii::app()->ePdf->mpdf('utf-8','A4','','',15,15,35,25,9,9,'P');
  $mPDF1->useOnlyCoreFonts = true;
  $mPDF1->SetTitle("Yises - Informe");
  $mPDF1->SetAuthor("Jesús E. Pérez Villegas");
  $mPDF1->SetWatermarkText("yises");
  $mPDF1->showWatermarkText = true;
  $mPDF1->watermark_font = 'DejaVuSansCondensed';
  $mPDF1->watermarkTextAlpha = 0.1;
  $mPDF1->SetDisplayMode('fullpage');
  $mPDF1->WriteHTML($this->renderPartial('pdf', array('model'=>$model), true));
  $mPDF1->Output('Informe_Productos'.date('YmdHis'),'I');
  exit;
}
  •  Crear la vista pdf.php dentro de la carpeta correspondiente.

 

<html>
<head>
</head>
<body>
  < !--mpdf
  <htmlpageheader name="myheader">
  <table width="100%"><tr>
    <td width="50%">Prueba para blog de Yises.com</td>
    <td width="50%" style="text-align: right;"><b>Prueba</b></td>
  </tr></table>
  </htmlpageheader>

  <htmlpagefooter name="myfooter">
    <div style="border-top: 1px solid #000000;text-align: center;">
      Página {PAGENO} de {nb}
    </div>
  </htmlpagefooter>

  <sethtmlpageheader name="myheader" value="on" show-this-page="1" />
  <sethtmlpagefooter name="myfooter" value="on" />
  mpdf-->
  <div style="text-align: right">Lo que sea que se quiera poner</div>
</body>
</html>

Importante: Es necesario que donde ponga <!–mdpdf se quite el espacio que hay para hacerlo comentario html (el wordpress no me permite hacerlo en el código)