如何显示具有 table 中可用记录的确切数量的集合表单
How to show a collection form with the exact number of records available in a table
我正在使用 symfony2 和 doctrine。
我有一个联系人列表,他们被分为多个组。
这些组存储在 table 中。
然后我的应用程序中有用户,我想为每个用户指定他们的权限:no/read/write。
为了实现这一点,我创建了一个用户权限 table :
<?php
namespace Curuba\contactsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use APY\DataGridBundle\Grid\Mapping as GRID;
/**
* userspermissions
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Curuba\contactsBundle\Entity\userspermissionsRepository")
*/
class userspermissions
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="permission", type="string", length=10)
*
* @GRID\Column(title="Permission")
*
*/
private $permission;
/**
* @ORM\ManyToOne(targetEntity="groupes", inversedBy="permissions")
* @ORM\JoinColumn(nullable=false)
*
* @GRID\Column(title="Groupes")
*/
private $groupe;
/**
* @ORM\ManyToOne(targetEntity="users", inversedBy="permissions")
* @ORM\JoinColumn(nullable=false)
*
* @GRID\Column(title="Permission")
*/
private $user;
现在,在我的用户表单中,我需要显示一个 table,其中包含所有可用的组和它们前面的下拉列表。
但是我不知道如何在没有集合的情况下实现这一点,然后要求用户添加组权限,select 一个组和相应的权限。
提前致谢。
您可以使用 ManyToOne 关系。
例如,用户和组
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="groups")
*/
class Group
{
const CLASS_NAME = __CLASS__;
/**
* @var integer
*
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id",type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="label",type="string",length=255)
*/
private $label;
/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param string $label
*/
public function setLabel($label)
{
$this->label = $label;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @return string
*/
public function __toString()
{
return $this->getLabel();
}
}
和用户实体
<?php
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User
{
const CLASS_NAME = __CLASS__;
/**
* @var integer
*
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id",type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string", name="label", length=255)
*/
private $label;
/**
* @ORM\ManyToMany(targetEntity="Group")
* @ORM\JoinTable(name="user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
**/
private $groups;
public function __construct()
{
$this->groups = new ArrayCollection();
}
/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param string $label
*/
public function setLabel($label)
{
$this->label = $label;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @param Group $group
*
* @return bool
*/
public function hasGroup(Group $group)
{
return $this->groups->contains($group);
}
/**
* @param Group $group
*
* @return $this
*/
public function addGroup(Group $group)
{
if (false === $this->hasGroup($group)) {
$this->groups->add($group);
}
return $this;
}
/**
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getGroups()
{
return $this->groups;
}
/**
* @return string
*/
public function __toString()
{
return $this->getLabel();
}
}
最后创建一个这样的表单类型:
class UserType extends AbstractType
{
const NAME = 'userType';
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('label', 'text');
$builder->add('groups', 'entity', array(
'class' => Group::CLASS_NAME,
'multiple' => true,
'expanded' => true,
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => User::CLASS_NAME,
));
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName()
{
return self::NAME;
}
}
我找到了如何做到这一点。这实际上非常简单,我可能期待更复杂的东西......
我在我的控制器中添加了一个函数(可能在我的实体中...),当我创建一个新的用户实体或编辑一个用户实体时调用这个函数(以防在平均时间。
代码如下:
private function autocompleteForm(users $user) {
$em = $this->getDoctrine()->getManager();
$groupes = $em->getRepository('contactsBundle:groupes')->findAll();
if ($user) {
foreach ($groupes as $groupe) {
$permission = $em->getRepository('contactsBundle:userspermissions')->findOneBy(array('groupe' => $groupe, 'user' => $user));
if(!$permission) {
$permission = new userspermissions();
$permission->setGroupe($groupe);
$user->addPermission($permission);
}
}
}
return $user;
}
如果有人需要,我很乐意解释更多...
我正在使用 symfony2 和 doctrine。 我有一个联系人列表,他们被分为多个组。 这些组存储在 table 中。 然后我的应用程序中有用户,我想为每个用户指定他们的权限:no/read/write。 为了实现这一点,我创建了一个用户权限 table :
<?php
namespace Curuba\contactsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use APY\DataGridBundle\Grid\Mapping as GRID;
/**
* userspermissions
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Curuba\contactsBundle\Entity\userspermissionsRepository")
*/
class userspermissions
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="permission", type="string", length=10)
*
* @GRID\Column(title="Permission")
*
*/
private $permission;
/**
* @ORM\ManyToOne(targetEntity="groupes", inversedBy="permissions")
* @ORM\JoinColumn(nullable=false)
*
* @GRID\Column(title="Groupes")
*/
private $groupe;
/**
* @ORM\ManyToOne(targetEntity="users", inversedBy="permissions")
* @ORM\JoinColumn(nullable=false)
*
* @GRID\Column(title="Permission")
*/
private $user;
现在,在我的用户表单中,我需要显示一个 table,其中包含所有可用的组和它们前面的下拉列表。 但是我不知道如何在没有集合的情况下实现这一点,然后要求用户添加组权限,select 一个组和相应的权限。
提前致谢。
您可以使用 ManyToOne 关系。 例如,用户和组
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="groups")
*/
class Group
{
const CLASS_NAME = __CLASS__;
/**
* @var integer
*
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id",type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="label",type="string",length=255)
*/
private $label;
/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param string $label
*/
public function setLabel($label)
{
$this->label = $label;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @return string
*/
public function __toString()
{
return $this->getLabel();
}
}
和用户实体
<?php
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User
{
const CLASS_NAME = __CLASS__;
/**
* @var integer
*
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id",type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string", name="label", length=255)
*/
private $label;
/**
* @ORM\ManyToMany(targetEntity="Group")
* @ORM\JoinTable(name="user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
**/
private $groups;
public function __construct()
{
$this->groups = new ArrayCollection();
}
/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param string $label
*/
public function setLabel($label)
{
$this->label = $label;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @param Group $group
*
* @return bool
*/
public function hasGroup(Group $group)
{
return $this->groups->contains($group);
}
/**
* @param Group $group
*
* @return $this
*/
public function addGroup(Group $group)
{
if (false === $this->hasGroup($group)) {
$this->groups->add($group);
}
return $this;
}
/**
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getGroups()
{
return $this->groups;
}
/**
* @return string
*/
public function __toString()
{
return $this->getLabel();
}
}
最后创建一个这样的表单类型:
class UserType extends AbstractType
{
const NAME = 'userType';
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('label', 'text');
$builder->add('groups', 'entity', array(
'class' => Group::CLASS_NAME,
'multiple' => true,
'expanded' => true,
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => User::CLASS_NAME,
));
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName()
{
return self::NAME;
}
}
我找到了如何做到这一点。这实际上非常简单,我可能期待更复杂的东西......
我在我的控制器中添加了一个函数(可能在我的实体中...),当我创建一个新的用户实体或编辑一个用户实体时调用这个函数(以防在平均时间。
代码如下:
private function autocompleteForm(users $user) {
$em = $this->getDoctrine()->getManager();
$groupes = $em->getRepository('contactsBundle:groupes')->findAll();
if ($user) {
foreach ($groupes as $groupe) {
$permission = $em->getRepository('contactsBundle:userspermissions')->findOneBy(array('groupe' => $groupe, 'user' => $user));
if(!$permission) {
$permission = new userspermissions();
$permission->setGroupe($groupe);
$user->addPermission($permission);
}
}
}
return $user;
}
如果有人需要,我很乐意解释更多...