Symfony2自动完成搜索

时间:2015-04-23 14:02:44

标签: database symfony search autocomplete

如何在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 个答案:

答案 0 :(得分:0)

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

您需要做的两件事:

1)创建数据转换器

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

Data Transformer基本上将您的输入(在您的情况下是用户名字符串)转换为您可以与实体一起存储的实际用户对象。它将允许您定义输入字段,而不是链接实体的默认下拉列表。看看文档,它非常直接。

2)创建Ajax自动完成

这可以在客户端使用您想要的任何库(jQuery,Prototype等),服务器端在Controller操作中处理,并使用JSON或呈现的模板进行回复。这里有很多教程。如果没有找到,则Ajax结果可能包含创建新用户的链接。

数据转换器是您需要关注的,我会在使用UI之前完成这项工作。

参考下文:

How to add an autocomplete field in forms Symfony2?