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 :

modifier un champ filter date dans l'admin generator [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut modifier un champ filter date dans l'admin generator
    donc mon appli j'ai un champ date qui en faite correspond à un mois - par défaut le jour est toujours à 05-

    dans l'admin generator, je me retrouve avec un filtre sur une période alors qu'il serait plus facile aux utilisateurs, de sélectionner juste un mois.

    donc dans mon fichier ..FormFilter, j'ai surchargé la fonction configure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function configure()
      {
      	$this->widgetSchema['date'] = new sfWidgetFormDateTime();
     
      	$this->validatorSchema['date'] = new sfValidatorDateTime();
      }
    en affichage, c'est bien pris en compte mais par contre en filtrant il ne me remonte rien.
    en furetant sur le net, j'ai vu que qu'on rajoute un champ il faut aussi creer l'action donc j'ai tenté de le rajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function AddDateColumnQuery(Doctrine_query $query, $field, $value)
      {
      	$fieldName = $this->getFieldName($field);
     
      	if($value)
      	{
      		$a = $query->getRootAlias();
      		$query->addWhere($a,', ChqDej.date = ?', $value);
    	}
    	return $query;
      }
    mais j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'r' in 'where clause'
    avec une requete SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) AS num_results FROM ChqDej c WHERE r - (, ChqDej.date = ?)
    j'ai tenté juste avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function DateColumnQuery(
    mais la il me retourne rien avec une requete SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) AS num_results FROM ChqDej c WHERE c.date IS NULL
    peut on m'aiguiller ?

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Quant tu trouves un truc bien compliqué à faire, tu n'hésites jamais

    J'aurais plutôt vu une liste déroulante peuplée d'un tableau de 1 a 12.

    Ensuite, dans ta requête, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      		$a = $query->getRootAlias();
      		$query->addWhere($a,', ChqDej.date = ?', $value);
    est faux.

    le $a va récupérer le nom d'alias de la racine de la requête, donc le addWhere doit le considérer comme un élément du nom du champs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query->addWhere( $a . '.date = ?', $value );
    Je n'ai pas creusé plus que cela la création de filtre spécifique, juste analysé le code donné dans ton exemple. Il n'est pas testé par moi non plus.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Quant tu trouves un truc bien compliqué à faire, tu n'hésites jamais .....
    Je prends cela comme un compliment

    En faites, je travaille avec une application qui a déjà 10 ans sur lequel j'ai rajouté au fur et à mesure des fonctionnalités.
    Malheureusement ça été du rajout avec à chaque fois mes connaissances du moment.
    Début codage au km à la asp 1ere generation, suivit d'un début d'encapsulation en fonction avec pour finir de la POO.
    Et je commençait a rajouté des trucs avec mes débuts dans la notion d'héritage quand je me suis dit qu'il était temps de stopper et de repartir sur une base saine.
    Sauf que toute l'interface client existe et qu'il est hors de question de changer les habitudes du client

    pour revenir au sujet, il a moyen de faire mois/année ?... Et oui je garde l'historique

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Essaye de partir de l'objet jour mois année de base.

    Tu vas être obligé de lui donné un nom particulier et un validateur qu'il faudra modifier aussi. Donc la création d'une partie de filtre particulière ne devrait pas être lourd. Faut juste créer une date avec le jour 5 et les deux autres éléments récupérés.


    Et oui, c'était un compliment !
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    bon j'ai réussi à transformer mon filtre range en un simple champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function configure()
      {
     
      	$this->widgetSchema['date'] = new sfWidgetFormDate();
        }
    et modif de l'action liée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public function AddDateColumnQuery(Doctrine_query $query, $field, $value)
      {
      	$fieldName = $this->getFieldName($field);
      	print_r($value);
      	die;
      	if($value)
      	{
      		$a = $query->getRootAlias();
      		$query->addWhere($a.'.date = ?', $value);
    	}
    	return $query;
      }
    tout marche.....
    sauf que ça me plait pas et que j'aimerai afficher que le mois/année, donc je transforme mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function configure()
      {
     
      	$this->widgetSchema['date'] = new sfWidgetFormDate();
      	$this->widgetSchema['date']->setOption('format','%month%/%year%');
     
      }
    sauf que bien entendu la valeur n'est plus valide
    en farfouillant sur internet (http://www.symfony-project.org/api/1...thod_configure) j'ai trouvé ça à rajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$this->validatorSchema['date'] = new sfValidatorDate(array('date_format'=>'~(?P<month>\d{2})/(?P<year>\d{4})~'));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$this->validatorSchema['date'] = new sfValidatorDate(array('date_format'=>'~(?P\d{2})/(?P\d{4})~'));

    malheureusement ça ne marche pas >> date invalid <<, des idées ?

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Je pense que le plus rapide et le plus simple (une fois passé une première appréhension compréhensible) sera de créer ton propre widget et le validator qu va avec.

    Base toi sur celui de base (qui te retourne une date en trois liste), vire une liste et retourne directement le 5 en champ caché. J'aime pas trop l'idée, un hacker pourrait modifier le champ date en autre chose que le 5, mais dans un filtre, je ne vois pas trop le bénéfice. Si non, créer le validateur qui va avec le widget et qui, lui, retournera une date avec un 5 du mois et de l'année. Le filtre devrait être simple.

    Faut un peu tripatouiller le code des widget et validator, mais ce n'est pas très sorcier.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  7. #7
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    la réponse que je craignait. Mais dans ce cas a quoi sert les options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Available options:
     
    * date_format: A regular expression that dates must match
    Note that the regular expression must use named subpatterns like (?P)
    Working example: ~(?P\d{2})/(?P\d{2})/(?P\d{4})~
    dans le code de sfValidatorDate ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Je ne sais pas si ça pourra aider mais as-tu regardé du côté de la validation directe depuis ton schéma Doctrine avec ton regexp ?

    Cf. : Regexp data validation

    Tu ne devrais -- a priori -- plus avoir besoin de ton date_format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tonObjet:
      columns:
        ...
        date: { type: ..., regexp: 'taRegexp' }

  9. #9
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    sauf que la tu perd la notion de date dans ton champ non ?

    De plus, a quoi ça sert de pouvoir formater un champ date de la forme mm/yyyy si le validator associé ne sait pas le gérer ?

  10. #10
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Dans le code du sfWidgetDate, il n'y a qu'une option "format" qui prend trois arguments %day%, %Mounth%, %Year%. les %xxx% correspondent aux trois listes déroulantes et permettent de les arranger différemment à l'écran.

    Je n'ai aucune idée de ce qui pourrait donner une option "format" = %Month% / %Year%

    Les options du validator permettent de tester le format du jours, mois et années. Est-ce qu'en le torturant on pourrait lui faire accepter une date sans jour ? A mon avis, il est là pour pouvoir accepter des date avec des années à deux chiffres. Mais, bien torturé ?

    Il faudra malgré tous dériver le validateur et modifier au moins la méthode doClean pour y rajouter le jour (5) qui ne pourras être saisi par absence de zone de saisie.

    @Bilbonec, la contrainte dans la base de donnée ne va pas nous aider ici. Nous sommes dans le cadre d'un filter...

    @erictomcat je ne sais pas comment tu comptes créer les fiches vierges pour les semaines, mais le couple widget validator du filtre pourrait aider... Sauf s'il n'y a qu'une insertion automatisée (ce que je ferais) possible.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  11. #11
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    le couple "format" = %Month% / %Year% fonctionne en affichage du filtre, j'ai juste le mois et l'année, pour ça que je comprend pas que le validator le refuse.

    Pour les insertions, effectivement c'est automatisé

  12. #12
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Il n'y a donc que le validator à modifier.

    Essaye de créer un dans lib/validator/sfValidatorDateAMoi.class.php

    Et de le faire enfant de sValidatorDate et de reprendre le code de doClean (qui fait aussi la validation) et de prendre en compte l'absence du retour de la date. J'ai pas regardé, mais cela ne doit pas être très sorcier.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  13. #13
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    j'ai juste rajouté une ligne dans sfValidatorDate dans la fonction DoClean, et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (is_array($value) && !array_key_exists('day',$value))
      		$value['day']=5;
    en faite ce n'était pas dans le doClean mais dans la partie qui contrôle que les 3 composants d'une date que ça foirait.
    En testant l'existence du jour et en rajoutant cette clef dans le doClean, ça passe.

    Merci à tous

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Désolé d'avoir répondu à côté

    Sinon (peut-être considères-tu que c'est un sous-entendu évident, et auquel cas, oublie ma remarque !), n'oublie pas la partie :
    Essaye de créer un dans lib/validator/sfValidatorDateAMoi.class.php

    Et de le faire enfant de sfValidatorDate
    Vu que tu n'as pas à toucher directement à sfValidatorDate qui serait une très mauvaise pratique.

  15. #15
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    je ne l'ai pas oublié mais effectivement je ne l'avait pas fait, la c'était juste pour voir si ça fonctionnait. je compte la créer.

  16. #16
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    oui, il vaut mieux, si non, les autres saisies de dates vont avoir une sacré surprise !
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  17. #17
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    bein en faites non.
    puisque je teste d'une part que j'ai bien affaire a un array mais que la clef day n'existe pas.Je ne modifie pas le comportement habituel du validator ?

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    De manière générale, il faut éviter (à moins d'être sous la torture) de toucher au code Symfony. C'est très très pas propre et dangereux

  19. #19
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Et imagine ce qu'il va se passer si tu mets a jours le moteur ?

    Et encore, si c'est toi, tu as des chances d'y penser... Mais imagine qu'un autre prenne ton code après toi, et fasse la mise à jour !

    L'idée est donc mauvaise.

    L'idéal serait donc un objet stocké dans le projet.

    Ton test en début de méthode suivi d'un parent::méthode pour le traitement standard que l'on pourrait garder.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  20. #20
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    je compte créer un lib/validator/sfValidatorDateAMoi.class.php mais dans le lib de mon appli, ça devrait marcher non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2002] modifier le format de date dans une requête
    Par tom@tom dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/06/2009, 09h36
  2. Réponses: 6
    Dernier message: 23/06/2009, 14h44
  3. [1.x] Champ de téléchargement dans l'admin generator
    Par qlimamax dans le forum Symfony
    Réponses: 5
    Dernier message: 17/04/2009, 11h34
  4. [1.x] Champs i18n disabled par l'admin generator
    Par wadzat dans le forum Symfony
    Réponses: 1
    Dernier message: 22/05/2008, 14h51
  5. Comment afficher un champ par date dans un intervalle
    Par KING_OF_GRACELAND dans le forum SQL
    Réponses: 13
    Dernier message: 12/03/2008, 10h38

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