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 :

Enregistrer la valeur d'un sfWidgetFormChoice [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Par défaut Enregistrer la valeur d'un sfWidgetFormChoice
    Bonjour,

    Alors je vous explique, j'ai generé une application admin pour gere un module 'plainte'. Dans le formulaire généré, a la place d'un champ texte de base généré j'ai mis un select avec une liste de communes (cette liste est stockée dans une base de donnée et j'ai également généré un modèle).

    Le problème c'est que lorsque que je sauvegarde une nouvelle plainte dans la base de donnée, dans le champ ou il sauvegarde la commune (plainte_pos ci dessous) il me sauvegarde l'id qu'elle a dans le tableau (a cause du array, voir ci dessous) de la commune et non son nom (se dont je souhaite sauvegarder).

    lib/modele/doctrinePlainteForm.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      public function configure()
      {
    	$this->widgetSchema['plainte_pos'] = new sfWidgetFormChoice(array('choices' => Doctrine::getTable('Plainte')->getFormChoiceCommune(), 'expanded' => false,));
      }

    lib/modele/doctrine/base/BasePlainteForm.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
     
     
    abstract class BasePlainteForm extends BaseFormDoctrine
    {
      public function setup()
      {
        $this->setWidgets(array(
       // ....
          'plainte_pos'                 => new sfWidgetFormInputText(),
        //...
        ));
     
        $this->setValidators(array(
      //...
          'plainte_pos'                 => new sfValidatorString(array('max_length' => 128)),
       //...
        ));
    Si quelqu'un a une solution, j'ai essayé quelques trucs (essayer de passer par les set/get du modele ou encore utiliser la fonction php array_values() ) sans succes.

    Merci d'avance!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Par défaut
    Quel est le schéma de ta table ?

    Pourquoi ne pas lier ta table plainte à la table commune ? A partir de là symfony te génèrera un formulaire dans lequel tu pourras séléctionner dans une liste les communes; et pour l'affichage, tu redéféfinies dans ta classe lib/Commune.class.php la méthode __toString()

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class TbCommune extends BaseTbCommune
    {
      public function __toString()
      {
        return $this->getIntitule();
      }
    }
    Donc quand tu afficheras tes données de la table plainte, au lieu d'avoir dans le champs commune_id un chiffre, tu auras le nom de la commune.

    C'est ça que tu voulais ou j'ai écris pour rien ? lol
    Si tu tiens à stocker vraiment en dur dans la base de données le nom de la commune, je ne te le conseil pas, ça serait une duplication d'information dans ta base..

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Par défaut
    Merci de me répondre spike2.

    data/sql/schema.yml


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE commune (commune_id INT AUTO_INCREMENT, commune_lb VARCHAR(255), commune_cd INT, commune_dept INT, PRIMARY KEY(commune_id)) ENGINE = INNODB;
    CREATE TABLE news (news_id INT UNSIGNED AUTO_INCREMENT, news_titre VARCHAR(80) NOT NULL, news_contenu TEXT NOT NULL, news_date BIGINT NOT NULL, news_lang TEXT NOT NULL, news_imgchemin VARCHAR(255) NOT NULL, PRIMARY KEY(news_id)) ENGINE = INNODB;
    CREATE TABLE plainte (plainte_id INT AUTO_INCREMENT, plainte_membre_code INT NOT NULL, plainte_commune VARCHAR(255) NOT NULL, plainte_statut INT NOT NULL, plainte_date_h DATETIME NOT NULL, plainte_pos VARCHAR(128) NOT NULL, plainte_adr_api VARCHAR(128) NOT NULL, plainte_titre VARCHAR(64) NOT NULL, plainte_description TEXT NOT NULL, plainte_h_gene TIME NOT NULL, plainte_date_gene DATE NOT NULL, plainte_duree_gene VARCHAR(25) NOT NULL, plainte_niv_gene VARCHAR(25) NOT NULL, plainte_odeur_proche VARCHAR(255) NOT NULL, plainte_precis_odeur_proche VARCHAR(255) NOT NULL, plainte_perso_genre VARCHAR(64) NOT NULL, plainte_perso_nom VARCHAR(64) NOT NULL, plainte_perso_prenom VARCHAR(64) NOT NULL, plainte_perso_adresse VARCHAR(128) NOT NULL, plainte_perso_cp INT NOT NULL, plainte_perso_ville VARCHAR(64) NOT NULL, plainte_perso_tel VARCHAR(25) NOT NULL, plainte_perso_mail VARCHAR(64) NOT NULL, PRIMARY KEY(plainte_id)) ENGINE = INNODB;
    En faite je peux pas changer la base de données car elle est utilisée ailleur. Je doit juste crée un backend qui gere les données plus facilement sans toucher aux tables!

    Ca complique un peu la chose et d'origine il y a les duplications de données et c'est assez le boxons dans la base de données.

  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
    Par défaut, symfony appuie sa requête sur l'Id de la table (le __toString() ) n'est utilisé que pour l'affichage.

    Maintenant, si tu définis dans ton modèle le nom comme clef unique de la table (primary key) et que dans ton schéma tu définis la relation entre ce champs et la table des plaintes, il n'y a pas de raison que tu reviennes (porter plainte !).

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Par défaut
    Merci mimi68 c'etais ca dans mon modèle j'avais l'id comme clé, j'ai changé et mis le nom et ca marche niquel !

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

Discussions similaires

  1. Enregistrer la valeur d'une variable
    Par horneth dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/01/2014, 21h37
  2. Réponses: 11
    Dernier message: 30/03/2007, 13h16
  3. NOT NULL enregistre des valeurs null
    Par tyberium dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/12/2006, 09h20
  4. enregistrer une valeur > 250 caractère dans un champ
    Par zidenne dans le forum Administration
    Réponses: 4
    Dernier message: 04/09/2006, 10h42
  5. Réponses: 4
    Dernier message: 20/06/2005, 14h57

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