Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/08/2011, 16h54   #1
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Par défaut Personalisation de l'admin generator bonne ou mauvaise iddée?

Bonjour à tous,

Je voudrais votre avis concernant la personnalisation de l'admin generator.

Dans mon cas particulier j'ai un formulaire d'édition dont je dois récupérer la valeur d'une case à cocher. Si c'est true je ne fais rien. Par contre si c'est false dans le contrôleur il faut indiquer qu'il y a redirection de l'admin vers un autre écran. Dans cet écran je demande si l'admin est sur car cela entraine la suppression de donnée. S'il ne valide pas on ne fait rien sinon on efface.

Selon vous est-ce préférable de faire ces actions dans l'admin générator ou plutôt dans un module non CRUD ?

Petite question subsidiaire : vu que le code est généré automatiquement comment faire pour récupérer la valeur d'un de ces champs?
J'ai bien sur fait ( dans mon contrôleur pour tester)
Code :
echo $information->getNomChamp
mais j'obtiens l'erreur
Code :
Undefined variable $information
Pourtant ce champ est bien enregistré dans ma BDD et l'admin generator me le propose par défaut dans le formulaire. Une chose est sur j'ai encore beaucoup à apprendre...

En vous remerciant d'avance de vos réponses.
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h25   #2
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 770
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 770
Points : 789
Points : 789
Citation:
Dans mon cas particulier j'ai un formulaire d'édition dont je dois récupérer la valeur d'une case à cocher. Si c'est true je ne fais rien. Par contre si c'est false dans le contrôleur il faut indiquer qu'il y a redirection de l'admin vers un autre écran. Dans cet écran je demande si l'admin est sur car cela entraine la suppression de donnée. S'il ne valide pas on ne fait rien sinon on efface.
Je ne suis pas sur de bien comprendre ta question. Par défaut, les boutons 'delete' présentés dans le backend généré par symfony proposent ce genre de sécurité. Si tu veux ajouter cette demande de confirmation sur le click du bouton 'mettre à jour', tu peux surcharger localement dans ton module le sfModelGeneratorHelper et sa fonction linkToSave(). Cf. dans ton cache le fichier _form_actions.php présent dans le dossier templates du module concerné.

NB : Si la demande de confirmation dépend de l'état coché/vierge d'une case du formulaire, un bout de javascript devrait remplacer avantageusement l'appel à confirm() dans l'option onclick de la fonction link_to(). Du moins je le suppose, car je n'ai jamais essayé cette acrobatie.

Citation:
Undefined variable $information
Si tu es dans un des partials de ton formulaire de modification, tu as accès à ton objet avec :
Un code du type $information->blabla() est utile dans les partials de la page de liste (car cette page ne contient pas de formulaire), en supposant ici que le modèle traité par ta page est : Information.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 15h32   #3
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Bonjour,

Merci pour ta réponse Hérode. Je vais essayer ta solution.

Par contre pour le champ dont je veux récupérer la valeur il s'agit d'un champ de type checkbox.
Ce que je ne comprend pas comment faire c'est obtenir la valeur de champ dans mon contrôleur une fois que l'utilisateur à cliqué sur enregistré. Si je veux récupérer ce champ dans le contrôleur c'est que si c'est FALSE (décoché) je veux faire une redirection.

Citation:
$form->getObject()
J'ai essayé mais ça me retourne 4 ( le nombre de champ du formulaire)

En espérant avoir été plus clair
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 09h44   #4
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 770
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 770
Points : 789
Points : 789
Dans la méthode executeMachinchouette() d'une action, les champs du formulaire se trouvent dans l'objet $request que tu reçois en paramètre.

Code :
$params = $request->getPostParameters();
donne accès au tableau associatif des champs, tu devrais trouver ton bonheur là-dedans.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 10h06   #5
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Bonjour,

