将实体类型渲染为文本字段,以便我可以使用jquery自动完成它

时间:2014-04-07 15:10:28

标签: 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
            ))
    }
}

我想要做的是渲染这个字段作为文本类型,所以我可以用jquery自动完成它(友好的用户体验。会有一个很多项目,所以我不希望用户搜索整个列表)。它应该像这样工作:用户填写公司字段,然后填写输入值显示的公司列表,之后有第二个输入 - 项目 - 应该有给定公司项目的提示。

我完全不知道该怎么做。我认为它可能有效的一种方法是在验证后在控制器中执行此操作,但此解决方案并非非常简洁

2 个答案:

答案 0 :(得分:7)

使用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));

答案 1 :(得分:3)

使用'entity'本身并使用

http://ivaynberg.github.io/select2/

用于实现自动完成。