2010-05-19 13 views
0

Je suis assez nouveau à symfony et j'ai 2 champs relatifs à ma table "Pages"; created_by et updated_by. Ils sont liés à la table users (sfGuardUser) en tant que clés étrangères. Je veux que ceux-ci soient cachés des formes d'édition/nouvelles, donc je l'ai mis en place le fichier generator.yml pour ne pas afficher ces champs:Symfony: Comment masquer les champs de formulaire de l'affichage, puis définir les valeurs pour eux dans la classe d'action

form: 
    display: 
    General: [name, template_id] 
    Meta: [meta_title, meta_description, meta_keywords] 

Maintenant je dois définir les champs de la sauvegarde. J'ai cherché comment faire cela toute la journée et essayé une centaine de méthodes. La méthode que j'ai travaillé est la suivante, dans la classe des actions:

protected function processForm(sfWebRequest $request, sfForm $form) 
    { 
    $form_params = $request->getParameter($form->getName()); 
    $form_params['updated_by'] = $this->getUser()->getGuardUser()->getId(); 
    if ($form->getObject()->isNew()) $form_params['created_by'] = $this->getUser()->getGuardUser()->getId(); 

    $form->bind($form_params, $request->getFiles($form->getName())); 

Cela fonctionne donc. Mais j'ai l'impression que, idéalement, je ne devrais pas modifier la requête web, mais plutôt modifier le formulaire/l'objet directement. Cependant, je ne ai pas eu de succès avec des choses comme:

$form->getObject()->setUpdatedBy($this->getUser()->getGuardUser()); 

Si quelqu'un pouvait offrir des conseils sur les meilleures façons de résoudre ce type de problème, je serais très reconnaissant.

Merci, Tom

Répondre

0

Après le traitement et l'enregistrement du formulaire, vous pouvez définir les champs sur l'objet et réenregistrez:

protected function processForm(sfWebRequest $request, sfForm $form) 
{ 
    $form->bind($request->getParameter($form->getName())); 

    if ($form->isValid()) 
    { 
    $page = $form->save(); 
    $user = $this->getUser()->getGuardUser(); 
    $page->setUpdatedBy($user); 
    if (empty($page->created_by)) 
    { 
     $page->setCreatedBy($user); 
    } 

    $page->save(); 

    $this->getUser()->setFlash('notice', 'Successfully saved page.'); 
    $this->redirect('@homepage'); 
    } 
} 

Il y a aussi une extension doctrine appelée blâmable qui définit automatiquement les champs edited_by et CREATED_BY sur les modèles spécifiés . Le site de Doctrine est en cours de réorganisation mais voici le cached page pour l'extension.

+0

Blameable est exactement ce dont j'ai besoin, merci un million - et y compris la page en cache aussi - légende. Incidemment, votre solution n'aurait pas fonctionné pour moi car les champs created_by/updated_by sont des clés étrangères et $ form-> save() ne laisseront pas passer les valeurs nulles. – Tom

0

Pour traiter votre formulaire créer un nouvel objet, définissez les champs, puis enregistrez.

$article = new Article(); 
$article->setName($request->getParameter($form->getName()); 
$article->setDescription($request->getParameter($form->getDescription()); 
$article->setMetaKeywords($request->getParameter($form->getMetaKeywords()); 
$article->save(); 
+0

Salut Jon, Merci pour votre réponse! Cependant, cela ne ressemble pas à son utilisation de la fonctionnalité de base sf. $ form-> bind() devrait (et gère) automatiquement tous les champs soumis. $ form est déjà lié à l'objet (article dans votre exemple) par $ form-> getObject() (right?) ce qui devrait rendre la dernière ligne de mon message valide ...? Mais ce n'est pas !! – Tom

+0

C'est vrai, pour être honnête, je n'ai que récemment migré vers Symfony 1.3 à partir de la version 1.0 et donc je fais peut-être les choses à l'ancienne. –

0

Qu'est-ce que vous voulez faire est de personnaliser votre formulaire et les pièces unset « created_at » et « updated_at » de la forme en configuration

class SampleForm extends BaseSampleForm 
{ 
    public function configure() 
    { 
    unset(
     $this['created_at'], 
     $this['updated_at'] 
    ); 
    } 
} 

Ensuite, ils ne seront pas visibles sous la forme et reçoivent les valeurs configuration par le comportement « timestampable » avant d'être sauvé

http://stereointeractive.com/blog/2010/04/07/symfony-forms-hide-created_at-updated_at-columns/