我有一个与公司实体无关的任务实体(公司有项目,每个项目都有任务)和这个简单的形式:
class TaskType extends AbstractType { public function buildForm(FormBuilderInterface $builder,array $options) { $builder->add('company','entity',array( 'class' => 'ITMore\FlowBundle\Entity\Company','mapped' => false )) } }
我想要做的是将此字段呈现为文本类型,因此我可以使用jquery自动完成它(友好的用户体验.会有很多项目,所以我不希望用户搜索整个列表).它应该像这样工作:用户填写公司字段,然后是适合输入值显示的公司列表,之后有第二个输入 – 项目 – 应该有给定公司项目的提示.
我完全不知道怎么做.我认为可行的一种方法是在验证后在控制器中执行此操作,但此解决方案不是很整洁
最佳答案
使用DataTransformer.
一个有效的例子.城市实体有数千个城市名称.您可以将其转换为文本输入,而不是下拉列表
<?php namespace Project\Bundle\DuterteBundle\Form\DataTransformer; use Project\Bundle\DuterteBundle\Entity\City; use Doctrine\Common\Persistence\ObjectManager; use Symfony\Component\Form\DataTransformerInterface; use Symfony\Component\Form\Exception\TransformationFailedException; class CityAutocompleteTransformer implements DataTransformerInterface { private $entityManager; public function __construct(ObjectManager $entityManager) { $this->entityManager = $entityManager; } public function transform($city) { if (null === $city) { return ''; } return $city->getName(); } public function reverseTransform($cityName) { if (!$cityName) { return; } $city = $this->entityManager ->getRepository('DuterteBundle:City')->findOneBy(array('name' => $cityName)); if (null === $city) { throw new TransformationFailedException(sprintf('There is no %s exists',$cityName )); } return $city; } }
然后在citytype形式,你可以这样做
->add('city','text',array( 'label' => 'Type your city',//'error_bubbling' => true,'invalid_message' => 'That city you entered is not listed',$builder->get('city') ->addModelTransformer(new CityAutocompleteTransformer($this->entityManager));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。