IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

class model comme doctrine 1


Sujet :

Doctrine2 PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut class model comme doctrine 1
    Comment faire pour avoir la même chose que doctrine1 sur 'getCalculChiffreTotal':

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($client->getFactures() as $facture{
        $facture->getCalculChiffreTotal();
    }
    La fonction $facture->getCalculChiffreTotal() fait une requête avant d'afficher le chiffre.
    Comment faire avec doctrine 2 et/ou si il existe une autre solution ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Ca depend.
    Disons pour l explication que les elements de la facture sont des produits.

    - Si $facture contient les $produits qui la compose (tu les as mis dans le join lors de ta requete).
    Pas de requete supplementaire, tu peux recalculer le total directement en bouclant sur ton entité.
    Vu que tu veux tous les totaux, cette solution me semble bien.

    - Si $facture ne contient pas les $produits qui la compose (tu les as mis dans le join).
    Si tu dois faire une requete pour recuperer la valeur au moment de l appel de getCalculChiffreTotal, il faut alors faire appel au repository.

    Ici, on explique comment faire un repository personnalisé:
    http://www.doctrine-project.org/docs...m-repositories

    Tu crees alors une fonction personnalisée qui recuperera le chiffre total.
    Et tu appeleras cette fonction comme ci depuis le controlleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($client->getFactures() as $facture{
      $this->getDoctrine()->getRepositories("MonBundle:Facture")->getCalculChiffreTotal( $facture->getId() );
    }


    Mais la premiere solution me semble mieux... tu recuperes tout d un coup: factures, produits,... en esperant que tu ne veuilles pas faire ceci pour 1000 factures!

    Cependant:
    Une solution vraiment top serait de stocker le total dans $facture.... ainsi tu dois le recalculer uniquement si la facture est modifiée. Ce qui est vraiment beaucoup mieux!

  3. #3
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    Merci pour cette réponse ultra rapide !!
    Donc on est obligé de redéfinir une requête car elles ne sont plus lié à l'objet initiale.

    SUITE:
    Je n'utilise pas TWIG pour la vue mais PHP (pour des raisons de complexité des conditions... plein de if et autre):
    Le code indiqué n'est pas possible dans index.html.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getDoctrine()->getRepositories("MonBundle:Facture")->getCalculChiffreTotal( $facture->getId()
    Comment puis-je correctement procédé?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Twig n'est pas obligatoire, mais l'utilisation des Controlleurs l'est

  5. #5
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    RapotOR,

    mon problème est que ma vue possède beaucoup de conditions et que la configuration de sf2 reste flou sur les meilleurs possibilité de codage par rapport à sf1.

    un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //index.html.php
    if($client){
        if(!$client->getAdressId()){
            $plateforme_adresse = $this->getDoctrine()->getRepositories("MonBundle:Client")->getRecherchePlateformeClient($client->getId())
            if($plateforme_adresse){
                echo 'Adresse (générique): '. $plateforme_adresse->getVille().' '.$plateforme_adresse->getCp();        
            }
            else {
                 echo 'Adresse inconnue: ';
            }
        }
        else{
                $adresse = $client->getAdresse();
                echo 'Adresse (réelle): '. $adresse->getVille().' '.$adresse->getCp();
        }
    }
    La fonction ...->getRecherchePlateformeAdresse() fait une requête précise,
    mais comme on est dans la vue... c pas possible avec ce code (a mois d'une solution),

    Suis-je obligé de faire un pre-traitement dans mon action et mettre les résultats dans un tableau ? (mais sa me force à réécrire les conditions 2 fois; dans l'action et la vue)

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Houla! L'appel aux repositories, etc...
    Tout ca c'est de la logique, ca doit etre en controlleur (sans les echos)!

    Dans la vue; tu dois vraiment avoir le display final avec les variables envoyées par le controlleur.

    Tu ne dois pas faire de IF deux fois!
    Ton controlleur va renvoyer une adresse (peu importe d'ou elle sort) à la vue.
    La vue va afficher => la ligne echo.

    Ca donnerait dans l'action du controlleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $adresse = false;
    if($client){
        if(!$client->getAdressId()){
            $adresse = $this->getDoctrine()->getRepositories("MonBundle:Client")->getRecherchePlateformeClient($client->getId())
        }
        else{
                $adresse = $client->getAdresse();
        }
    }
    return array('adresse' => $adresse); // ici il y a une adresse... du client ou pas, on s'en fou!
    Dans la vue; tu affiches adresse si existant.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    pas de soucit , j'aurais fait comme toi si j'avais juste sa a afficher.

    Mon problème est que je trouves toujours des exemples ou ta logique peut s'appliquer. Cependant lorsque g des boucles et des if imbriqués, qu'elle est la meilleur méthode:

    un autre exemple de sf1 à convertir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
            <?php $site_web_langs = $site_web->getSiteWebLangs(); ?>
            <?php if($site_web_langs): ?>
                <?php foreach($site_web_langs as $lang): ?>
                    <tr>
                        <td align="center" bgcolor="#f4f3f0"><img src="/img/drapeau/32/<?php echo $lang->getname_iso() ?>.png" alt="<?php echo $lang->getname_iso() ?>" border="0" alt="img_<?php echo $lang->getname_iso() ?>"></td>
                        <?php foreach($swprts as $swprt_id => $swprt)  ?>
                        <?php $root = $site_web->getSiteWebPageRootOneByTypeAndLang($swprt_id, $lang->getid()) ?>
                        <?php if($root): ?>
                            <?php $domaine_affichage = $root->getDomainePageRootAffichage() ?>
                            <td align="center">
                                <?php echo $domaine_affichage['url'] ?>
                                <br/>
                                <a href="http://www.<?php echo $domaine_affichage['url'] ?>">éditer</a>
                            </td>
                        <?php else: ?>
                            <td align="center"><img src="/img/edition/unavail2.png" border="0"></td>
                        <?php endif ?>
                    </tr>
                <?php endforeach ?>
            <?php else: ?>
                <tr>
                    <td align="center"><img src="/img/edition/unavail2.png" border="0"></td>
                </tr>
            <?php endif ?>
    regarde la ligne 7 et 9, avant avec sf1 on pouvais imbriquer des requêtes autres que la jointure directe (comme la ligne 1)

    On ne peut plus faire avec l'objet client par exemple:
    $client->getREQUETEAPARTIRDELENREGISTREMENTCLIENT()
    alors comment expliquer que les requêtes sont possibles avec les jointures comme $client->getAdresse() (D'ailleurs on ne peut plus récrire les requêtes de jointures).

    Je cherche un exemple concret autre que simple pour comprendre la logique et réécrire mes fonctions xxxxxActions() le mieux possible.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    C'est quoi le but de convertir du code SF1 vers SF2 ?
    Si tu veux faire ca facilement et rapidement c'est impossible, si tu veux faire ca bien, le mieux est l'utilisation de Twig et d'apprendre par le début l'utilisation de Symfony2 et Doctrine2.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    j'ai déjà bien commence, g même fait un générateur d'annotation avec les écritures de jointures automatiques par rapport à une base mysql.
    G une base de 180 tables, donc g t un peu obligé.

    Qu'elle est la meilleur méthode pour écrire mon action qui imbrique beaucoup de conditions et de requêtes et l'afficher; car si je suis la logique de doctrine2, je vais avoir 3 km de code par rapport à doctrine1.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Tu n'as pas répondu à ma question, pourquoi cette transformation du code ?
    Et je ne comprends toujours ton problème

  11. #11
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    ok j'explique

    Dans d1 et d2,
    nous avons la possibilité de faire suivre l'enregistrement de l'objet par la jointure:
    exemple: $client->getAdresse()->getCp()
    - doctrine1: permet de modifier si besoin la requête de la jointure, pour, par exemple, l'améliorer et la mettre dans le cache APC (ajout de..->useResultQuery(true, 3600)...
    - doctrine2: je sais pas comment optimisé la requête de jointure par l'objet.

    doctrine1 fait également suivre des requêtes personnalisé par la jointure (déclaré dans model\client.class.php):
    $client->getAdresseValid()
    se qui a l'inconvénient d'alourdir légèrement le model mais de rendre le code php court dans les gros traitements et donc compréhensible.

    avec doctrine2, on ne peut plus faire suivre des requêtes dans le model mais uniquement celles autorises par les jointures.
    exemple:
    $client->getAdresse() ok
    $client->getAdresseValid() non (a)


    Alors avant on utilisé les fichiers:
    client.class.php et clientTable.class.php pour faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
           <?php $site_web_langs = $site_web->getSiteWebLangs(); ?>
            <?php if($site_web_langs): ?>
                <?php foreach($site_web_langs as $lang): ?>
                    <tr>
                        <td align="center" bgcolor="#f4f3f0"><img src="/img/drapeau/32/<?php echo $lang->getname_iso() ?>.png" alt="<?php echo $lang->getname_iso() ?>" border="0" alt="img_<?php echo $lang->getname_iso() ?>"></td>
                        <?php foreach($swprts as $swprt_id => $swprt)  ?>
                        <?php $root = $site_web->getSiteWebPageRootOneByTypeAndLang($swprt_id, $lang->getid()) ?>
                        <?php if($root): ?>
                            <?php $domaine_affichage = $root->getDomainePageRootAffichage() ?>
                            <td align="center">
                                <?php echo $domaine_affichage['url'] ?>
                                <br/>
                                <a href="http://www.<?php echo $domaine_affichage['url'] ?>">éditer</a>
                            </td>
                        <?php else: ?>
                            <td align="center"><img src="/img/edition/unavail2.png" border="0"></td>
                        <?php endif ?>
                    </tr>
                <?php endforeach ?>
            <?php else: ?>
                <tr>
                    <td align="center"><img src="/img/edition/unavail2.png" border="0"></td>
                </tr>
            <?php endif ?>
    Donc
    si je veux traiter le code ci-dessus comme sf2, il va falloir que je face une variable tableau avec toutes les conditions dedans.... puis refaire pareil dans la vue pour afficher le tableau.

    si c comme sa qu'il faut que je face, y a pas de soucit, mais je veux en être sur que doctrine2 ne permette plus d'agrémenter les objet à partir d'un enregistrement comme celui-ci: $client->getAdresseValid().
    d'ailleurs c bete puisqu'il le fait avec les jointures.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/07/2010, 19h38
  2. Réponses: 12
    Dernier message: 19/04/2010, 08h40
  3. classe parent comme écouteur
    Par toto44000 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 24/07/2007, 11h50
  4. Réponses: 1
    Dernier message: 20/10/2006, 12h23
  5. cherche model comme "TOP 10" !
    Par ada_b dans le forum SQL
    Réponses: 6
    Dernier message: 12/12/2004, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo