我正在尝试做一些我不确定可行的事情。
这是我的表单对象:
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对象?
怎么做?
谢谢
答案 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。我可以想象解决这几种方式:
getName()
或其他任何可以神奇地提供您想要的内容时