如何使用表中可用的确切记录数显示集合表单

时间:2015-01-01 20:09:10

标签: forms symfony doctrine

我正在使用symfony2和doctrine。 我有一个联系人列表,他们被分为几个组。 这些组存储在表中。 然后我在我的应用程序中有用户,并且我想为每个用户指定他们的权限:no / read / write。 为了实现这一点,我创建了一个userspermission表:

<?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;

现在,在我的用户表单中,我需要显示一个包含所有可用组的表,并在其前面显示一个下拉列表。 但我不知道如何在没有集合的情况下实现这一目标,然后要求用户添加组权限,选择组和相应的权限。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用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;
}
}

答案 1 :(得分:0)

我已经找到了如何做到这一点。事实上这很简单,我可能期待更复杂的事情......

我在我的控制器中添加了一个函数(可能在我的实体中...),当我创建一个新的用户实体或编辑一个时,我会调用此函数(如果同时添加了一个groupe)

以下是代码:

    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;
}

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