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 :

Récupérer une entité de Twig depuis JavaScript à envoyer vers le contrôleur ?


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Points : 48
    Points
    48
    Par défaut Récupérer une entité de Twig depuis JavaScript à envoyer vers le contrôleur ?
    Bonjour à vous tous.

    J'ai une petit problème à vous exposer, à déjà savoir si ma modélisation est possible.

    Voila voila :

    En résumé je souhaiterai récupérer une Entité envoyé à un template twig pour l'envoyer vers mon contrôler.

    En d'autres termes :

    Controller : render->template(monTwig, 'cpt'-> Entity)
    monTwig : Modification des valeurs, initialisé par les attributs de l'Entity au préalable. Envoyer l'entity modifié vers mon controller
    Controller : persist(Entity)

    Voila ce que j'aimerai faire. c'est une approche Objet au complet.

    Ce que j'ai cru comprendre pouvoir être possible :

    - Créer un formulaire via formBuilder
    - Passer en paramètre de ce formulaire une entité
    - Instaurer le formulaire dans la vue twig
    - Manipulation du formulaire par l'utilisateur
    - Soumission
    - récupération du formulaire
    - Créer une entité vide et la Remplir à travers les données du formulaire
    - Persist

    D'accord, ce principe peut exister, mais personnellement je ne suis friand de formulaire et préfère être plus maitre de mes balisages. (peut-être ais-je tord, je n'ai d'expertise html/php)

    Voila donc où j'en serai :

    Controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function adhesionUnAction()
        {
        	// create an Account
        	$compte = new CompteAcces();
     
        	$compte = $this->getDoctrine()
        	->getRepository('PldAccountBundle:CompteAcces')
        	->findOneById(1);
     
    return $this->render('PldAccountBundle:Default:adhesionCompte.html.twig', (array('cpt' => $compte,)));
    }
    Mon twig html :
    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
     
    <p class="toCoord">
    			<label for="iemail"> E-mail : </label>
    			<input id="iemail" value="{{ cpt.eMail }}"/>
    			</br>
    			<label for="icemail"> Confirmer E-mail : </label>
    			<input id="icemail"/>
    			</br>
    			<label for="imdp"> Mot de passe : </label>
    			<input id="imdp" value="{{ cpt.pwd }}"/>
    			</br>
    			<label for="icmdp"> Confirmer Mot de passe : </label>
    			<input id="icmdp"/>
    		</p>
    <input id="send_un" type="submit" click=/>
    Le javascript

    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
     
    $(document).ready(function()
    			{
     
    				$('input#send_un').click(function(){
    					save({{cpt}});
    				})
    			}
    	);
     
    	function save(cpt)
    	{
    		alert(cpt.email);
    		if(cpt != null)
    			{
    				$.get(Routing.generate('updateCompte', {'cpt':cpt}));
    			}
    	}
    Le controlleur de mise à jour (pour l'instant je fait juste un test echo)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     /**
         * @Route("/adhesion1Update/{cpt}", name="updateCompte", options={"expose"=true})
         */
        public function adhesionUnUpdateAction($cpt)
        {
        	$compte = new CompteAcces($cpt);
        	echo($compte->getEMail());
        	return new Response($compte->getEMail());
        }
    J'aimerai donc pouvoir faire ceci, hors cela ne fonctionne au niveau de mon javascript , {{cpt}}, en effet il ne comprend pas l'objet, attendant un String. De même, j'ai tendance à croire que "cpt" ne correspond à rien, cpt.eMail et cpt.mdp étant interprété de suite en string, je ne suis sur qu'on puisse "stocké" une entité comme ça. si ?

    J'ai donc essayer une classe javascript et la fonction associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var maClassA = function(email, mdp)
    		{
    		    this.email = email;
    		    this.mdp = mdp;
    		}
     
    $('input#send_un').click(function(){
    					var objet = new maClassA($('input#iemail').val(), $('input#imdp').val());
    					save(objet);
    				})
    Ici tout marche, normal, l'objet est reconnu et envoyé. hors, bien entendu, coté php (le controller), il ne correspond à rien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /**
         * @Route("/adhesion1Update/{cpt}", name="updateCompte", options={"expose"=true})
         */
        public function adhesionUnUpdateAction($cpt)
        {
    $compte = new CompteAcces($cpt);
        	echo($compte->getEMail());
    }
    Me renvoie "" au lieu de tujrf@lr.com par exemple.

    Comment donc faire à comprendre que $cpt correspond à l'objet spécifié dans javascript ? Existe-t-il un binding de classe php-javascript, pour qu'il se reconnaissent ?

    C'est à dire, quelque chose du genre

    class AJava { nom : string}

    Binding[class=Ajava]
    class Aphp {nom : string }

    ou un autre procédé ?

    Vous l'aurez compris, je débute php/javascript à travers symphony

    Puis, si j'ai un formulaire de 15 champs, ce serai tellement bien de pouvoir récupérer cet objet "cpt" et simplement le renvoyé, étant renseigné dynamiquement par l'utilisateur ou pas. Dois-je faire 15 fois, objet.paramX = champX.val() ? Il me faut déjà régler la concordance java/php. Si je peut éviter un appel controller du genre

    $.get(Routing.generate('updateCompte', {'x1': x1, 'x2': ......... : x15}));

    J'espère ne pas avoir été confus, dites le-moi si des points sont obscur. Je suis à l'écoute de d'autres méthode pouvant être meilleur, j'apprends, j'apprends..

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    donc en fait, si je résume, ce que tu essaie de faire, c'est la récupération d'une entité pour l'editer? ou alors un enregistrement ajax? Je n'ai pas bien compris ton probleme

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Points : 48
    Points
    48
    Par défaut
    Les deux en fait, mais tu as bien ciblé, c'est surtout l'enregistrement.

    Récupérer une entité via la base de donnée et l'afficher à travers twig, il n'y a de problème.

    Bdd -> controller --envoie entité -> Twig-- affiche entité

    Ok

    ----

    Mais ensuite, suite à les mises a jour utilisateurs, est-il possible de renvoyez cette Entité pour effectuer une mise a jour en Bdd

    Twig.html -- envoie entité --> controller -- persist(entité) -> Bdd

    ** Ce que j'aimerai faire **

    ----

    En effet tu as raison, via ajax. Du moins j'utilise fosjsrouting pour cibler mon controller et passer les paramètres.

    Ajax pur c'est le même principe si je ne me trompe :

    $.ajax{ url ; param, option, callback } quelque chose comme ça non ? Je ne l'ai pas utilisé.

    Mais je pense que tu as compris, c'est bien le fait d'envoyer une entité (préalablement émise dans le twig pour l'éditer) depuis le template twig.html vers le controller, pour en effet l'enregistrer.


  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    Dacord, je vois. ben... le traitement est pareil que si tu le fais avec symfony et juste en php, sauf que tu envoie les données POST avec une requete ajax. Je ne vois vraiment pas ou tu bloques.

    tu verifie simplement si c'est une requete avec ->isXmlHttpRequest() avant le traitement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Points : 48
    Points
    48
    Par défaut
    Je n'arrive pas à envoyer L'objet relatif à une Entité.

    Comme l'exemple que j'ai mis :

    $.get(Routing.generate('updateCompte', {'cpt':{{cpt}}));

    Object of class Pld\Bundle\AccountBundle\Entity\CompteAcces could not be converted to string in

    Avec $.post(Routing.generate('updateCompte', {'cpt':{{ cpt }} })); c'est iddentique.

    ----

    cpt est mon objet relatif à l'entité 'CompteAcces'

    qui m'affiche l'e-mail et le mdp utilisateur.

    via {{ cpt.email }} et {{ cpt.mdp }}

    ----

    L'utilisateur modifie dans le champ input sont e-mail et veut enregistrer cela.

    J'aimerai donc que l'Objet cpt soit envoyer au controller, mais j'ai l'impression que :

    1 : il n'y a de binding de fait avec l'objet, juste la valeur du input et changé
    -> i.e. #inputMail.val() renseigne bien le nouveau e-mail
    {{ cpt.email }} garde l'ancienne valeur

    2 : on ne peut envoyer un objet de type Entité. Du moins il n'est pas reconnu là, existe-t-il un méthode 'cast' (mais javascript comprendra-t-il, vu que c'est une objet php ?)

    Ais-je tord ?

    Merci de tes remarques au passages

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Points : 48
    Points
    48
    Par défaut
    J'avance !!!

    En fait j'ai appris certaines chose comme :

    Communication de paramètres entre javascript <-> php , se fait via
    - xml
    - dom
    - text
    - json

    Donc ça à répondu un peut à mes questionnements. (il en existe d'autres ?)

    J'ai donc utilisé Json pour "Encapsuler" mon objet (il l'a retranscris plus précisément).

    Voilà ce que ça peut donner :

    Html :
    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
     
    ...
    ...
     
    <p class="toCoord">
    			<label for="iemail"> E-mail : </label>
    			<input id="iemail" value="{{ cpt.eMail }}"/>
    			</br>
    			<label for="icemail"> Confirmer E-mail : </label>
    			<input id="icemail" value="{{ cpt.eMail }}"/>
    			</br>
    			<label for="imdp"> Mot de passe : </label>
    			<input id="imdp" value="{{ cpt.pwd }}"/>
    			</br>
    			<label for="icmdp"> Confirmer Mot de passe : </label>
    			<input id="icmdp" value="{{ cpt.pwd }}"/>
    		</p>
     
    		<label  class="labelToCoord">Information compte</label>
    		<p class="toCoord">
    			<label for="ititre"> Titre : </label>
    			<select id="ititre">
    				<option>Mr</option>
    				<option>Mme</option>
    				<option>Mlle</option>
    			</select>
    			</br>
    			<label for="inom"> Nom : </label>
    			<input id="inom" value="{{ info.familynameuser }}"/>
    			</br>
    			<label for="iprenom"> Prenom : </label>
    			<input id="iprenom" value="{{ info.nameuser }}"/>
    			</br>
    			<label for="itel"> Téléphone : </label>
    			<input id="itel" value="{{ info.phoneNumber }}"/>
    		</p>
     
    ...
    ...
    JavaScript
    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
     
    ....
     
    $('input#send_un').click(function(){
    					var objetC = new compte($('input#iemail').val(), $('input#imdp').val());
    					objCompte = JSON.stringify(objetC);  
     
    					var objetI = new infoCompte($('input#ititre').val(), $('input#inom').val(),
    												$('input#iprenom').val(), $('input#itel').val());
    					objInfoCompte = JSON.stringify(objetI);  
     
    					$.post(Routing.generate('updateCompte', {'cpt':objCompte, 'info':objInfoCompte})
    						 );
    				})
     
    ...
     
    var compte= function(email, mdp)
    	{
    	    this.email = email;
    	    this.mdp = mdp;
    	}
     
    	var infoCompte = function (titre, nom, prenom, telephone)
    	{
    		this.titre = titre;
    		this.nom = nom;
    		this.prenom = prenom;
    		this.telephone = telephone;
    	}
    Je passe donc mes objets formalisé en Json pour les communiquer à php qui saura quoi en faire, avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $objC = json_decode(stripslashes($cpt));
    $cpt étant l'objet objCompte.

    Note : N'y a -t- il aucun problème à utiliser json, ayant vu certains rouspéter sur certaines fiabilité d'effectuer ce processus coder/décoder ? Non parce que après j'ai à utiliser des booléens(ça devrait aller ça) et images hé hé.

    Voila en partit ce que je voulais faire donc.

    Car un autre questionnement était de savoir si l'on pouvais mettre à jour directement une Entité passé en paramètre de notre template twig, mais je pense que non. (trop facile sinon...).

    Mais j'aimerai avoir votre avis sur cette "modélisation" , l'a trouvé vous justifiable ou bancale, octogonale etc..

    C'est à dire, il y a t-il une meilleur manière de faire, plus robuste, plus patterns, plus générique pourquoi pas, plus propre, plus plus plus !!! ?

    nb : en effet, ayant vu le principe du formulaire géré par twig, mais n'ayant l'impression de pouvoir réaliser autant de chose technique ou visuel. -> comment en gérer l'internationalisation (les langues), le css, etc. En quoi le formulaire serai mieux ( à part peut être moins coder ) ? Form ou pas Form par exemple dans mon exmple ? : )

    Ps : simcos, j'ai lus un peut sur XmlHttpRequest, en fait c'est le principe de faire un appel distant via open(), puis passer des paramètres via send(). Après je n'en sais de plus désolé.. Mais les fonctions get() et post() de jQuery le font très bien. Ou alors ils pêchent peut-être sur certains point que je ne saurai.


    Merci pour vos expertises que vous pourrez produire

Discussions similaires

  1. [SAX] Récupérer une entité avec SAX sans la modifier
    Par basis2 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 29/12/2008, 17h20
  2. Réponses: 3
    Dernier message: 29/05/2008, 21h06
  3. Récupérer une variable ASP.NET en Javascript
    Par zooffy dans le forum ASP.NET
    Réponses: 6
    Dernier message: 20/03/2008, 09h34
  4. Récupérer une variable dans un script javascript
    Par Finelarme dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/10/2006, 18h41
  5. [WebForms]Comment utiliser une variable de session depuis JavaScript ?
    Par ThunderBib dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 05/05/2006, 14h01

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