<?php
namespace App\Controller\Backend;
use App\Controller\Base\BaseController;
use App\Entity\PtiGroup;
use App\Entity\PtiRule;
use App\Filter\PtiGroupFilterType;
use App\Form\PtiGroupType;
use App\Repository\PtiGroupRepository;
use App\Repository\PtiModuleActionRepository;
use App\Repository\PtiModuleRepository;
use App\Repository\PtiRuleRepository;
use App\Utils\ObjectManager;
use Symfony\Component\HttpFoundation\Response;
use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
use Symfony\Component\HttpFoundation\Request;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
/**
* Require ROLE_SUPER_USER for *every* controller method in this class.
*
* @IsGranted("ROLE_SUPER_USER")
*/
class PtiGroupController extends BaseController
{
private $pageName = 'pti_group';
private $class = PtiGroup::class;
/**
* @Route("/group", name="pti_group")
*/
public function index(BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface): Response
{
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('Group User');
$form = $this->createFormFilter(PtiGroupFilterType::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/pti_group/index.html.twig', [
'page_name' => $this->pageName,
'button_credential' => $this->buttonCredentials($this->pageName),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/group/form/{id}", defaults={"id"= null}, name="pti_group_form", methods={"POST", "GET"})
*/
public function form(?string $id = null, Request $request, PtiGroupRepository $ptiGroupRepo)
{
if ($id) {
$pti_group = $ptiGroupRepo->find($id);
} else {
$pti_group = new PtiGroup();
}
if (!$pti_group) {
throw new NotFoundHttpException();
}
$form = $this->createForm(PtiGroupType::class, $pti_group, ['action' => $this->generateUrl('pti_group_form', ['id' => $pti_group->getId()])]); //Jadi lebih singkat
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$pti_group = $form->getData();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($pti_group);
$entityManager->flush();
if($id){
$this->addFlash('notice', 'User Group "' . $pti_group->getNamaGroup() . '" berhasil diubah');
}else{
$this->addFlash('notice', 'User Group "' . $pti_group->getNamaGroup() . '" berhasil dibuat');
}
return $this->redirectToRoute('pti_group');
}
return $this->render('backend/pti_group/form.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("/group/{id}/delete_pti_group", name="pti_group_delete", methods={"GET"})
*/
public function delete(PtiGroup $ptiGroup)
{
//dump($myUserRepository); exit;
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($ptiGroup);
$entityManager->flush();
$this->addFlash('notice', 'User "' . $ptiGroup->getNamaGroup() . '" berhasil dihapus');
return $this->redirectToRoute('pti_group');
}
/**
* @Route("/group/add_selected", name="pti_group_add_selected", methods={"POST"})
*/
public function add_selected(Request $request)
{
$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("/group/action_selected", name="pti_group_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('pti_group');
}
/**
* @Route("/group/{id}/detail", name="pti_group_detail", methods={"GET", "POST"})
*/
public function detail(BreacrumbBuilder $builder, PtiGroupRepository $ptiGroupRepo, PtiGroup $ptiGroup, PtiModuleRepository $ptiModuleRepo,
PtiModuleActionRepository $ptiModuleActionRepo, PtiRuleRepository $ptiRuleRepo)
{
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('Group User', "pti_group");
$builder->add('Detail');
$detail = $ptiGroupRepo->find($ptiGroup);
$modules = [];
$credentials = [];
$rules = [];
$creds = $ptiRuleRepo->findBy(['groups' => $detail->getId()]);
foreach($creds as $cred){
$credentials[$cred->getModuleAction()->getId()] = $cred;
}
// dump($credentials);exit;
$parents = $ptiModuleRepo->findBy(['parent' => 0], ['id' => 'asc']);
foreach($parents as $parent)
{
$rule_parents = $ptiModuleActionRepo->findBy(['module' => $parent->getId(), 'action' => 'index']);
$rules[$parent->getId()] = $rule_parents;
$childs = $ptiModuleRepo->findBy(['parent' => $parent->getId()], ['id' => 'asc']);
$modules[] = ['parent' => $parent, 'child' => $childs];
foreach($childs as $child){
$rule_child = $ptiModuleActionRepo->findBy(['module' => $child->getId()], ['id' => 'asc']);
$rules[$child->getId()] = $rule_child;
}
}
// dump($credentials);exit;
return $this->render('backend/pti_group/detail.html.twig', [
'page_name' => $this->pageName,
'button_credential' => $this->buttonCredentials($this->pageName),
'ptiGroup' => $detail,
'modules' => $modules,
'rules' => $rules,
'credentials' => $credentials,
]);
}
/**
* @Route("/group/access", name="pti_group_form_action_access", methods={"GET", "POST"})
*/
public function form_action_access(Request $request, PtiGroupRepository $ptiGroupRepo, PtiModuleActionRepository $ptiModuleActionRepo, PtiRuleRepository $ptiRuleRepo)
{
$credentials = $request->get('credentials');
$group_id = $request->get('group');
$group = $ptiGroupRepo->find($group_id);
$rules = $ptiRuleRepo->findBy(['groups' => $group_id]);
if ($rules) {
foreach ($rules as $rule) {
$rule->setIsAllowed(false);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($rule);
$entityManager->flush();
}
}
// dump($credentials);exit;
foreach($credentials as $credential)
{
$rule = $ptiRuleRepo->findOneBy(['groups' => $group_id, 'module_action' => $credential]);
if (!$rule) {
$module_action = $ptiModuleActionRepo->find($credential);
$rule = new PtiRule();
$rule->setGroups($group);
$rule->setModuleAction($module_action);
}
$rule->setIsAllowed(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($rule);
$entityManager->flush();
}
$this->addFlash('notice', 'Hak akses group user "' . $group->getNamaGroup() . '" berhasil disimpan');
return $this->redirectToRoute('pti_group_detail', ['id' => $group_id]);
}
}