Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour debutant en POO, php et zend ....voila ce qui me chagrine. je dev une appli qui devrait etre " l'image " d'un fichier exel je dis cela pour situer le nombre important de calcul . j'ai créer des tables suivant un shema classique genre : entete de facture, ligne de facture
les classes modeles idem . puis lorsque je ne suis interressé aux calculs j'ai repris des cours récents (trop ?) en me disant que ces calculs devaient etre dans les objets donc c'étaient la responsabilitée. je les ai donc mis dans mes classes modèles ....ais-je tord ?
deuxième question ce sont des fonctions public dans mon controlleur j'instancie ma table ( new) je fais un select pour avoir les enregistrements voulues, je transmet à la vue et là : undefin...fonction !
avez vous un exemple de code donc je puisse m'inspirer et conprendre la logique surtout pour ma formation
cordialement manu
Dernière modification par manu32320 (18-05-2009 15:37:56)
Hors ligne
je me permets de mettre un compément à ma question car aller au code est plus simple /
ma classe modele :
class TPropalmodele extends Zend_Db_Table_Abstract { /** * Nom de la table * * @var string */ protected $_name = 'propalmodele'; /** * Nom de la clé primaire * * @var string */ protected $_primary = array('idpropal','idmodele'); /** * Nom de la classe des enregistrements * * @var string */ protected $_rowClass = 'Dsi_Db_Table_Row'; /** * Nom de la classe des jeux d'enregistrements * * @var string */ protected $_rowsetClass = 'Dsi_Db_Table_Rowset'; public function prixachatcli(){ // prix achat client // $prixachat = prix achat dsi // $marge = marge locative $prixachat = $this->prixachatdsi(); $this->_db->setFetchMode(Zend_Db::FETCH_OBJ); $enreg = $this->_db->fetchAll("SELECT margeloc FROM propal WHERE idpropal = $this->idpropal"); $marge = $enreg->margeloc; $mnt = $prixachat / $marge ; return $mnt; }
dans mon controlleur j'essaie :
$propalmodeles = $this->_propalmodeleTable->find($un,$deux)->curent; $i = 0; $test= arra(); foreach ($propalmodeles as propalmodele) { $i++; $test[$i] = $propalmodele->prixachatdsi(); echo $test[$i]; }
propalmodeleTable est instancie au debut du controleur et le find fonctionne bien. maintenant j'essaie d'appeler les fonctions
de la classe Tpropalmodele pour passer les résultats a la vue . mais j'y arrive pas . là c'est le foreach qui fonctionne pas
sur un autre essai c'est fonction undefinie .....
un petit coup de pouce svp ?
manu
Dernière modification par Mr.MoOx (19-05-2009 08:49:19)
Hors ligne
utilise le bbcode [ code] c'est plus lisible
ta classe TPropalmodele représenta ta table propalmodele pas les éléments qu'elle contient
dans ta classe tu mets
protected $_rowClass = 'Dsi_Db_Table_Row';
donc les éléments que tu lis dans la table sont des instance de Dsi_Db_Table_Row
dans ton foreach tu manipules des Dsi_Db_Table_Row
foreach ($propalmodeles as propalmodele) { $i++; $test[$i] = $propalmodele->methodeDeLaClasseDsi_Db_Table_Row(); echo $test[$i]; }
si tu veux une méthode comme celle que tu as défini sur les row il te faut faire une classe row qui contient cette méthode
par principe je fais toujours deux classes même si elles n'ont rien de particulier
MyType_Table et MyType_Row la première représente la table qui enregistrera les instances de la seconde
La classe row ne fais souvent que dériver de la classe Row de ZF mais si j'ai besoin d'y ajouter une fonctionnalité elle est présente je n'ai rien d'autre à toucher.
A+JYT
Hors ligne
merci beaucoup je vais voir ça tout à l'heure au boulot (enfin stage )et je n'oublirais pas le
à + manu
Hors ligne
re-bonjour,
j'ai repris la classe row et ajouté les fonctions :
class Dsi_Db_Table_Rowpm extends Zend_Db_Table_Row_Abstract { /** * Activation / Désactivation de l'autosauvegarde à la destruction * * @var boolean */ private static $_autoSave = true; /** * Méthode de manipulation de l'autosauvegarde * * @param boolean $save * @return void */ public static function setAutoSave($save) { self::$_autoSave = (bool) $save; } /** * Sauvegarde les données dans le cache * * @return boolean */ public function saveToMemory() { $cache = Zend_Db_Table::getDefaultMetadataCache(); if (!$cache instanceof Zend_Cache_Core) { throw new Zend_Db_Table_Row_Exception('Pas de cache configuré'); } $cacheId = ''; foreach ($this->_primary as $primary) { $cacheId .= '_' . $this->$primary; } return $cache->save($this, $this->_tableClass . $cacheId); } /** * Sauvegarde automatiquement l'objet dans le cache si la sauvegarde est activée */ public function __destruct() { if (!self::$_autoSave || empty($this->_modifiedFields)) { return; } $this->saveToMemory(); } /** * Reconnecte automatiquement l'objet à sa table * * Appelé à la désérialisation de l'objet. */ public function __wakeup() { $this->setTable(new $this->_tableClass); } /* calcul dependant de cette classe */ public function prixachatcli(){ // prix achat client // $prixachat = prix achat dsi // $marge = marge locative $prixachat = $this->prixachatdsi(); $this->_db->setFetchMode(Zend_Db::FETCH_OBJ); $enreg = $this->_db->fetchAll("SELECT margeloc FROM propal WHERE idpropal = $this->idpropal"); $marge = $enreg->margeloc; $mnt = $prixachat / $marge ; return $mnt; }
dans la classe modele :
code :
<?php /** * * * @package application * @subpackage models */ class TPropalmodele extends Zend_Db_Table_Abstract { /** * Nom de la table * * @var string */ protected $_name = 'propalmodele'; /** * Nom de la clé primaire * * @var string */ protected $_primary = array('idpropal','idmodele'); /** * Nom de la classe des enregistrements * * @var string */ protected $_rowClass = 'Dsi_Db_Table_Rowpm';
et le controlleur :
$db->setFetchMode(Zend_Db::FETCH_OBJ); $propalmodeles = $db->fetchAll("SELECT * FROM propalmodeleList WHERE idpropal = '$idpropal'"); // $result est un tableau d'objets Zend_Debug::dump($propalmodeles, $label=null, $echo=true); //traitement metier pour transmettre à la vue : $i = 0; $test = array(); foreach ($propalmodeles as $propalmodele) { $i ++; Zend_Debug::dump($propalmodele, $label=null, $echo=true); $test[$i] = $propalmodele->prixachatcli(); echo $test[$i]; }
le resultat :
object(stdClass)#94 (9) {
["idpropal"] => string(2) "32"
["idmodele"] => string(2) "31"
["montantrachat"] => string(1) "0"
["nbcopienb"] => string(5) "10000"
["nbcopiec"] => string(5) "10000"
["prixcopienb"] => string(5) "0.006"
["prixcopiec"] => string(5) "0.007"
["qte"] => string(4) "6765"
["nom"] => string(7) "C7521DN"
}
Fatal error: Call to undefined method stdClass::prixachatcli() in C:\wamp\www\DSI-FM\application\controllers\PropalController.php on line 302
y-a-t-il une façon de connaitre, lister l'objet stdClass pour obtenir son type et méthode ?
manu
Hors ligne
resolu ; ouf, c'est pas l'objet mais l'objet dur dur....le blème tableau d'objet et pas objet d'où recherche méthode introuvable.
seul c'est pas facile.
Hors ligne
je croyais mon problème résolue car j'ai pu obtenirs le retour de ma fonctions (pardon méthode ) mais uniquement avec un fetchRow sur ma table modèle ou un find() donc a l'obtention d'un objet Dsi_Db_Table_Rowpm . sur un select
j'ai un objet select, sur fetchAll j'ai un autre objet si j'itère dessus je n'aurais qu'un objet row pas Dsi_Db_Table_Rowpm avec mes méthodes ...
je ne voie pas comment faire....
Hors ligne
je crois qu'il te faut serieusement lire la doc
tu défini une table et une classe pour les objet qui la contienne puis tu fais ton select sans utiliser la table donc tu ne remonte pas des objet de ta classe mais des objet de badse tu ne peux donc pas utiliser ses méthodes.
c'est pourtant pas si compliqué tu fais une classe Table une classe row tu associe la classe table et la classe row tu instancie ta classe table et tu lui demande les élément que tu veux elle va te donner des objet de ta classe row c'est tout
dans ton code tu créé les classes puis tu ne les utilise pas et tu fais un select sur la base tu ne peux donc pas accéder aux méthodes de tes classes
Je persiste à dire que mieux vaut lire un peu au départ plutôt que de faire n'importe quoi dans l'espoir que ça marche. on y perds beaucoup moins de temps ensuite.
A+JYT
Hors ligne
tu as bien raison sekaijin j'ai "levé" le pied hiers soir et reprendre doucement ....
merçi du conseil : la tête dans le guidon on pense plus bien
à + manu
Hors ligne