【问题标题】:Symfony: How to hide form fields from display and then set values for them in the action classSymfony:如何从显示中隐藏表单字段,然后在操作类中为它们设置值
【发布时间】:2010-05-19 13:12:35
【问题描述】:

我是 symfony 的新手,我有 2 个与我的表“页面”相关的字段; created_by 和 updated_by。这些作为外键与用户表 (sfGuardUser) 相关。我希望将这些从编辑/新表单中隐藏,因此我将 generator.yml 文件设置为不显示这些字段:

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

现在我需要设置保存的字段。我整天都在寻找如何做到这一点,并尝试了一百种方法。我已经开始工作的方法是,在动作类中:

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()));

所以这行得通。但我觉得理想情况下我不应该修改网络请求,而是直接修改表单/对象。但是,我在以下方面没有取得任何成功:

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

如果有人能就解决此类问题的最佳方法提供任何建议,我将不胜感激。

谢谢, 汤姆

【问题讨论】:

    标签: forms symfony1 bind


    【解决方案1】:

    处理并保存表单后,您可以在对象上设置这些字段并重新保存:

    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');
      }
    }
    

    还有一个名为 Blameable 的 Doctrine 扩展,它会自动在指定模型上设置edited_by 和 created_by 字段。 Doctrine 网站正在进行一些重组,但这里是扩展名的cached page

    【讨论】:

    • Blameable 正是我所需要的,感谢一百万 - 也包括缓存页面 - 图例。顺便说一句,您的解决方案对我不太有效,因为 created_by/updated_by 字段是外键,并且 $form->save() 不会让空值通过。
    【解决方案2】:

    要处理您的表单,请创建一个新对象,设置字段然后保存。

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

    【讨论】:

    • 您好乔恩,感谢您的回答!然而,这看起来不像使用任何 sf 核心功能。 $form->bind() 应该(并且确实)自动处理所有提交的字段。 $form 已经通过 $form->getObject() 与对象(您的示例中的文章)相关联(对吗?)所以这应该使我帖子中的最后一行有效......?但它不是!
    • 是的,说实话,我最近才从 Symfony 1.0 迁移到 Symfony 1.3,所以我可能会以的方式做事。
    【解决方案3】:

    您要做的是自定义表单并在配置中取消设置表单的“created_at”和“updated_at”部分

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

    然后它们将不会显示在表单中,并且会在保存之前通过“时间戳”行为设置值

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2018-12-04
      相关资源
      最近更新 更多