From d86b9f33a0983a630a8d48d7e78cb854ce03ee88 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Tue, 30 Jan 2018 16:08:04 +0800 Subject: [PATCH] Fix sort by hub issue for rider list + add hub selection to outlets --- src/Controller/OutletController.php | 75 ++++++++++++++++++++++++----- src/Controller/RiderController.php | 11 +++-- src/Entity/Hub.php | 11 +++++ src/Entity/Outlet.php | 23 ++++++++- templates/outlet/form.html.twig | 52 +++++++++++--------- templates/outlet/list.html.twig | 4 ++ templates/rider/list.html.twig | 2 +- 7 files changed, 136 insertions(+), 42 deletions(-) diff --git a/src/Controller/OutletController.php b/src/Controller/OutletController.php index b373f3da..da270a2c 100644 --- a/src/Controller/OutletController.php +++ b/src/Controller/OutletController.php @@ -4,6 +4,7 @@ namespace App\Controller; use App\Ramcar\BaseController; use App\Entity\Outlet; +use App\Entity\Hub; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; @@ -39,8 +40,12 @@ class OutletController extends BaseController $datatable = $req->request->get('datatable'); // count total records - $tquery = $qb->select('COUNT(q)'); + $tquery = $qb->select('COUNT(q)') + ->leftJoin('q.hub', 'hub'); + + // add filters to count query $this->setQueryFilters($datatable, $tquery); + $total = $tquery->getQuery() ->getSingleScalarResult(); @@ -61,13 +66,20 @@ class OutletController extends BaseController ]; // build query - $query = $qb->select('q'); + $query = $qb->select('q') + ->addSelect('hub.name as hub_name'); + $this->setQueryFilters($datatable, $query); // check if sorting is present, otherwise use default if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $prefix = ''; + + if (!in_array($datatable['sort']['field'], ['hub_name'])) + $prefix = 'q.'; + $order = $datatable['sort']['sort'] ?? 'asc'; - $query->orderBy('q.' . $datatable['sort']['field'], $order); + $query->orderBy($prefix . $datatable['sort']['field'], $order); } else { $query->orderBy('q.id', 'asc'); } @@ -82,12 +94,13 @@ class OutletController extends BaseController $rows = []; foreach ($obj_rows as $orow) { // add row data - $row['id'] = $orow->getID(); - $row['name'] = $orow->getName(); - $row['address'] = $orow->getAddress(); - $row['contact_nums'] = $orow->getContactNumbers(); - $row['time_open'] = $orow->getTimeOpen()->format('g:i A'); - $row['time_close'] = $orow->getTimeClose()->format('g:i A'); + $row['id'] = $orow[0]->getID(); + $row['name'] = $orow[0]->getName(); + $row['address'] = $orow[0]->getAddress(); + $row['contact_nums'] = $orow[0]->getContactNumbers(); + $row['time_open'] = $orow[0]->getTimeOpen()->format('g:i A'); + $row['time_close'] = $orow[0]->getTimeClose()->format('g:i A'); + $row['hub_name'] = $orow['hub_name']; // add row metadata $row['meta'] = [ @@ -119,6 +132,11 @@ class OutletController extends BaseController $params['obj'] = new Outlet(); $params['mode'] = 'create'; + $em = $this->getDoctrine()->getManager(); + + // get parent associations + $params['hubs'] = $em->getRepository(Hub::class)->findAll(); + // response return $this->render('outlet/form.html.twig', $params); } @@ -145,7 +163,8 @@ class OutletController extends BaseController protected function setQueryFilters($datatable, QueryBuilder $query) { if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { - $query->where('q.name LIKE :filter') + $query->where('hub.name LIKE :filter') + ->orWhere('q.name LIKE :filter') ->orWhere('q.address LIKE :filter') ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); } @@ -155,8 +174,6 @@ class OutletController extends BaseController { $this->denyAccessUnlessGranted('outlet.add', null, 'No access.'); - error_log($req->request->get('time_open')); - // create new object $em = $this->getDoctrine()->getManager(); $obj = new Outlet(); @@ -164,6 +181,19 @@ class OutletController extends BaseController // initialize error list $error_array = []; + // custom validation for associations + $hub_id = $req->request->get('hub'); + + if ($hub_id) { + $hub = $em->getRepository(Hub::class) + ->find($hub_id); + + if (empty($hub)) + $error_array['hub'] = 'Invalid hub selected.'; + else + $obj->setHub($hub); + } + // check if lat and lng are provided if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat'))) { @@ -185,7 +215,6 @@ class OutletController extends BaseController } } - // check if any errors were found if (!empty($error_array)) { @@ -220,6 +249,11 @@ class OutletController extends BaseController if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); + $em = $this->getDoctrine()->getManager(); + + // get parent associations + $params['hubs'] = $em->getRepository(Hub::class)->findAll(); + $params['obj'] = $obj; $params['mode'] = 'update'; @@ -247,6 +281,21 @@ class OutletController extends BaseController // initialize error list $error_array = []; + // custom validation for associations + $hub_id = $req->request->get('hub'); + + if ($hub_id) { + $hub = $em->getRepository(Hub::class) + ->find($hub_id); + + if (empty($hub)) + $error_array['hub'] = 'Invalid hub selected.'; + else + $obj->setHub($hub); + } else { + $obj->clearHub(); + } + // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 33201211..0f6dae90 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -71,8 +71,13 @@ class RiderController extends BaseController // check if sorting is present, otherwise use default if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $prefix = ''; + + if (!in_array($datatable['sort']['field'], ['hub_name'])) + $prefix = 'q.'; + $order = $datatable['sort']['sort'] ?? 'asc'; - $query->orderBy('q.' . $datatable['sort']['field'], $order); + $query->orderBy($prefix . $datatable['sort']['field'], $order); } else { $query->orderBy('q.id', 'asc'); } @@ -82,7 +87,6 @@ class RiderController extends BaseController ->setMaxResults($perpage) ->getQuery() ->getResult(); - // Query::HYDRATE_ARRAY); // process rows $rows = []; @@ -94,7 +98,7 @@ class RiderController extends BaseController $row['last_name'] = $orow[0]->getLastName(); $row['plate_number'] = $orow[0]->getPlateNumber(); $row['contact_num'] = $orow[0]->getContactNumber(); - $row['hub'] = $orow['hub_name']; + $row['hub_name'] = $orow['hub_name']; // add row metadata $row['meta'] = [ @@ -327,6 +331,7 @@ class RiderController extends BaseController ->orWhere('q.first_name LIKE :filter') ->orWhere('q.last_name LIKE :filter') ->orWhere('q.contact_num LIKE :filter') + ->orWhere('q.plate_number LIKE :filter') ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); } } diff --git a/src/Entity/Hub.php b/src/Entity/Hub.php index b0b26a91..1251cf03 100644 --- a/src/Entity/Hub.php +++ b/src/Entity/Hub.php @@ -67,6 +67,12 @@ class Hub */ protected $riders; + // outlets under this hub + /** + * @ORM\OneToMany(targetEntity="Outlet", mappedBy="hub") + */ + protected $outlets; + public function __construct() { $this->riders = new ArrayCollection(); @@ -150,4 +156,9 @@ class Hub { return $this->riders; } + + public function getOutlets() + { + return $this->outlets; + } } diff --git a/src/Entity/Outlet.php b/src/Entity/Outlet.php index 6ed4d3e9..6bb4fbb3 100644 --- a/src/Entity/Outlet.php +++ b/src/Entity/Outlet.php @@ -71,7 +71,11 @@ class Outlet */ protected $job_orders; - + /** + * @ORM\ManyToOne(targetEntity="Hub", inversedBy="outlets") + * @ORM\JoinColumn(name="hub_id", referencedColumnName="id") + */ + protected $hub; public function __construct() { @@ -150,4 +154,21 @@ class Outlet { return $this->time_close; } + + public function setHub(Hub $hub) + { + $this->hub = $hub; + return $this; + } + + public function getHub() + { + return $this->hub; + } + + public function clearHub() + { + $this->hub = null; + return $this; + } } diff --git a/templates/outlet/form.html.twig b/templates/outlet/form.html.twig index 27ba76e7..9c11bbd6 100644 --- a/templates/outlet/form.html.twig +++ b/templates/outlet/form.html.twig @@ -36,35 +36,24 @@
-
+
-
-
-
- - - +
+ + +
-
-
-
- - - -
-
- -
-
+
@@ -76,7 +65,7 @@
-
+
@@ -89,7 +78,22 @@
- +
+
+ + + +
+
+ + + +
+