Symfony2:列出具有停用每个用户选项的用户
Symfony2: List Users with Option to Deactivate Each User
在我的应用程序的管理面板中,我显示了当前在数据库中标记为 "Active" 的用户列表。
<ul class="list-group">
{% for activeuser in activeusers %}
<li class="list-group-item">
{{ activeuser.username|e }}
<input type="checkbox" name="my-checkbox" class="ckbx" checked>
</li>
{% endfor %}
</ul>
如您所见,每个活动用户列表项现在都有一个占位符复选框,您猜对了,当用户处于活动状态时会选中该复选框。
我希望能够简单地取消选中该复选框,然后 运行 一个 AJAX 调用来更新数据库以将用户标记为非活动状态。我的第一直觉是为我的控制器中的每个用户对象创建一个表单,但看起来那样会变得非常混乱。另外,我不能简单地传递一个
'form' => $form->createView()
来自我的控制器,因为每个用户可能必须有一个表格。我阅读过的关于这个主题的任何文档似乎都没有为这个特定问题提供任何帮助。
更新
我在我的控制器中创建了一个函数来创建一个通用的用户更新表单:
/**
* Creates a form to create a User entity.
*
* @param User $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/
public function createUserForm(User $entity){
$form = $this->createForm(new UserType(), $entity, array(
'action' => $this->generateUrl('user_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
return $form;
}
表单由UserType生成class
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('isActive', 'checkbox');
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_user';
}
}
现在在主要操作(称为 dashboardAction)中,我得到一个用户列表,并为每个用户生成一个表单。 不要忘记在每次生成表单时 运行 createView()!
public function dashboardAction()
{
$userService = new UserService($this->getDoctrine()->getManager());
$activeUsers = $userService->listUsers('active');
$inactiveUsers = $userService->listUsers('inactive');
$formify_activeUsers = array();
foreach($activeUsers as $activeUser){
$formify_activeUsers[] = $this->createUserForm($activeUser)->createView();
};
return $this->render('AppBundle:Admin:dashboard.html.twig',
array('page_title' => 'Administration Panel',
'activeusers' => $formify_activeUsers,
)
);
}
然后树枝代码如下所示:
<ul class="list-group">
{% for activeuser in activeusers %}
<li class="list-group-item">
{{ form_start(activeuser) }}
{{ form_widget(activeuser) }}
{{ form_end(activeuser) }}
</li>
{% endfor %}
</ul>
如果您真正想要的是 activate/desactivate 用户,为什么要在这种情况下增加表格的开销。
您可以简单地创建一个动作:
/**
* @Route("/admin/isactive", name="isactive")
* @Method("POST")
*/
public function deactivateUserAction($id){
$em = $this->getDoctrine();
$user= $em
->getRepository('AppBundle\Entity\User')
->find($id);
if (!$user) {
throw $this->createNotFoundException(
'No userfound for id '.$id
);
}
$user->setActive(false);
$em->getManager()->flush($user);
return new JsonResponse();
}
您的看法:
<ul class="list-group">
{% for activeUser in activeusers %}
<li class="list-group-item">
<input class="user-status" type="checkbox" value="{{activeUser.id}}">{{activeUser.name}}
</li>
{% endfor %}
</ul>
将点击事件附加到您的复选框中。
$('.user-status).on('click', function(e){
$.post("{{ path('isactive') }}", {userId: $(this).val()})
.done(function(data){
alert("Data loaded: " + data);
});
});
在我的应用程序的管理面板中,我显示了当前在数据库中标记为 "Active" 的用户列表。
<ul class="list-group">
{% for activeuser in activeusers %}
<li class="list-group-item">
{{ activeuser.username|e }}
<input type="checkbox" name="my-checkbox" class="ckbx" checked>
</li>
{% endfor %}
</ul>
如您所见,每个活动用户列表项现在都有一个占位符复选框,您猜对了,当用户处于活动状态时会选中该复选框。
我希望能够简单地取消选中该复选框,然后 运行 一个 AJAX 调用来更新数据库以将用户标记为非活动状态。我的第一直觉是为我的控制器中的每个用户对象创建一个表单,但看起来那样会变得非常混乱。另外,我不能简单地传递一个
'form' => $form->createView()
来自我的控制器,因为每个用户可能必须有一个表格。我阅读过的关于这个主题的任何文档似乎都没有为这个特定问题提供任何帮助。
更新
我在我的控制器中创建了一个函数来创建一个通用的用户更新表单:
/**
* Creates a form to create a User entity.
*
* @param User $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/
public function createUserForm(User $entity){
$form = $this->createForm(new UserType(), $entity, array(
'action' => $this->generateUrl('user_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
return $form;
}
表单由UserType生成class
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('isActive', 'checkbox');
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_user';
}
}
现在在主要操作(称为 dashboardAction)中,我得到一个用户列表,并为每个用户生成一个表单。 不要忘记在每次生成表单时 运行 createView()!
public function dashboardAction()
{
$userService = new UserService($this->getDoctrine()->getManager());
$activeUsers = $userService->listUsers('active');
$inactiveUsers = $userService->listUsers('inactive');
$formify_activeUsers = array();
foreach($activeUsers as $activeUser){
$formify_activeUsers[] = $this->createUserForm($activeUser)->createView();
};
return $this->render('AppBundle:Admin:dashboard.html.twig',
array('page_title' => 'Administration Panel',
'activeusers' => $formify_activeUsers,
)
);
}
然后树枝代码如下所示:
<ul class="list-group">
{% for activeuser in activeusers %}
<li class="list-group-item">
{{ form_start(activeuser) }}
{{ form_widget(activeuser) }}
{{ form_end(activeuser) }}
</li>
{% endfor %}
</ul>
如果您真正想要的是 activate/desactivate 用户,为什么要在这种情况下增加表格的开销。
您可以简单地创建一个动作:
/**
* @Route("/admin/isactive", name="isactive")
* @Method("POST")
*/
public function deactivateUserAction($id){
$em = $this->getDoctrine();
$user= $em
->getRepository('AppBundle\Entity\User')
->find($id);
if (!$user) {
throw $this->createNotFoundException(
'No userfound for id '.$id
);
}
$user->setActive(false);
$em->getManager()->flush($user);
return new JsonResponse();
}
您的看法:
<ul class="list-group">
{% for activeUser in activeusers %}
<li class="list-group-item">
<input class="user-status" type="checkbox" value="{{activeUser.id}}">{{activeUser.name}}
</li>
{% endfor %}
</ul>
将点击事件附加到您的复选框中。
$('.user-status).on('click', function(e){
$.post("{{ path('isactive') }}", {userId: $(this).val()})
.done(function(data){
alert("Data loaded: " + data);
});
});