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 :

embedForm / mergeForm => casse tête chinois


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 embedForm / mergeForm => casse tête chinois
    j'essaye de comprendre comment fonctionne ces deux fonctions.
    pour ça j'ai créer deux tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    article:
      columns:
        name: string(255)
        description: string(255)
        periode: string(255)
    photo:
      columns:
        name: string(50)
        chemin: string(255)
        article_id: integer
      relations:
        article:
          local: article_id
          foreign: id
    j'ai généré les modules dans mon frontend et je voudrait embarqué (dans un premier temps) un formulaire photo dans mon formulaire article.
    rien de plus simple d'apres la doc, suffit de mettre dans la fonction configure du formulaire de l'article:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class articleForm extends BasearticleForm
    {
      public function configure()
      {
      	$newPhotoForm = new photoForm();
      	$this->embedForm('photo',$newPhotoForm);
      }
    }
    je vais sur ma page .../article/new et...
    bein j'ai bien les champs de ma table article mais aucun des champs de la table photo.
    que manque t il dans mon code pour que ça marche ?

  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
    A priori je dirais pour le schéma :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
      relations:
        article:
          local: article_id
          foreign: id
          foreignAlias: photos
    Pour le code, essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class articleForm extends BasearticleForm
    {
      public function configure()
      {
      	$newPhotoForm = new photoForm(new photo);
      	$this->embedForm('photo',$newPhotoForm);
      }
    }

  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
    comportement étrange.

    Je n'ai toujours pas dans mon form article les champs correspondants au form photo mais par contre j'ai bien une ligne de rajouté dans ma table photo (tout à vide bien sur) quand je crée un nouvel article.

    juste comme ça, il ne faut pas que je rajoute quelque chose dans le template du _form de l'article ????

  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
    Citation Envoyé par erictomcat Voir le message
    juste comme ça, il ne faut pas que je rajoute quelque chose dans le template du _form de l'article ????
    Possible.

    Mais qu'y a-t-il actuellement dans ce template ?

  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
    bein ce qui est créé par doctrine, je n'ai touché a rien:
    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
    <?php use_stylesheets_for_form($form) ?>
    <?php use_javascripts_for_form($form) ?>
     
    <form action="<?php echo url_for('article/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?id='.$form->getObject()->getId() : '')) ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>
    <?php if (!$form->getObject()->isNew()): ?>
    <input type="hidden" name="sf_method" value="put" />
    <?php endif; ?>
      <table>
        <tfoot>
          <tr>
            <td colspan="2">
              <?php echo $form->renderHiddenFields(false) ?>
              &nbsp;<a href="<?php echo url_for('article/index') ?>">Back to list</a>
              <?php if (!$form->getObject()->isNew()): ?>
                &nbsp;<?php echo link_to('Delete', 'article/delete?id='.$form->getObject()->getId(), array('method' => 'delete', 'confirm' => 'Are you sure?')) ?>
              <?php endif; ?>
              <input type="submit" value="Save" />
            </td>
          </tr>
        </tfoot>
        <tbody>
          <?php echo $form->renderGlobalErrors() ?>
          <tr>
            <th><?php echo $form['name']->renderLabel() ?></th>
            <td>
              <?php echo $form['name']->renderError() ?>
              <?php echo $form['name'] ?>
            </td>
          </tr>
          <tr>
            <th><?php echo $form['description']->renderLabel() ?></th>
            <td>
              <?php echo $form['description']->renderError() ?>
              <?php echo $form['description'] ?>
            </td>
          </tr>
          <tr>
            <th><?php echo $form['periode']->renderLabel() ?></th>
            <td>
              <?php echo $form['periode']->renderError() ?>
              <?php echo $form['periode'] ?>
            </td>
          </tr>
        </tbody>
      </table>
    </form>

  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
    Tu as généré en mode verbose, donc effectivement il manque le code pour ton formulaire embed.

    Modifie en mode non verbose.

    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
     
    <?php use_stylesheets_for_form($form) ?>
    <?php use_javascripts_for_form($form) ?>
     
    <form action="<?php echo url_for('article/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?id='.$form->getObject()->getId() : '')) ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>
    <?php if (!$form->getObject()->isNew()): ?>
    <input type="hidden" name="sf_method" value="put" />
    <?php endif; ?>
      <table>
        <tfoot>
          <tr>
            <td colspan="2">
              <?php echo $form->renderHiddenFields(false) ?>
              &nbsp;<a href="<?php echo url_for('article/index') ?>">Back to list</a>
              <?php if (!$form->getObject()->isNew()): ?>
                &nbsp;<?php echo link_to('Delete', 'article/delete?id='.$form->getObject()->getId(), array('method' => 'delete', 'confirm' => 'Are you sure?')) ?>
              <?php endif; ?>
              <input type="submit" value="Save" />
            </td>
          </tr>
        </tfoot>
        <tbody>
          <?php echo $form->renderGlobalErrors() ?>
          <?php echo $form ?>
        </tbody>
      </table>
    </form>

  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
    ça marche mieux, j'ai bien mon 2eme formulaire imbriqué
    sauf qu'ils sont indépendant l'un de l'autre/
    Quand je crée un nouvel article, j'ai bien un enregistrement dans ma table article et ma table photos, mais le champ article_id est null

  8. #8
    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 faut le renseigner dans l'objet lié au future formulaire.

  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
    quand je dit que c'est un casse-tête chinois.
    de nouveau formulaire tu parles ?
    je ne crée aucun nouveau formulaire la, puisque j'utilise ceux existant ??

    je pense qu'il faut surchargé la classe save() du formulaire parent non ?

  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
    Je parlais, pour être plus précis de l'instance de l'objet photo que tu crées (new) pour l'intégrer dans l'instance de l'objet photoForm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class articleForm extends BasearticleForm
    {
      public function configure()
      {
      	$photoNew = new photo;
            $photoNew->setArticleId = $this->getValue('id');
            $newPhotoForm = new photoForm($photoNew);
      	$this->embedForm('photo',$newPhotoForm);
      }
    }

  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
    j'ai modifié ton code pour éviter une erreur au niveau du setArticleId
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $photoNew = new photo;
        $photoNew->setArticleId() = $this->getValue('id');
        $newPhotoForm = new photoForm($photoNew);
      	$this->embedForm('photo',$newPhotoForm);
    et je me retrouve avec un Fatal Error:
    Fatal error: Can't use method return value in write context in /home/xxx/web/sfprojects/sftest/lib/form/doctrine/articleForm.class.php on line 17
    sinon j'ai essayé d'appliqué la methode que j'ai trouvé ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $photoNew = new photo;
        $photoNew->article = $this->getObject();
        $newPhotoForm = new photoForm($photoNew);
      	$this->embedForm('photo',$newPhotoForm);
    donc la y a un début mais pas évident à expliquer:
    action new il me crée l'article et la photo mais pas de lien entre eux (article_id=null)
    action edit il m'édite bien l'article et me crée une photo lié (article_id=id) sauf que quand tu retourne en édition il me remonte pas la photo (je pense qu'il reste en action new pour le forumaire embarqué).
    j'ai essayé aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedRelation('photos');
    bon bein la, j'ai le titre du formulaire embarque ("Photos") c'est tout.

  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
    Zut, j'ai merdé !

    Et tu m'as suivi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $photoNew = new photo;
        $photoNew->setArticleId( $this->getValue('id') );
        $newPhotoForm = new photoForm($photoNew);
      	$this->embedForm('photo',$newPhotoForm);

  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
    arfeu oui, j'ai encore du mal avec le comportement objet et d'array() qui se mélange

    bon par contre je pense que j'arriverai au même résultat que la solution que j'ai trouvé.
    C'est à dire que systématiquement il me crée un sous-formulaire vierge, tu ne crois pas ?

    ne dois je pas aller moi même chercher les photos déjà existante pour cette article et les incorporer dans le formulaire pour pouvoir les éditer/deleter ?

  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 principe est effectivement de créer systématiquement un enregistrement.

    L'idée est, lors de la création, de ne créer qu'un enregistrement principale. Et de laisser les enregistrements liés dans les modifications d'enregistrement.

    Il y a un plugin : ahDoctrineEasyEmbeddedRelationsPlugin qui peut peut-être utile pour avoir des interfaces de liaison plus simple à mettre en œuvre.

  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
    intéressant mais bon il te crée une ligne vierge quand tu supprime un enregistrement dans la table fille et il affiche le champ qui fait la relation (ici article_id) quand tu est en édition et donc changer le père, pas trés secure ça

  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
    J'ai pas beaucoup plus d'information sur les embeded, il faut vraiment que je m'y penche un de ces jours.

    Mais je crois que Bilbonec à un peu plus d'expérience, s'il passait par ici...

  17. #17
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Bon dans la problématique des embedForm vous avez bien été au au bout du problème,
    En effet en mode édition, tu peux utiliser les embedRelations,
    ou refaire des embedForm avec tes objets lié.
    du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $article = $this->getObject();
     
    foreach ($article->getPhotos()->getData() as $photo)
    {
      	$formPhotoExist = new photoForm($photo);
      	$this->embedForm($i++, $formPhotoExist);
    }
    Bon je ne sais pas si ca peut aider : mais j'ai bossé sur un tuto très bien fait
    http://www.symfony-project.org/more-...Advanced-Forms

    Avec la gestion de PostValidator et de methode pour surcharger les enregistrements des formulaires imbriqué, il est très bien fait...

    Bon courage...

  18. #18
    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
    oui je l'ai lu. Malheureusement il n'explique pas tout ce qu'il fait
    le post que j'ai créée le concernant

Discussions similaires

  1. Casse tête chinois
    Par mortimer.pw dans le forum SQL
    Réponses: 5
    Dernier message: 26/09/2008, 19h59
  2. SMSLIB casse tête chinois
    Par yashiro dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 02/11/2007, 11h45
  3. Casse tête chinois
    Par Jahjouh dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 15/03/2006, 09h04
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  5. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 16h38

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