如何访问Symfony 1.4中显示的表单中的相关对象

时间:2011-05-20 11:51:09

标签: symfony1 symfony-1.4 symfony-forms

我需要显示一个表单,以便在显示新闻报道的同一页面上输入博客文章。用户正在输入与故事相关的博客文章。

在我的博客表单中,我目前正在这样做,以显示故事的ID:

public function configure()
{
    $this->setWidget('image_filename', new sfWidgetFormInputFileEditable(array(
    'file_src'    => '/uploads/blogpost_images/thumbnails/thumb_'.$this->getObject()->image_filename, //displayed for existing photos
    'edit_mode'   => !$this->isNew(),
    'is_image'    => true,
    'with_delete' => false,

    )));

    $this->setValidator('image_filename', new sfValidatorFile(array(
      'mime_types' => 'web_images',
      'required' => $this->isNew(),
      'path' => sfConfig::get('sf_upload_dir').'/blogpost_images',
      'validated_file_class' => 'BlogPostValidatedFile',
    )));
    $this->setValidator('url', new sfValidatorUrl(array('required' => true)));
    $this->setValidator('title', new sfValidatorString(array('required' => true)));

    $this->setWidget('user_id', new sfWidgetFormInputHidden(array(),array(
        'value'=>sfContext::getInstance()->getUser()->getId())
            ));

    // get the request params to access the notice ID and pass it back to the form for
    // saving with the blog post

    $params = sfContext::getInstance()->getRequest()->getParameterHolder();

    $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden(array(),array(
                'value'=>$params->get('id'))
                    ));

    $this->removeFields();


}

有更清洁的方法吗?从请求参数中获取通知(新闻报道)的ID会感觉很麻烦。

更新

我实际上是通过ajax从模式对话框发布表单,并尝试在请求之间维护notice_id值。我在将表单绑定到显示错误之前将其与表单绑定:

  public function executeModal(sfWebRequest $request) {

  if ($request->isXmlHttpRequest()) {
    //return $this->renderText('test'.$request->getParameterHolder()->getAll());
    $params = $request->getParameter('nb_blog_post');
    $form = new nbBlogPostForm(null,array('notice_id',$request->getPostParameter('notice_id')));

    $form->bind($params,$request->getFiles());


    if ($form->isValid()) {
      $nb_blog_post = $form->save();
      $this->getUser()->setFlash('notice', 'Your blog post was successfully created');
      $this->redirect('@noticeboard');

    } else {
      return $this->renderPartial('form',array('form'=>$form,'form_id'=>'blogpost'));
    }
  }


  }

我似乎无法将notice_id与表单绑定(它是一个隐藏字段)。其他值的约束力很好。

I've also tried $form = new nbBlogPostForm(null,array('notice_id',$request->getPostParameter('nb_blog_post[notice_id]')));

进一步更新

在第一次通过表单时,configure方法依赖于请求中的notice_id,我认为在通过ajax再次创建表单时将其设置为null。这解决了它:

   $params = sfContext::getInstance()->getRequest()->getParameterHolder();
    if (($params->get('id'))) {
    $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden(array(),array(
                'value'=>$params->get('id'))
                    ));
    } else {
          $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden());

    }

如果有人有更清洁的方式,请告诉我。

2 个答案:

答案 0 :(得分:2)

正确的方法是:

$form = new YourForm(null,array('notice_id' => $notice_id));

正如您所提到的,第一个参数必须是一个对象,因此给出了null,第二个参数应该包含要传递给表单的变量

<强>更新

提供新信息。你有两个选择,第一个:

在表单中创建一个新方法,如下所示:

public function setNoticeId($id){
$this->getWidget('notice_id')->setAttribute('value'),$id);
}

然后在您的操作中创建表单后调用它:

$this->form = new Form();
$this->form->setNoticeId($id);

第二个不是在显示表单时设置通知ID,而是以我之前提到的方式在create action中传递这样的参数:

public function executeCreate(sfWebRequest $request)
{
$this->form = new Form(null, array('notice_id'=>$id));
$this->processForm($request,$this->form);

}

然后你必须在你的表单保存方法中使用它(在开始时)并将它分配到所需的字段,如下所示:

$this->values['notice_id'] = $this->getOption('notice_id');

第一种方法比较清晰,但后者在需要一些与您的对象无关的数据时非常有用,例如,如果您需要将帖子保存在用户文件夹中,并且您需要这样的名称用户文件夹。

我希望这会有所帮助。

答案 1 :(得分:1)

我认为最简单方便的方法是在创建新表单对象时传递表单元素的默认值。

像这样:

$form = new YourForm(array('notice_id' => $notice_id));

这将自动设置表单元素的值。 (并且也适用于所有表单元素。)

问候。