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

ORM PHP Discussion :

[AdminGenerator] affichage dans filtres et champs du backend


Sujet :

ORM PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut [AdminGenerator] affichage dans filtres et champs du backend
    Bonjour à tous,

    Mon site avance bien mais j'ai encore quelques soucis.
    A savoir que j'ai généré un module d'administration dans mon backend permettant d'ajouter, editer, supprimer des objets du catalogue.

    J'ai un petit problème dans mes champs qui ont une relation sur mon schema.yml! En effet, par exemple pour le champs index_marque il m'affiche un select qui a pour option les champs descriptions de ma table marque. J'ai modifié pour qu'au lieu d'afficher la description, il m'affiche le nom de la marque à l'aide de la fonction __toString.

    Cependant pour le champs index gamme j'ai un champs input texte. Je souhaiterais avoir un select avec les options correspondant à ma gamme

    Pour mieux vous éclairer, voici un apercu de mon schema.yml:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    Catalogue:
      connection: doctrine
      tableName: catalogue
      actAs:
        Commentable:
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        index_famille:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          default: '0'
          notnull: true
          autoincrement: false
        designation:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        index_marque:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          default: '0'
          notnull: true
          autoincrement: false
      relations:
        JointuresGammes:
          local: id
          foreign: index_catalogue
          type: many
     
    Gammes:
      connection: doctrine
      tableName: gammes
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        intitule:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        description:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        JointuresGammes:
          local: id
          foreign: index_gamme
          type: many
     
    JointuresGammes:
      connection: doctrine
      tableName: jointures_gammes
      columns:
        index_catalogue:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        index_gamme:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        Catalogue:
          local: index_catalogue
          foreign: id
          type: one
        Gammes:
          local: index_gamme
          foreign: id
          type: one
    Par exemple j'aimerai avoir dans les options le champs intitule de ma table gammes.
    Est-ce faisable?
    Si oui comment: _toString sur quelle table??

    Merci

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Ton shema ne correspond à aucune des normes recommandées par symfony pour un shema doctrine (majuscule, "s" intempestif, relation a redéfinir, nom des champs de liaison, option par défaut à supprimer,...).

    Commence par le nettoyer et le compléter.

    A priori, tu as une liaison n-n entre catalogue et gammes mais elle n'est pas définie suivant les normes doctrine.

    Une fois ton shema.yml correctement mis en place et généré, tu ne devrais plus avoir de problèmes pour générer ce que tu veux.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Ton shema ne correspond à aucune des normes recommandées par symfony pour un shema doctrine (majuscule, "s" intempestif, relation a redéfinir, nom des champs de liaison, option par défaut à supprimer,...).
    J'ai construit mon schema en m'aidant du tuto Jobeet de Symfony:
    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
    JobeetJob:
      actAs: { Timestampable: ~ }
      columns:
        category_id:  { type: integer, notnull: true }
        type:         { type: string(255) }
        company:      { type: string(255), notnull: true }
        logo:         { type: string(255) }
        url:          { type: string(255) }
        position:     { type: string(255), notnull: true }
        location:     { type: string(255), notnull: true }
        description:  { type: string(4000), notnull: true }
        how_to_apply: { type: string(4000), notnull: true }
        token:        { type: string(255), notnull: true, unique: true }
        is_public:    { type: boolean, notnull: true, default: 1 }
        is_activated: { type: boolean, notnull: true, default: 0 }
        email:        { type: string(255), notnull: true }
        expires_at:   { type: timestamp, notnull: true }
      relations:
        JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
    Il y a bien une majuscule pour le nom du model, des champs qui contiennent une option default.
    En ce qui concerne le nom des champs de liaison, je ne peux pas les modifier puisque dans mon cahier des charge on m'a clairement signifié que je devais m'appuyer sur une base de données déjà existante et ne pas en modifier les champs.
    Je peux effectivement supprimer des "s" intempestifs et redefinir d'une meilleure manière les relations. Je pensais pourtant qu'elles étaient bonnes. Comment puis-je les arranger??

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Avec un peu de rechercher tu aurais trouvé plusieurs articles où j'en parle, je t'invite à le faire pour comprendre les modifications que je te suggère ici.

    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
     
    catalogue:
      actAs:
        Commentable:
      columns:
        famille_id:  #pas défini ici...
          type: integer
          default: '0'
          notnull: true
        designation:  string(255)
        marque_id: #pas défini ici
          type: integer
          default: '0'
          notnull: true
      relations:
        gammes:
          class: gamme
          refClass: JointuresGamme
          foreignAlias: catalogues
     
    gamme:
      columns:
        intitule:   string()
        description:     string()
     
    jointuresGamme:
      connection: doctrine
      tableName: jointures_gammes
      columns:
        catalogue_id:
          type: integer
          primary: true
        gamme_id:
          type: integer
          primary: true
      relations:
        Catalogue:
          foreignAlias: jointuresGammes
        Gamme:
          foreignAlias: jointuresGammes
    Pas testé, vu qu'il manque des tables dans ton exemple.

    En s'inspirant de cela et de ce que tu vas trouver avec chercher, tu devrais pouvoir corriger le reste.

    Poste le tous si tu veux une relecture. (dans la soirée, pas avant)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Merci Michel. J'aimerai cependant avoir quelques éclaircicements:
    • dans ce que tu me proposes, tu ne définis pas le local et foreign je suppose que je dois garder quand même ceux que j'ai mis??
    • concernant ce qu'il faut mettre pour les relations:prenons un exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      groupsGammes: # (1)
            class: # (2)
            local: # (3)
            foreign: # (4)
            refClass: # (5)
            foreignAlias: # (6)
      (1): ceci est le "titre" de ma relation
      (2): ceci est mon moyen d'appeler ma relation. Par exemple si j'ai class: lambda je dois faire getLambda()->...
      (3): ceci est le champs sur lequel porte la relation dans ma table où cette relation est définie
      (4): ceci est le champs sur lequel porte ma relation sur la table étrangère
      (5): ceci est la class de ma deuxieme table liée
      (6): ceci est l'alias me permettant d'utiliser ma relation depuis ma seconde table


    Est-on d'accord sur les termes, afin que j'épure mon fichier schema.yml??

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Citation Envoyé par babyboy6492 Voir le message
    concernant ce qu'il faut mettre pour les relations:prenons un exemple :
    • (1) C'est le nom de la relation vu du côté de la table où elle est définie. C'est donc, généralement le nom de l'autre table.
    • (2)(défaut : le nom de la relation) c'est le nom de la classe (nom de la table) qui doit être lié. A n'utiliser que si (1) est différent du nom de la classe (nom de la table)
    • (3)(defaut : id) c'est le nom du champ de la table source à utiliser, si le champ est id, il n'est pas utile de le mettre.
    • (4)(defaut : <nomDeLaRelation>_id ) c'est le nom du champ de l'autre côté de la relation, si le champ est nommé correctement, il n'est pas utile de le mettre.
    • (5)(defaut : null ) ne s'utilise QUE pour la mise en place d'un lien n-n utilisant d'une manière transparente la table de liaison. Ne s'utilise jamais dans une relation 1-n ou 1-1.
    • (6)C'est le nom de la relation vu depuis l'autre table l'inverse de (1). Généralement, pour une relation 1-n correctement définie, c'est un nom au pluriel, pour indiquer qu'il retourne un doctrine_collection.


    Je suis d'accord avec mes termes

    Toujours construire la relation depuis le côté n de la relation 1-n

    Ne pas renseigner les données par défaut pour ne pas surcharger le schema (c'est surtout pour la lisibilité, doctrine, lui, s'en fout).

    Il existe d'autres paramètres, moins utilisé, dans les relations, il faudrait vraiment que je fasse un billet là dessus.

    Ne jamais définir une relation sur les deux côtés de la relation, au risque d'avoir un truc qui ne marche absolument pas.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Alors voila ce que j'ai: j'ai essayé de m'inspirer du fichier schema.yml de sfGuardPlugin (avec les permissions qui sont gérer par rapport à un groupe ou une permission singulière eux-même ratachés à un utilisateur) et de ce que tu m'as dit Michel.
    J'ai surement encore des erreurs qui vont te grisonner ("s" et majuscules intempestifs), mais je te soumets une partie de mon schema.yml quand même:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Catalogue:
      connection: doctrine
      tableName: catalogue
      actAs:
        Commentable:
      columns:
        index_famille:
          type: integer(4)
          default: '0'
          notnull: true
        designation: string(255)
        index_marque:
          type: integer(4)
          default: '0'
          notnull: true
      relations:
        gammes:
          class: Gammes
          local: index_catalogue
          foreign: index_gamme
          refClass: JointuresGammes
          foreignAlias: Catalogues
        Categorie:
          local: index_famille
          foreign: index_categorie
          type: many
        Marque:
          local: index_marque
          foreign: id
          type: many
    Constituants:
      connection: doctrine
      tableName: constituants
      columns:
        index_catalogue:
          type: integer(4)
          default: '0'
          notnull: true
        index_secondaire:
          type: integer(4)
          default: '0'
          notnull: true
      relations:
        Catalogue:
          local: index_secondaire
          foreign: id
          type: one
    Gammes:
      connection: doctrine
      tableName: gammes
      columns:
        intitule: string()
        description: string()
        index_resp_log:
          type: integer(4)
          default: '0'
          notnull: true
    JointuresGammes:
      connection: doctrine
      tableName: jointures_gammes
      columns:
        index_catalogue:
          type: integer(4)
          primary: true
        index_gamme:
          type: integer(4)
          primary: true
      relations:
        Catalogue:
          local: index_catalogue
          foreign: id
          onDelete: CASCADE
        Gammes:
          local: index_gamme
          foreign: id
          onDelete: CASCADE
    Marque:
      connection: doctrine
      tableName: marque
      actAs:
        Commentable:
      columns:
        constructeur:
          type: string(20)
          fixed: true
          notnull: true
        logo: string(255)
        description:
          type: string()
          notnull: true
      relations:
        Catalogue:
          local: id
          foreign: index_marque
          type: one
    Qu'en penses-tu??

  8. #8
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    • Majuscules intempestives... ex : Catalogue --> catalogue
    • Nom des champs de liaison. ex : index_famille --> famille_id
    • Pas de nom de table qui termine par un "s". ex : gammes --> gamme
    • Pas de valeurs par défaut.
    • Dans relations, la relation est, par défaut en 1-n, d'où le "type: one" ne sert à rien.


    J'ai un peu l'impression de me répéter et de retrouver des corrections que j'ai apporté quant j'ai pris le temps de réécrire ton schéma qui ont disparues dans ta version.

    Dans "Aides-toi et développez.net t'aidera", il y a l'idée de s'aider... et de profiter des réponses précédentes pour améliorer sa réflexion. Reprends ton schéma à la lumière des modifications que j'ai déjà suggérée et on en reparle.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    • Majuscules intempestives... ex : Catalogue --> catalogue
    • Nom des champs de liaison. ex : index_famille --> famille_id
    • Pas de nom de table qui termine par un "s". ex : gammes --> gamme
    • Pas de valeurs par défaut.
    Bonjour Michel,

    Par rapport à tes remarques, je veux bien les prendre en compte mais le soucis c'est que je suis obligé de partir d'une base de données existante à laquelle je n'ai pas le droit de toucher sur mon projet. Ainsi j'ai du faire un build-schema et non pas construire mon schema pour générer mes tables.
    Du coup, je ne peux pas modifier les noms des tables pour enlever les s, je ne peux pas modifier le nom des champs pour les renommer d'une meilleure manière et je ne peux pas modifier leur structure pour enlever les valeurs par défaut.

    C'erst un peu mon souci, sinon crois-moi bien que je ferais le ménage car il existe aussi des champs que je montre pas mais qui serve à rien et que j'aurais bien envie de supprimer ou renommer...
    Je suis un peu obligé de faire du "bricolage". Je m'excuse pour le fait que je ne puisse prendre en compte toutes tes suggestions et crois-moi bien que j'en suis le premier désolé.

    Sinon j'ai réussit à avancer en surchargeant mon formulaire et ma methode pour enregistrer un objet catalogue de la maniere suivante:
    catalogueForm.class.php:
    Code php : 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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?php
      public function configure()
      {
    	  $this->setWidgets(array(
    	   'jointure_gammes'    => new sfWidgetFormDoctrineChoice(array('model' => 'Gammes', 'add_empty' => false, 'multiple' => true)),
    	  ));
     
    	      $this->setValidators(array(
         'jointure_gammes'    => new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'Gammes', 'required' => true)),
        ));
     
    	$this->widgetSchema->setNameFormat('catalogue[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
      }
     
      public function updateDefaultsFromObject()
      {
        parent::updateDefaultsFromObject();
     
        if (isset($this->widgetSchema['jointure_gammes']))
        {
          $this->setDefault('jointures_gammes', $this->object->gammes->getPrimaryKeys());
        }
      }
     
     
      protected function doSave($con = null)
      {
        $this->savegammesList($con);
     
        parent::doSave($con);
      }
     
      public function savegammesList($con = null)
      {
        if (!$this->isValid())
        {
          throw $this->getErrorSchema();
        }
     
        if (!isset($this->widgetSchema['jointure_gammes']))
        {
          // somebody has unset this widget
          return;
        }
     
        if (null === $con)
        {
          $con = $this->getConnection();
        }
     
        $existing = $this->object->gammes->getPrimaryKeys();
        $values = $this->getValue('jointure_gammes');
        if (!is_array($values))
        {
          $values = array();
        }
     
        $unlink = array_diff($existing, $values);
        if (count($unlink))
        {
          $this->object->unlink('gammes', array_values($unlink));
        }
     
        $link = array_diff($values, $existing);
        if (count($link))
        {
          $this->object->link('gammes', array_values($link));
        }
      }

    Méthode qui fonctionne correctement lors de l'ajout d'un objet. Mon seul souci maintenant est que les gammes choisie ne sont pas par défaut selectionnées lors de l'édition de l'objet catalogue...

  10. #10
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Pour le schéma, le fait que tu partes d'un existant non modifiable change, pour le moins, les données du problème.

    Tu peux récupérer ton schéma, le modifier, changer le nom des objets sans pour autant modifier le nom des champs et régénérer ton schéma (objet, sans réinjection sql). Par contre, au niveau des relations, tu seras, hélas, limité par ce qui existe, et ce que doctrine en comprend...

    Pour les valeurs par défauts, je suis désolé, mais à la relecture, je trouves mon message sujet à erreur, et ta réaction, justifiée, me le confirme. Dans mon esprit, les valeurs par défaut sont celles que doctrine donne à des propriétés, il n'est pas, par exemple, nécessaire de préciser "autoincremant: false" alors qu'il est toujours à false, sauf si on le met à true. Par contre, les valeurs par défaut données aux champs à l'aide de "default: xxx" est, elle, très pertinente.


    Pour ton problème.

    Ton code me semble correcte.

    Je pense que l'erreur vient non pas de ce code, mais de la liaison de l'objet form avec l'objet du modèle dans le contrôleur. La valeur enregistrée n'est probablement pas correctement transmise ou pas comme le form l'attend, ce qui empêche la récupération de la valeur, et donc, ca transition au widget de liste.

    Essayes de faire une introspection de l'objet du modèle que tu transmets dans ton contrôleur, au pire avec un "méchant" print_r.

Discussions similaires

  1. Left join, champ null et affichage dans etat
    Par catoucat dans le forum Access
    Réponses: 3
    Dernier message: 03/07/2006, 02h58
  2. [Tableaux] affichage dans un champ est tronqué
    Par harlock59 dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2006, 21h39
  3. [JTextField] Problème d'affichage dans un champ ...
    Par mitje dans le forum Composants
    Réponses: 2
    Dernier message: 01/02/2006, 15h41
  4. Verifier un champ a l affichage dans un etat
    Par virtuose dans le forum Access
    Réponses: 5
    Dernier message: 19/01/2006, 18h18
  5. Réponses: 9
    Dernier message: 09/01/2006, 12h10

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