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 :

Backend - Ajout d'une action dans l'édition


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut Backend - Ajout d'une action dans l'édition
    Bonjour,

    Dans mon formulaire d'édition, j'aimerais avoir un boutton de type ajouter comme nouvelle article.

    Exemple :
    J'ai un article avec certaines caractéristique.
    J'aimerais avoir un bouton qui, lorsque je cliquerais dessus, n'édite pas l'article courant mais en créer un nouveaux.

    Pour le moment, j'ai pensé :
    1/ Faire un executeDapresModele qui lorsque je l'apelle, prend l'objet en paramètre et enleve l'id (clé primaire)
    2/ Surchargé une méthode (je ne sais pas laquelle)

    Merci d'avance,

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Pourquoi faire ca dans le formulaire d'edition alors qu'il existe un formulaire d'ajout expres ?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    C'est ce que je suis en train de me dire. Mais je pense que je vais ajouter une action dans la page indexSuccess qui lorsque je clique dessus, me créer un formulaire d'ajout pré-rempli en fonction d'un élément.

    Donc il faut que je regarde comment est fichu les action pour en rajouter une :p


    Cette solution est-elle propre ?


    Problème : linkToNew ne peut pas prendre d'objet. Sinon, il faudrait que je créer une action spécial qui fasse un redirect sur un new ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Que cherches tu à faire exactement ?
    En gros pré-remplir un formulaire de création d'article avec des données existantes ou connues ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Si j'ai bien compris le probleme, ce que je ferai c'est :
    - Dans une nouvelle action, creer un nouvel objet Article.
    - Lui attribuer les valeurs souhaitées ($monArticle->setNom('test') )
    - Et enfin utiliser cet objet pour instancier le formulaire d'ajout : $form = new ArticleForm($monArticle);

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    en faite, j'ai un module backend. J'ai 2 enregistrements qui se ressemble mais j'ai un champs qui diffère.

    Pour éviter de retaper les informations à chaque fois. J'aimerais avoir simplement un lien qui me permettrait d'ajouter un enregistrement à partir d'un autre.

    J'ai donc tout d'abord penser à le rajouter dans le formulaire d'édition mais impossible de dupliquer.

    Maintenant je me dit qu'une action dans le template index me permettrait d'afficher, lors d'un clique sur un enregistrement, un formulaire pré-rempli en prenant le soin d'enlever l'id.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Dans ce cas la méthode que je t'ai proposée devrait fonctionner.
    Dans la nouvelle action tu récupère l'article à "dupliquer", tu créer un nouvel article et tu met à jour ses propriétés puis tu appelle ArticleForm avec en paramètre ce nouvel article.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - Dans une nouvelle action, creer un nouvel objet Article.
    Pour ajouter l'action je doit modifier le template ou le generator peut m'aider?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - Lui attribuer les valeurs souhaitées ($monArticle->setNom('test') )
    Est ce que l'on peut dupliquer un objet ? et lui mettre don id à null ? ou Doctrine_NULL ou quelque chose du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - Et enfin utiliser cet objet pour instancier le formulaire d'ajout : $form = new ArticleForm($monArticle);
    Après cela, je doit rediriger sur le template new ? ou je doit me créer un nouveaux template en copiant collant le template new ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Pour ajouter l'action je doit modifier le template ou le generator peut m'aider?
    Tu dois ajouter une nouvelle action dans ton action.class.php.
    Apres dans ton template tu dois juste faire appel à cet action (bouton lien etc...)

    Est ce que l'on peut dupliquer un objet ? et lui mettre don id à null ? ou Doctrine_NULL ou quelque chose du genre ?
    La on se trouve dans la nouvelle action.
    Ce que tu dois faire c'est récupérer l'article que tu veux cloner (requete ?)
    Apres quand tu creer un nouvel objet article, je ne sais pas si tu peux faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nouvelArticle = new Article();
    $nouvelArticle = $articleACloner;
    Car si tu fais comme ca je ne sais pas si l'id est conservé ( à tester et si tu pouvais me donner la réponse ca serait sympa )
    Mais en tout cas si cela ne fonctionne pas alors tu devras juste mettre les parametres de ton nouvel article a jour manuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nouvelArticle = new Article();
    $nouvelArticle->setName($articleAcloner->getName());
    Après cela, je doit rediriger sur le template new ? ou je doit me créer un nouveaux template en copiant collant le template new ?
    Il me semble qu'il n'y a pas besoin de refaire un template new. Celui existant sera utilisé.

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Ok merci, je fait ça cette apres-midi, et je posterais mon retour

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Ben en faite, je l'ai fait maintenant . Très rapide. Merci de ton aide insane, j'avais eu cette idée cette nuit mais je savait pas si elle était jouable.

    Voici mon code :
    _list_td_actions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <td>
      <ul class="sf_admin_td_actions">
        <?php echo $helper->linkToEdit($article_type, array(  'params' =>   array(  ),  'class_suffix' => 'edit',  'label' => 'Edit',)) ?>
        <?php echo '<a href="'.url_for('article/NewByModel?id='.$article_type->getId()).'">New</a>';?>
        <?php echo $helper->linkToDelete($article_type, array(  'params' =>   array(  ),  'confirm' => 'Are you sure?',  'class_suffix' => 'delete',  'label' => 'Delete',)) ?>
      </ul>
    </td>
    actions.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      public function executeNewByModel(sfWebRequest $request)
      {
        $this->article_type = $this->getRoute()->getObject();
        $this->article_type = $this->article_type->copy(true);
        $this->form = $this->configuration->getForm($this->article_type);
        $this->setTemplate('new');
      }
    Voila comment on duplique un objet : $monObjet->copy(true)
    En fait, la classe Record de Doctrine possède une méthode pour faire tout ça en meme temps : copy(). 2 avantages en particulier :
    L’objet créé possède automatiquement un nouvel identifiant si dans le schéma la clé primaire est en auto-incrément.
    La méthode prend en paramètre un booléen (deep) qui, s’il vaut TRUE, duplique également tous les objets associés à l’objet dupliqué et ce récursivement. Pour cela, il y a quand même une petite astuce à savoir : il faut « loader » toutes les références à l’objet que vous voulez dupliquer avec la méthode loadReference(). Et il y a aussi une astuce à savoir si vous êtes en i18n. Mais vous comprendrez mieux avec l’exemple concret ci-dessous.
    Vu sur le site : http://david-gueye.fr/2010/02/02/dup...ctrine-record/
    Dans mon id (en faisant un print_r) voila ce que j'ai :
    Premier id rencontré : id = array() => On voit bien qu'il n'a plus d'identifiant.
    Et dans le tableau des valeurs [id] => Doctrine_Null Object () => Plus de valeurs non plus ici.

    [édition :] j'ai pas encore mes jointures correctement (une relation N-M portant sur la table elle même), le copy ne me met pas à jour ma liste des composition ( j'ai un article qui peut être composé de 1 ou N articles) et quand je fait un copy, je n'ai pas mes jointeure associés.

    [édition 2:]Voici ce que j'ai rajouté afin d'avoir mes compositions dans action.class :
    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
      public function executeNewByModel(sfWebRequest $request)
      {
        $model = $this->getRoute()->getObject();
        $this->article_type = $model->copy();
        $collection = new Doctrine_Collection ("ArticleComposition");
        foreach($model->getEstComposes() as $composition)
        {
          $temp = $composition->copy(true);
          $temp->article = $this->article_type;
          $collection->add($temp);
        }
        $this->article_type->estComposes = $collection;
        $this->form = $this->configuration->getForm($this->article_type);
        $this->setTemplate('new');
      }
    Mais j'ai une erreur : Unexpected extra form field named "compositionX" ... Je ne sais pas encore pourquoi.

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Bon, avec ces deux lignes, ma validation fonctionne mais mes relations ne sont pas sauvegardé. Je ne sais pas encore pourquoi. Je continue mes investigation.
    dans le configure de ArticleTypeForm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $this->validatorSchema->setOption('allow_extra_fields', true);
        $this->validatorSchema->setOption('filter_extra_fields', false);
    Si vous avez des pistes je suis preneur.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Je suis perdu.

    voici ce que j'ai essayé :
    1/ copy(true) => ne duplique pas les relations
    2/ faire un copy() des relations et les ajouter à une collection. Marche mais ne s'enregistre pas.
    3/ Par contre, en ajoutant un code afin d'ajouter un formulaire vierge. ça marche (enfin j'ai seulement la valeur dans le nouveau formulaire et pas les relations - je les vois mais elle ne s'enregistre pas).
    4/ En essayant de faire un new MonObjet() et en utilisant les setters. Cela ne marche pas non plus. Pourtant, cela marche avec le formulaire vierge.

    Je suis perdu. Un peu d'aide serait la bienvenue.

  14. #14
    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
    Je me permet de rajouter un grain de sel.

    Si j'ai bien compris : Tu as un article qui doit te servir de base à la création d'un nouvel article, tu souhaites dupliquer tout l'article, sauf la clef unique et tu souhaites aussi passer des liaisons n-n entre ta table et une autre. Est-ce bien ce que tu souhaites faire ?


    Je pense que le plus simple est d'utiliser la méthode clone() de l'objet article pour optenir un nouvel article.

    La question qui va ce poser est : l'article peut-il être enregistré en base de données avant d'être édité pour la première fois ou pas.

    Si oui, la duplication des clefs devrait être simple mais si l'article ne doit pas être créé, on va être dans le caca...

    Si non, la duplication des clefs, il va falloir que j'y réfléchisse attentivement et la, je n'ai pas la solution. J'en ai, mais elles sont un peu compliqués et peu viables.

    En fait, j'en arrive à pense qu'il doit être plus simple de créer un article et ces liaisons, au risque de devoir l'effacer, que le contraire.

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Je me permet de rajouter un grain de sel.
    Avec plaisir,

    Si j'ai bien compris : Tu as un article qui doit te servir de base à la création d'un nouvel article, tu souhaites dupliquer tout l'article, sauf la clef unique et tu souhaites aussi passer des liaisons n-n entre ta table et une autre. Est-ce bien ce que tu souhaites faire ?
    Oui tout à fait.

    Je pense que le plus simple est d'utiliser la méthode clone() de l'objet article pour optenir un nouvel article.
    C'est ce que j'utilise mais j'ai l'impression que les relations (les getters permettant de renvoyer des Doctrine_Collection) ne sont pas renseignés.

    La question qui va ce poser est : l'article peut-il être enregistré en base de données avant d'être édité pour la première fois ou pas.
    Un article est enregistré en base, et c'est cette article que je voudrais pouvoir prendre en model. Je ne peut pas prendre un model qui n'est pas en base. Mais je ne suis pas obligé d'enregistrer le nouvel article crée. Il faut qu'il valide le formulaire.

    A priori, j'arrive a renseigné mes objets dans mon actions pour dupliquer tous mes éléments. Le seul problème est que les liaisons ne se font pas. J'ai essayé d'initialisé mes collections, de les vider, .... Mais rien n'y fait. Impossible d'enregistrer en base mes relations.

  16. #16
    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
    J'ai un peu creusé.

    En fait, le Doctrine_record (objet doctrine) ne peut être copié avec clone. Il embarque une fonction copy()

    copy($deep = false). Le paramètre $deep à true doit permettre de copier les relations. En principe, car j'ai trouvé un sujet sur le forum anglais qui propose une correction.

    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
     
        /**
         * Fixes the buggy copy method of Doctrine_Record
         *
         * @param bool $deep
         * @return BaseDoctrineRecord
         */
        public function copy($deep = false)
        {
          $ret = parent::copy(false);
          if (!$deep)
            return $ret;
     
          // ensure to have loaded all references (unlike Doctrine_Record)
          foreach ($this->getTable()->getRelations() as $name => $relation)
          {
            // ignore ONE sides of relationships
            if ($relation->getType() == Doctrine_Relation::MANY)
            {
              if (empty($this->$name))
                $this->loadReference($name);
     
              // do the deep copy
              foreach ($this->$name as $record)
                $ret->{$key}[] = $record->copy($deep);
            }
          }
        }
    à mettre dans ton objet a copier le message date de janvier 2010, il y a eu plusieurs correction de bug depuis... peut-être vérifier dans un premier temps la fonction copy de base, et si non, tester la version modifiée.

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    Bonjour,

    Merci du temps que tu prends à nous répondre.

    J'ai une erreur en exécutant le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown record property / related component "1" on "ArticleType"
    A priori, cela viens de cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              foreach ($this->$name as $record)
                $ret->{$key}[] = $record->copy($deep);

    J'ai tenté de prendre le code sur : http://trac.doctrine-project.org/bro...d.php?rev=7261

    Je n'ai pas d'erreurs mais les relations ne sont pas copiés. En faisant un count($variable->getMaRelation()) j'ai 0 alors que sur l'objet à copier, j'ai 3.

  18. #18
    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
    Le fix que tu as trouvé est certainement déjà appliqué dans la dernière version.

    Je n'ai jamais testé le code donné et je suis un peu surbouqué cette deux prochaines semaines pour monter un projet de test et faire des essais.

    Il me faudrait plus de détail sur les test effectués.

    A la limite, mettre xdebug sur ton php pour pouvoir suivre pas à pas ce qui se passe dans le code.

    A priori, le code retrouve les liaisons existantes et copie les enregistrements, ce qui n'a d'intérêt que pour les liaisons n-n, ce qui semble être ton cas.

    Si tu ne peux pas mettre de xdebug en place, essaye de bien repérer les clefs primaires qui doivent être copiée et d'envoyer des informations à l'écran avec un bête echo, ou dans le fichier de log.

  19. #19
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 96
    Par défaut
    dans le code que tu as trouvé, le $key est une variable non initialisé. C'est pour cela que le code ne fonctionne pas. (Enfin je pense).

    Sinon, ben j'ai essayé plein de chose. Créer des objets à la main et initialisé les champs ne fonctionne même pas. C'est pour cela que je suis un peu dérouté. Je ne comprend pas pourquoi lorsque je crée un objet vide cela marche, puis lorsque je crée X objet vide dans un forEach, cela ne fonctionne pas.

  20. #20
    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
    Je n'ai pas plus de réponses, il faudrait que je monte un projet test, et pas le temps.

    Éventuellement, mets moi par MP un zip de ton projet et je regarde dés que j'ai un peu de temps. Pense au fichier fixature pour qu'il y ait des données dans le test.

Discussions similaires

  1. Ajout d'une action dans un groupe d'items d'une ToolBar
    Par barth3000 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 22/07/2011, 12h59
  2. Ajouter une action dans le menu help d'une application RCP
    Par jinar dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 11/06/2008, 12h56
  3. Ajouter deux paramètres à une action dans un lien.
    Par Alexandre T dans le forum Struts 1
    Réponses: 4
    Dernier message: 27/08/2007, 12h39
  4. Ajouter une action dans une liste de checkbox
    Par kstou2001 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 09/08/2007, 20h06
  5. ajouter une action dans un jeu
    Par lolo5169 dans le forum Projets
    Réponses: 15
    Dernier message: 28/08/2006, 10h53

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