yii2 advanced template i18n

1) crear la carpeta de mensajes

en common crear la carpeta messages

2) crear el archivo i18n.php

en common/config crear el archivo i18n.php con el siguiente contenido

<?php
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en','es'], //Add languages to the array for the language files to be generated.
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];

2) setear en la configuracion el lenguaje del sitio y el componente i18n

en common/config/main.php

'language' => 'es',
  'components' => [
   
    'i18n' => [
    'translations' => [
    'frontend*' => [
    'class' => 'yii\i18n\PhpMessageSource',
    'basePath' => '@common/messages',
    ],
    'backend*' => [
    'class' => 'yii\i18n\PhpMessageSource',
    'basePath' => '@common/messages',
    ],
    ],
    ],
   
    ],



3) crear los archivos de traducciones

ejecutar en la consola
yii message/extract @common/config/i18n.php

esto creara dentro de la carpeta common/messages
las carpetas correspondientes a la lista de lenguajes que se pusieron en i18n.php
y dentro de cada carpeta 3 archivos, con la lista de palabrabras y sus traducciones:
app.php
frontend.php
backend.php

4)Usar los terminos traducidos


Yii::t('backend', 'Translatable String');



symfony ORM doctrine mapeo de base datos

1) configurar datos de conexion

app/config/parameters.yml

# This file is auto-generated during the composer install
parameters:
    database_host: localhost
    database_port: 3306
    database_name: symfoweb
    database_user: root
    database_password:



2) configurar orm doctrine 

app/config/config.yml

# Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
  
3) creamos la base de datos symfoweb con las siguientes tablas

CREATE TABLE `blog_post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `content` longtext COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `blog_comment` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `post_id` bigint(20) NOT NULL,
  `author` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `content` longtext COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `blog_comment_post_id_idx` (`post_id`),
  CONSTRAINT `blog_post_id` FOREIGN KEY (`post_id`) REFERENCES `blog_post` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

4) vamos a trabajar en un bundle nuevo

vamos a crearlo desde consola situados en la base del proyecto, ejecutamos:

php app/console generate:bundle --namespace=Acme/Bundle/BlogBundle --no-interaction



lo que nos generara la siguiente estructura




Recordar agregarlo en app/AppKernel.php

en class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
                  ...
                 new Acme\Bundle\BlogBundle\AcmeBundleBlogBundle(),


5) Crear los archivo  de metada que describen las entidades basadas en las tablas

php bin/console doctrine:mapping:import --force AcmeBundleBlogBundle xml
(si quisieramos generar los archivos de tipo Yaml el ultimo parametro debe ser yml)

lo que generara 2 archivos:
src\Acme\Bundle\BlogBundle\Resources\config\doctrine\BlogComment.orm.xml
src\Acme\Bundle\BlogBundle\Resources\config\doctrine\BlogPost.orm.xml

6) creamos las entidades

ejecutamos
 php bin/console doctrine:generate:entities AcmeBundleBlogBundle

lo que generara 2 archivos:
src\Acme\Bundle\BlogBundle\Entity\BlogComment.php
src\Acme\Bundle\BlogBundle\Entity\BlogPost.php


7) configuramos el routeo.

en config/routing.yml

acme_bundle_blog:
    resource: "@AcmeBundleBlogBundle/Controller/"
    type:     annotation
    prefix:   /blog

probar:

http://symfoweb.local/blog

deberia mostrar en el browser:

Hello World!

8) crear un action para crear un registro en la tabla Post

symfony redirecting redireccionamiento


/**
     * @Route("/random/{max}",name="random")
     */
public function randomAction($max)
    {
   
    $number = mt_rand(0, $max);
   
    return $this->render('lucky/number.html.twig', array(
    'number' => $number,
    ));
    }
    /**
     * @Route("/redireccionar/{max}")
     */
    public function redireccionarAction($max){
    return $this->redirectToRoute('random', array('max' => $max));
    }

entonces,
la url
http://symfoweb.local/lucky/redireccionar/7

llamará finalmente a

http://symfoweb.local/lucky/random/7

symfony primeros pasos routing y template twig


1) Crear un Controller

src\AppBundle\Controller\LuckyController.php


namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;



class LuckyController extends Controller
{
/**
     * @Route("/number", name="number")
     */
    public function numberAction()
    {
   
    $number = mt_rand(0, 100);
   
    return $this->render('lucky/number.html.twig', array(
    'number' => $number,
    ));
    }
 
}

2) crear la plantilla twig

app\Resources\views\lucky\number.html.twig

<h1>Tu numero de la suerte es {{ number }}</h1>

3) agregar entradas nuevas de routeo

app\config\routing.yml

_lucky:
    resource: "@AppBundle/Controller/LuckyController.php"
    type:     annotation
    prefix:   /lucky

4) limpiar la cache

(esto se debe hacer luego de cualquier cambio)

en la consola situados en la carpeta del proyecto, ejecutar el siguiente comando

php bin/console --env=prod cache:clear

(cuando se trabaje en un ambiente de desarrollo cambiar prop x dev)

5) listo!

abrir un browser e ingresar la sgt url: http://symfoweb.local/lucky/number




Symfony y Eclipse

1) Bajar las librerias necesarias de Symfony

Menu HELP -> Install new Software

click en botton [add]

Symfony
http://p2.pdt-extensions.org/

elegir todo y terminar.


2) Configura el ejecutable de PHP

Menu windows -> preferences

php

ejecutables
[add]

en el popup, ingresar la ruta de Executable path....si estas usando xampp sera
C:\xampp\php\php.exe

el resto de campos se autocompletaran.

3) Crear proyecto

new -> Symfony Project

le puse de nombre "symfoweb" y el workspace se llama wks-symfony

4) Crear un virtual host:

en C:\xampp\apache\conf\extra\httpd-vhosts.conf

<VirtualHost *:80>
    ServerName symfoweb.local
    ServerAlias www.symfoweb.local

    DocumentRoot "C:\Users\israel\wks-symfony\symfoweb\web"
    <Directory C:\Users\israel\wks-symfony\symfoweb\web>
        AllowOverride None
        Require all granted

        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>

    <Directory C:\Users\israel\wks-symfony\symfoweb\web\bundles>
        <IfModule mod_rewrite.c>
            RewriteEngine Off
        </IfModule>
    </Directory>
    ErrorLog logs/proyectos.local-error.log
    CustomLog logs/proyectos.local-access.log combined   
</VirtualHost>

5) agregar el nuevo virtual host en el archivo de hosts

en C:\Windows\System32\drivers\etc\hosts

agregar la entrada

127.0.0.1        symfoweb.local www.symfoweb.local

6) Listo! 
abrir un browser e ingresar la sgt url:
http://symfoweb.local/



yii2 yii2-user registracion usar email como username

en la vista,

vendor\dektrium\yii2-user\views\registration\register.php

sacamos el campo de username.

en los modelos:

vendor\dektrium\yii2-user\models\RegistrationForm.php
en la function rules()
comentar la linea que pide que username sea obligatorio

//'usernameRequired'

vendor\dektrium\yii2-user\models\User.php

en la function rules()
comentar la linea que pide que username sea obligatorio
 // 'usernameRequired'

y agregar la siguiente funcion:

  public function init() {
    $this->on(self::BEFORE_REGISTER, function() {
    $this->username = $this->email;
    });
    
    parent::init();

    }

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable