Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-05-2009 19:21:06

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

[zf 1.7] logique metier

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

 

#2 17-05-2009 21:58:53

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

je me permets de mettre un compément à ma question car aller au code est plus simple /
ma classe modele :

Code:

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 :

Code:

$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

 

#3 17-05-2009 22:26:25

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [zf 1.7] logique metier

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

Code:

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

Code:

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

 

#4 18-05-2009 05:00:09

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

merci beaucoup je vais voir ça tout à l'heure au boulot (enfin stage )et je n'oublirais pas le 

Code:

à + manu

Hors ligne

 

#5 18-05-2009 09:10:45

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

re-bonjour,
j'ai repris la classe row et ajouté les fonctions :

Code:

 
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 :

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 :

Code:

    $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

 

#6 18-05-2009 12:06:38

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

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

 

#7 18-05-2009 15:47:06

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

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

 

#8 18-05-2009 16:40:28

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [zf 1.7] logique metier

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

 

#9 19-05-2009 07:25:19

manu32320
Membre
Date d'inscription: 29-04-2009
Messages: 17

Re: [zf 1.7] logique metier

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages