Practical Symfony: Jobeet – 2° Edición

Desde hace ya unas cuantos días termine el proyecto de tener traducido a nuestro idioma la segunda edición del Libro Oficial de Capacitación Practical Symfony : JOBEET,  y esta vez no solo para Symfony 1.2 sino también para el nuevo Symfony 1.3. Como imaginarán es el mismo libro pero adaptado para la nueva versión.

El tutorial como es lógico está en constante cambio, revisando errores, y mejorando sus partes, con el finde dar un mejor recurso para los rrhh de las empresas. Con mejores versiones de cada una de sus partes así como el uso de las mejores prácticas del mundo profesional de desarrollo web
Y aunque esta muy bien realizado, se recomienda ver las últimos cambios en cada día del tutorial.

Como siempre, para nuestros dos más queridos ORMs

Symfony 1.3 + Propel:
http://www.symfony-project.org/jobeet/1_3/Propel/es/

Symfony 1.3 + Doctrine:
http://www.symfony-project.org/jobeet/1_3/Doctrine/es/

Symfony 1.2 + Propel:
http://www.symfony-project.org/jobeet/1_2/Propel/es/

Symfony 1.2 + Doctrine:
http://www.symfony-project.org/jobeet/1_2/Doctrine/es/

Publicado en Symfony | Deja un comentario

Performance Symfony : 1.3 : PROPEL & DOCTRINE


Castellano

English
Bueno, este prueba es muy inicial….

El planteo: Siguiendo Practical Jobeet con Propel y Doctrine, y usando Symfony1.3 ¿Cuanto demora interactuar con un simple ABM?

Well, it’s just very initial

The problem: Follow Practical Jobeet with Propel and Doctrine, and using Symfony1.3, How long takes interac with a simple CRUD?

Leyendo los Capítulos 1 y 3, para cada ORM, y envolviendo el controlador para el entorno DEV en un archivo benchmark estos fueron los tiempos.Los reportes tienen este formato:
0 _ORM_WEBDIR_URL-TIEMPO.BMK
Reading the Chapters 1 and 3, for each ORM, and warp to front controller for DEV enviorement inside a benchmark file, these is the resultsThe reports has this format:
0 _ORM_WEBDIR_URL-TIME.BMK
Luego de generar el projecto y la aplicación After generate project and application
0 _propel_web_benchmark.php-0.12712812423706.BMK

0 _doctrine_web_benchmark.php-0.1438159942627.BMK

Luego de cargar los datos iniciales After load data
0 _propel_web_benchmark.php-0.13877201080322.BMK

0 _doctrine_web_benchmark.php-0.1630699634552.BMK

Luego de la generacion del modulo y creacion del ABM After generate modele and create the CRUD
0 _propel_web_benchmark.php_job-0.16423082351685.BMK

