如何在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个字母后面时,它应该弹出。
提前谢谢
答案 0 :(得分:0)
我认为这会对你有所帮助:
您需要做的两件事:
1)创建数据转换器
将允许您使用输入字段而不是链接实体的默认下拉列表。
Data Transformer基本上将您的输入(在您的情况下是用户名字符串)转换为您可以与实体一起存储的实际用户对象。它将允许您定义输入字段,而不是链接实体的默认下拉列表。看看文档,它非常直接。
2)创建Ajax自动完成
这可以在客户端使用您想要的任何库(jQuery,Prototype等),服务器端在Controller操作中处理,并使用JSON或呈现的模板进行回复。这里有很多教程。如果没有找到,则Ajax结果可能包含创建新用户的链接。
数据转换器是您需要关注的,我会在使用UI之前完成这项工作。
参考下文: