jquery 如何在symfony2中加载页面后在select中添加选项

46scxncf  于 2023-01-04  发布在  jQuery
关注(0)|答案(2)|浏览(129)

加载一个页面后,选择字段是用jquery动态完成的,但是发布数据没有在$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无法识别动态选择中加载的选项。var_dump($form-〉getData())显示填充的隐藏字段,但不显示选择字段。
谢谢。

tquggr8v

tquggr8v1#

我认为choice不是这个用例的正确字段类型,因为从表单字段的Angular 来看,可能的选择列表是空的。因此提交的值永远不会有效(除非是空的)。
我可以建议您使用hidden作为此字段的类型,或者使用choice类型指定表单字段的选择列表。

sulc1iza

sulc1iza2#

我已经用这种方式使用ChoiceType字段。我认为这是合乎逻辑的选择。它的主要问题是(以及默认的EntityToIdTransformerEntityChoiceList)是它水合每个可能的选项以便选择一个,这在某些情况下是多余的。你可能需要编写自己的转换器来防止这种情况。我使用 AJAX 在页面加载后将数据加载到选择中。它使页面更小,加快了页面处理时间,并使我能够更精确地缓存每组选项。
这是针对Symfony 2.0的。它运行良好,我们在一个页面上放置了一堆Chosen字段,其中包含4000多个选项(尽管它只在用户与小部件交互时创建Chosen元素)。现在的限制是浏览器内存。

联系人实体类型

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';
    }
}

连接至变压器

这是内置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;
    }
}

相关问题