mmm*_*mmm 5 php jquery symfony symfony-2.3
我有一个与公司实体无关的任务实体(公司有项目,每个项目都有任务)和这个简单的形式:
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('company','entity',array(
'class' => 'ITMore\FlowBundle\Entity\Company',
'mapped' => false
))
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将此字段呈现为文本类型,因此我可以使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |