编辑具有选择列表的组的表单

时间:2016-09-01 07:14:59

标签: forms doctrine-orm symfony

在我的项目中,我有两个实体:GroupPermission,这些实体已链接在一起。我在为Group Entity创建表单时遇到问题。我是Symfony的新手,所以我可能会想念一些简单的东西。

我有一个»AppReset«命令来初始化应用程序,在那里,Permissions表填充了固定数量的条目,看起来像这样(n = 9):

 #  |  Name    |  type 
--------------------------------
 1  |  VIEW    |  type1
 2  |  EDIT    |  type1
 …
 n  | MASTER   |  type1
--------------------------------
n+1 | VIEW     |  type2
 …
2n  | MASTER   |  type2
2n+1| VIEW     |  type3
 …
 4n | MASTER   |  type4     

因此每个组最多可以拥有28个权限。在一个组的编辑表单中,我想有一个名为权限的部分,它本身应该显示如下:

PERMISSIONS:
    type1:
        checkbox#1 (checked if group has this) VIEW
        checkbox#2 (unchecked if not) EDIT
        …
        checkbox#n MASTER
    type2:
       …
    type4:
        …
        checkbox#4n MASTER

请查看我到目前为止的以下代码。有两个主要问题:

  1. 权限未保存/更新,我想这是因为它们不是mapped,或者没有正确映射?
  2. 如何为每种权限类型创建一个部分?
  3. 这是实体的代码:

    Group.php(缩短)

    <?php
    
    namespace AppBundle\Entity;
    
    class Group implements RoleInterface
    
    /**
     * @ORM\ManyToMany(targetEntity="Permission")
     * @ORM\JoinTable(name="app_groups_permissions",
     *      joinColumns={
     *          @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     *      },
     *      inverseJoinColumns={
     *          @ORM\JoinColumn(name="permission_id", referencedColumnName="id", unique=true)
     *      }
     *  )
     */
    private $permissions;
    
      public function __construct() {
          $this->permissions    = new ArrayCollection();
      }
    
      public function getPermissions() {
        return $this->permissions;
      }
    
      /**
       * @param Permission $permission
       */
      public function addPermission(Permission $permission) {
        if($this->permissions->contains($permission)) {
            return;
        }
    
        $this->permissions->add($permission);
    
        return $this;
      }
    
      /**
       * @param Permission $permission
       */
      public function removePermission(Permission $permission) {
        if (!$this->permissions->contains($permission)) {
            return;
        }
        $this->permissions->removeElement($permission);
    
        return $this;
      }
    }
    

    Permission.php(缩短)

    namespace AppBundle\Entity;
    
    class Permission
    {
        //»default« primary id field
        //simple string fields (name, mask, type)
    }
    

    GroupType.php :: buildForm

    public function buildForm(FormBuilderInterface $builder, array $options) {  
    $builder
        ->add('name',   TextType::class)
        ->add('permissions', PermissionsType::class, ['groups' => [$builder->getData()]])
         ->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit'])
         ->add('save', SubmitType::class);
     }
    

    PermissionType.php :: buildForm

    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
        foreach($options['groups'] as $group) {
            $name = is_null($group->getId()) ? '0' : $group->getId();
    
            $builder->add($name, ChoiceType::class, [
                'mapped'        => false,
                'multiple'      => true,
                'expanded'      => true,
                'label'         => $group->getName(),
                'choices'       => $this->permissions,
                'choice_value'  => 'id',
                'choice_label'  => 'name',
                'data' => array_reduce($this->permissions,
                    function($map, $perm) use($group)
                    {
                        if($group->getPermissions()->contains($perm)) $map[] = $perm;
                        return $map;
                    },[])
    
            ]);
        }
    }
    

0 个答案:

没有答案