- 1
[Opened] Extension d'objet
Posted by Zagor on 08/28/2006 23:20
Voici un code simple qui me permet de récupérer un enregistrement de ma base de données
$dao = jDao::get('cartes');
$carte = $dao->get($this->getParam('id'));
Mais je souhaite étendre des propriétés/méthodes de l'objet $carte avec une fonction ayant pour fonction de réaliser une concation de chaine
function type() {
$type = $this->typeA;
$type .= " et ".$this->typeB;
return $type;
}
Mais je ne vois pas ou ne sais pas comment je peux accroitre les propriétés/méthode d'une objet jDao créé pad jélix.
PS : le bug sur DISTINCT existe toujours
<factory>
<method name="findNomByCiv" type="select" distinct="nom">
<parameter name="civ" />
<conditions>
<eq property="civilisation" expr="$civ" />
</conditions>
<order>
<orderitem property="nom" way="asc" />
</order>
</method>
</factory>
Avec ceci le distinct se fait sur l'ensemble des champs de la base et non pas uniquement sur nom.
[Opened] Re: Extension d'objet
Posted by laurentj on 08/29/2006 10:42
Tu peux ajouter des méthodes, mais uniquement au niveau de la factory, avec une méthode type="php", avec balises <parameter> éventuellement, et une balise <body> contenant le code php que tu veux à encadrer dans un CDATA pour éviter les problèmes xml.
Donc ça reviendra à faire :
$type = $dao->type($carte);
et
<method name="type" type="php"> <parameter name="record" /> <body><![CDATA[ return $record->typeA.' et '.$record->typeB; ]]></body> </method>
Pour le moment, on ne peut pas étendre l'objet record. Ce qui pourrait être utile effectivement. Poste une feature request pour répertorier cette idée : https://developer.berlios.de/feature/?gr(..)
PS : Les bugs sont à indiquer dans https://developer.berlios.de/bugs/?group(..) , pour pas que j'oublie de les corriger ;-)
[Opened] Re: Extension d'objet
Posted by laurentj on 08/29/2006 23:43
Au contraire, encapsuler dans un objet métier/service, c'est bien, puisque ça peut simplifier une API, et la façon dont tu l'as fais, cela permet de modifier des trucs sur les records sans qu'on s'en aperçoive de l'exterieur de l'objet metier. Voir même de faire evoluer plus tard la machinerie de l'objet métier sans chambouler sont api (imaginons par exemple que, plus tard, l'objet métier ne se base plus sur des daos, mais sur des services web, ou des fichiers ou autre..)
Par contre, tu n'es pas allé jusqu'au bout de l'idée. Il faudrait plutôt avoir un truc comme ça pour ton premier exemple :
$post = new Post($post_record); if ($post->canPublish()) { $post->setStatus('online'); }
Ainsi là on ne voit plus l'objet record. On n'a plus à s'en préoccuper (sauf éventuellement à le récupérer pour le passer à un template par exemple..)
PS : d'ailleurs, les classe jAcl* et jAuth* dans lib/jelix/ ne sont ni plus ni moins que des classes métiers/services...
- 1