<?php
namespace App\Controller\Backend;
use App\Controller\Base\BaseController;
use App\Entity\MUser;
use App\Filter\MUserFilterType;
use App\Form\MUserType;
use App\Repository\MUserRepository;
use App\Utils\ObjectManager;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactoryInterface;
/**
* Require ROLE_ADMIN for *every* controller method in this class.
*
* @IsGranted("ROLE_ADMINISTRATOR")
*/
class MUserController extends BaseController
{
private $pageName = 'user';
private $class = MUser::class;
/**
* @Route("/user", name="user")
*/
public function index(BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface): Response
{
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('User');
$form = $this->createFormFilter(MUserFilterType::class);
$queryBuilder = $this->getQueryBuilder($this->class);
$queryBuilder = $this->buildFilter($request, $form, $queryBuilder)->addOrderBy("this.id", "DESC");
$this->setSessionLimit($request);
$maxPerPage = $request->getSession()->get("limit") ? $request->getSession()->get("limit") : $this->getLimit();
$pagination = $paginatorInterface->paginate($queryBuilder, $request->query->getInt('page', 1), $maxPerPage);
return $this->render('backend/user/index.html.twig', [
'page_name' => $this->pageName,
'button_credential' => $this->buttonCredentials($this->pageName),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/user/form/{id}", defaults={"id"= null}, name="user_form", methods={"POST", "GET"})
*/
public function form(?string $id = null, Request $request, MUserRepository $mUserRepo)
{
if ($id) {
$user = $mUserRepo->find($id);
} else {
$user = new MUser();
}
if (!$user) {
throw new NotFoundHttpException();
}
$form = $this->createForm(MUserType::class, $user, ['action' => $this->generateUrl('user_form', ['id' => $user->getId()])]); //Jadi lebih singkat
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$user->setIsActive(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
if($id){
$this->addFlash('notice', 'User "' . $user->getName() . '" berhasil diubah');
}else{
$this->addFlash('notice', 'User "' . $user->getName() . '" berhasil dibuat');
}
return $this->redirectToRoute('user');
}
return $this->render('backend/user/form.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("/user/{id}/delete_user", name="user_delete", methods={"GET"})
*/
public function delete(MUser $mUser)
{
//dump($myUserRepository); exit;
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($mUser);
$entityManager->flush();
$this->addFlash('notice', 'User "' . $mUser->getName() . '" berhasil dihapus');
return $this->redirectToRoute('user');
}
/**
* @Route("/profile/", name="user_profile")
*/
public function profile(Request $request, MUserRepository $mUserRepo)
{
$user_id = $this->getUser()->getId();
$user = $mUserRepo->find($user_id);
return $this->render('user/profile.html.twig', [
'profile' => $user,
'title' => 'Profile'
]);
}
/**
* @Route("user/add_selected", name="user_add_selected", methods={"POST"})
*/
public function add_selected(Request $request, ObjectManager $objectManager)
{
$sessionName = $request->get("name");
$this->get('session')->set($sessionName, $request->get('selected'));
$selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
return $this->json($selected);
}
/**
* @Route("user/action_selected", name="user_action_selected", methods={"POST"})
*/
public function action_selected(Request $request, ObjectManager $objectManager)
{
$sessionName = $request->get("name");
if ($this->isCsrfTokenValid($sessionName . '_action_selected', $request->request->get('_token')))
{
$selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
$deleted = $objectManager->deleteByIds($this->class, $selected);
if($deleted) {
$this->get('session')->set($sessionName, []);
$this->addFlash('success', $this->getTranslator()->trans('messages.deleted.success'));
} else {
$this->addFlash('error', $this->getTranslator()->trans('messages.deleted.error'));
}
}
return $this->redirectToRoute('user');
}
/**
* @Route("/user/{id}/detail_user", name="user_detail", methods={"GET","POST"})
*/
public function detail(MUserRepository $mUserrepo, MUser $mUser)
{
$detail = $mUserrepo->find($mUser);
return $this->render('backend/user/detail.html.twig', [
'users' => $detail
]);
}
/**
* @Route("/user/{id}/reset_pass", name="user_reset_pass", methods={"GET","POST"})
*/
public function resetPass(MUser $mUser, PasswordHasherFactoryInterface $encoderFactory){
$encoder = $encoderFactory->getPasswordHasher($mUser);
$password = $encoder->hash('admin');
$mUser->setPassword($password);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($mUser);
$entityManager->flush();
$this->addFlash('notice', 'Password "' . $mUser->getUsername() . '" berhasil direset');
return $this->redirectToRoute('user');
}
}