如何显示具有 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;
}

如果有人需要,我很乐意解释更多...