viernes, 28 de diciembre de 2012

Proceso de creacion de CRUD en Symfony2

Proceso de desarrollo:

0- Eliminar contollers, toda la carpeta entity, toda la carpeta form, resource/routing, Resource/view/*

1- Diseño db en Mysql Workbench

2- Impactar sobre BD

3- php app/console doctrine:mapping:import PaqueteBundle annotation

Para generar una entidad: php app/console doctrine:mapping:import AdminBundle annotation --filter="Modulos"

4- php app/console doctrine:generate:entities PaqueteBundle

   php app/console doctrine:generate:entities MyCustomBundle:User
   php app/console doctrine:generate:entities MyCustomBundle/Entity/User

5- php app/console doctrine:generate:crud

Nota: si es una entidad user o role, hacer extend de clases 

Luego nos solicita si deseamos crear las opciones de escritura, le decimos “y” (sí), formato del CRUD: annotation, y finalmente en el Routes prefix colocamos /admin/role, este paso es importante porque a la ruta le asignamos el prefijo /admin para que nos permita empatar luego con el access_control, confirmamos y aparecerá el mensaje “You can now start using the generated code!”

crear esquema de seguridad
http://www.maestrosdelweb.com/editorial/curso-symfony2-seguridad-de-acceso/

Comandos:

  • php app/console doctrine:mapping:import AcmeBlogBundle annotation
  • php app/console doctrine:generate:entities AcmeBlogBundle

sábado, 24 de noviembre de 2012

Paquetes a instalar - MySQL - PHP - Apache - Centos


Cosas fundamentales para cuando se instala mysql php y apache por separado:
  • MySQL (php-mysql) – A extension for PHP applications that use MySQL databases.
  • PostgreSQL (php-pgsql) – A extension for PostgreSQL database for PHP.
  • MongoDB (php-pecl-mongo) – A driver for MongoDB database.
  • SQLite (php-sqlite) – Extension for SQLite Database Engine.
  • Memcache (php-pecl-memcache) – Memcached caching daemon.
  • Memcached (php-pecl-memcached) – Memcached caching daemon.
  • GD (php-gd) – GD extension for PHP application to serve graphics.
  • XML (php-xml) – XML Parser for PHP applications.
  • MBString (php-mbstring) – Mbstring extension is used to handle multi-byte string in PHP applications. 
  • MCrypt (php-mcrypt) – A Mcrypt library for PHP scripts.
  • APC (php-pecl-apc) – APC module used to optimize and cache PHP code.
  • CLI (php-cli) – Command-line interface for PHP.
  • PEAR (php-pear) – Application Repository framework for PHP.
  • PDO (php-pdo) – Database access module for PHP applications.
  • mcrypt - rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/php53-mcrypt-5.3.3-1.el5.i386.rpm

miércoles, 14 de noviembre de 2012

Instalación Symfony2 - Centos 6 - Problemas

En esta oportunidad voy a describir un problema que tuve al iniciar un nuevo proyecto en symfony2 sobre centos 6.

Problema 1:

Error con los host virtuales y permisos en el contexto de ejecución: Warning: DocumentRoot [/var/ ...] does not exist

Solución 1:

La manera en que descomprimimos symfony para ser usado. La manera correcta es hacerlo mediante la consola de la siguiente manera:

$ tar zxvf Symfony_Standard_Vendors_2.0.18.tgz

y luego

chown root:root symfony

Problema 2:

Otro problema que se presenta es, al momento de chekear si la instalacion de symfony2 es correcto, nos da:

php app/check.php
PHP Fatal error:  Class 'DOMDocument' not found in /var/www/html/Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php on line 214
Fatal error: Class 'DOMDocument' not found in /var/www/html/Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php on line 2

Solución 2:

yum -y install php-xml

Salvadora:

yum install php-pdo 
yum install php-mbstring

lunes, 12 de noviembre de 2012

Google Maps - Utilidades

Quitar el shadow de InfoWindow:

<style type="text/css">
#map_canvas { height: 100% }
img[src*="iws3.png"] {display: none;}
</style>

Redimensionar una imagen con librerias nativas de Google Maps:

var icon = new google.maps.MarkerImage("http://domain/path/image.png", null, null, null, new google.maps.Size(64, 64));

Pegar una estiqueta de tipo html sobre google maps en una posicion determinada o en asociada a un marker, se debe hacer uso de una librería label.js y asociarla al marker e la siguiente manera:

var label = new Label({
   map: map
});
label.bindTo('position', marker, 'position');
label.bindTo('text', marker, '$ '+recomendacion.precioFinal.toString());
marker.label = label;

lunes, 22 de octubre de 2012

Tomar valores pasados por GET JQuery Ajax - Symfony2

Problema:

Enviar por valores por post sin usar form de html

Solución:

Jquery

var p = {'origenNombre': origenNombre};
$.ajax(
  {
   url:"{{ path('aereo_load_extreme_search_t')}}",
   data: p,
   success: function(response){
      setting();
      initialize(response.data);
   }
  }
);

Symfony 2

$request = $this->getRequest();      
$request->get('origenNombre');

miércoles, 19 de septiembre de 2012

Ingeniería inversa - Symfony2

Algunos proyectos web obligan a utilizar una base de datos existente y que no se puede modificar. En estos casos no es necesario crear las entidades con las herramientas explicadas en las secciones anteriores. Lo mejor es crear las entidades directamente a partir de la base de datos mediante las herramientas de ingeniería inversa que incluye Symfony2.

En primer lugar, configura la información de acceso a la base de datos mediante el archivo app/ config/parameters.ini (o, si lo prefieres, en el archivo app/config/config.yml). Después, eje- cuta el siguiente comando para transformar la estructura completa de tablas de la base de datos en las clases PHP de las entidades:

$ php app/console doctrine:mapping:import OfertaBundle annotation
Importing mapping information from "default" entity manager
> writing .../OfertaBundle/Entity/Ciudad.php
> writing .../OfertaBundle/Entity/Oferta.php
> writing .../OfertaBundle/Entity/Tienda.php
// ...

El primer argumento del comando es el nombre del bundle en el que se guardan todos los archivos generados automáticamente. El segundo argumento indica el formato utilizado para definir la in- formación de cada entidad. El valor annotation indicado anteriormente hace que la información se defina mediante anotaciones. Por esa razón el comando anterior genera una clase PHP por ca- da tabla de la base de datos e incluye todas las anotaciones necesarias para reflejar la estructura de tablas y el tipo de columnas.

Si el formato indicado es yml o xml, no se generan las clases PHP sino los archivos de configura- ción YAML o XML que se guardan en el directorio Resources/config/doctrine del bundle.

Para completar las entidades, añade los getters y setters con el siguiente comando:

$ php app/console doctrine:generate:entities OfertaBundle

Como todas las entidades de la aplicación se han creado en el bundle OfertaBundle, seguramente el último paso consistirá en colocar el archivo de cada entidad en su bundle correspondiente. No olvides modificar el valor del namespace en todas las clases que muevas de sitio.

Generar las entidades mediante ingeniería inversa es un proceso sencillo y que funciona muy bien, ya que Doctrine2 tiene en cuenta la información de las tablas, columnas, índices, claves primarias y externas. No obstante, el manual de Doctrine2 asegura que cuando el esquema de la base de datos es muy complejo, solamente se puede obtener entre el 70 y el 80% de la información. Con- ceptos como la herencia de entidades, las asociaciones inversas, los eventos y otra información avanzada tendrás que configurarla manualmente.

Y para el CRUD:

php app/console doctrine:generate:crud

Fuente: Desarrollo web ágil con Symfony2 - Javier Eguiluz

miércoles, 5 de septiembre de 2012

Error 403 - Symfony2 - Centos Linux

Error:
403 Forbidden
You don't have permission to access /app_dev.php/aereo/ on this server.
Apache/2.2.15 (CentOS) 
Server at tije.test.local Port 80

Solución:
find /var/www/html -type d -exec chmod -R 775 {} \;
find /var/www/html -type f -exec chmod -R 664 {} \;

Nota: generalmente esto se da en ambiente de producción, por cuestiones de actualización de vendors, no es aconsejable hacerlo en ambiente de testing y/o desarrollo.

Failed to write cache and log file - Linux - Symfony2

Es un problema que sucede cuando no tenemos seteados los permisos correspondientes a la carpeta cache de app.

Error:

Whoops, looks like something went wrong. 1/1 RuntimeException:
Failed to write cache file "/var/www/html/tijedev/app/cache/dev/classes.php".

Solución:

Posicionarse sobre la carpeta app del proyecto y lanzar.

chmod 755 -R cache

Nota:

También puede suceder con los logs, por lo tanto se debe lanzar:

chmod -R 777 logs

La instalación de php sobre Centos no trae las librerias que soportan SOAP:

yum install php-soap

martes, 4 de septiembre de 2012

Cómo minimizar los js y css con YUI Compressor - Symfony2

1) Descargar el JAR de YUI Compressor y guárdalo en:

app/Resources/java/yuicompressor.jar

2) Se debe configurar dos filtros Assetic en tu aplicación, uno para minimizar los JavaScript con el compresor YUI y otro para minimizar hojas de estilo:

#app/config/config.yml
assetic:
 filters:
  yui_css:
   jar: "%kernel.root_dir%/Resources/java/yuicompressor.jar"
  yui_js:
   jar: "%kernel.root_dir%/Resources/java/yuicompressor.jar"

3) Uso

{% javascripts ’@AcmeFooBundle/Resources/public/js/*’ filter=’yui_js’ %}
{% endjavascripts %}
{% stylesheets ’@AcmeFooBundle/Resources/public/css/*’ filter=’yui_css’ %}
{% endstylesheets %}

Migración Proyecto Symfony2 Windows a Linux - Problemas

Error: Class 'DOMDocument' not found
Solución: yum install php-xml

Error: Whoops, looks like something went wrong.
Solución: date.timezone = America/Buenos_Aires

Multihost - Centos

Editar el archivo

gedit /etc/httpd/conf/httpd.conf

1) Descomentar

NameVirtualHost *:80

2) Crear virtual hosts


# Virtual host general.
<VirtualHost *:80>
 DocumentRoot "/var/www/html"
 <Directory "/var/www/html">
  allow from all
  Options +Indexes
 </Directory>
</VirtualHost>

#Desarrollo
<VirtualHost *:80>
 DocumentRoot "/var/www/html/tijedev/web"
 #DirectoryIndex app.php
 ServerName tije.dev.local
 <Directory "/var/www/html/tijedev/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

#Testing
<VirtualHost *:80>
 DocumentRoot "/var/www/html/tijetest/web"
 #DirectoryIndex app.php
 ServerName tije.test.local
 <Directory "/var/www/html/tijetest/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

Abrir el archivo /etc/hosts y agregar los NameVirtual:

127.0.0.1 tije.dev.local
127.0.0.1 tije.test.local

FileZilla - Centos

Instalación de Filezilla sobre Centos:

1. wget http://nchc.dl.sourceforge.net/project/filezilla/FileZilla_Client/3.5.3/FileZilla_3.5.3_i586-linux-gnu.tar.bz2

2. tar -jxvf FileZilla_3.5.3_i586-linux-gnu.tar.bz2

3. cd FileZilla3/bin

4. ./filezilla

Luego mover la carpeta Filezilla3 a /opt

Permisos - Centos

Este comando se aplica a archivos y carpetas, se puede usar -R para dar permisos recursivamente. El comando es:

chmod [opciones] XXX nomCarpeta/nomFichero

Donde:

[opciones]
-R permiso recursivo, se asigna el mismo permiso a carpetas y archivos hijos

XXX
0 = Ningún permiso (Lectura = 0 + Escritura = 0 + Ejecución = 0)
1 = Permiso de Ejecución (Lectura = 0 + Escritura = 0 + Ejecución = 1)
2 = Permiso de Escritura (Lectura = 0 + Escritura = 2 + Ejecución = 0)
3 = Permiso de Escritura y Ejecución (Lectura = 0, Escritura = 2, Ejecución = 1)
4 = Permiso de Lectura (Lectura = 4 + Escritura = 0 + Ejecución = 0)
5 = Permiso de Lectura y Ejecución (Lectura = 4 + Escritura = 0 + Ejecución = 1)
6 = Permiso de Lectura y Escritura (Lectura = 4 + Escritura = 2 + Ejecución = 0)
7 = Permiso de Lectura, Escritura y Ejecución (Lectura = 4 + Escritura = 2 + Ejecución = 1)

¿Entonces, que es, por ejemplo, chmod 644? 

Son los Permisos que tiene asignados cada Identidad, sobre un archivo o carpeta, según su Relación Numérica.

Siempre siguiendo este orden:

Propietario = 6 (Puede Leer y Escribir)
Grupo = 4 (solo puede Leer)
Otros = 4 (solo puede Leer)

Nota: Evidentemente el comando chmod contiene muchas más opciones y formas de asignar permisos, puedes consultarlas consultando el manual del comando, para ello abre un terminal y teclea:

lunes, 27 de agosto de 2012

Puertos

Puerto Descripción
1 TCP Port Service Multiplexer (TCPMUX)
5 Remote Job Entry (RJE)
7 Protocolo Echo (Responde con eco a llamadas remotas)
9 Protocolo Discard (Elimina cualquier dato que recibe)
13 Daytime (Fecha y hora actuales)
17 Quote of the Day (Cita del Día)
18 Message Send Protocol (MSP)
19 Protocolo Chargen, Generador de caractéres
20 FTP — Datos
21 FTP — Control
22 SSH, scp, SFTP – Remote Login Protocol
23 Telnet
25 Simple Mail Transfer Protocol (SMTP)
29 MSG ICP
37 Time
42 Host Name Server (Nameserv)
43 WhoIs
49 Login Host Protocol (Login)
53 Domain Name System (DNS)
66 Oracle SQLNet
67 BOOTP (BootStrap Protocol) (Server), también usado por DHCP
68 BOOTP (BootStrap Protocol) (Client), también usado por DHCP
69 Trivial File Transfer Protocol (TFTP)
70 Gopher Services
79 Finger
80 HTTP
88 Agente de autenticación Kerberos
103 X.400 Standard
107 Remote Telnet Service
108 SNA Gateway Access Server
109 POP2
110 POP3
115 Simple File Transfer Protocol (SFTP)
118 SQL Services
119 Newsgroup (NNTP)
123 NTP
137 NetBIOS Name Service
138 NetBIOS Datagram Service
139 NetBIOS Session Service
143 Internet Message Access Protocol (IMAP)
156 SQL Server
161 SNMP
162 SNMP-trap
177 XDMCP (Protocolo de gestión de displays en X11)
179 Border Gateway Protocol (BGP)
190 Gateway Access Control Protocol (GACP)
194 Internet Relay Chat (IRC)
197 Directory Location Service (DLS)
209 Quick Mail Protocol
217 dBASE Unix
389 Lightweight Directory Access Protocol (LDAP)
396 Novell Netware over IP
443 HTTPS
444 Simple Network Paging Protocol (SNPP)
445 -DS (Active Directory, compartición en , gusano Sasser, Agobot)
458 Apple QuickTime
500 IPSec ISAKMP, Autoridad de Seguridad Local
512 exec
513 login
514 syslog usado para logs del sistema
515 Printer
520 RIP
522 Netmeeting
531 Conference
546 DHCP Client
547 DHCP Server
563 SNEWS
569 MSN
631 CUPS: sistema de impresión de Unix
666 identificación de Doom para jugar sobre TCP
992 Telnet SSL
993 IMAP4 SSL
995 POP3 SSL
1080 Socks Proxy
1352 IBM Lotus Notes/Domino RCP
1433 Microsoft-SQL-Server
1434 Microsoft-SQL-Monitor
1494 Citrix MetaFrame Cliente ICA
1512 WINS
1521 Oracle listener
1701 Enrutamiento y Acceso Remoto para VPN con L2TP
1723 Enrutamiento y Acceso Remoto para VPN con PPTP
1761 Novell Zenworks Remote Control utility
1863 MSN Messenger
2049 NFS
2082 CPanel
2086 WHM (Web Host Manager)
2427 Cisco MGCP
3000 Calista IP phone (saliente)
3030 NetPanzer
3128 Squid Proxy
3306 MySQL
3389 Microsoft Terminal Server
3396 Novell agente de impresión NDPS
3690 SubVersion
4099 AIM Talk
4662 eMule
4672 eMule
4899 RAdmin
5000 UPNP (Universal plug-and-play)
5060 SIP (Session Initiation Protocol)
5190 Calista IP phone (entrante)
5222 XMPP/Jabber: conexión de cliente
5223 XMPP/Jabber: puerto por defecto para conexiones de cliente SSL
5269 XMPP/Jabber: conexión de servidor
5432 PostgreSQL
5500 VNC (Virtual Network Computing)
5517 Setiqueue proyecto SETI@Home
5631 pcAnyWhere (host)
5632 pcAnyWhere (host)
5400 VNC (Virtual Network Computing)
5500 VNC (Virtual Network Computing)
5600 VNC (Virtual Network Computing)
5700 VNC (Virtual Network Computing)
5800 VNC (Virtual Network Computing)
5900 VNC (Virtual Network Computing)
6000 X11 usado para X-windows
6112 Blizzard Entertainment
6129 Dameware: Software conexión remota
6346 Gnutella
6347 Gnutella
6348 Gnutella
6349 Gnutella
6350 Gnutella
6355 Gnutella
6667 IRC
6881 BitTorrent: puerto por defecto
6891-6900 MSN Messenger (archivos)
6901 MSN Messenger (voz)
6969 BitTorrent: puerto de tracker
7100 Servidor de Fuentes X11
8000 Shoutcast
8080 HTTP alternativo al puerto 80. También Tomcat default
8118 privoxy
8291 routers Microtik
9009 Pichat peer-to-peer chat server
9898 Dabber (troyano)
10000 Webmin (Administración remota web)
12345 Netbus (troyano)
19226 Puerto de comunicaciones de Panda Agent
20000-20019 ICQ
28800-29000 MSN Game Zone
31337 Back Orifice (troyanos)

viernes, 24 de agosto de 2012

Montar unidad NTFS con Centos 6.2 - Linux


Arquitectura 32-bit: 
$ su  
# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt  
# rpm -Uvh http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm   


Arquitectura a 64-bit:
$ su  
# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt  
# rpm -Uvh http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm  


Luego de configurar los repositorios, se instalan los paquetes y sus dependencias:
# yum install fuse-ntfs-3g gnome-vfs2-ntfs  
# hash  

Fuente: http://linux-bsd-sharing.blogspot.com.ar/2012/04/howto-enable-ntfs-read-and-write-access.html

jueves, 23 de agosto de 2012

Environment - Symfony2 - Xampp

#proyecto tije desarrollo
<VirtualHost *:8080>
 DocumentRoot "C:/xampp/htdocs/proyectotije/web"
 DirectoryIndex app.php
 ServerName tije.dev.local
 <Directory "/htdocs/proyectotije/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

#proyecto tije testing
<VirtualHost *:8088>
 DocumentRoot "C:/xampp/htdocs/tije/web"
 DirectoryIndex app.php
 ServerName tije.test.local
 <Directory "/htdocs/tije/web">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

martes, 21 de agosto de 2012

Dado 130912 devuelve Ej: Jue, 13 de Septiembre de 2012

public function dateText($date) 
{
  $dia = substr($date, 0, 2);
  $mes = substr($date, 2, 2);
  $anio = substr($date, 4, 2);
  $fecha = $dia . '/' . $mes . '/' . $anio;
  $dias = array('Dom', 'lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab');
  $meses = array('01' => 'Enero', '02' => 'Febrero', '03' => 'Marzo', '04' => 'Abril', '05' => 'Mayo', '06' => 'Junio', '07' => 'Julio', '08' => 'Agosto', '09' => 'Septiembre', '10' => 'Octubre', '11' => 'Noviembre', '12' => 'Diciembre');
  $dd = explode('/', $fecha);
  $ts = mktime(0, 0, 0, $dd[1], $dd[0], $dd[2]);
  return $dias[date('w', $ts)] . ', ' . $dd[0] . ' de ' . $meses[date('m', $ts)] . ' de ' . date('Y', $ts);
}

Funciones de fechas - PHP

Resta fechas y el devuelve el resultado en segundos:

$a = new DateTime('now');
$b = new DateTime('now+1');
$ats = $a->getTimestamp();
$bts = $b->getTimestamp();
$resta = $ats - $bts; //en segundos

Sumar meses a una fecha en un formato determinado:


$hoy = new \DateTime('now'); 
$hoy = (String) $hoy->format('dmy'); 
$hoy->add(new \DateInterval('P11M')); 
$onceMesesDespues = (String) $hoy->format('dmy');

martes, 14 de agosto de 2012

Llamar un Controller dentro de otro - Symfony2

Muchas veces vamos a necesitar dividir el DefaultController.php en varios módulos independientes y mantenibles.

Suponemos que extraemos parte de DefaultController.php y creamos modulo1.php y modulo2.php. En estos momentos tenemos tres archivos.

- DefaultController.php
- Modulo1Controller.php
- Modulo2Controller.php

El problema llega al momento en que queremos acceder al siguiente objeto desde cualquier controller:

$em = $this->getDoctrine()->getEntityManager();


La solucion es setear el container apenas instanciamos los objetos:

$modulo1Controller = new Modulo1Controller.php();
$modulo1Controller->setContainer($this->container);

Esto permite por ejemplo, acceder a la la base de datos de distintos controladores.


lunes, 13 de agosto de 2012

Funciones de cadena - Twig

Concatenar cadenas: ~
Tomar parte de una cadena: ('ddmmaa') | slice(0, 2) resultado dd

lunes, 6 de agosto de 2012

Crear entidad a partir de una tabla en base de datos

Cómo generar entidades de una base de datos existente en Symfony2:
php app/console doctrine:mapping:convert yml ./src/Acme/BlogBundle/Resources/config/doctrine/metadata

php app/console doctrine:mapping:import AcmeBlogBundle annotation

php app/console doctrine:generate:entities AcmeBlogBundle

Si queremos crear el CRUD:

php app/console doctrine:generate:crud

Doctrine2 y Symfony2 - DQL

Alta de registro simple

$em = $this->getDoctrine()->getEntityManager();
$aereoReserva = new AereoReserva();
$aereoReserva->setCodigoAmadeus('asdf');
$aereoReserva->setCodigoAerolinea('asdfsadf'); 
$em->persist($aereoReserva);
$em->flush();

Consulta simple con DQL

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery("SELECT CONCAT(a.aerolinea, CONCAT(' (', CONCAT(a.iata,')')))  AS label, a.iata AS value FROM AereoBundle:Aerolineas a WHERE a.aerolinea LIKE :aerolinea ")->setParameter('aerolinea', "%$searchterm%");
$entities = $query->getResult();

jueves, 2 de agosto de 2012

Error cannot import resource routing_dev yml

En la mayoría de los casos la solución es limpiar la cache:

php app/console cache:clear

Persistencia de Entidades vinculadas

Crear un registro de entidad asociada:
addComment($myFirstComment);

$em->persist($user);
$em->persist($myFirstComment);
$em->flush();
Eliminar en cascada:
$user = $em->find('User', $deleteUserId);

foreach ($user->getAuthoredComments() AS $comment) {
    $em->remove($comment);
}
$em->remove($user);
$em->flush();

miércoles, 1 de agosto de 2012

Crear entidad especial con annotation - Symfony2


namespace Cupon\OfertaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Entity */
class Venta {