Après avoir creusé un peu plus mon problème je m'aperçois que c'est la méthode save que je dois personnaliser. Pourquoi personnalisé la méthode save? Dans mon cas précis la personne remplie le formulaire le valide et donc enregistrement des éléments envoyés. Puisque mon traitement consiste à récupérer l'état d'un champ rempli par l'utilisateur la personnalisation du save me semble logique.

J'ai été voir la doc officielle ( notamment http://www.symfony-project.org/forms...ne-Integration ) au paragraphe personnalisé la méthode save.

Vu que je n'ai que un seul formulaire dans mon backend j'ai voulu faire une fonction save dans lib/form de la façon suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
class PhotoStatutForm extends BaseForm
{
public function save($request)
 {
 
    if ($request->isMethod('post'))
    {
      //$photo = $this->form->getObject()->getPhoto(); // c etait ma 1er façon de faire
     $this->photo($request->getParameter()->getPhoto());// ça c'est suite à l'indication donnée plus haut dans ce topic
      if ($this->photo == FALSE)
      {
        $this->redirect(@homepage);
      }
    }
    return parent::save($request);
	  }
}
mais forcement ça ne fonctionne pas. Pire en mettant des die ou des exit dans le code rien ne se passe. Ce qui me fait penser que quand je clique sur save ca n'appelle même pas cette fonction.

J'ai essayé dans le contrôleur du backend avec :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public function executeSave(sfWebRequest $request)
	{
 if ($request->isMethod('post'))
    {
      $photo= $this->form->getObject()->getPhotoOk();
 
      if ($photo == FALSE)
      {
        $this->redirect(@homepage);
      }
    }
    return parent::save($request);
	  }
mais c'est un bel échec. Pourtant dans ma bdd les changements de champs sont bien enregistrés.
Désolé de vous embêtez encore mais si quelqu'un peut m'éclairer de ses lumières.

EDIT: en regardant dans la barre de debug, je me suis aperçu que je devais placer mon code dans le fichier AgentForm.class.php
Maintenant quand j'y met le code de la fonction save j'ai comme erreur
Code :
Strict Standards: Declaration of AgentForm::save() should be compatible with that of sfFormObject::save()
C'est pas exatement ce que je veux mais au moins le code est au bon endroit...
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 11h38   #6
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 770
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 770
Points : 789
Points : 789
Si tu surcharges la méthode save() de ton formulaire, il faut en effet respecter la signature de la méthode mère :
Code :
public function save($conn = null)
où $conn est de type Doctrine_Connection.

Pas d'objet $request donc, et pas besoin de tester si la méthode est POST : le formulaire a déjà été initialisé et le test sur POST déjà fait - en amont - dans la méthode executeMachinchouette() de l'action invoquée.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 16h28   #7
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Désolé de t'embêter encore mais maintenant je bloque sur la suite...
Dans ma class AgentForm j'ai fait

Code :
1
2
3
4
5
6
7
8
9
 
public function save($con = null)
  {
  	if ($this->getObject()->getPhotoOk() == FALSE)
  	{
  		die('aaa');
  	}
  	return parent::save($con);
  }
Je sais que j'ai bien accès à ma variable et que sa valeur est bien égal à FALSE car le die se manifeste bien.

Par contre je pensais qu'avec le
Code :
return parent::save($con);
sa me remonterais les valeurs jusqu'au contrôleur ce qui n'est pas le cas.

En effet

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function executeSave(sfWebRequest $request)
	  {
 
	    if ($request->isMethod('post'))
	    {
		    $photo= $request->getParameter('photoOk');
 
		      	if ($photo == FALSE)
		      	{
		      		$this->redirect(@homepage);
		      	}
 
 
	    }
	  }
ne fonctionne pas. Or comme tu me l'as dit dans un précédent post sfWebRequest $request contient, entre autre, les valeurs des champs du formulaire.

