Fix sort by hub issue for rider list + add hub selection to outlets

This commit is contained in:
Ramon Gutierrez 2018-01-30 16:08:04 +08:00
parent 161778cfef
commit d86b9f33a0
7 changed files with 136 additions and 42 deletions

View file

@ -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();

View file

@ -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'] . '%');
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -36,35 +36,24 @@
<div class="m-portlet__body">
<div class="form-group m-form__group row no-border">
<div class="col-lg-8">
<div class="col-lg-3">
<label for="name" data-field="name">
Name
</label>
<input type="text" name="name" class="form-control m-input" value="{{ obj.getName() }}">
<div class="form-control-feedback hide" data-field="name"></div>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-8">
<label for="address" data-field="address">
Address
</label>
<textarea class="form-control m-input" id="address" rows="3" name="address">{{ obj.getAddress }}</textarea>
<div class="form-control-feedback hide" data-field="address"></div>
<div class="col-lg-3">
<label data-field="hub">Hub:</label>
<select class="form-control m-input" id="hub" name="hub">
<option value=""></option>
{% for hub in hubs %}
<option value="{{ hub.getID() }}"{{ obj.getHub() and hub.getID() == obj.getHub().getID() ? ' selected' }}>{{ hub.getName() }}</option>
{% endfor %}
</select>
<div class="form-control-feedback hide" data-field="hub"></div>
</div>
</div>
<div class="form-group m-form__group row">
<div class="col-lg-8">
<label for="contact_nums" data-field="contact_nums">
Contact Numbers
</label>
<textarea class="form-control m-input" id="contact_nums" rows="3" name="contact_nums">{{ obj.getContactNumbers }}</textarea>
<div class="form-control-feedback hide" data-field="contact_nums"></div>
</div>
</div>
<div class="form-group m-form__group row">
<div class="col-lg-4">
<div class="col-lg-3">
<label for="time_open">
Time Open
</label>
@ -76,7 +65,7 @@
</div>
<div class="form-control-feedback hide" data-field="time_open"></div>
</div>
<div class="col-lg-4">
<div class="col-lg-3">
<label for="time_close">
Time Close
</label>
@ -89,7 +78,22 @@
<div class="form-control-feedback hide" data-field="time_close"></div>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-6">
<label for="address" data-field="address">
Address
</label>
<textarea class="form-control m-input" id="address" rows="4" name="address">{{ obj.getAddress }}</textarea>
<div class="form-control-feedback hide" data-field="address"></div>
</div>
<div class="col-lg-6">
<label for="contact_nums" data-field="contact_nums">
Contact Numbers
</label>
<textarea class="form-control m-input" id="contact_nums" rows="4" name="contact_nums">{{ obj.getContactNumbers }}</textarea>
<div class="form-control-feedback hide" data-field="contact_nums"></div>
</div>
</div>
<div class="form-group m-form__group row">
<div class="col-lg-12">
<label data-field="coordinates">

View file

@ -92,6 +92,10 @@
field: 'contact_nums',
title: 'Contact Numbers'
},
{
field: 'hub_name',
title: 'Hub'
},
{
field: 'time_open',
title: 'Time Open'

View file

@ -108,7 +108,7 @@
title: 'Plate Number'
},
{
field: 'hub',
field: 'hub_name',
title: 'Hub'
},
{