formulario sfGuardUser embebido en formulario Usuario

94 views
Skip to first unread message

Gebe

unread,
Nov 10, 2009, 7:36:23 PM11/10/09
to symfony-es
Buenas,

Lo que quiero hacer es crear al mismo tiempo un nuevo user con el
plugin sfGuardUser y a ese usuario guardarle una especie de perfil en
otra tabla/clase, todo esto al mismo tiempo con el mismo formulario.

Estoy trabajando con doctrine.

La parte de mi Schema referido a ello seria asi:

Usuario:
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
sf_guard_user_id:
type: integer(4)
notnull: true
nombre:
type: string(100)
notnull: true
apellido:
type: string(100)
notnull: true
email:
type: string(200)
notnull: true
relations:
sfGuardUser:
local: sf_guard_user_id
foreign: id
type: one
foreignType: one
onDelete: cascade

sfGuardUser:
actAs: [Timestampable]
columns:
id:
type: integer(4)
primary: true
autoincrement: true
username:
type: string(128)
notnull: true
unique: true
algorithm:
type: string(128)
default: sha1
notnull: true
salt: string(128)
password: string(128)
is_active:
type: boolean
default: 1
is_super_admin:
type: boolean
default: false
last_login:
type: timestamp
indexes:
is_active_idx:
fields: [is_active]
relations:
groups:
class: sfGuardGroup
local: user_id
foreign: group_id
refClass: sfGuardUserGroup
foreignAlias: Users
permissions:
class: sfGuardPermission
local: user_id
foreign: permission_id
refClass: sfGuardUserPermission
foreignAlias: Users

Cree mi modulo Usuario
Y luego embebí el formulario del plugin dentro del formulario de
Usuario asi:

class UsuarioForm extends BaseUsuarioForm
{
public function configure()
{
$this->embedForm('user', new sfGuardUserForm());
unset($this['sf_guard_user_id']); // La quito para que no
me la muestre, ¿esta bien asi?
}

public function save($con = null)
{
$vs = parent::getValues();
$guardUser = new sfGuardUser();
$guardUser->setUsername($vs['user']['username']);
$guardUser->setPassword($vs['user']['password']);
$guardUser->save($con);

parent::setDefault('sf_guard_user_id', $guardUser->getId()); //
esto estaría mal o no?

return parent::save($con);
}
}

En definitiva anda todo, lo unico que no se como referenciar el
guardUser resientemente creado a la columna relacional
(sf_guard_user_id) del Usuario que estoy por crear , es decir como le
asigno el valor.
Ademas de que me gustaría saber si es la manera correcta de hacer
esto, o hay alguna forma que doctrine o symfony lo realice solo ya que
sabe la relación entre ambos objetos.

Espero sus comentarios...
Saludos
Gebe

Kike

unread,
Nov 10, 2009, 7:46:52 PM11/10/09
to symfony-es
La solución rápida es que en el schema del sfGuardUser metas los
campos del usuario: nombre, apellido, email, etc. Y trabajes en tu
aplicación con los sf_guard_user para todo. Es decir, si se trata de
una aplicación de libros donde cada libro es de un usuario pues el
schema del libro le metes la referencia:
libro:
id:
titulo:
sf_guard_user_id: { type: integer, foreignTable: sf_guard_user,
foreignReference: id, onDelete: setnull }

Y la solución buena es creando un perfil al sfGuardUser. Puedes
encontrar información sobre esa solución aqui:
http://trac.symfony-project.org/wiki/sfGuardPluginExtraDocumentation/Es

Germana Oliveira

unread,
Nov 10, 2009, 7:31:19 PM11/10/09
to symfo...@googlegroups.com
Puedes hacer lo que recomienda Kike, o si lo que deseas es realmente
trabajar con formularios embebidos, creo que te falta embeber el
formulario de sf_guard_user, lo cual es un poco mas complejo de lo que
tienes aca.

debes usar, por ejemplo $this->embedForm()

luego debes modificar la funcion saveEmbeddedForms y el doSave.

al menos asi fue como me funciono a mi con los formulario embebidos



Gebe escribió:
--
Germana Oliveira

Movilnet: 0426 7457105
Digitel: 0412 0386159
Correo-e: germanaoliveirab_at_gmail.com
Blog: http://slcarabobo.wordpress.com
Usuario Linux : #493487

Carabobo, Venezuela.

Gebe

unread,
Nov 11, 2009, 9:34:12 AM11/11/09
to symfony-es
Buenas....

Gracias a ambos por contestar..

Kike, no es la idea hacer lo que me dices, quiero mantener separadas
las dos tablas. Gracias por el enlace, me aclara algunas cosas, pero
no resueleve mi problema que es a la hora de guardar el perfil y el
user.

German:
Si te fijas, la primera linea dentro de configure, estoy embebiendo el
formulario: $this->embedForm('user', new sfGuardUserForm());

de echo me lo muestra y todo, ahora me quedaria averiguar mas sobre
saveEmbeddedForms y el doSave

tienes ejemplo de como lo resolviste tu ó material de consulta para
ello?

Saludos y Gracias
Gebe

tirengarfio

unread,
Nov 11, 2009, 3:52:58 PM11/11/09
to symfony-es
Tienes toda la informacion aqui:

http://www.symfony-project.org/blog/2008/11/12/call-the-expert-customizing-sfdoctrineguardplugin

