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 :

Symfony formulaire multiple type facture


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut Symfony formulaire multiple type facture
    Bonjour,

    Je veux créer un formulaire de facture avec plusieurs articles. Voilà des jours que je cherche comment y arriver mais c'est l'impasse. J'essaie de télécharger le plugin ahEasyDoctrineEmbeddedRelationPlugin mais c'est pas possible j'ai un probléme avec pear.php. J'ai symfony 1.4.5 avec php5.3.0

    Je vous mets le max de code pour pouvoir m'aider car je dois terminer cette application dans une semaine et c'est pour mon rapport de stage.

    voilà mon schéma.yml il me semble correct mais j'ai des doutes quant aux relations entre facture et prestation.
    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
    Client:
      columns:
        id:
          type: integer(4)      
          primary: true
          autoincrement: true
        rais_soc:
          type: string(250)      
        adresse:
          type: string(250)      
        cod_postal:
          type: integer(5)      
        ville:
          type: string(30)      
        tel:
          type: integer(10)
     
    Contenir:  
      columns:
        prestation_id:
          type: integer(4)
          primary: true      
        facture_id:
          type: integer(4) 
          primary: true     
        quantite:
          type: integer(4)      
      relations:
        Facture:
          foreignAlias: Contenirs
        Prestation:
          foreignAlias: Contenirs
     
    Facture:  
      columns:
        id:
          type: integer(4)      
          primary: true      
        client_id:
          type: integer(4)            
        date_fre:
          type: string(10)      
        montant_fre:
          type: integer      
      relations:
        Client:
          foreignAlias: Factures     
     
    Prestation:  
      columns:
        id:
          type: integer(4)      
          primary: true
          autoincrement: true
        designation:
          type: string(250)      
        pu:
          type: integer(4)      
      relations:
        Factures:
          foreignAlias: Prestations
          class: Facture
          refClass: Contenir
     
    Reglement:  
      columns:
        id:
          type: integer(4)      
          primary: true
          autoincrement: true
        facture_id:
          type: integer(4)      
        date_reglement:
          type: string(10)      
        montant_reglement:
          type: integer(4)
     
      relations:
        Facture:
          foreignAlias: Reglements
    voilà mon action class de facture:
    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
    public function executeNew(sfWebRequest $request)
      {
        $this->form = new factureForm();
    	//$this->form1 = new prestationForm();
      }
     
      public function executeCreate(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
     
        $this->form = new factureForm();
    	//$this->form1 = new prestationForm();
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('new');
      }
     
      public function executeEdit(sfWebRequest $request)
      {
        $this->forward404Unless($facture = Doctrine::getTable('facture')->find(array($request->getParameter('id'))), sprintf('Object facture does not exist (%s).', $request->getParameter('id')));
        $this->form = new factureForm($facture);
      }
     
      public function executeUpdate(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
        $this->forward404Unless($facture = Doctrine::getTable('facture')->find(array($request->getParameter('id'))), sprintf('Object facture does not exist (%s).', $request->getParameter('id')));
        $this->form = new factureForm($facture);
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('edit');
      }
     
      public function executeDelete(sfWebRequest $request)
      {
        $request->checkCSRFProtection();
     
        $this->forward404Unless($facture = Doctrine::getTable('facture')->find(array($request->getParameter('id'))), sprintf('Object facture does not exist (%s).', $request->getParameter('id')));
        $facture->delete();
     
        $this->redirect('facture/index');
      }
     
      protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    	//$form1->bind($request->getParameter($form1->getName()), $request->getFiles($form1->getName()));
     
        if ($form->isValid())
        {
          $facture = $form->save();
     
          $this->redirect('facture/edit?id='.$facture->getId());
        }
      }
    }
    voilà le formulaire facture :
    A noter que quand je met $this-> embedRelation ça marche pas, j'ai un message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class FactureForm extends BaseFactureForm
    {
      public function configure()
      { 
    	unset($this['PU']);	
     
    		$this->embedForm('prestations', new PrestationForm());
     
      }
     
     
    }
    avec ce formulaire j'ai le formulaire prestation(equivalent à article) mais une seule ligne. Si quelqu'un peut m'aider à résoudre ce probléme svp.Merci.

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Bonjour sipap,

    La relation entre Facture et Prestation n'est pas claire en effet, d'après ton schema c'est une relation many to many : pour une prestation tu peux avoir plusieurs factures et pour une facture tu peux avoir plusieurs prestation. Est-ce bien ce que tu veux ? Si ce n'est pas le cas, alors pas de many-many et pas de table 'contenir'.

    Si c'est bien le cas je reverrai le schema de Contenir plutôt de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Contenir:
      columns:
        prestation_id:  { type: integer(11), primary: true }
        facture_id:     { type: integer(11), primary: true }
        quantite:       { type: integer(4) }
      relations:
        Prestation:     { local: prestation_id, foreign: id, onDelete: CASCADE }
        Facture:        { local: facture_id, foreign: id, onDelete: CASCADE }
    Je ne me suis pas vraiment occupé de ce qu'il y avait autour.

    Ensuite deuxième point, si tu n'arrives pas à utiliser la commande plugin install à cause de pear (comme beaucoup de gens) je te suggère l'installation manuelle tout simplement. En lisant la doc tu devrais trouver ou placer quels répertoires.

    Et enfin pour l'embarquement des formulaires j'ai peur de ne pas bien comprendre ce que tu cherches à faire : peux-tu le décrire de manière plus explicite ? Si tu parviens à installer ton plugin tu y arriveras peut-être de manière plus simple, mais pour ma part je ne l'ai jamais utilisé, j'ai toujours fait mes embarquements de formulaire à la main.

    Bon courage !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut
    Bjr Nico,

    Merci pour ta réponse. Donc j'ai modifié le schema.yml. En ce qui concerne l'installation du plugin à la main c'est trop galére, quand je dépasse une étape j'ai un nouveau probléme, au finish j'étais à l'étape où il faut faire entrée mais quand je faisais entrée j'avais un bug mon ordi ne répondait pas. Même si j'aurais bien aimé pouvoir installer le plugin car aprés je dois installer le plugin fpdf pour pouvoir imprimer la facture par la suite mais pour le moment c'est une autre paire de manche.
    Pour revenir à mon probléme de formulaire, je veux créer un formulaire de la facture et donc dans une facture j'ai plusieurs lignes de prestations ( sachant que les prestations existent déjà) il faut juste afficher le nbre de prestations souhaitées ainsi que le PU ( qui existe déjà aussi). Aprés je dois pouvoir ajouter une ligne pour la quantité ( de ce fait sur une ligne de prestation je dois avoir la designation, le PU et la quantité et le montant pour la ligne de prestation). Donc voilà je crois qu'il est beaucoup plus interessant pour moi de le faire à la main aussi et j'apprendrai plus de ce fait.
    Pour le moment j'arrive à afficher dans mon formulaire, fait à la main, une ligne de prestation avec la designation et le PU (seulement j'arrive pas à avoir une liste déroulante pour selectionner la désignation souhaitée ainsi que le PU qui va avec). Merci à toi c'est vraiment hyper important pour moi car l'obtention de mon diplôme en dépend.

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Ok alors voila ce que j'ai compris :

    Pour une facture, la relation avec les prestations existe déjà, donc du coup tu peux déjà afficher un formulaire de facture avec le nombre de ligne correspondant au nombre de prestations déja associées et avec des champs vides et des champs remplis pour chaque ligne.

    J'ai été confronté à ce cas et j'ai résolu mon problème avec les formulaires embarqués : tu peux jeter un oeil à ma démarche qui se rapproche beaucoup de la tienne sur ce topic.

    Ensuite pour ce qui est de ta liste déroulante sur la désignation : vu ton schéma la désignation est propre à une prestation, si tu veux proposer plusieurs choix il faut que tu surcharges toi même le widget de la désignation pour en faire un sfWidgetFormChoice par exemple et dans lequel tu mettras les valeurs en brut de ce que tu veux proposer.

    Aide toi de mon topic, approprie-le toi et refais le avec tes objets. Ça devrait être ok :-)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut
    ok en effet, j'avais déjà vu ton topic. Mais je l'avais déjà essayé mais ça ne marche pas. En fait quand je fais getPrestations dans l'action ça ne marche pas, j'ai ce message d'erreur :
    Fatal error: Call to a member function getPrestations() on a non-object in C:\dev\sfproject\APPLI\apps\frontend\modules\facture\actions\actions.class.php on line 58.
    Donc voilà je ne sais plus à quel saint me vouer avec ce formulaire. J'ai eu dans un post içi qu'avec symfony pour avoir un formulaire de facture c'est galére. Bin je le constate amérement.

  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
    As-tu pu installer le plugin ?

    Peux-tu mettre ton shema actuel (il a changé semblerait-il).

    Mettre le code qui génère l'erreur je suppose que, lui aussi, à évolué.

Discussions similaires

  1. [2.x] formulaire de type choice avec les roles securité de symfony
    Par miltone dans le forum Symfony
    Réponses: 12
    Dernier message: 20/04/2015, 21h29
  2. [VBA-E] formulaire type facture,devis
    Par benco dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/03/2006, 21h53
  3. Réponses: 18
    Dernier message: 08/12/2004, 14h04
  4. Pb avec le formulaire en type List
    Par LoulouFifi dans le forum Struts 1
    Réponses: 5
    Dernier message: 04/02/2004, 11h34

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