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 :

[sf 1.4.x] Comment changer la langue de base des formulaires ? Comment modifier la page d'erreur 404 ? [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut [sf 1.4.x] Comment changer la langue de base des formulaires ? Comment modifier la page d'erreur 404 ?
    Salut tout le monde,

    Lors de la validation des formulaires, quand il y a une erreur, symfony affiche automatiquement le type d'erreur (invalid, required, etc ...). C'est super, mais je ne trouve pas comment changer ces textes d'erreur pour les mettre en français. Quelqu'un aurait-t-il une idée ?

    Pour la page d'erreur 404, j'ai suivi le tutorial sur jobeet, mais ca ne fonctionne pas, alors je suis complètement largué :< donc encore une fois, une idée ?

    Merci.

  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
    Modification des messages d'erreur

    Dans l'objet formulaire : lib/form/<monobjet>Form.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class monobjetiForm extends BaseMonObjetForm
    {
      public function configure()
      {
          $this['monValidator']->
                setMessage('required', "C'est obligatoire !")->
                setMessage('invalid', "C'est pas valide ce truc");
      }
    }
    C'est une des possibilités, il y en a plusieurs autres, faut creuser la doc.

    Il faut modifier les redirections dans le fichier de configuration de l'application :
    apps/<app>/config/settings.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    all:
      .actions:
        error_404_module:       myModule   
        error_404_action:        myAction
    Normalement l'entrée all existe déjà. Il faut créer un module et une action. Il faut peut-être rajouter une entrée dans le fichier routes.yml suivant le cas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Tout d'abord, merci pour ta réponse.

    Pour les forms, avec ta méthode, il faudrait que je modifie tous les validateurs, donc c'est pas super propre (mais je garde sous le coude pour une message d'erreur perso pour un validateur donné).
    J'ai creusé un peu la question et je suis tombé sur ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ObjForm extends BaseObjForm
    {
      public function configure()
      {
    [...]
    	$this->validatorSchema->setMessages(array(
    	  'invalid' => 'pas valide',
    	  'required' => 'Requis !',
    	 ));
      }
    }
    setMessages() étant censé modifier tous les messages d'erreur.
    Et ben ca fonctionne pas ... Faut-il que je mette ce code ailleurs ?

    Pour l'erreur404, il s'est mis à fonctionner tout seul (se qui m'inquiète un peu), mais j'aimerais savoir comment je peux réutiliser le layout.php général du site sans pour autant devoir créer un module/action perso car mon settings.xml contient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     .actions:
        error_404_module: default
        error_404_action: error404
    et j'ai simplement créer les fichiers error.html.php et exception.html.php dans config\error.

  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
    Les méthodes sont plus ou moins équivalentes et je n'avais pas pour ambition de faire ici un cours sur toutes les possibilités !

    La méthode que j'utilise est setMessage(), sans S à la fin et permet de modifier un validateur.

    La méthode setMessages() permet de modifier tous les messages d'un validateur.

    La méthode par le validatorSchema permet de modifier d'une manière uniforme toutes les validateurs d'un formulaire, mais avec une réponse standard pour tous les champs, ce qui n'est pas nécessairement évident. Imagine un champ téléphone ou tu entre 01 23 45 67 89 et qui retourne "invalid", mais où donc est l'erreur !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Je dis pas que t'as méthode est pas bonne, je cherche simplement un truc général. Et vu ton explication, c'est bien se que je recherche ^^
    Mais ca fonctionne pas :/

  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
    Second essai.

    La bonne syntaxe (vérifiée) :
    fichier lib/form/doctrine/<monforumlaire>Form.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class <monformulaire>Form extends Base<Monformulaire>Form
    {
      public function configure()
      {
          $this->validatorSchema['<leChamp>']->
                  setMessage('required', 'Vous devez saisir la donnée')->
                  setMessage('invalid', "Cette donnée n'est pas valide");
      }
    }
    on peut aussi utiliser la fonction setMessages() et un array, question de choix et je ne suis pas sur que la différence de performances soit palpable, ni de savoir de quel côté elle va pencher.

    Pour les pages 404, si tu veux (et tu devrais le faire avant toutes mises en lignes) il faut :
    • Créer un module (qui ne doit pas s'appeler "default").
    • Créer une action (ex: 404error). L'action peut être vide, mais la fonction executeAction() doit exister, même vide.
    • créer le template correspondant actionSuccess.php dans lequel tu mets le code html de ta page 404.


    Si tu utilises, tel que recommandé dans le framework, les messages "flash" voir le J3 de jobeet, tu peux aussi dans l'action faire un $this->setFlash('error','erreur 404, cette page n'existe pas') et rediriger sur l'accueil par exemple.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Pour mon histoire de formulaire, j'ai enfin trouvé le problème : il s'avère qu'il faut setter les messages AVANT la création des validateurs, or la méthode setup() de la classe Base<Monformulaire>Form, qui contient les widgets et validateurs "automatiques" est appelé avant la méthode configure() de la classe <monformulaire>Form.
    Donc voici la réponse fonctionnelle sous sf 1.4.x :
    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
    class <monformulaire>Form extends Base<Monformulaire>Form
    {
      function setup()
      {
        sfValidatorBase::setDefaultMessage('required', 'Ce champs ne peut être vide.');
        sfValidatorBase::setDefaultMessage('invalid', 'Ce champs n\'est pas valide.');
     
        parent::setup();
      }
     
      public function configure()
      {
        [...]
      }
    }
    Enfin, ca reste une solution pas tip-top, le mieux serait d'utiliser l'I18N, mais c'est un sujet sur lequel je plane complètement
    Mais un grand merci, tu m'as vachement aidé sur ce point.

    Pour l'erreur 404, je ne saisis pas l'intérêt de ne pas utiliser le module par défaut, si ce n'est pour pouvoir faire une redirection, comme tu le proposes.
    Donc il me reste (encore) 2 questions :
    - Peut-on appeler le layout.php à partir d'un template "extérieur" ?
    - Ta solution est très séduisante, mais comment faire passer le message de l'erreur404 dans un flash, si ce flash est sur la home (où on aura redirigé le user après l'erreur404) ? Je dois mettre toute l'information ("c'est une erreur 404 suite à l'appelle de la page XXX") en session ? Ou ya-t-il un moyen plus simple ?

    PS: Si je suis pas clair, il faut le dire.

  8. #8
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Salut,

    Perso j'utilise la classe BaseFormDoctrine.class.php pour indiquer mes messages d'erreurs par défaut (au besoin, je redéfinis champ par champ s'ils sont différents) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    abstract class BaseFormDoctrine extends sfFormDoctrine
    {
      public function setup()
      {
        sfProjectConfiguration::getActive()->loadHelpers('I18N');
        sfValidatorBase::setDefaultMessage('required', __('Required.', array(), 'sf_admin'));
        sfValidatorBase::setDefaultMessage('invalid', __('Invalid.', array(), 'sf_admin'));
      }
    }
    La 3ème valeur de la méthode __() correspond au catalogue utilisé. Ici, je vais donc appeler le fichier sf_admin.lang.xml (par exemple : sf_admin.fr.xml).
    Étant donné qu'il sert à mon application complète, je l'ai placé dans app/backend/i18n/sf_admin.fr.xml

    J'espère t'avoir aidé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Il faut que je me penche un peu plus sur l'internationalisation, mais je pense que ton code m'aidera.

    Par contre, le fait de mettre ce code dans BaseFormDoctrine, est-ce vraiment "propre" ? Quand on fait un "symfony doctrine:build --all --and-load", comme symfony reconstruit les forms, il ne recharge pas cette classe ?

  10. #10
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    A voir, je ne sais plus mais je crois que non et l'avantage, c'est que ça évite surtout d'avoir dans chaque classe de formulaire à le renoter.

  11. #11
    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 fais un build --all, symfony recrée tous ce qui se trouve dans les dossier :
    • lib/model/doctrine/base
    • lib/form/doctrine/base
    • lib/filter/doctrine/base


    Le fichier lib/form/doctrine/BaseFormDoctrine.class.php n'est donc pas touché par une régénération de la base.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    En effet, BaseFormDoctrine n'est pas modifié, jvais tout mettre là-dedans.

    Merci pour votre aide

  13. #13
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    y a t il une solution via un fichier frontend/config/<fichier>.yml ?? et prenant en compte aussi l'internationalisation i18n ??

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i18n:
       fr:
          sfvalidatorDate:
              required: 'la date est requis'
              max: 'La date doit etre superieur a %max%.'
       en:
          sfvalidatorDate:
              required: 'required'
              max: 'The date must be before %max%.'
       it:
         sfvalidatorDate:
              required: 'required'
              max: 'The date must be before %max%.'
    etc... ca existe ???

    Je prend pour exemple cette page : http://www.symfony-project.org/book/1_2/10-Forms

  14. #14
    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 ne pense pas que la syntaxe que tu décris existe. De plus mettre les translations dans trois lieux différents ne me semble pas simple.

    Pour traduire les form, dans ton form tu dois lui préciser le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('NewUserForm');
    où "NewUserForm" est le nom du fichier au format i18n qui contient les modifications pour ton formulaire.

    Tu peux mettre cette ligne dans le BaseForm mais alors toutes form utiliseraient le même catalogue de traduction.

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

Discussions similaires

  1. Comment changer la langue de debian?
    Par programmerPhil dans le forum Debian
    Réponses: 4
    Dernier message: 04/08/2015, 17h31
  2. Réponses: 4
    Dernier message: 27/09/2006, 12h17
  3. comment changer la langue d'in CFileDialog
    Par ksoft dans le forum MFC
    Réponses: 2
    Dernier message: 09/05/2006, 18h02
  4. Comment changer la langue avec 2 TMainMenu ?
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 20/01/2006, 18h50
  5. [VCL] Comment changer de langue à l'exécution ?
    Par Zatoobux dans le forum Composants VCL
    Réponses: 1
    Dernier message: 27/09/2005, 18h08

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