Skip to content

Instantly share code, notes, and snippets.

@lenybernard
Created December 20, 2013 10:40
Show Gist options
  • Select an option

  • Save lenybernard/8053112 to your computer and use it in GitHub Desktop.

Select an option

Save lenybernard/8053112 to your computer and use it in GitHub Desktop.
description
<?php
namespace Dav\AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use JMS\SecurityExtraBundle\Annotation\PreAuthorize;
use JMS\SecurityExtraBundle\Annotation\Secure;
use Dav\AppBundle\Entity\Preference;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Dav\AppBundle\Form\Type\SpreadsheetType;
use Dav\AppBundle\Entity\Mission\Mission;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use JMS\Serializer\SerializationContext;
/**
* Spreadsheet controller
*
* @Route("/spreadsheet")
* @PreAuthorize("isFullyAuthenticated()")
*/
class SpreadsheetController extends BaseController
{
protected $filterColumns = array(
'entity.name',
'entity.status',
'entity.startDate',
'entity.endDate',
'worker.firstname',
'worker.lastname',
'worker.status',
'client.name',
'signedBy.name',
'chargedBy.name',
);
/**
* PreExecute
* @Secure(roles="ROLE_MGR, ROLE_ADV")
*/
public function preExecute()
{
parent::preExecute();
if ($this->breadcrumb->getChild('spreadsheet')) {
$this->breadcrumb->addChild('spreadsheet', array(
'label' => $this->get('translator')->trans('menu.front.breadcrumb.spreadsheet'),
'route' => 'Spreadsheet_Index',
));
}
}
/**
* Index
*
* @Route("/", name="Spreadsheet_Index")
* @Template()
*/
public function indexAction(Request $request, $_scope)
{
$params = array();
$filters = $this->get('request')->query->get('spreadsheet_filter_row', array());
$missions = $this->searchMissions($filters, $_scope);
$this->filterRow($_scope, $params);
$this->filterColumn($request, $params);
$em = $this->getDoctrine()->getManager();
$missionForms = array();
$segment = 1;
if ($this->get('request')->query->has('page')) {
$segment = intval($this->get('request')->query->get('page'));
}
$i = 0;
//Build mission form only for displayed missions
foreach ($missions as $mission) {
$i++;
if ( ($segment * 20) - 20 <= $i && $i <= $segment * 20) {
$missionForms[] = $this->createForm(new SpreadsheetType($em), $mission)->createView();
} else {
$missionForms[] = true;
}
}
$options = array(
'filters' => $params['preference_columns'],
'max_per_page' => 20
);
$params['list'] = $this->container->get('av_list')->getList($missionForms, 'DavAppBundle:Spreadsheet:list.html.twig', $options);
if ($this->get('request')->isXMLHttpRequest()) {
return $this->render('DavAppBundle:Spreadsheet:list.html.twig', $params);
}
return $params;
}
/**
* List
*
* @Route("/save/{slug}", name="Spreadsheet_Save_Mission")
* @Template()
* @Method("POST")
* @ParamConverter("mission", class="DavAppBundle:Mission\Mission")
*/
public function saveMissionAction(Request $request, Mission $mission)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new SpreadsheetType($em), $mission);
$form->submit($request);
if ($form->isValid()) {
$atomicService = $this->get('atomic_service');
$atomicService->releaseEntity($mission);
$em->persist($mission);
$em->flush();
}
return new Response();
}
/**
* Filter row.
*
* @param string $scope
* @param array &$param
*/
private function filterRow($scope, &$params)
{
$filterRowForm = $this->createForm('spreadsheet_filter_row', null, array('scope' => $scope));
$filterRowForm->submit($this->get('request'));
$params['filter_row_form'] = $filterRowForm->createView();
}
/**
* Filter column.
*
* @param Request $request
* @param array &$param
*/
private function filterColumn(Request $request, &$params)
{
$em = $this->getDoctrine()->getManager();
$preferenceSpreadsheetColumns = $em->getRepository('DavAppBundle:Preference')
->findByUserAndType($this->getUser(), Preference::TYPE_SPREADSHEET_FILTER_COLUMN);
if (!$preferenceSpreadsheetColumns) {
$preferenceSpreadsheetColumns = new Preference();
$preferenceSpreadsheetColumns->setUser($this->getUser())
->setType(Preference::TYPE_SPREADSHEET_FILTER_COLUMN)
->setValue($this->filterColumns);
}
// Form process
$form = $this->createForm('spreadsheet_filter_column', $preferenceSpreadsheetColumns);
if ($request->isMethod('POST')) {
$form->submit($request);
$em->persist($preferenceSpreadsheetColumns);
$em->flush();
}
// Parameters
$params['default_columns'] = array_diff($this->filterColumns, $preferenceSpreadsheetColumns->getValue());
$params['preference_columns'] = $preferenceSpreadsheetColumns->getValue();
$params['filter_column_form'] = $form->createView();
}
/**
* Return a branch.
*
* @param Request $request An HTTP request.
* @param integer $id Branch id.
* @return Response
*
* @Route("/ajax/search/{id}", name="Branch_Ajax_Search", defaults={"id" = null})
* @Method("GET")
*/
public function ajaxSearchAction(Request $request, $id = null)
{
$em = $this->getDoctrine()->getManager();
$params = $request->query->all();
if ($id) {
$branchs = array($em->getRepository('DavAppBundle:Branch')
->findOneById($id));
} elseif (isset($params['q'])) {
$fieldValue = $params['q'];
$branchs = $em->getRepository('DavAppBundle:Branch')
->getByFullName($fieldValue);
} else {
$branchs = array();
}
$serializer = $this->container->get('jms_serializer');
$data = $serializer->serialize(
$branchs,
'json',
SerializationContext::create()->setGroups(array('branch_search'))
);
return new JsonResponse(json_decode($data));
}
private function searchMissions(array $filters, $_scope = "perso")
{
$em = $this->getDoctrine()->getManager();
$metadatas['joins']['client'] = 'entity.client';
$metadatas['leftjoins']['signedBy'] = 'entity.signedBy';
$metadatas['leftjoins']['chargedBy'] = 'entity.chargedBy';
$metadatas['leftjoins']['worker'] = 'entity.worker';
$metadatas['leftjoins']['manager'] = 'entity.manager';
$metadatas['leftjoins']['adv'] = 'entity.adv';
$metadatas['operandes'] = array();
// Get missions
//If admin mode
if ($this->get('security.context')->isGranted('ROLE_ADMIN') && "admin" === $_scope) {
$managers = $em->getRepository('DavAppBundle:User\User')->findAll();
} else {
$managers = ($_scope == 'macro') ? $em->getRepository('DavAppBundle:User\User')->findByBoss($this->getUser(), $_scope) : array();
}
$managers[] = $this->getUser();
$metadatas['manager']['type'] = 'customRelation';
$metadatas['adv']['type'] = 'customRelation';
$metadatas['manager']['options'] = array(
array(
'entity' => 'entity',
'field' => 'manager'
)
);
$metadatas['adv']['options'] = array(
array(
'entity' => 'entity',
'field' => 'manager'
)
);
$params['manager'] = $managers;
$params['adv'] = $managers;
$metadatas['operandes'] = array_merge($metadatas['operandes'], array('manager' => 'IN'));
$metadatas['operandes'] = array_merge($metadatas['operandes'], array('adv' => 'IN'));
foreach ($filters as $on => $value) {
if ($value) {
$field = explode('_', $on);
if ('client' === $on || 'manager' === $on || 'chargedBy' === $on || 'signedBy' === $on) {
$metadatas[$on]['type'] = 'customRelation';
$metadatas[$on]['options'] = array(
array(
'entity' => 'entity',
'field' => $on,
)
);
$params[$on] = $value;
$metadatas['operandes'] = array_merge($metadatas['operandes'], array($on => 'IN'));
} elseif ('entity_name' === $on) {
$metadatas[$on]['type'] = 'field';
$params[$field[1]] = $value;
$metadatas['operandes'] = array_merge($metadatas['operandes'], array($field[1] => 'LIKE'));
} else {
$metadatas[$on]['type'] = 'choice';
$params[$field[1]] = $value;
$metadatas['operandes'] = array_merge($metadatas['operandes'], array($field[1] => '='));
}
}
}
$metadatas['entity_deleted']['type'] = 'customRelation';
$metadatas['entity_deleted']['options'] = array(
array(
'entity' => 'entity',
'field' => 'deleted'
)
);
$params['entity_deleted'] = '0';
$metadatas['operandes'] = array_merge($metadatas['operandes'], array('entity_deleted' => '='));
$params['entity'] = 'DavAppBundle:Mission\Mission';
$params['metadatas'] = json_encode($metadatas);
$qr = $this->get('search_engine.query')
->searchQuery($params);
return $qr->execute();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment