【问题标题】:how to add choices in select after page load in symfony2如何在 symfony2 中的页面加载后在选择中添加选项
【发布时间】:2013-04-07 23:58:27
【问题描述】:

加载页面后,选择字段使用 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()) 显示填充的隐藏字段,但不显示选择字段。

谢谢。

【问题讨论】:

  • 阿格格。好的我明白了。我将在控制器中使用 Services_GeoNames(Pear) 添加“以编程方式”选项。

标签: jquery forms select symfony choice


【解决方案1】:

我认为choice 不是此用例的正确字段类型,因为从表单字段的角度来看,可能的选择列表是空的。因此提交的值永远不会有效(除非为空)。

我可以建议您使用 hidden 作为此字段的类型,或者使用 choice 类型为您的表单字段指定选项列表。

【讨论】:

    【解决方案2】:

    我以这种方式使用了ChoiceType 字段。我认为这是合乎逻辑的选择。它的主要问题(以及默认的EntityToIdTransformerEntityChoiceList)是为了选择一个可能的选项,这在某些情况下是多余的。您可能需要编写自己的转换器来防止这种情况。我在页面加载后使用 AJAX 将数据加载到选择中。它使页面更小,加快页面处理时间,让我更精确地缓存每组选项。

    这是针对 Symfony 2.0 的。它工作得很好,我们在一个页面上放置了一堆选择的字段,其中包含 4000 多个选项(尽管它只在用户与小部件交互时创建选择的元素)。现在限制是浏览器内存。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多