   ...

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Cupon\OfertaBundle\Entity\Oferta")
     */
    protected $oferta;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Cupon\UsuarioBundle\Entity\Usuario")
     */
    protected $usuario;
    
    ...
    
    public function setOferta(\Cupon\OfertaBundle\Entity\Oferta $oferta) {
        $this->
        oferta = $oferta;
    }    
    ...
}

martes, 31 de julio de 2012

Uniendo entidades con Join en Symfony2 en DQL

$em = $this->getDoctrine()->getEntityManager();
$consulta = $em->createQuery('SELECT o FROM OfertaBundle:Oferta o
JOIN o.ciudad c
WHERE c.slug = :ciudad
AND o.fecha_publicacion = :fecha');
$consulta->setParameter('ciudad', 'barcelona');
$consulta->setParameter('fecha', '201X-XX-XX 00:00:00');
$oferta = $consulta->getResult();

Comandos importantes en Symfony2

Chequear instalacion de symofny2

  1. Muestra requisitos faltantes para el correcto funcionamiento de symfony2:                        
    php app/check.php
  2. Comprobamos si symfony2 se instalo correctamente                                                             
    php app/console
Crear Bundle


php app/console generate:bundle --namespace=proyectotije/AereoBundle --bundle-name=AereoBundle --dir=src/ --format=yml --structure=no --no-interaction

Publicar Bundle en web

 php app/console assets:install web

Crear entidades en Symfony2 usando consola


$ php app/console doctrine:generate:entity --entity="MiBundle:MiEntidad"
--fields="nombre:string(100) apellidos:string(100) email:string(255)
fecha_alta:datetime"

Luego de ejecutar éste comando tenemos el objeto de la entidad en symfony2, luego hay que plasmar el objeto físicamente en la Base de Datos.

Crear base de datos

 Una vez configurados los datos de acceso, ya puedes crear la base de datos vacía directamente con el siguiente comando de Symfony2:

$ php app/console doctrine:database:create

A continuación, crea toda la estructura de tablas de la base de datos (también llamada esquema):

$ php app/console doctrine:schema:create

Si en vez de crear las tablas, solamente quieres ver las sentencias SQL que se van a ejecutar, añade la opción --dump-sql:

$ php app/console doctrine:schema:create --dump-sql
CREATE TABLE Ciudad (id INT AUTO_INCREMENT NOT NULL, nombre VARCHAR(100) NOT
NULL, slug VARCHAR(100) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Usuario ...

Durante el desarrollo de la aplicación suele ser habitual añadir o eliminar propiedades de las entidades. En este caso no es necesario que elimines la base de datos y vuelvas a crearla. Basta utilizar el comando doctrine:schema:update para actualizar la estructura de tablas a la última definición de las entidades:

// Ver las sentencias SQL que se ejecutarían para la actualización
$ php app/console doctrine:schema:update --dump-sql
// Ejecutar las sentencias SQL anteriores
$ php app/console doctrine:schema:update --force