0 _doctrine_web_benchmark.php_job-0.22494578361511.BMK
-
Otros test, note que “ORM_WEBDIR_URL”
tiene reemplazados los “/” por unos “_”,
asi sabemos que test ejecutamos
Others test, note that “ORM_WEBDIR_URL”
has replace the  “/” by “_”,
thus we know which test run
20/10/2009  16:48                 0 _propel_web_benchmark.php_job-0.18634295463562.BMK
20/10/2009  16:48                 0 _propel_web_benchmark.php_job-0.20151519775391.BMK
20/10/2009  16:58                 0 _propel_web_benchmark.php_job_create-0.21860218048096.BMK
20/10/2009  16:56                 0 _propel_web_benchmark.php_job_create-0.25584602355957.BMK
20/10/2009  16:55                 0 _propel_web_benchmark.php_job_edit_id_1-0.24364185333252.BMK
20/10/2009  16:56                 0 _propel_web_benchmark.php_job_new-0.22872591018677.BMK
20/10/2009  16:50                 0 _propel_web_benchmark.php_job_show_id_1-0.17427802085876.BMK
20/10/2009  16:48                 0 _doctrine_web_benchmark.php_job-0.22568798065186.BMK
20/10/2009  16:48                 0 _doctrine_web_benchmark.php_job-0.27266120910645.BMK
20/10/2009  16:57                 0 _doctrine_web_benchmark.php_job_create-0.29636907577515.BMK
20/10/2009  16:58                 0 _doctrine_web_benchmark.php_job_create-0.31708693504333.BMK
20/10/2009  16:50                 0 _doctrine_web_benchmark.php_job_edit_id_1-0.36150407791138.BMK
20/10/2009  16:56                 0 _doctrine_web_benchmark.php_job_new-0.27971601486206.BMK
20/10/2009  16:50                 0 _doctrine_web_benchmark.php_job_show_id_1-0.27344703674316.BMK
Probando ahora con Symfony 1.3 y el nuevo Propel 1.4 Testing with Symfony 1.3 and the new one Propel 1.4
22/10/2009  14:01-> 0 _sfFULL_propel_web_benchmark.php-0.13401699066162.BMK
22/10/2009  14:07-> 0 _sfFULL_propel_web_benchmark.php_job-0.16235113143921.BMK
22/10/2009  14:07-> 0 _sfFULL_propel_web_benchmark.php_job-0.16368754986478.BMK
22/10/2009  14:08-> 0 _sfFULL_propel_web_benchmark.php_job_create-0.21050310134888.BMK
22/10/2009  14:08-> 0 _sfFULL_propel_web_benchmark.php_job_create-0.21248616913548.BMK
22/10/2009  14:07-> 0 _sfFULL_propel_web_benchmark.php_job_edit_id_1-0.25051593780518.BMK
22/10/2009  14:08-> 0 _sfFULL_propel_web_benchmark.php_job_edit_id_3-0.24934816360474.BMK
22/10/2009  14:07-> 0 _sfFULL_propel_web_benchmark.php_job_new-0.24454116821289.BMK
22/10/2009  14:04-> 0 _sfFULL_propel_web_benchmark.php_job_show_id_3-0.17340588569641.BMK
22/10/2009  14:08-> 0 _sfFULL_propel_web_benchmark.php_job_update_id_3-0.14927196502686.BMK

RESULTADOS

Symfony 1.3 + Propel 1.4 > Symfony 1.3 + Propel 1.3 > Symfony 1.3 + Doctrine 1.2

Comparando (%) Propel 1.4 y Doctrine 1.2 Comparation (%) Propel 1.4 and Doctrine 1.2
Sabiendo que Symfony 1.3 le toma 0.10 en carga todo, sin hacer uso de la DDBB Knowing that Symfony 1.3 take 0.10 autoload all, without use the DDBB
Propel 1.4 beta
22/10/2009  14:04            0 _sfFULL_propel_web_benchmark.php_job_show_id_3-0.17340588569641.BMK
Propel 1.3
20/10/2009  16:50            0 _propel_web_benchmark.php_job_show_id_1-0.17427802085876.BMK
Doctrine 1.2
20/10/2009  16:50            0 _doctrine_web_benchmark.php_job_show_id_1-0.27344703674316.BMK

Comparativa ORM Inicial ( Propel 1.4 / Doctrine 1.2 ) : ( 0.173 ) / ( 0.273 ) = 63%
Comparativa ORM Real ( Propel 1.4 / Doctrine 1.2 ) : ( 0.173 – 0.10 ) / ( 0.273 – 0.10 ) = 42%

Propel 1.4 beta
22/10/2009  14:08            0 _sfFULL_propel_web_benchmark.php_job_create-0.21248616913548.BMK
Propel 1.3
20/10/2009  16:56            0 _propel_web_benchmark.php_job_create-0.25584602355957.BMK
Doctrine 1.2
20/10/2009  16:58            0 _doctrine_web_benchmark.php_job_create-0.31708693504333.BMK

