Symfony 2:绑定请求以形成包含对象的对象

时间:2014-10-01 16:42:21

标签: forms symfony

我正在尝试做一些我不确定可行的事情。

这是我的表单对象:

class DeclarationForm {
  private $string1;
  private $paramObject;
}

这是Param对象:

class Param {
  private $id;
  private $name;
}

我希望表单在创建阶段显示“ParamObject”字段的选择

public function buildForm(FormBuilderInterface $builder, array $options) {
    $phase = intval($this->options['phase']);

    if($phase === 0) {
        $params_qualities = $this->options['params_qualities'] // this is an array of Param Objects;
        $qualities = new ObjectChoiceList($params_qualities, 'name', array(), null, 'id');
        $builder->add('paramObject', 'choice', array(
           'required' => true,
            'choice_list' => $qualities  
        ));
    }
    ...
 }

它工作正常,当然,当我提交表单时,只有所选选项的id放在请求中。 问题是我使用$ form-> handleRequest($ request);在控制器中,它尝试将一个字符串(id值)放在我的DeclarationForm的Param对象中。

当handleRequest尝试将请求绑定到对象时,是否可以在请求中获取所选选项的标签以填充Param对象?

怎么做?

谢谢

1 个答案:

答案 0 :(得分:0)

这是可能的,但不是只有一个表格。在Symfony中,每个单独的Form都有一个后备数据对象(如果有的话),并且每个HTML字段对应于该对象的单个成员(除了特殊情况,如日期和实体)。但是,one of the Field Types you can use is Form表示具有自己的数据对象的子表单。

在你的情况下,这意味着做这样的事情:

class DecorationFormType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $phase = intval($this->options['phase']);

        if($phase === 0) {
            //Add child form for param; pass options (with dropdown info) in
            //By default fieldname needs to match object member
            $builder->add('paramObject', new ParamType(), ['options' => $options] );
        }
        ...
    }
}

class ParamType {

    public function buildForm(FormBuilderInterface $builder, array $options) {

            $params_qualities = $this->options['params_qualities'] // this is an array of Param Objects;
            $qualities = new ObjectChoiceList($params_qualities, 'name', array(), null, 'id');
            //By default fieldname needs to match object member
            $builder->add('id', 'choice', array(
               'required' => true,
                'choice_list' => $qualities  
            ));
        ...
    }

}

然后在Controller中

public parameterAction() {
    //Get param options somehow and stick in $options

    $paramForm = $this->createForm(new DecorationFormType(), $decorationForm, $options);
}

所以基本上你正常创建你的主表单,在那个表单中,它添加的一个字段是子表单。该Field的名称需要与DeclarationForm类上的公共属性或getter匹配,以便它可以找到数据对象(您可以在选项中覆盖它)。您可以在每个表单上正确设置data_class

道歉,如果那不太正确,我没有对它进行测试,而且我更习惯使用集合(这可能是你可能有几个给定的子表单,具体取决于数据)。

一般来说,建议是使用Form Events来操作Fields添加到Forms中的内容(例如,只有在phase==0时才会添加你的Param),但我认为这不重要我只会使用一次表格。

我通常不会使用“表单选项”将下拉信息传递给表单,但这可能就是我,不知道最佳做法是什么 - 一方面你要混合自己的东西一大堆固定的Symfony键,但另一方面它是一个方便的地方!我过去曾使用过我的数据对象成员。

关于从HTML表单中获取标签的问题 - 你不能这样做,因为你已经看到了Request包含的唯一内容就是ID。我可以想象解决这几种方式:

  • 使用标签作为下拉键(如果它们是唯一的)
  • 以某种方式将ID重新映射到Param对象中的标签,为其提供选项列表,以便当您转到getName()或其他任何可以神奇地提供您想要的内容时
  • 只需接受您的ID,然后查看使用它时的含义!