denyAccessUnlessGranted('battery.list', null, 'No access.'); return $this->render('battery/list.html.twig'); } public function rows(Request $req) { $this->denyAccessUnlessGranted('battery.list', null, 'No access.'); // build query $qb = $this->getDoctrine() ->getRepository(Battery::class) ->createQueryBuilder('q'); // get datatable params $datatable = $req->request->get('datatable'); // count total records $tquery = $qb->select('COUNT(q)') ->join('q.manufacturer', 'mfg') ->join('q.model', 'model') ->join('q.size', 'size'); // add filters to count query $this->setQueryFilters($datatable, $tquery); $total = $tquery->getQuery() ->getSingleScalarResult(); // get current page number $page = $datatable['pagination']['page'] ?? 1; $perpage = $datatable['pagination']['perpage']; $offset = ($page - 1) * $perpage; // add metadata $meta = [ 'page' => $page, 'perpage' => $perpage, 'pages' => ceil($total / $perpage), 'total' => $total, 'sort' => 'asc', 'field' => 'id' ]; // build query $query = $qb->select('q') ->addSelect('mfg.name as mfg_name') ->addSelect('model.name as model_name') ->addSelect('size.name as size_name'); // add filters to query $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'], ['mfg_name', 'model_name', 'size_name'])) $prefix = 'q.'; $order = $datatable['sort']['sort'] ?? 'asc'; $query->orderBy($prefix . $datatable['sort']['field'], $order); } else { $query->orderBy('mfg_name', 'asc'); } // get rows for this page $obj_rows = $query->setFirstResult($offset) ->setMaxResults($perpage) ->getQuery() ->getResult(); // process rows $rows = []; foreach ($obj_rows as $orow) { // add row data $row['id'] = $orow[0]->getID(); $row['mfg_name'] = $orow['mfg_name']; $row['model_name'] = $orow['model_name']; $row['size_name'] = $orow['size_name']; $row['prod_code'] = $orow[0]->getProductCode(); $row['sell_price'] = $orow[0]->getSellingPrice(); $row['warr_private'] = $orow[0]->getWarrantyPrivate(); $row['warr_commercial'] = $orow[0]->getWarrantyCommercial(); $row['warr_tnv'] = $orow[0]->getWarrantyTnv(); $row['res_capacity'] = $orow[0]->getReserveCapacity(); $row['length'] = $orow[0]->getLength(); $row['width'] = $orow[0]->getWidth(); $row['height'] = $orow[0]->getHeight(); $row['total_height'] = $orow[0]->getTotalHeight(); $row['image_file'] = $orow[0]->getImageFile(); // add row metadata $row['meta'] = [ 'update_url' => '', 'delete_url' => '' ]; // add crud urls if ($this->isGranted('user.update')) $row['meta']['update_url'] = $this->generateUrl('battery_update', ['id' => $row['id']]); if ($this->isGranted('user.delete')) $row['meta']['delete_url'] = $this->generateUrl('battery_delete', ['id' => $row['id']]); $rows[] = $row; } // response return $this->json([ 'meta' => $meta, 'data' => $rows ]); } /** * @Menu(selected="battery_list") */ public function addForm() { $this->denyAccessUnlessGranted('battery.add', null, 'No access.'); $params['obj'] = new Battery(); $params['mode'] = 'create'; $em = $this->getDoctrine()->getManager(); // get parent associations $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); $params['models'] = $em->getRepository(BatteryModel::class)->findAll(); $params['sizes'] = $em->getRepository(BatterySize::class)->findAll(); $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); // response return $this->render('battery/form.html.twig', $params); } public function addSubmit(Request $req, ValidatorInterface $validator) { $this->denyAccessUnlessGranted('battery.add', null, 'No access.'); // create new row $em = $this->getDoctrine()->getManager(); $row = new Battery(); // set and save values $row->setProductCode($req->request->get('prod_code')) ->setSAPCode($req->request->get('sap_code')) ->setWarrantyPrivate($req->request->get('warr_private')) ->setWarrantyCommercial($req->request->get('warr_commercial')) ->setWarrantyTnv($req->request->get('warr_tnv')) ->setReserveCapacity($req->request->get('res_capacity')) ->setLength($req->request->get('length')) ->setWidth($req->request->get('width')) ->setHeight($req->request->get('height')) ->setTotalHeight($req->request->get('total_height')) ->setSellingPrice($req->request->get('sell_price')) ->setImageFile($req->request->get('image_file')); // initialize error list $error_array = []; // custom validation for battery manufacturer $manufacturer = $em->getRepository(BatteryManufacturer::class) ->find($req->request->get('manufacturer')); if (empty($manufacturer)) $error_array['manufacturer'] = 'Invalid manufacturer selected.'; else $row->setManufacturer($manufacturer); // custom validation for battery model $model = $em->getRepository(BatteryModel::class) ->find($req->request->get('model')); if (empty($model)) $error_array['model'] = 'Invalid model selected.'; else $row->setModel($model); // custom validation for battery size $size = $em->getRepository(BatterySize::class) ->find($req->request->get('size')); if (empty($size)) $error_array['size'] = 'Invalid size selected.'; else $row->setSize($size); // custom validation for vehicles $vehicles = $req->request->get('vehicles'); if (!empty($vehicles)) { foreach ($vehicles as $vehicle_id) { $vehicle = $em->getRepository(Vehicle::class)->find($vehicle_id); if (!empty($vehicle)) { $row->addVehicle($vehicle); } } } // validate $errors = $validator->validate($row); // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); } // check if any errors were found if (!empty($error_array)) { // return validation failure response return $this->json([ 'success' => false, 'errors' => $error_array ], 422); } else { // validated! save the entity $em->persist($row); $em->flush(); // return successful response return $this->json([ 'success' => 'Changes have been saved!' ]); } } /** * @Menu(selected="battery_list") */ public function updateForm($id) { $this->denyAccessUnlessGranted('battery.update', null, 'No access.'); $params['mode'] = 'update'; // get row data $em = $this->getDoctrine()->getManager(); $row = $em->getRepository(Battery::class)->find($id); // make sure this row exists if (empty($row)) throw $this->createNotFoundException('The item does not exist'); // get parent associations $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); $params['models'] = $em->getRepository(BatteryModel::class)->findAll(); $params['sizes'] = $em->getRepository(BatterySize::class)->findAll(); $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); $params['obj'] = $row; // response return $this->render('battery/form.html.twig', $params); } public function updateSubmit(Request $req, ValidatorInterface $validator, $id) { $this->denyAccessUnlessGranted('battery.update', null, 'No access.'); // get row data $em = $this->getDoctrine()->getManager(); $row = $em->getRepository(Battery::class)->find($id); // make sure this row exists if (empty($row)) throw $this->createNotFoundException('The item does not exist'); // set and save values $row->setProductCode($req->request->get('prod_code')) ->setSAPCode($req->request->get('sap_code')) ->setWarrantyPrivate($req->request->get('warr_private')) ->setWarrantyCommercial($req->request->get('warr_commercial')) ->setWarrantyTnv($req->request->get('warr_tnv')) ->setReserveCapacity($req->request->get('res_capacity')) ->setLength($req->request->get('length')) ->setWidth($req->request->get('width')) ->setHeight($req->request->get('height')) ->setTotalHeight($req->request->get('total_height')) ->setSellingPrice($req->request->get('sell_price')) ->setImageFile($req->request->get('image_file')) ->clearVehicles(); // initialize error list $error_array = []; // custom validation for battery manufacturer $manufacturer = $em->getRepository(BatteryManufacturer::class) ->find($req->request->get('manufacturer')); if (empty($manufacturer)) $error_array['manufacturer'] = 'Invalid manufacturer selected.'; else $row->setManufacturer($manufacturer); // custom validation for battery model $model = $em->getRepository(BatteryModel::class) ->find($req->request->get('model')); if (empty($model)) $error_array['model'] = 'Invalid model selected.'; else $row->setModel($model); // custom validation for battery size $size = $em->getRepository(BatterySize::class) ->find($req->request->get('size')); if (empty($size)) $error_array['size'] = 'Invalid size selected.'; else $row->setSize($size); // custom validation for vehicles $vehicles = $req->request->get('vehicles'); if (!empty($vehicles)) { foreach ($vehicles as $vehicle_id) { $vehicle = $em->getRepository(Vehicle::class)->find($vehicle_id); if (!empty($vehicle)) { $row->addVehicle($vehicle); } } } // validate $errors = $validator->validate($row); // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); } // check if any errors were found if (!empty($error_array)) { // return validation failure response return $this->json([ 'success' => false, 'errors' => $error_array ], 422); } else { // validated! save the entity $em->flush(); // return successful response return $this->json([ 'success' => 'Changes have been saved!' ]); } } public function destroy($id) { $this->denyAccessUnlessGranted('battery.delete', null, 'No access.'); // get row data $em = $this->getDoctrine()->getManager(); $row = $em->getRepository(Battery::class)->find($id); if (empty($row)) throw $this->createNotFoundException('The item does not exist'); // delete this row $em->remove($row); $em->flush(); // response $response = new Response(); $response->setStatusCode(Response::HTTP_OK); $response->send(); } public function uploadImage(Request $req, FileUploader $uploader) { // retrieve temporary info for file $file = $req->files->get('image_file'); // upload the file $filename = $uploader->upload($file); // return response return $this->json([ 'success' => true, 'filename' => $filename ]); } public function getBattery(Request $req) { // no access check, grant all for this ajax call // parse the id: model size $bmfg_id = $req->query->get('mfg_id'); $bmodel_id = $req->query->get('model_id'); $bsize_id = $req->query->get('size_id'); // find the battery using model and size $em = $this->getDoctrine()->getManager(); $query = $em->createQuery('SELECT b FROM App\Entity\Battery b JOIN b.model bm JOIN b.size bs JOIN b.manufacturer bmfg WHERE bm.id = :bm_id AND bs.id = :bs_id AND bmfg.id = :bmfg_id') ->setParameter('bmfg_id', $bmfg_id) ->setParameter('bm_id', $bmodel_id) ->setParameter('bs_id', $bsize_id); $result = $query->getResult(); if (empty($result)) { // TODO: will have to change from 422 to 404 return $this->json([ 'success' => false, 'errors' => "Battery does not exist", ], 422); } $batteries = []; foreach ($result as $row) { $batteries[] = [ 'id' => $row->getID(), 'manufacturer' => $row->getManufacturer()->getName(), 'model' => $row->getModel()->getName(), 'size' => $row->getSize()->getName(), 'price' => $row->getSellingPrice(), ]; } return $this->json([ 'data' => $batteries ]); } // check if datatable filter is present and append to query protected function setQueryFilters($datatable, &$query) { if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { $query->where('mfg.name LIKE :filter') ->orWhere('model.name LIKE :filter') ->orWhere('size.name LIKE :filter') ->orWhere('q.prod_code LIKE :filter') ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); } } }