Comparativa ORM Inicial ( Propel 1.4 / Doctrine 1.2 ) : ( 0.212 ) / ( 0.317 ) = 66%
Comparativa ORM Real ( Propel 1.4 / Doctrine 1.2 ) : ( 0.212 – 0.10 ) / ( 0.317 – 0.10 ) = 51%

Sin querer ofender a nadie :) , pero…

Propel es dos veces más rápido

I don’t want offend to anyone :) , but…

Propel is twice faster

Publicado en Symfony | 1 comentario

Richard Stallman y Roberto Puentes Díaz en Córdoba

Ayer Domindo 23, el señor Richard Stallman, tuvo el placer de tomarse una foto con su servidor.

Cuando RMS me conoció
Cuando RMS me conoció

Bueno, saliendo del tono de humor/ego. Decir que la conferencia es todo un exito, Felicitaciones a la Fundacion Via Libre, UNC, y la Ciudad de Córdoba. Desde ayer RMS es visitante ilustre.

Publicado en General, Software Libre | Deja un comentario

Jobeet: Libro en Español

Desde hace ya unas cuantas semanas que nos encontramos llevando a cabo el proyecto de tener traducido a nuestro idioma el Libro Oficial de Capacitación Symfony : JOBEET.

El tutorial esta en constante cambio, revisando errores, y mejorando sus partes.
Por eso se recomienda ver las últimos cambios en cada día del tutorial.

Para Propel:
http://www.symfony-project.org/jobeet/1_2/Propel/es/

Para Doctrine:
http://www.symfony-project.org/jobeet/1_2/Doctrine/es/

Publicado en General | Deja un comentario

Factura Electrónica

Ahora, una de Contadores.

Como ya saben, nuestra buena amiga AFIP, nos ofrece la EFACTURA (http://www.afip.gov.ar/efactura/)

En el anterior enlace encontraremos mucha información al respecto.

Si desean ver los vídeos, pero tiene grandes inconvenientes de conexión, les dejo las descargas de los mismo:

  1. Presentacion
  2. RECE
  3. RCEL
Publicado en General | Deja un comentario

Como Bootear desde en una Maquina Virtual VirtualBox

Como Bootear desde en una Maquina Virtual VirtualBox


Si llegaste hasta aqui es porque, seguro que no encontraste la forma de seleccionar tu pendrive en el orden de booteo. Ademas parece que VB no da soporte aun en los BIOS virtuales…

Por eso, podemos probar esto:

1) Crea una nueva Maquina Virtual
b) En la seccion “Floppy” del panel derecho, ingresa.
c) Activa “Mount Floppy Drive”, y de la lista desplegable “Host Floppy Device”, selecciona la letra o ruta de tu pendrive (e: en windows, por ej:; en linux puede ser /dev/sdxx)

Listo!.
Saludos

Publicado en Software Libre, Tecnología IT | Deja un comentario

Quini 6

¿ Querés saber si vas a ganar ?

Es Facil, escribi en un papel seis numeros del 00 al 45.

Entonces visita : http://puentesdiaz.com.ar/azar/quini.php

y con la tecla F5, podes simular otro sorteo, y probar si tus numeros traen suerte!!!

==============================================

[quini6]

Si tenes 6 o 5 o 4 aciertos en la primer serie, hay premio.

Si tenes 6 o 5 o 4 aciertos en la segunda serie, hay premio.

Si tenes 6 aciertos en la tercer serie (Revancha), hay premio.

En el SIEMPRE SALE, la cuarta serie, siempre hay ganadores:

Si hay ganadores, con 6 aciertos, se reparte entre ellos, y no importa los de 5, 4, 3 aciertos y asi….

Si no hay ganadores, con 6 aciertos, buscamos ganadores con 5, sino con 4 y asi…

Los 18 depurados. Si en el ultimo listado, estan tus seis numeros elegidos, tambien hay premio

