Rechercher dans ce blog

Chargement...

lundi 30 janvier 2012

Se méfier du toString !!

La méthode __toString est une méthode très pratique pour remplacer les ID dans les menus déroulants par le nom de l'objet.
Typiquement, vous avez un SELECT dans un de vos formulaires. Ce SELECT est créé par un widget sfWidgetFormDoctrineChoice. S'affiche alors un beau menu déroulant avec la valeur des identifiants (1,2,3 au lieu de pomme,poire,raisin etc...).
Pour afficher le nom de l'objet Doctrine - appelons le myObject - il suffit d'aller dans sa Classe et de définir la méthode _toString :
class MyObject extends BaseMyObject
{
    public function __toString()
    {
      return $this->getNom();
      # évidement, il doit y avoir un champ "nom" dans la table "my_object'
    }
}
S'affiche alors un beau menu déroulant avec - comme intitulé (option du select) - poire,pomme, raisin ...
Ceci, tout le monde le sait ;-)

D'autre part, lorsque l'on appelle un objet Doctrine, on peut connaître la valeur de ses différents champs.
Pour reprendre notre exemple :
Ma table my_object dans ma DB a les champs suivants :
- id
- nom
- infos
Mon objet Doctrine correspondant est une Class MyObject. Si on cherche l'enregistrement de "chapitre" avec l'identifiant 5, on écrit :
$chapitre = Doctrine::getTable('MyObject')->find(5);
Si je veux afficher ensuite la valeur des champs, j'écris :
echo $chapitre->getId(); # pour avoir la valeur de l'id (ici:5)
echo $chapitre->getNom(); # pour avoir la valeur du nom (par ex : poire)
echo $chapitre->getInfos(); # vous avez compris ...

Bon ...
Maintenant, si on écrit :
echo $chapitre;  # seulement ..
on affiche alors : la valeur de l'ID (ici : 5)
Car Symfony affiche la valeur de l'ID par défaut ...

De ce fait ...
On a un lien écrit ainsi :
link_to("Aller au chapitre",'chapitre/show?id'.$chapitre->getId());
qui donne le lien : monsite/chapitre/show?id=5
Pour simplifier - et parce qu'on connaît Symfony - on a écrit :
link_to("Aller au chapitre",'chapitre/show?id'.$chapitre);

Que se passe t'il alors ?
- Si on N'A PAS redéfini __toString : le lien est valide
- Si on A redéfini __toString comme ci-dessus, on obtient le lien : monsite/chapitre/show?id=poire
... ce qui mène évidemment à une page 404 :-((

Conclusion :
Si on a redéfini la méthode __toString, bien vérifier que l'on a utilisé les formes longues dans nos valeurs (= $chapitre->getId() et non $chapitre tout court)

0 commentaires: