我正在尝试创建一个这样的表单来管理权限。
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
));
并重复了sms
,email
和read
权限的代码。这似乎不太优雅。在表单处理中,我必须处理1337_twitter
和69_sms
等密钥。有没有办法可以像$form[$subUser->getId()]['twitter']
一样处理表单?
答案 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
// ...
}
这很简单:)