[symfony-es] como funciona __toString()

1,093 views
Skip to first unread message

neoslink

unread,
Apr 20, 2010, 6:46:51 AM4/20/10
to symfony-es
como puedo utilizar ese bendito metodo ya que intento manejarlo y no
sucede nada alguien podria hacer un pequeño tutorial sobre este metodo
en especial para trabajarlo con

sfWidgetFormDoctrineChoice

ya que de este widget no encuentro una documentacion que me explique
como utilizar el widget con el metodo __toString()

gracias muchachos y muchachas espero me puedan colaborar estare muy
agradecido.

--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.

ReynierPM

unread,
Apr 20, 2010, 8:26:54 AM4/20/10
to symfo...@googlegroups.com
On 4/20/2010 6:46 AM, neoslink wrote:
> como puedo utilizar ese bendito metodo ya que intento manejarlo y no
> sucede nada alguien podria hacer un pequeño tutorial sobre este metodo
> en especial para trabajarlo con
>
> sfWidgetFormDoctrineChoice
>
> ya que de este widget no encuentro una documentacion que me explique
> como utilizar el widget con el metodo __toString()
>
> gracias muchachos y muchachas espero me puedan colaborar estare muy
> agradecido.
>

Okey te explico ;) El método __toString() es un método mágico que casi
siempre es usado para devolver la cadena asociada a un número como por
ejemplo es el caso de los ID. Supón el siguiente escenario:

tbl_usuario
===========
idus, usuario, nombre_apellidos, email

tbl_universidad
===============
idun, nombre_universidad, idus

Cuando generas tus clases del modelo, ya sea con Doctrine o Propel, y si
está bien escrito el fichero schema.yml (contiene las relaciones
pertinentes entre las tablas, en este caso tbl_universidad y
tbl_usuario) entonces se te generan métodos que desde la clase usuario y
haciendo JOINs te permiten obtener los campos de la tabla
tbl_universidad asociados a la tabla tbl_usuario por la relación
existente entre ambas tablas.

Cuando imprimes el resultado de cualquier consulta se te muestra algo
como esto:

idus usuario nombre_apellidos email idun
===================================================
1 pepe pepe sanchez pe...@p.com 1

que es lo que tu no quieres que ocurra. ¿Cómo se resuelve? Usando el
método mágico __toString(). Para ello en la clase generada para la tabla
tbl_universidad escribes lo siguiente:

public __toString()
{
return $this->getNombreUniversidad();
}

El método getNombreUniversidad() se te genera de forma automática en tu
fichero base (las mayúsculas han sido adicionadas por el comportamiento
CamelCase si tienes duda pues a por Google). Ese método lo que hace es
devolverte la cadena asociada a ese ID. Ahora si haces una consulta te
"debería" devolver lo siguiente:

idus usuario nombre_apellidos email nombre_universidad
================================================================
1 pepe pepe sanchez pe...@p.com UCI

Espero te haya servido. Si continuas con dudas revisa bien los libros
(si mi memoria no falla esta en el Joobet) de Symfony que ahí se explica
bien el uso de dicho método.

--
Saludos
ReynierPM

andres vanegaz

unread,
Apr 20, 2010, 11:17:28 AM4/20/10
to symfo...@googlegroups.com
y como lo uno con el widget??

andres vanegaz

unread,
Apr 20, 2010, 12:04:53 PM4/20/10
to symfo...@googlegroups.com
eh intentado de mil formas se que tengo algo mal pero con lo que me explican no termino de aclarar mis dudas

Germana Oliveira

unread,
Apr 20, 2010, 12:24:42 PM4/20/10
to symfo...@googlegroups.com
El método __oString es automatico, no tienes que 'unirlo' una vez definido con lo que quieras mostrar, como explica ReynierPM


public __toString()
{
 return $this->getNombreUniversidad();
}

si no me equivoco cuando hagas un getUniversidad() debe salir el Nombre de la universidad en vez del ID como seria por defecto.

--
Germana Oliveira

germanaoliveirab arroba gmail punto com
http://626f67.wordpress.com
http://slcarabobo.wordpress.com

andres vanegaz

unread,
Apr 20, 2010, 12:26:51 PM4/20/10
to symfo...@googlegroups.com
y donde lo declaro en lib/model/doctrine

andres vanegaz

unread,
Apr 20, 2010, 12:38:12 PM4/20/10
to symfo...@googlegroups.com
mira basicamente tengo las siguientes tablas


=========
= usuarios =
=========
= id          =
= nombre  =
= apellido  =
=========


=========
= obra       =
=========
= id          =
= name     =
=========

============
= usuariosobra =
============
= id                =
= usuarios_id  =
= obra_id        =
============

primero que todo quiero aclarar que ya eh intentado todo de lo que eh leido en manuales y no funciona

*********************************************************************************************************************************************************

BaseUsuariosobraForm.class.php

abstract class BaseUsuariosobraForm extends BaseFormDoctrine
{
  public function setup()
  {
    $this->setWidgets(array(
      'id'          => new sfWidgetFormInputHidden(),
      'obra_id'     => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('obra_'), 'add_empty' => false)),
      'usuarios_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('usuarios_'), 'add_empty' => false)),
    ));

    $this->setValidators(array(
      'id'          => new sfValidatorDoctrineChoice(array('model' => $this->getModelName(), 'column' => 'id', 'required' => false)),
      'obra_id'     => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('obra_'))),
      'usuarios_id' => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('usuarios_'))),
    ));

    $this->widgetSchema->setNameFormat('usuariosobra[%s]');
    // esto tambien lo intente y nada   $this->widgetSchema['usuarios_id']->setOption('method', '__toString');
    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);

    $this->setupInheritance();

    parent::setup();
  }

  public function getModelName()
  {
    return 'Usuariosobra';
  }

}

*****************************************************************************************************************************************************************************
lib/model/doctrine/usuariosobra.class.php
class Usuariosobra extends BaseUsuariosobra
{

public function __toString()
{
 return $this->getNombre();
}

}
**************************************************************************************************************************************************************************
el de la obra lo toma automatico porque el lo reconoce por si solo pero el de usuarios no

andres vanegaz

unread,
Apr 20, 2010, 12:43:59 PM4/20/10
to symfo...@googlegroups.com
primero que todo muchas gracias a todos los que tomaron la decision de ayudarme

solucionado
solucionado
solucionado
solucionado
solucionado
solucionado
solucionado

ehhh feliz contento



lib/model/doctrine/usuariosobra.class.php
class Usuariosobra extends BaseUsuariosobra
{

public function __toString()
{
 return $this->getNombre();
}

}
**************************************************************************************************************************************************************************
abstract class BaseUsuariosobraForm extends BaseFormDoctrine
{
  public function setup()
  {
    $this->setWidgets(array(
      'id'          => new sfWidgetFormInputHidden(),
      'obra_id'     => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('obra_'), 'add_empty' => false)),
      'usuarios_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('usuarios_'), 'add_empty' => false)),
    ));

    $this->setValidators(array(
      'id'          => new sfValidatorDoctrineChoice(array('model' => $this->getModelName(), 'column' => 'id', 'required' => false)),
      'obra_id'     => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('obra_'))),
      'usuarios_id' => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('usuarios_'))),
    ));

    $this->widgetSchema->setNameFormat('usuariosobra[%s]');
   
    $this->widgetSchema['usuarios_id']->setOption('method', 'getNombre');

    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);

    $this->setupInheritance();

    parent::setup();
  }

  public function getModelName()
  {
    return 'Usuariosobra';
  }

}


gracias a todos
Reply all
Reply to author
Forward
0 new messages