Por cierto Kike, el codigo o la estructura de los plugins, incluido el
schema en el que aparece sfGuardUser, NO SE TOCA JAMAS !!! Los plugins
no se tocan!!!

Germana Oliveira

unread,
Nov 11, 2009, 4:05:46 PM11/11/09
to symfo...@googlegroups.com
Yo logre hacer esto:

/* GUARDAR FORMULARIOS EMBEBIDOS:
* Personalizacion de la funcion para salvar formularios embebidos
*/
public function saveEmbeddedForms($con = null, $forms = null)
{
if (is_null($con))
{
$con = $this->getConnection();
}
if (is_null($forms))
{
$forms = $this->embeddedForms;
}
foreach ($forms as $key => $form)
{
if ($form instanceof sfFormPropel)
{
$form->bind($this->values[$key]);
$form->doSave($con);
$form->saveEmbeddedForms($con);
}
else
{
$this->saveEmbeddedForms($con, $form->getEmbeddedForms());
}
}
}

/* GUARDAR FORMULARIO:
* Personalizacion del metodo para salvar formularios
*/
protected function doSave($con = null)
{
if (is_null($con))
{
$con = $this->getConnection();
}

$this->updateObject();

//FORMULARIOS EMBEBIDOS//
$this->saveEmbeddedForms($con);
$forms = $this->getEmbeddedForms();

//obtener el id de denunciante y denunciado recien insertados
$denunciante_id = $forms['denunciante']->getObject()->getId();
$denunciado_id = $forms['denunciado']->getObject()->getId();

$this->getObject()->setDenuncianteId($denunciante_id);
$this->getObject()->setDenunciadoId($denunciado_id);


//VALORES ESTATICOS DEL FORMULARIO//
$empleado_id =
sfContext::getInstance()->getUser()->getEmpleadoUsuario('id');
$fecha = date('d').'-'.date('m').'-'.date('Y');
$correlativo = Denuncia::obtenerCorrelativo();

$this->getObject()->setEmpleadoId($empleado_id);
$this->getObject()->setFecha($fecha);
$this->getObject()->setCorrelativo($correlativo);

$this->getObject()->save($con);
}

Algunas cosas son muy muy personales de mi aplicacion, pero espero que
en lo general te sirva.

NOTA: los formularios denunciante y denunciado son los formularios
embebidos en el formulario de Denuncia.


Gebe escribió:

Gebe

unread,
Nov 11, 2009, 5:23:43 PM11/11/09
to symfony-es
Muchas Gracias por las respuestas,

Ya lo habia solucionado antes de leer las ultimas dos respuestas:

en el configure del form padre:

$user = $this->getObject()->getSfGuardUser();
if(is_null($user))
{
$user = new sfGuardUser();
$this->getObject()->setSfGuardUserId($user);
}
$this->embedForm('user', new sfGuardUserForm($user));

y luego reescribiendo el metodo doSave del mismo:

protected function doSave($con = null)
{
if (is_null($con))
{
$con = $this->getConnection();
}
$this->updateObject();
$this->saveEmbeddedForms($con);
$forms = $this->getEmbeddedForms();
$user_id = $forms['user']->getObject()->getId();
$this->getObject()->setSfGuardUserId($user_id);
$this->getObject()->save($con);
}


Ahora tengo otra duda:

Como hago para cuando se muestra el formulario de edicion de un objeto
existente, mostrar un campo del formulario vacio, mas alla de que
tenga valor en la base de datos
Es decir, por ejemplo, el campo password, que cuando edite un usuario,
aparezca vacio y no con lo que trae de la base de datos.

Saludos

tirengarfio

unread,
Nov 12, 2009, 5:36:17 AM11/12/09
to symfony-es
Te paso este link que habla sobre como extender los filtros. Quizas te
pueda ser de utilidad:

http://jsangil.blogspot.com/2009/09/modificacion-de-filtros-en-symfony-para.html

Javi

Gregorio Escalona

unread,
Dec 3, 2009, 1:46:45 PM12/3/09
to symfony-es
Buenas. Mi problema es que a mi si me guarda los formularios el
problema es cuando trato de modificar la información de este, La
informacion del padre si se modifica per loa información de los
embebidos nada que puedo hacer q se modifiquen. esperando respuesta me
despido.

Gregorio Escalona.
gregorioescalona arroba gmail punto com
Barquisimeto Venezuela.

Maria Oliveira

unread,
Dec 3, 2009, 5:52:09 PM12/3/09
to symfo...@googlegroups.com
Como haces el embebido de los formularios? o mas bien el Save ?
--
Germana Oliveira

correo: germanaoliveirab_AT_gmail_DOT_com
blog:   http://626f67.wordpress.com
       http://slcarabobo.wordpress.com

tirengarfio

unread,
Dec 4, 2009, 7:34:13 AM12/4/09
to symfony-es
Hola, creo que tambien deberia de saber la gente que para todo el tema
este de unir el modelo sfGuardUser con el modelo Profile existe la
posibilidad (para mi mucho más sencilla) de usar las herencias de
Doctrine (simple, concrete, ...). Buscad por aqui:

http://www.symfony-project.org/doctrine/1_2/en/04-Schema-Files

Un saludo

Javier



On 3 dic, 17:52, Maria Oliveira <germanaolivei...@gmail.com> wrote:
> Como haces el embebido de los formularios? o mas bien el Save ?
>
> El 3 de diciembre de 2009 14:46, Gregorio Escalona <
> gregorioescal...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages