Symfony2 自动完成搜索

Symfony2 autocomplete search

如何在不使用任何包的情况下在 symfony2 中创建从本地数据库(一个输入)加载用户的自动完成? 这是我的用户实体:

<?php

namespace Me\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="Me\MainBundle\Repository\UsersRepository")
 * @ORM\Table(name="users")
 */

class Users
{
     /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Assert\NotBlank(
     *      message = "Users first name field can not be blank!",
     *      groups={"registration"}
     * )
     * @Assert\Length(
     *      min = 3,
     *      minMessage = "First name must be at least 3 characters long!",
     *      groups={"registration","search"}
     * )
     * @ORM\Column(type="string", length=255, nullable=false, name="first_name")
     */
    protected $firstName;

    /**
     * @Assert\NotBlank(
     *      message = "Users last name field can not be blank!",
     *      groups={"registration"}
     * )
     * @Assert\Length(
     *      min = 3,
     *      minMessage = "Last name must be at least 3 characters long!",
     *      groups={"registration","search"}
     * )
     * @ORM\Column(type="string", length=255, nullable=false, name="last_name")
     */
    protected $lastName;

//relationship variables:

    /**
     * @ORM\OneToMany(targetEntity="UsersSkillLevel", mappedBy="userId")
     **/
    protected $usersSkillLevels;

    public function __construct() {
        $this->usersSkillLevels = new ArrayCollection();
    }

//getters, setters:


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set firstName
     *
     * @param string $firstName
     * @return Users
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get firstName
     *
     * @return string 
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Set lastName
     *
     * @param string $lastName
     * @return Users
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get lastName
     *
     * @return string 
     */
    public function getLastName()
    {
        return $this->lastName;
    }

    /**
     * Add usersSkillLevels
     *
     * @param \Me\MainBundle\Entity\UsersSkillLevel $usersSkillLevels
     * @return Users
     */
    public function addUsersSkillLevel(\Me\MainBundle\Entity\UsersSkillLevel $usersSkillLevels)
    {
        $this->usersSkillLevels[] = $usersSkillLevels;

        return $this;
    }

    /**
     * Remove usersSkillLevels
     *
     * @param \Me\MainBundle\Entity\UsersSkillLevel $usersSkillLevels
     */
    public function removeUsersSkillLevel(\Me\MainBundle\Entity\UsersSkillLevel $usersSkillLevels)
    {
        $this->usersSkillLevels->removeElement($usersSkillLevels);
    }

    /**
     * Get usersSkillLevels
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getUsersSkillLevels()
    {
        return $this->usersSkillLevels;
    }
}

和搜索表单:

$searchForm = $this->createFormBuilder()
            ->setMethod('POST')
            ->add('user_name', 'text', array('label' => 'User\'s name: ','attr' => array('placeholder' => 'Enter Users first or last name')))
            ->add('searchUsers', 'submit', array('label' => 'Search for employee'))
            ->getForm();

当名字或姓氏写在 3 个字母后时应该弹出。

提前致谢

我认为这会对你有所帮助:

您需要做两件事:

1) 创建数据转换器

hich 将允许您使用输入字段而不是 linked 实体的默认下拉列表。

Data Transformer 基本上将您的输入(在您的情况下是用户名字符串)转换为您可以与您的实体一起存储的实际用户对象。它会让您定义一个输入字段,而不是 linked 实体的默认下拉列表。看看文档,很简单。

2) 创建 Ajax 自动完成

这可以在客户端使用任何你想要的库(jQuery、Prototype 等)来完成,而在服务器端你可以在你的控制器操作中处理它并用 JSON 或呈现的模板。那里有很多教程。如果找到 none,Ajax 结果可能包含 link 以创建新用户。

Data Transformer 是您需要关注的重点,我会在处理 UI 之前先完成它。

参考以下:

How to add an autocomplete field in forms Symfony2?