加载页面后,选择字段使用jquery以dinamically方式完成,但是post数据未加载到$ form-> getData()中。经过一些搜索后,选项是添加隐藏字段并使用javascript添加值。我想知道是否存在其他选择。
这是行动:
$form = $this->createFormBuilder()
->add('country','file')
->add('admcod2','file')
->add('isocountry', 'choice', array('empty_value' => 'select country'))
->add('iso','hidden')
->getForm();
选择用jquery填充
$("#form_isocountry").jeoCountrySelect({
callback: function () {
$("#form_isocountry").removeAttr('disabled');
}
});
//this add the value to a hidden field...
$("#form_isocountry").change(function() {
$("#form_iso").val($("#form_isocountry").val());
})
因此symfony不会识别dinamic选择中加载的选项。 var_dump($ form-> getData())显示填充的隐藏字段,但不显示选择字段。
感谢。
答案 0 :(得分:1)
我认为choice
不是此用例的正确字段类型,因为从表单字段的角度来看,可能的选项列表是空的。因此,提交的值永远不会有效(除非是空的)。
我建议您使用hidden
作为此字段的类型,或者使用choice
类型为表单字段指定选项列表。
答案 1 :(得分:0)
我用这种方式使用了ChoiceType
个字段。我认为这是合乎逻辑的选择。它的主要问题(以及默认的EntityToIdTransformer
或EntityChoiceList
)是它为每个可能的选项提供水合以便选择一个,这在某些情况下是过度的。您可能需要编写自己的变压器来防止这种情况发生。我在页面加载后使用AJAX将数据加载到选择中。它使页面更小,加快了页面处理时间,让我更精确地缓存每组选项。
这适用于Symfony 2.0。它工作正常,我们在一个页面上放置了一堆Chosen字段,其中包含4000多个选项(尽管它只在用户与窗口小部件交互时才创建Chosen元素)。现在的限制是浏览器内存。
<强> ContactEntityType 强>
class ContactEntityType extends AbstractType {
public function __construct(EntityManager $em) {
$this->em = $em;
}
public function buildForm(FormBuilder $builder, array $options)
{
$repository = $this->em->getRepository('AcmeContactsBundle:Contact');
$builder->prependClientTransformer(new ContactToIdTransformer($repository));
}
public function buildView(FormView $view, FormInterface $form)
{
$contact = $form->getData();
if($contact instanceof \Acme\ContactsBundle\Entity\Contact) {
$view->set('choices', array($contact->getId() => $contact->getName()));
}
}
public function getParent(array $options) {
return 'choice';
}
}
<强> ContactToIdTransformer 强>
这是内置EntityToIdTransformer
的变体。
...
class ContactToIdTransformer implements DataTransformerInterface
{
private $repository;
public function __construct(EntityRepository $repository)
{
$this->repository = $repository;
}
public function transform($entity)
{
if (null === $entity || '' === $entity) {
return null;
}
if (!is_object($entity)) {
throw new UnexpectedTypeException($entity, 'object');
}
if ($entity instanceof Collection) {
throw new \InvalidArgumentException('Expected an object, but got a collection. Did you forget to pass "multiple=true" to an entity field?');
}
return $entity->getId();
}
public function reverseTransform($key)
{
if ('' === $key || null === $key) {
return null;
}
if (!is_numeric($key)) {
throw new UnexpectedTypeException($key, 'numeric');
}
if (!($entity = $this->repository->find($key))) {
throw new TransformationFailedException(sprintf('The entity with key "%s" could not be found', $key));
}
return $entity;
}
}