我正在使用带有 PropelBundle 的 Symfony 2.1 表单,并且我正在尝试重构具有对象下拉列表(可供选择)的表单,以使用 jquery 自动完成字段(使用 AJAX)。对于下拉列表,我在表单类型中使用了以下代码(非常适合下拉列表):
$builder->add('books', 'collection', array(
'type' => 'model',
'options' => array(
'class' => 'MyVendor\MyBundle\Model\Book',
'property' => 'title',
),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'required' => false,
));
为了提供一点上下文,假设我们正在创建一个新的“读者”对象,并且我们想从可用的“书籍”对象列表中选择读者最喜欢的书籍。使用集合类型,以便可以在新的“读者”表单中选择许多“最喜欢的书籍”。现在,我想更改以上内容以使用自动完成功能。为此,我尝试实现一个数据转换器,以便能够从一个简单的文本字段中获取一个 Book 对象,该文本字段可用于 Autocomplete 函数以传递 Book ID,如本问题的答案所示. 但是,我无法弄清楚如何使 Data Transformer 与集合类型和 Propel 类一起工作。我按照 Symfony Cookbook 中的说明创建了一个 BookToIdTransformer 类,并在“ReaderType”文件中尝试了以下操作:
$transformer = new BookToIdTransformer();
$builder->add(
$builder->create('books', 'collection', array(
'type' => 'text',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'required' => false,
))->addModelTransformer($transformer)
);
有了上面,我得到一个“调用未定义的方法:getId”异常(显然,Transformer 需要书籍的 PropelCollection,而不是单个 Book 对象..)。有谁知道该怎么做?或者让我知道是否有其他方法可以使用 Propel 在 Symfony 中实现自动完成功能并允许选择多个对象(例如书籍集合)?