Como veras, hay muchas posibilidades :p

Eso quisieras!, regresa a tus labores!

Cr. Puentes Diaz

MP 10.12726.9

Córdoba – Argentina

Linux User n° 441474

Ubuntu/Symfony/Eclipse Rocks!

Publicado en Deporte & Salud, General | Deja un comentario

Symfony 1.2 Bondades de Doctrine

Un Gran Agradecimiento

Una gran cantidad de cosas impresionantes, se han añadido recientemente a la proxima gran entrega de symfony 1.2. Fabien ha trabajado muy duro para agregar sin dudas las más sofisticadas características que cualquier otro framework PHP pudiera tener hoy en día. No sólo son características agradables sino que fueron implementadas Orientada a Objeto por lo que ha sido sencillo para mi implmentar algunas características con otro ORM, Doctrine.Todo esto se hizo con muy poco trabajo de mi parte. Por lo tanto, doy muchas gracias a él y disfruta de este artículo.

Ejemplo del mundo real

En este artículo voy a empezar desde el principio con un nuevo proyecto symfony 1.2 para que puedas ponerte en marcha con Doctrine. Vamos a utilizar un esquema típico de tu sistema de gestión de contenidos. El esquema consta de los artículos, los autores y categorías donde los artículos son internacionalizados.

Comienza tu Proyecto

En primer lugar necesitas inicializar un nuevo proyecto symfony 1.2 y inicializar un app backend. Asegúrate de que estás utilizando el último código del svn pues beta1 no incluye esta funcionalidad de Doctrine.

Generar tu proyecto

mkdir cms
cd cms
symfony generate:project cms

Generar la aplicación backend

symfony generate:app backend

Todo el mundo encienda su Doctrine

Ahora tenemos que habilitar Doctrine y desactivar Propel :) Edita tu config/ProjectConfiguration.class.php y agregue el código siguiente a tu función setup().

public function setup()
{
  $this->enablePlugins(array('sfDoctrinePlugin'));
  $this->disablePlugins(array('sfPropelPlugin'));
}

Ahora que Doctrine está habilitado podemos enumerar las tareas disponibles de Doctrine:

./symfony list doctrine

Available tasks for the "doctrine" namespace:
  :build-all                   Generates Doctrine model, SQL and initializes the database (doctrine-build-all)
  :build-all-load              Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-load)
  :build-all-reload            Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-reload)
  :build-all-reload-test-all   Generates Doctrine model, SQL, initializes database, load data and run all test suites (doctrine-build-all-reload-test-all)
  :build-db                    Creates database for current model (doctrine-build-db)
  :build-filters               Creates filter form classes for the current model
  :build-forms                 Creates form classes for the current model (doctrine-build-forms)
  :build-model                 Creates classes for the current model (doctrine-build-model)
  :build-schema                Creates a schema from an existing database (doctrine-build-schema)
  :build-sql                   Creates SQL for the current model (doctrine-build-sql)
  :data-dump                   Dumps data to the fixtures directory (doctrine-dump-data)
  :data-load                   Loads data from fixtures directory (doctrine-load-data)
  :dql                         Execute a DQL query and view the results (doctrine-dql)
  :drop-db                     Drops database for current model (doctrine-drop-db)
  :generate-admin              Generates a Doctrine admin module
  :generate-migration          Generate migration class (doctrine-generate-migration)
  :generate-migrations-db      Generate migration classes from existing database connections (doctrine-generate-migrations-db, doctrine-gen-migrations-from-db)
  :generate-migrations-models  Generate migration classes from an existing set of models (doctrine-generate-migrations-models, doctrine-gen-migrations-from-models)
  :generate-module             Generates a Doctrine module (doctrine-generate-crud, doctrine:generate-crud)
  :generate-module-for-route   Generates a Doctrine module for a route definition
  :insert-sql                  Inserts SQL for current model (doctrine-insert-sql)
  :migrate                     Migrates database to current/specified version (doctrine-migrate)
  :rebuild-db                  Creates database for current model (doctrine-rebuild-db)

