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 :

Formulaires et array_key_exists() [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut Formulaires et array_key_exists()
    Bonjour, voila j'ai rencontré un problème lorsque je test mon formulaire d'inscription. Au début j'avais oublier de mettre 'Id' en tant que clé primaire, et je me suis retrouvé avec cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in \symfony\lib\util\sfParameterHolder.class.php on line 53
    J'ai cru comprendre qu'il manquait le champ Id. J'ai donc mis à jour ma base de données. J'ai lancé les commande symfony nécessaires pour régénérer schema, model....

    Mais voila j'ai toujours ce problème. Comment y remédier ?

    Voici l'implémentation de la methode configure dans la class MembresForms.Class.php :

    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
     
     protected static $Civilites = array('Mademoiselle', 'Madame', 'Monsieur');
     
      public function configure()
      {
         unset(
            $this["Role"], $this["IpInscription"], $this["Id"],
            $this["DateInscription"], $this["Etat"]);
     
     
          $this->setWidgets(array(
              'Login' => new sfWidgetFormInput(),
              'Email' => new sfWidgetFormInput(),
              'Pass' => new sfWidgetFormInput(),
              'Repass' => new sfWidgetFormInput(),
              'Nom' => new sfWidgetFormInput(),
              'Prenom' => new sfWidgetFormInput(),
              'Civilite' => new sfWidgetFormSelect(array('choices' => self::$Civilites)),
              'Telephone' => new sfWidgetFormInput(),
              'Adresse' => new sfWidgetFormInput(),
              'Complement' => new sfWidgetFormInput(),
              'CodePostal' => new sfWidgetFormInput(),
              'Ville' => new sfWidgetFormInput(),
              'Photo' => new sfWidgetFormInputFile(),
              'Newsletter'=> new sfWidgetFormInputCheckbox(),
              'Captcha' => new sfWidgetFormInput(),
               'Parrain' => new sfWidgetFormInput()));
     
              $this->widgetSchema->setLabels(array(
                  'Login' => "Nom d'utilisateur*",
                  'Email' => "Adresse email*",
                  'Pass' => "Mot de passe*",
                  'Repass' => "Confirmer*",
                  'Nom' => "Nom*",
                  'Prenom' => "Prénom*",
                  'Civilite' => "Civilité*",
                  'Telephone' => "Téléphone*",
                  'Adresse' => "Adresse*",
                  'Complement' => "Adresse complémentaire",
                  'CodePostal' => "Code postal*",
                  'Ville' => "Ville*",
                  'Photo' => "Avatar",
                  'Newsletter'=> "Newsletter*",
                  'Captcha' => "Captcha",
                  'Parrain' => "Parrain"));
     
            $this->widgetSchema->setHelp('Login', "Nombre de caractères : Entre 6 et 32.");
            $this->widgetSchema->setHelp('Pass', "Veuillez saisir un mot de passe complexe. Nombre de caractères : Entre 6 et 16");
            $this->widgetSchema->setHelp('Repass', "Veuillez confirmer votre mot de passe en le réécrivant, opur prévenir d'une éventuelle erreurs.");
            $this->widgetSchema->setHelp("Email","Veuillez saisir une addrese email valide.");
            $this->widgetSchema->setHelp('Nom', "Nombre de caractères : Entre 2 et 50.");
            $this->widgetSchema->setHelp('Prenom',"Nombre de caractères : Entre 2 et 50.");
            $this->widgetSchema->setHelp('Civilite', "Veuillez séléctionner votre civilité dans la liste.");
            $this->widgetSchema->setHelp('Telephone', "Nombre de chiffres : 10.");
            $this->widgetSchema->setHelp('Adresse', "Nombre de caractères : Entre 2 et 50.");
            $this->widgetSchema->setHelp('Complément', "Nombre de caractères : Entre 2 et 50.");
            $this->widgetSchema->setHelp('CodePostal', "Nombre de caractères : 5.");
            $this->widgetSchema->setHelp('Ville', "Nombre de caractères : Entre 2 et 50.");
            $this->widgetSchema->setHelp('Photo', "Veuillez séléctionner une image sur votre ordinateur.");
            $this->widgetSchema->setHelp('Newsletter', "Veuillez cocher la case si vous souhaitez vous inscrire à la newsletter.");
            $this->widgetSchema->setHelp('Parrain', "Veuillez saisir le nom d'utilisateur de votre parrrain.");
     
            $this->validatorSchema->setPostValidator(
                new sfValidatorSchemaCompare('Pass',  sfValidatorSchemaCompare::EQUAL, 'Repass')
            );
     
            $this->setValidators(array(
              'Login' => new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 3, 'max_length' => 32)),
                new sfValidatorRegex(array('pattern' => '/^[a-zA-Z0-9-]+$/')))),
              'Email'=> new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 3, 'max_length' => 100)),
                new sfValidatorRegex(array('pattern' => '^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$')))),
              'Pass'  => new sfValidatorString(array('required' => true, 'min_length' => 6, 'max_length' => 16)),
              'Repass' => new sfValidatorString(array('required' => true, 'min_length' => 6, 'max_length' => 16)) ,
              'Nom' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Prenom' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Telephone' => new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 10, 'max_length' => 10)),
                new sfValidatorRegex(array('pattern' => '/^(01|02|03|04|05|06|08)[0-9]{8}/')))),
              'Adresse' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Complement' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'CodePostal' => new sfValidatorString(array('required' => true,'min_length' => 5, 'max_length' => 5)),
              'Ville' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50))));
     
        }
    Personnalisent je pense que l'erreur vient du model, voici un extrait du schéma :

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    Membres:
      connection: doctrine
      tableName: membres
      columns:
        parrain:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        login:
          type: string(32)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        pass:
          type: string(32)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        email:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        nom:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        prenom:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        civilite:
          type: string(20)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        telephone:
          type: string(10)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        adresse:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        complement:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        code_postal:
          type: string(5)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        ville:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        photo:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          default: ''
          notnull: false
          autoincrement: false
        role:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        newsletter:
          type: integer(1)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        ipinscription:
          type: string(30)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        dateinscription:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        etat:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
    Donc voila si vous trouvez quelque chose qui vous semble faux n'hésitez pas à me le signaler. Merci

    Cordialement

  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
    Citation Envoyé par toham Voir le message
    J'ai cru comprendre qu'il manquait le champ Id. J'ai donc mis à jour ma base de données. J'ai lancé les commande symfony nécessaires pour régénérer schema, model....
    Je pense que tu tiens ton erreur.

    Quant tu dis cela, as-tu régénéré totalement la base (doctrine:build --all) ?

    Si non, essaye.

    A part cela et un schéma trop verbeux le tous me semble fonctionnel.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Je pense que tu tiens ton erreur.

    Quant tu dis cela, as-tu régénéré totalement la base (doctrine:build --all) ?

    Si non, essaye.

    A part cela et un schéma trop verbeux le tous me semble fonctionnel.
    Ba cette commande ne marche pas chez moi ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Task "doctrine:build-all" is not defined.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Salut,
    alors, j'ai le même soucis que toi, même erreure.
    Et je n'ai pas la solution mais

    la commande est
    symfony doctrine:build --all

    avec un espace et deux tirets devant all
    Et chez moi cela ne marche pas (la commande marche, mais cela change rien avec le formulaire)



    Pour si jamais il y a une correlation dans ton erreur et la mienne, voici mon schema. (Ce sera p-e plus facile de trouver chez l'autre que chez soi 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
    News:
      columns:
        id:
          type: integer
          primary: true
        membre_id:
          type: integer
          primary: true
        titre:
          type: string(255)
        message:
          type: string()
        date:
          type: timestamp
        image:
          type: string()
        site:
          type: integer
      relations:
        Membre:
          foreignAlias: auteur
     
    Post:
      columns:
        id:
          type: integer
          primary: true
        news_id:
          type: integer
          primary: true
        membre_id:
          type: integer
          primary: true
        message:
          type: string()
        date:
          type: timestamp
     
     
      relations:
        News:
          foreignAlias: NewsPostMembre
        Membre:
          foreignAlias: NewsPostMembre
     
    Membre:
      columns:
        id:
          type: integer
          primary: true
        sf_Guard_User_id:
          type: integer
     
      relations:
        sfGuardUser:
          foreignType: one

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Bon, mon problème s'est résolu de lui-même, en fait j'ai continué de travailler et j'ai mis cette erreur de coté, et entre-temps cette erreur à disparu.... et je ne sais pas ce que j'ai pu faire arranger mon problème, désolé.

    Par contre j'ai une autre erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in E:\Production\lib\vendor\symfony\lib\validator\sfValidatorRegex.class.php on line 52
    Je pense que l'erreur vient de mes expressions régulières. Un problème avec les '^'. Voici les validators en questions :

    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
     $this->setValidators(array(
              'Login' => new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 3, 'max_length' => 32)),
                new sfValidatorRegex(array('pattern' => '/^[a-zA-Z0-9-]+$/')))),
              'Email'=> new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 3, 'max_length' => 100)),
                new sfValidatorRegex(array('pattern' => '^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$')))),
              'Pass'  => new sfValidatorString(array('required' => true, 'min_length' => 6, 'max_length' => 16)),
              'Repass' => new sfValidatorString(array('required' => true, 'min_length' => 6, 'max_length' => 16)) ,
              'Nom' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Prenom' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Telephone' => new sfValidatorAnd(array(
                new sfValidatorString(array('required' => true, 'min_length' => 10, 'max_length' => 10)),
                new sfValidatorRegex(array('pattern' => '/^(01|02|03|04|05|06|08)[0-9]{8}/')))),
              'Adresse' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'Complement' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50)),
              'CodePostal' => new sfValidatorString(array('required' => true,'min_length' => 5, 'max_length' => 5)),
              'Ville' => new sfValidatorString(array('required' => true, 'min_length' => 2, 'max_length' => 50))));

  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
    @tohan, tu as dû, d'une manière ou d'une autre corriger. Tant mieux. Comme on dit en informatique, La théorie c'est quant tu sais pourquoi cela ne marche pas et la pratique c'est quant tu ne sais pas pourquoi cela marche, vive la pratique...

    Juste un truc, dans ton code, je n'avais pas vu hier, tu as, dans ton form une propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected static $Civilites = array('Mademoiselle', 'Madame', 'Monsieur');
    Je la déplacerais dans le modèle Membres.class.php tu peux y accéder dans le form avec un Membes::Civilites et l'avantage c'est que tous ce qui est données reste dans les données.

    Autre choses, ta table membres s'appelle "membres" et donc ta classe s'appelle "membres" aussi. Hors, un objet représente un seul membre je te recommande donc, dans les shema.yml il convient de mettre tous les nom de tables au singulier (et si le nom au singulier fini par un "s", d'en changer). Tu peux garder le nom physique de la table au pluriel, ceci n'interfère pas. Seul les nom de liens qui retournent plusieurs enregistrement (le côté n d'une relation) seront au pluriels, justement pour savoir qu'ils renvoient plusieurs enregistrement.

    Pour le nouveau problème, regarde ton validateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sfValidatorRegex(array('pattern' => '/^(01|02|03|04|05|06|08)[0-9]{8}/'))
    a priori j'aurais mis '/^0[1-8][0-9]{8}/' reste que ce type de validation exclu les numéros étranger et les numéros de plus de 10 chiffres que l'on peut rencontrer sur certain standard. Et il y a des numéros qui commence en 09 si mes souvenirs sont bon, sans oublier les numéro cours en 32xx. Je ne suis pas sur qu'un validateur sur les téléphones soit réellement envisageable, sauf à interdire caractères.



    @movrack
    Je ne sais pas ce que tu n'arrives pas à créer ni dans quel formulaire, le seul shema.yml est un peu "léger" pour cela. Par contre, il est un peu effrayant et va te coincer méchamment plus ou moins rapidement.
    1) tes clefs primaires sont mal définies, elle englobent trop de champs. Exemple dans la table News: tu as une clef primaire composée de l'id de la news et de l'id du membre. Hors, normalement, l'id de la news devrait être unique et ce suffire en tant que clef. Et si l'id était unique pour chaque news, la liaison mise en place uniquement sur l'id ne pourrait marcher. Sans compter que le foreignAlias de ta liaison est hors sujet et non contextuel.

    En plus tu utilise une table Membre qui fait juste une liaison sur la table sfGuardUser, sans lui apporter aucun contenu, ce qui ne présente aucun intérêt.

    Le shema.yml revu :
    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
     
    New:
      actAs:
        timestampable: 
      columns:
        membre_id: integer(4)
        titre: string(255)
        message: clob
        image: string()
        site: integer
      relations:
        auteur:
          class: sfGuardUser:    
          local: member_id
          foreign: id
          foreignAlias: News
     
    Post:
      actAs:
        timestampable: ~
      columns:
        news_id:  integer
        membre_id: integer(4)
        message: clob
      relations:
        New:
          foreignAlias: Posts
        Auteur:
          class: sfGuardUser
          local: membre_id
          foreign: id
          foreignAlias: Posts
    • une table sans clef primaire déclare automatiquement un champ id (integer, priamry: true, autoincremant: true).
    • La liaison avec l'utilisateur doit être plus précises vu que le nom de la liaison est différentes du nom de la classe (d'où class) et que le nom du champs de liaison n'est pas le même que le nom de la class. A noter aussi que dans sfGuarUser, la clef est un integer(4) (integer est en fait integer(8).
    • suppression des clefs primaires composées inutiles.
    • les liaisons qui retournent plusieurs enregistrement ont un nom qui fini par "s" ce qui est plus simple à utiliser. Pour une nouvelle $new on va retrouver un tableau de tous les posts par $new->getPosts().

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

Discussions similaires

  1. Création d'un formulaire sous flash?
    Par ultrakas dans le forum Flash
    Réponses: 5
    Dernier message: 11/01/2005, 19h33
  2. [CR][Access] intégrer un viewer dans un formulaire access
    Par nicolak dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 13/01/2003, 16h52
  3. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 10h59
  4. [VB6][Formulaire]Appliquer un Scrollbar a une Form
    Par Boil dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/11/2002, 04h51
  5. [CR] Tranfert de formulaire a travers une page HTMl
    Par LIEU dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 12/09/2002, 09h37

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