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

Zend Framework PHP Discussion :

classe étendant Zend_Db_Table_Abstract


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut classe étendant Zend_Db_Table_Abstract
    Bonjours,

    Je suis en pleine reflexion, et j'essaye de comprendre comment fonctionne la gestion de la base de donné.

    Chaque table doit avoir sa classe étendant Zend_Db_Table_Abstract, comme décrit dans Définir une classe de Table.
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
        class Accounts extends Zend_Db_Table_Abstract
        {
            protected $_name            = 'accounts';
            protected $_dependentTables = array('Bugs');
        }
     
        class Products extends Zend_Db_Table_Abstract
        {
            protected $_name            = 'products';
            protected $_dependentTables = array('BugsProducts');
        }
     
        class Bugs extends Zend_Db_Table_Abstract
        {
            protected $_name            = 'bugs';
     
            protected $_dependentTables = array('BugsProducts');
     
            protected $_referenceMap    = array(
                'Reporter' => array(
                    'columns'           => 'reported_by',
                    'refTableClass'     => 'Accounts',
                    'refColumns'        => 'account_name'
                ),
                'Engineer' => array(
                    'columns'           => 'assigned_to',
                    'refTableClass'     => 'Accounts',
                    'refColumns'        => 'account_name'
                ),
                'Verifier' => array(
                    'columns'           => array('verified_by'),
                    'refTableClass'     => 'Accounts',
                    'refColumns'        => array('account_name')
                )
            );
        }
     
        class BugsProducts extends Zend_Db_Table_Abstract
        {
            protected $_name = 'bugs_products';
     
            protected $_referenceMap    = array(
                'Bug' => array(
                    'columns'           => array('bug_id'),
                    'refTableClass'     => 'Bugs',
                    'refColumns'        => array('bug_id')
                ),
                'Product' => array(
                    'columns'           => array('product_id'),
                    'refTableClass'     => 'Products',
                    'refColumns'        => array('product_id')
                )
            );
     
        }
    A part protected $_name = 'accounts'; qui sert a definir le nom de la table.
    Et si on met rien le nom de la classe et prise comme nom de classe.

    Vous pourriez m'expliquer a quoi sert le reste ?

    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Pour la version longue, il faut aller du côté de la doc : http://framework.zend.com/manual/en/...tionships.html

    Pour la version courte $_dependentTables est un tableau des classes (important : c'est le nom de la classe qu'il faut mettre ici, pas de la table) qui sont "dépendantes" de la table que tu définis.

    Par exemple, comme il y a une clé étrangère vers la table accounts dans bugs, Bugs apparaît dans le tableau $_dependentTables de la table Accounts.

    Ca permet de récupérer les objets dépend d'un Zend_Db_Table_Row via une méthode "magique" find*(), ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $table = new Accounts();
    $account = $table->find(1)->current();
    $bugs = $account->findBugs();
     
    foreach ($bugs as $bug) {
    // Do something with $bug
    }
    $_referenceMap permet de traiter "l'autre sens" de la relation : récupérer une row "parente". La syntaxe est plus compliquée car il faut donner un nom à la règle, nommer la table, la clé primaire dans la table parente et la clé étrangère dans la table dépendante.

    Par exemple, en définissant le $_referenceMap dans Bugs comme dans l'exemple, on peut accéder au compte utilisateur via une méthode "magique" findParent*().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $table = new Bugs();
    $bug = $table->find(1)->current();
    $account = $bug->findParentAccounts();
    Comme tu peux le voir dans la définition, il y a deux clés vers la table Accounts, et donc deux règles : Engineer et Reporter. La précédente façon de faire va prendre la règle "par défaut" (la première dans le tableau), mais on peut préciser quelle règle utiliser avec findParent*By*().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reporter = $bug->findParentAccountsByReporter();
    $engineer = $bug->findParentAccountsByEngineer();
    Reste plus que les relations ManyToMany qui sont permises avec des méthodes magiques find*Via*(). Exemple, retrouver les produits pour un bug :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $table = new Bugs();
    $bug = $table->find(1)->current();
    $products = $bug->findProductsViaBugsProducts();
    Comme mentionné dans la doc, ces méthodes "magiques" sont des alias vers des méthodes existantes (findDependentRowset, findParentRow et findManyToManyRowset) que tu peux préférer d'utiliser si tu les trouve plus parlantes.

    Si tu n'as à te rappeler que d'une chose de tout ça, c'est que chacune de ces méthodes entraine un appel à la base de données... Il faut donc s'en servir en connaissance de cause, et souvent avec parcimonie.

  3. #3
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut
    Ok donc pour bien comprendre tous sa je vais essayer de creer mon menu dynamique (recuperer les nom et url dans une BDD) etape par etape en m'inspirant de votre experience et assayer de prendre de bonne habitude

    Actuellement tu me parles de plein de chose et je suis pas encore apte a comprendre.

    Donc pour mon menu voici la table (provisoire, et simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Structure :
    id : incrementer
    ##############
    # ID # name # url  #
    ##############
    --Contenu--
    ##############
    #  1 # lien 1 # lien #                       #
    ##############

    Pour expliquer ma configuration voci un petit resumer :
    - Utilisation d'un layout (APPLICATION_ROOT / layouts / scripts / layout.phtml)

    Dans layout.phtml j'inclus la page (APPLICATION_ROOT / modules / default / views / scripts / template / top / menu / menu.phtml)

    Donc si vous comprenez bien menu.phtml contien mon menu qui va etre dynamique.

    Premierement je commence par quoi ?

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    En toute honnêteté, je ne pense pas que commencer par un menu dynamique soit la façon la plus simple de commencer à utiliser Zend_Db : des exemples simples de CRUD permettront de débuter plus sereinement, en ajoutant petit à petit des relations et des formulaires plus complexes.

    Si vraiment le menu est une priorité, je ferais comme ça :
    - Exécuter une requête pour ramener tous les éléments de la table.
    - Transformer les données de la requête en un tableau (ou un Zend_Config) pouvant être lu par un objet Zend_Navigation.
    - Utiliser Zend_Navigation dans le layout pour afficher mon menu.

    Du reste, il faut que tu prennes le temps de lire la doc pour chaque module que tu veux utiliser (Zend_Db et Zend_Navigation...) et que tu n'hésites pas à jeter un oeil dans le source pour voir comment ça fonctionne, c'est une des (sinon la) meilleures façons de lever un doute ou de répondre à ses questions.

  5. #5
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut
    Vous parlez comme si je demandé de faire quelque chose d'ultra compliqué !

    Je rappel que justement j'ai le menu parcque iln'ya rien de plus simpls.

    En php normal se serai juste une petite boucle while qui liste tous.

Discussions similaires

  1. JScroll avec une classe étendant une JTable
    Par begre1929 dans le forum Composants
    Réponses: 4
    Dernier message: 22/12/2012, 18h41
  2. Réponses: 7
    Dernier message: 11/03/2010, 10h13
  3. Réponses: 6
    Dernier message: 08/08/2007, 17h38
  4. Réponses: 14
    Dernier message: 10/02/2007, 13h27
  5. Réponses: 31
    Dernier message: 30/03/2006, 16h57

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