El Esquema

Ahora empieza la diversión. Tenemos Doctrine habilitado por lo que la primera cosa que necesitamos es definir nuestro esquema del CMS en config/doctrine/schema.yml.

---
Article:
  actAs:
    Timestampable:
    I18n:
      fields: [title, content]
  columns:
    author_id: integer
    status:
      type: enum
      values: [Draft, Published]
      notnull: true
    title:
      type: string(255)
      notnull: true
    content:
      type: clob
      notnull: true
    is_on_homepage: boolean
    published_at: timestamp
  relations:
    Author:
      foreignAlias: Articles
    Categories:
      class: Category
      refClass: ArticleCategory
      foreignAlias: Articles
 
Category:
  columns:
    name:
      type: string(255)
      notnull: true
 
Author:
  columns:
    name:
      type: string(255)
      notnull: true
    about: string(1000)
 
ArticleCategory:
  columns:
    article_id: integer
    category_id: integer
  relations:
    Article:
      foreignAlias: ArticleCategories
    Category:
      foreignAlias: ArticleCategories
 

Datos Fixtures

Tenemos nuestro esquema, ahora necesitamos algunos datos para ponerlo a prueba por lo que copia de los siguientes YAML en data/fixtures/data.yml

---
Article:
  Article_1:
    Author: jwage
    status: Published
    is_on_homepage: true
    published_at: ''
    Categories: [article, ontheedge]
    Translation:
      en:
        title: symfony 1.2 and Doctrine
        content: Article about the new Doctrine integration in symfony 1.2
      fr:
        title: symfony 1.2 et doctrine
        content: Article sur l'intégration de Doctrine dans symfony 1.2

Author:
  jwage:
    name: Jonathan H. Wage
    about: Jonathan is the lead developer of the Doctrine project and is also a core contributor to the symfony project.

Category:
  article:
    name: Article
  tutorial:
    name: Tutorial
  ontheedge:
    name: Living on the edge
 

Desarrollo y Pruebas

Ahora que tenemos nuestro esquema y los datos tenemos todo lo que necesitamos para inicializar nuestra base de datos, modelos, formularios, datos, etc. Esto puede ser hecho con el muy simplemente comando siguiente:

./symfony doctrine:build-all-reload --no-confirmation
>> doctrine  dropping databases
>> doctrine  creating databases
>> doctrine  generating model classes
>> doctrine  generating sql for models
>> doctrine  generating form classes
>> doctrine  generating filter form classes
>> doctrine  created tables successfully
>> doctrine  loading data fixtures from "/Us...ymfony12doctrine/data/fixtures"

Eso fue demasiado fácil, cuando se va a poner difícil? Ahora vamos a hacer la inspección con DQL para ver los datos que se cargaron correctamente.

./symfony doctrine:dql "FROM Article a, a.Author a2, a.Translation t"
>> doctrine  executing dql query
DQL: FROM Article a, a.Author a2, a.Translation t
found 1 results
-
  id: '1'
  author_id: '1'
  status: Published
  is_on_homepage: true
  published_at: '2008-11-06 04:37:11'
  created_at: '2008-11-06 16:37:11'
  updated_at: '2008-11-06 16:37:11'
  Author:
    id: '1'
    name: 'Jonathan H. Wage'
    about: 'Jonathan is the lead developer of the Doctrine project and is also a core contributor to the symfony project.'
  Translation:
    en:
      id: '1'
      title: 'symfony 1.2 and Doctrine'
      content: 'Article about the new Doctrine integration in symfony 1.2'
      lang: en
    fr:
      id: '1'
      title: 'symfony 1.2 et doctrine'
      content: 'Article sur l''intégration de Doctrine dans symfony 1.2'
      lang: fr

Esto puede ser su primer gusto del Doctrine Query Language, también conocido como DQL. Se parece mucho a SQL no? Cierre la boca, que estás babeando.

Para aquellos de ustedes que no quieran escribir cadenas de DQL, no te preocupes tenemos un completo objeto Doctrine_Query para la construcción de tus consultas.

$q = Doctrine_Query::create()
  ->from('Article a, a.Author a2, a.Translation t');
$articles = $q->execute();

Generadores de Admin

Ahora que tenemos todo construido, podemos empezar a generar algunas cosas con la magia symfony. Vamos a empezar por la definición de la Colecciones de Rutas para la gestión de nuestros artículos, autores y categorías. Abre apps/backend/config/routing.yml en tu editor y pega las siguientes rutas dentro.

articles:
  class:         sfDoctrineRouteCollection
  options:
    model:       Article
    module:      articles
    with_show:   true
    collection_actions: { filter: post, batch: post }

categories:
  class:         sfDoctrineRouteCollection
  options:
    model:       Category
    module:      categories
    with_show:   true
    collection_actions: { filter: post, batch: post }

authors:
  class:         sfDoctrineRouteCollection
  options:
    model:       Author
    module:      authors
    with_show:   true
    collection_actions: { filter: post, batch: post }

Estas rutas nos permitirán generar un módulo generador de administrador para la gestión de los datos a través de cada uno de los modelos de Doctrine. Ejecute los siguientes comandos para generar los tres módulos.

./symfony doctrine:generate-admin backend articles
$ ./symfony doctrine:generate-admin backend categories
$ ./symfony doctrine:generate-admin backend authors

Ahora, cuando tiene acceso al modulo categories desde el backend deberías ver lo siguiente.

New Admin Generators

Ahora deseas, perrsonalizar un poco los artículos generados de admin para mostrar sólo una serie de campos en la lista y los filtros del formulario. Puedes hacerlo editando el generator.yml situado en apps/backend/modules/categories/config/generator.yml.

config:
  list:
    display:  [title, published_at, is_on_homepage, status]
  filter:
    class:    ArticleFormFilter
    display:  [author_id, status, is_on_homepage, published_at, categories_list]

Puedes personalizar los otros módulos de la misma forma.

Ahora, si cambia la URL ?sf_culture=fr en su URL el título se mostrará la versión en francés. Debería ver lo siguiente en su navegador cuando levantes hacia arriba el módulo de artículos.

New Admin Generators

Edición de Traducciones

Ahora, ¿cómo trabaja la edición de esas traducciones? Si te acuerdas de esto con los antiguos generadores de admin, era casi imposible. Ahora, se trata de una cuestión de añadir una línea de código a nuestro ArticleForm. Todo que tenemos que hacer es embeber/integrar/fusionar el formulario ArticleTranslation. Esto se puede hacer editando lib/form/doctrine/ArticleForm.class.php y añadiendo el código siguiente al configure()

public function configure()
{
  $this->embedI18n(array('en', 'fr'));
}

Ahora, cuando editas un artículo, verás que tienes la capacidad de editar directamente las traducciones dentro del artículo.

New Admin Generators I18n

Ahora que está muy bien pero que si deseas editar el Author directamente dentro del Article como así y que se cree un nuevo Author si no existe y el uso del actual Author si ese nombre existe. Esto es simple.

Editar / Añadir autor

Con el fin de añadir la funcionalidad descrita anteriormente tenemos que añadir un poco de código en tres lugares diferentes. En primer lugar necesitas embeber el formulario Author en el formulario Article editando lib/form/doctrine/ArticleForm.class.php y agregue el código siguiente.

public function configure()
{
  unset($this['author_id']);
  $authorForm = new AuthorForm($this->getObject()->getAuthor());
  unset($authorForm['about']);
  $this->embedForm('Author', $authorForm);

  $this->embedI18n(array('en', 'fr'));
}

