Files
socialhose-php/src/AdminBundle/Controller/User/AbstractUserController.php
T
2022-12-09 08:36:26 -06:00

344 lines
9.8 KiB
PHP

<?php
namespace AdminBundle\Controller\User;
use AdminBundle\Form\Search;
use AdminBundle\Form\Type\SearchType;
use FOS\UserBundle\Model\UserManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use UserBundle\Entity\User;
use UserBundle\Enum\UserRoleEnum;
use UserBundle\Mailer\MailerInterface;
use UserBundle\Repository\UserRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use UserBundle\UserBundleServices;
/**
* Class AbstractUserController
* @package AdminBundle\Controller\User
*/
abstract class AbstractUserController extends Controller
{
protected static $role;
protected static $formClass;
protected static $limit = 20;
/**
* @Route("/")
* @Method({"GET", "POST"})
*
* @param Request $request A Request instance.
*
* @return Response
*/
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
/** @var UserRepository $userRepository */
$userRepository = $em->getRepository(User::class);
$search = new Search();
$searchForm = $this->createForm(SearchType::class, $search);
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && !$searchForm->isValid()) {
$search = new Search();
}
$query = $userRepository->getUserByRoleQB(new UserRoleEnum(static::$role), $search->getHandledQuery());
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$query,
$request->query->getInt('page', 1),
self::$limit
);
return $this->render($this->getTemplate('index'), [
'users' => $pagination,
'search' => $searchForm->createView(),
'newUrl' => $this->generateCRUDUrl('new'),
'deleteRoute' => $this->getRoute('delete'),
'changeEnabledRoute' => $this->getRoute('changeEnabled'),
'resendPasswordRoute' => $this->getRoute('resendPassword'),
'showRoute' => $this->getRoute('show'),
'editRoute' => $this->getRoute('edit'),
]);
}
/**
* Creates a new user entity.
*
* @Route("/new")
* @Method({"GET", "POST"})
*
* @param Request $request A Request instance.
*
* @return Response
*/
public function newAction(Request $request)
{
/** @var $userManager UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
/** @var \UserBundle\Entity\User $user */
$user = $userManager->createUser();
$user->setEnabled(true);
$form = $this->createForm(static::$formClass, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$form->has('plainPassword')) {
$user->generatePassword();
$password = $user->getPlainPassword();
} else {
$password = $form->get('plainPassword')->getData();
}
$user
->setVerified(true)
->addRole(static::$role);
if (($response = $this->preCreate($user)) !== null) {
return $response;
}
$userManager->updateUser($user);
$mailer = $this->get(UserBundleServices::MAILER);
$mailer->sendPassword($user, $password);
if ($request->isXmlHttpRequest()) {
return new JsonResponse(['success' => true]);
}
return $this->redirect($this->generateCRUDUrl('show', $user->getId()));
}
if ($request->isXmlHttpRequest()) {
$resolveName = static function (FormInterface $form) use (&$resolveName) {
$parent = $form->getParent();
if ($parent === null) {
return $form->getName();
}
return $resolveName($parent) .'_'. $form->getName();
};
return new JsonResponse([
'success' => false,
'errors' => array_map(function (FormError $error) use ($resolveName) {
return [
'field' => $resolveName($error->getOrigin()),
'message' => $error->getMessage(),
];
}, iterator_to_array($form->getErrors(true, true))),
], 400);
}
return $this->render($this->getTemplate('new'), [
'user' => $user,
'form' => $form->createView(),
'indexUrl' => $this->generateCRUDUrl('index'),
]);
}
/**
* @Route("/{id}/show"), requirements={ "id": "\d+" }
* @Method({ "GET" })
*
* @param User $user A User entity instance.
*
* @return Response
*/
public function showAction(User $user)
{
return $this->render($this->getTemplate('show'), [
'user' => $user,
'listUrl' => $this->generateCRUDUrl('index'),
'editUrl' => $this->generateCRUDUrl('edit', $user->getId()),
'deleteUrl' => $this->generateCRUDUrl('delete', $user->getId()),
]);
}
/**
* @Route("/{id}/edit", requirements={ "id": "\d+" })
* @Method({"GET", "POST"})
*
* @param Request $request A Request instance.
* @param User $user A User entity instance.
*
* @return Response
*/
public function editAction(Request $request, User $user)
{
$form = $this->createForm(static::$formClass, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$manager = $this->get('user.user_manager');
if ((trim($user->getPlainPassword()) !== '') && $form->get('notifyAboutPassword')->getData()) {
/** @var MailerInterface $mailer */
$mailer = $this->get(UserBundleServices::MAILER);
$mailer->sendPassword($user, $user->getPlainPassword());
}
$manager->updateUser($user);
return $this->redirect($this->generateCRUDUrl('index'));
}
return $this->render($this->getTemplate('edit'), [
'user' => $user,
'form' => $form->createView(),
'indexUrl' => $this->generateCRUDUrl('index'),
'deleteUrl' => $this->generateCRUDUrl('delete', $user->getId()),
]);
}
/**
* @Route("/{id}/delete", requirements={ "id": "\d+" })
*
* @param User $user A User entity instance.
*
* @return Response
*/
public function deleteAction(User $user)
{
$manager = $this->get('user.user_manager');
if (($response = $this->preDelete($user)) !== null) {
return $response;
}
$manager->deleteUser($user);
return $this->redirectToRoute($this->getRoute('index'));
}
/**
* @param object $entity Deleted entity instance.
*
* @return null|Response
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function preDelete($entity)
{
return null;
}
/**
* @param string $name CRUD operation name.
*
* @return string
*/
public function getRoute($name)
{
$controllerName = strtolower(str_replace('Controller', '', \app\c\getShortName(static::class)));
$name = strtolower($name);
return "admin_user_{$controllerName}_{$name}";
}
/**
* @param string $name CRUD operation name.
*
* @return string
*/
public function getTemplate($name)
{
$controllerName = str_replace('Controller', '', \app\c\getShortName(static::class));
return "AdminBundle:User\\{$controllerName}:$name.html.twig";
}
/**
* @Route(
* "/{id}/change-enabled",
* requirements={ "id": "\d+" },
* condition="request.isXmlHttpRequest()"
* )
*
* @param User $user A User entity instance.
*
* @return JsonResponse
*/
public function changeEnabledAction(User $user)
{
$em = $this->getDoctrine()->getManager();
$user->setEnabled(! $user->isEnabled());
$em->persist($user);
$em->flush();
return new JsonResponse([
'enabled' => $user->isEnabled(),
]);
}
/**
* @Route(
* "/{id}/resend-password",
* requirements={ "id": "\d+" },
* condition="request.isXmlHttpRequest()"
* )
*
* @param User $user A User entity instance.
*
* @return JsonResponse
*/
public function resendPasswordAction(User $user)
{
$manager = $this->get('user.user_manager');
$user->generatePassword();
$password = $user->getPlainPassword();
$manager->updateUser($user);
/** @var MailerInterface $mailer */
$mailer = $this->get(UserBundleServices::MAILER);
$mailer->sendPassword($user, $password);
return new JsonResponse();
}
/**
* @param string $name Route name.
* @param integer $user A User entity id.
*
* @return string
*/
protected function generateCRUDUrl($name, $user = null)
{
$parameters = [];
if ($user !== null) {
$parameters = [ 'id' => $user ];
}
return $this->generateUrl($this->getRoute($name), $parameters);
}
/**
* @param object $entity Created entity instance.
*
* @return null|Response
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function preCreate($entity)
{
return null;
}
}