Pour résumer la situation d'un coté j'ai ma surcharge de save de mon form qui reconnait la valeur de mon champ mais je ne comprends pas comment faire pour obtenir cette valeur dans mon contrôleur pour qu'il exécute la redirection.
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 17h19   #8
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 770
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 770
Points : 789
Points : 789
1 -
Citation:
Envoyé par apprentiDev Voir le message
Je sais que j'ai bien accès à ma variable et que sa valeur est bien égal à FALSE car le die se manifeste bien.

Par contre je pensais qu'avec le
Code :
return parent::save($con);
sa me remonterais les valeurs jusqu'au contrôleur ce qui n'est pas le cas.
C'est normal. Si tu regardes le code de la méthode Doctrine_Record::save(), tu verras :
Code :
1
2
3
/**
     * @return void
*/
Tu es dans la couche "modèle" du MVC. La méthode save() sauvegarde l'objet en base de données, avec ou sans traitements spécifiques à ta sauce. Elle ne "remonte" rien.

2 - Par définition d'une surcharge, surcharger MonObjet::save() pour ne faire (si j'ai bien compris ce que tu fais) que
Code :
1
2
3
public function save(Doctrine_Connection $conn = null) {
   parent::save($conn); 
}
ne présente aucun intérêt

3 - Si ton formulaire s'appelle 'mon_formulaire', ton champ devrait être accessible par :
Code :
1
2
$fields = $request->getParameter('mon_formulaire');
$test= $fields['photoOk'];
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 19h41   #9
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Tout d'abord je te remercie une nouvelle fois de ta réponse.

Pour être clair ce que l'utilisateur fait :
Dans un formulaire d’édition de l'admin generator j'ai un champ photoOk qui est un case à cocher.
L'utilisateur le coche ou le décoche.
L'utilisateur valide son choix et envoi donc son formulaire.
Ce que je veux faire :
Avant qu'il y ait enregistrement dans la bdd, vérification de l'état du champ qui est à TRUE ou FALSE.
Si c'est TRUE pas de traitement
si c'est FALSE alors la : redirection de l'utilisateur sur la page du formulaire et affichage d'un message demandant confirmation à l'utilisateur.
Si l'utilisateur confirme alors suppression d'une photo et dans la bdd enregistrement du FALSE sinon pas de suppression et dans la bdd enregistrement du TRUE.

Si je veux modifier la méthode save() c'est parce que j'ai cru comprendre que cette méthode agit avant enregistrement en bdd.Je ne veux enregistrer que s'il y a confirmation quand le champ est à FALSE. Si je me trompe effectivement ce que je fais ne sert à rien.

D’après ton dernier post la seul chose que j'ai modifier pour réaliser ces traitement c'est le contrôleur pas besoin de toucher a save()..

Merci d'avoir pris la peine de répondre à mes précédentes questions.
Cordialement.
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 22h18   #10
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 770
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 770
Points : 789
Points : 789
"pris la peine" n'est pas le terme approprié. Je réponds juste sans trop faire de fioritures, au risque de paraitre un peu sec - mais c'est pure paresse diplomatique de ma part. You're welcome, comme disent les angliches, et les forums sont là pour dépanner.

Et surtout : oui, pour autant que je comprenne ton problème, c'est dans le contrôleur que ça se passe.
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 20h28   #11
Invité régulier
 
Inscription : mai 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 24
Points : 7
Points : 7
Bonjour,

Pour t'informer que j'ai réussi ce que je voulais faire. En faite le problème venait que je ne devais pas agir dans executeSave mais dans executeUpdate car je suis dans l'admin generator. En effet dans l'url j'avais un /4 qui correspond au fait de faire un Update.
Il ne me reste plus qu'a insérer du javascript pour mon checkbox quand il est décoché, dans le code généré par l'admin generator mais c'est autre chose.

Merci pour ta patience et tes explications Hérode.
apprentiDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h28.


 
 
 
 
Partenaires

Hébergement Web