Symfony2子表单用于非实体

时间:2014-01-07 22:00:56

标签: php forms symfony

我正在尝试创建一个这样的表单来管理权限。

twitter   sms   email    readonwebsite
user0    yes      no     yes          yes
user1     no     yes      no          yes
user2     no      no      no          yes
user3    yes     yes     yes          yes

我这样做的当前方式是为每个子用户使用foreach循环并将其直接添加到表单

$form = $form->add($subUser->getId() . '_twitter', 'checkbox', array
(
    'label'     => 'twitter',
    'required'  => false,
    'mapped' => false,
    'data' => (bool)//original checkbox value derived from db value
));

并重复了smsemailread权限的代码。这似乎不太优雅。在表单处理中,我必须处理1337_twitter69_sms等密钥。有没有办法可以像$form[$subUser->getId()]['twitter']一样处理表单?

2 个答案:

答案 0 :(得分:1)

... $form->add("[{$subUser->getId()}][twitter]" ...

答案 1 :(得分:1)

我假设您正在使用Doctrine,因为您还没有指定您正在使用的ORM。 你有Permission个对象吗?如果您在权限和用户之间创建了一个更清晰的关系。您可以将permissions添加到您的用户表单中,并且很容易管理。

因此,您的权限表将包含' twitter',' sms',' email',' readonwebsite'。

您可以设置实体和形式如下:

e.g。

// src/PathTo/YourBundle/Entity/Permission.php
class Permission
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $name;  // e.g. 'twitter' or 'email'

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="permissions")
     */
    private $users;
}


// src/PathTo/YourBundle/Entity/User.php
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="Permssion")
     * @ORM\JoinTable(name="user_permission",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
     * )
     */
    private $permissions;
}


// src/PathTo/YourBundle/Form/Type/UserFormType.php

class UserFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // Add more fields
            ->add('permissions', null, array(
                'expanded' => true, // Creates checkboxes
            ))
        ;
    }

    // ...
}

然后在您的控制器中

// src/PathTo/YourBundle/Controller/UserContoller.php
public function editAction($id, Request $request)
{
    // ...
    // Get your user object

    $form = $this->createForm(new UserFormType(), $user);

    $form->handleRequest($request);

    if ($form->isValid()) 
        $em->persist($user);
        $em->flush();

        // redirect back to some edit page
        // ...
    }

    // render some form template
    // ...
}

这很简单:)