Ahora, al ver la la edición y la creación de un artículo verá el formulario incorporado para el autor con la información existente.

New Admin Generators Embedded Author

Ahora el último paso es decir a Doctrine para que busque objetos existentes de Author la hora de establecer el nombre para que un nombre duplicado de Author no sea creado. Edita lib/model/doctrine/Author.class.php y sobreescribe el name mutator añadiendo el siguiente código.

public function setName($name)
{
  $name = trim($name);
  $found = Doctrine_Query::create()
    ->select('a.id')
    ->from('Author a')
    ->where('a.name = ?', $name)
    ->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
  if ($found)
  {
    $this->assignIdentifier($found['id']);
  } else {
    $this->_set('name', $name);
  }
}

El código anterior será para verificar si un Author con el nombre pasado ya existe, Si existe se asignará el identificador del registro encontrado de lo contrario es lo que normalmente haría, establecer el nombre para el objeto.

Los métodos _set() y _get() deben utilizarse para evitar un bucle infinito cuando se sobrescriben accessors y mutators.

Wow, lo que realmente acaba de construir todo un backend para gestionar el contenido de un simple sistema de gestión de contenido en menos de una hora? Estamos seguros de que sí. Pruébalo y disfruta el desarrollo de ricas funcionalidad basada en web utilizando symfony y Doctrine.

La presente, es una traducción al castellano realizada por Roberto G. Puentes Diaz,
sobre el artículo new-in-symfony-1-2-doctrine-goodies de Jonathan Wage.

Publicado en Software Libre, Symfony | Deja un comentario

Symfony 1.2 : Dios salve a los formularios anidados

En symfony 1.1, introducimos el nuevo sub-framework de formularios. un gran paso para symfony, aun cuando la curva de aprendizaje sea un poco empinada.

Trabajamos mucho para hacerlo aun mejor
para symfony 1.2, y mas importante mas simple para los mas novatos.

Una de las fortalezas del framework de formularios es la capacidad de tratar con formularios anidados.
Un formulario que puede ser embebido en otro formulario el cual también puede ser embebido en otro formulario (y así sucesivamente):

$article = ArticlePeer::doSelectOne(new Criteria());

 
$articleForm = new ArticleForm($article);
$authorForm = new AuthorForm($article->getAuthor());

$companyForm = new AuthorForm($article->getAuthor()->getCompany());

 
$authorForm->embedForm('company', $companyForm);
$articleForm->embedForm('author', $authorForm);

 

El articleForm se muestra como sigue:

Embedded forms

Otra gran característica del framework de formularios es la capacidad de serializar formularios automaticamente. Como los formularios anteriores son de Propel, una simple llamada a $articleForm->save() automaticamente actualizara el objeto $article con los valores enviados y validados para grabarlos en la base de datos.

Pero habia un problema en symfony 1.1. Los objetos author y company
no eran guardados automáticamente. Entonces, tenias que sobreescribir el método save() para poder validar y actualizar los objetos manualmente.
Nada imposible de lograr, pero realmente molesto si tenemos un framework
que ya tiene toda la información necesaria para hacerlo automáticamente.

Esto ha sido implementado en symfony 1.2 y esta disponible desde la beta 2. Eso es, una única llamada a $form->save() ahora actualizara los objetos articulo, autor, y compania. Es una gran noticia, pero hay otra mas: El nuevo generador de admin también tiene en cuenta esta nueva característica.

La presente, es una traducción al castellano realizada por Roberto G. Puentes Diaz,
sobre el artículo new-in-symfony-1-2-god-save-the-nested-forms de Fabien Potencier.

Publicado en General | Deja un comentario

Que Feliz que Soy

Argentina Pais Generoso.
Hasta cuando te ven la cara debes poner una sonrisa.

Desde aqui, un abrazo solidario para aquellos que siguen siendo rehenes, de estos personajes.

Publicado en General, Sociedad, Software Libre | Deja un comentario