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

Symfony PHP Discussion :

filtre admin generator [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Par défaut filtre admin generator
    Bonjour à tous,
    j'ai un serieux probleme:
    - j'utilise deux bases de données sur un projet.
    - j'ai crée un module admin generator (pour une table de ma première base) pour avoir le filtre par defaut.
    - dans l'un des champs de cette table je stocke des id venant d'une table de la deuxieme base.
    - pour avoir les bons label dans mon filtre, j'ai fait ça dans le fichier lib/filter/xxxxfilter.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema['format'] = new sfWidgetFormDoctrineChoice(array('model'=>'Format','add_empty' => true));
    jusqu’à présent tout est correct ; dans mon filtre j'ai la bonne liste déroulante qui me ramène les infos venant de la table de la deuxième base.

    Le problème est que lorsque j'essaye de filtrer sur ce champ (contenant les infos de la table de la 2eme base), il n'effectue aucun tri dans la table concerne par le module (qui fait référence a une table de la 1ere base)

    Merci pour votre aide.

  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
    Toi au moins tu fais des trucs tordu et pas simple...

    Tu peux mettre ton shema ou un bout avec les deux bases et les tables concernées ?

    Ensuite le fichier de configuration du form pourrait servir.

    Je n'ai jamais tenté un truc pareille, aucune idée des possibilités de réalisation de la chose

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Par défaut
    je commençais à me sentir très seul sur ce forum!

    Voici les infos:

    schema de la table concerne par le module genere.Le champ qui contiendra les données venant de l'autre base est le champ "format"
    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
     
    Document:
      connection: baseclient
      tableName: document
      columns:
        id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        image:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        format:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        unite:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        modele_id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        langue_id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        visuel_id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        theme_campagne_id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Modele:
          local: modele_id
          foreign: id
          type: one
        Langue:
          local: langue_id
          foreign: id
          type: one
        Visuel:
          local: visuel_id
          foreign: id
          type: one
        ThemeCampagne:
          local: theme_campagne_id
          foreign: id
          type: one
        Creation:
          local: id
          foreign: document_id
          type: many
    le schema de la table format dans la deuxieme base (c'est l'id de cette table qui sera stocke dans la champ format cité ci-dessus)
    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
     
    PresseFormat:
      connection: basemedia
      tableName: presse_format
      columns:
        id:
          type: integer(11)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        colonne:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        hauteur:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        largeur:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        surface:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        PresseTarif:
          local: id
          foreign: presse_format_id
          type: many
    Maintenant le fichier de configuration du filtre du module generé a partir de la premiere table (document)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public function configure()
      {
          $this->widgetSchema['nom'] = new sfWidgetFormFilterInput(array
              ('with_empty' => false));
     
          $this->widgetSchema['format'] = new sfWidgetFormDoctrineChoice(array('model'=>'PresseFormat','add_empty' => true));
      }
    Après avoir fait tout ceci , mon filtre me donne bel et bien un champ format avec les données de la table "PresseFormat" et ayant pour "value" les id des champs concernés.
    Mais quand je filtre dessus rien ne se passe!!snif snif

  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
    Point 1, le modèle.

    Je pars du présupposé qu'il n'y a pas d'autre possibilité que d'utiliser deux bases.

    Par contre, la constitution des shema.yml n'est pas viable à terme. En effet, il semble (est certain ?) que tu aies créés les bases de données avant d'importer le schéma dans symfony. C'est la moins bonne méthode pour faire un shema.yml fonctionnel. Soit tes deux bases sont nouvelles et tu as out intérêt à écrire un shema.yml propre et viable et à les générer depuis, soit tes bases existent et il n'est pas envisageable de les régénérer et il faut alors retravailler le shema.yml pour qu'il colle aux bases et soit utilisable, ce qui est beaucoup plus lourd.

    Ton shema.yml tel que je l'aurais écris (du moins le partiel que tu as envoyé...

    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
     
    Document:
      connection: baseclient
      tableName: document
      columns:
        #l'id est auto généré s'il n'y a pas de clef primaire
        nom:  string(45)
        image:  string(255)
        format: string(45)
        unite: string(255)
        modele_id: 
          type : integer
          notnull: true
        langue_id:
          type: integer
          notnull: true
        visuel_id:
          type: integer)
          notnull: true
        theme_campagne_id:
          type: integer
          notnull: true
      relations:
        Modele:
          # les autres paramètres sont ceux par défaut (dans la mesure ou l'autre table s'appelle ici modele)
          foreignAlias: documents
          # a noter que l'alias de la relation sur la table modele est au pluriel, en effet, un modele
          # a ici plusieurs documents liés donc un Doctrine_Collection en retour, donc pas un Doctrine_Record
          # donc un "s" à documents pour l'indiquer.
        Langue:
          foreignAlias: documents
        Visuel:
          foreignAlias: documents
        ThemeCampagne:
          foreignAlias: documents
        # pour Creation: la relation sera décrite sur la table création.
        # Les relations sont décrites sur une seul des deux tables de la relation, normalement,
        # le côté n de la relation.
     
     
    PresseFormat:
      connection: basemedia
      tableName: presse_format
      columns:
        nom: string(255)
        colonne: string(45)
        hauteur: string(45)
        largeur: string(45)
        surface: string(45)
      relations:
        # A décrire sur l'autre côté : PresseTarif:
    Question, pourquoi le format est-il un string(45) dans la table document alors que le nom est un string(255) et n'est pas pour autant garanti unique dans le modèle ?

    Question, tu laisses entendre que tu veux stocker les id des PresseFormat, pourquoi dans une string ?

    Ton shema pourrait alors ressembler plutôt à 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Document:
      connection: baseclient
      tableName: document
      columns:
        nom:  string(45)
        image:  string(255)
        format_id: integer
        unite: string(255)
        modele_id: 
          type : integer
          notnull: true
        langue_id:
          type: integer
          notnull: true
        visuel_id:
          type: integer)
          notnull: true
        theme_campagne_id:
          type: integer
          notnull: true
      relations:
        Modele:
          foreignAlias: documents
        Langue:
          foreignAlias: documents
        Visuel:
          foreignAlias: documents
        Format:
          class: PresseFormat
          local: format_id # Ici on n'est pas sur les paramètres par défaut, il faut donc les préciser
          foreignAlias: documents
        ThemeCampagne:
          foreignAlias: documents
     
    PresseFormat:
      connection: basemedia
      tableName: presse_format
      columns:
        nom: string(255)
        colonne: string(45)
        hauteur: string(45)
        largeur: string(45)
        surface: string(45)
    En principe (non testé) ce type de shema "over" deux bases est supporté par doctrine.


    Point 2, le widget

    Bon, si on part sur de l'integer stocké dans de l'integer, cela pourrait aller mieux, quoique, PHP devrait avoir pu gérer.

    Question, quel est le SQL généré par ton filtre ?

    Question, que est le contenu des données de ton objet user issu du filtre ?

    Tu trouveras les deux réponses en mode debug dans la barre de débug.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Par défaut
    Bonjour
    Je viens de mettre en place toute les instructions que tu m'as donné, mais rien , j'ai arrange mon schema.yml !!Mais la mise en place de ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Format:
          class: PresseFormat
          local: format_id # Ici on n'est pas sur les paramètres par défaut, il faut donc les préciser
          foreignAlias: documents
    a généré une erreur lors de l'insertion du sql dans la base de données.

    Voici c que la requette retourne dans les log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT d.id AS d__id, d.nom AS d__nom, d.image AS d__image, d.format AS d__format, d.unite AS d__unite, d.modele_id AS d__modele_id, d.langue_id AS d__langue_id, d.visuel_id AS d__visuel_id, d.theme_campagne_id AS d__theme_campagne_id FROM document d LIMIT 10 - ()
    il n'y a pas de clause where pourtant j'ai bien choisi un format d'un certain id.

    J'ai aussi essaye de le mettre dans l'action index de mon module
    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
     
    public function executeIndex(sfWebRequest $request)
      {
        // sorting
        if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
        {
          $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
        }
     
        // pager
        if ($request->getParameter('page'))
        {
          $this->setPage($request->getParameter('page'));
        }
     
        $this->pager = $this->getPager();
        $this->sort = $this->getSort();
     
        $this->filters = new DocumentFormFilter($this->getFilters());
            $q = Doctrine_Query::create()
              ->from('PresseFormat f');
        $this->filters->setWidget('format',new sfWidgetFormDoctrineChoice(array('model' => 'PresseFormat','add_empty' => true, 'query'=>$q)));
     
        //$this->filters->setValidator('format', new sfValidatorDoctrineChoice(array('required' => false, 'model' => 'Modele')));
     
      }
    Toujours rien il me retourne une erreur même quand je decommente le validateur de ce widget, il exige que je mette le validateur au niveau du document.form.php
    J'en peux plus ca me torture ce truc!! Une idée

  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
    Il faut commencer par avoir un shema.yml viable, qui répond aux demandes de l'application.

    Le reste du code ne peut être fait qu'une fois le shema viable et terminé.

    Concentre toi sur la mise en place d'un shema viable, le reste ira plus simplement.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Par défaut
    Je pense avoir un schéma viable, que j'ai mis en place en suivant vos instructions et ceux de joobet!!
    Et toujours rien!! j'aimerais éviter cette option mais je pense que je vais faire un filtre à la mano!!en interrogeant ma base avec de simples requettes doctrine!

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 22
    Par défaut
    Salut,

    J'ai déjà rencontré ce problème. Le soucis vient du formatage des données qui vont d'un formulaire vers ton filter qui est spécifique au filter. Quand tu ne tripatouille pas dedans, ça fonctionne nickel, par dès que tu veux faire ça a ta manière, c'est autre chose.

    L'astuce est en fait très simple. Il faut juste surcharger la méthode getFields sur de ton baseFilter dans ton filter comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function getFields()
    {
        $fields = parent::getFields();
        $fields['format'] = 'Enum';
        return $fields;
    }
    Normalement c'est censé résoudre ton problème

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Par défaut
    Merci Lewad tu me sauves la vie , tu n'imagines pas a quel point (j’étais entrain de partir sur de ces trafics de code à la con)

    Voilà comment j'ai surchager mon getFields; et hop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function getFields()
      {
        return array(
          'id'                => 'Number',
          'nom'               => 'Text',
          'image'             => 'Text',
          'format'            => 'Enum'
        );
      }
    Merci à tous pour votre aide, par la même occasion j'ai appris à faire un bon schema.yml

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/10/2011, 11h52
  2. [1.x] recuperer le filtre d'un admin generator pour action download
    Par erictomcat dans le forum Symfony
    Réponses: 10
    Dernier message: 28/06/2011, 14h55
  3. [1.x] Admin generator, filtre sur clé étrangère
    Par DevForFun dans le forum Symfony
    Réponses: 1
    Dernier message: 23/12/2010, 17h27
  4. [1.x] [Admin Generator] Lien vers un filtre ?
    Par dourouc05 dans le forum Symfony
    Réponses: 3
    Dernier message: 22/09/2010, 11h09
  5. [1.x] Admin Generator et les filtres
    Par cacahuete85 dans le forum Symfony
    Réponses: 7
    Dernier message: 15/06/2009, 15h21

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