Files
Ecobuddy/paginationcontroller.php
2024-12-04 21:13:46 +00:00

112 lines
4.4 KiB
PHP

<?php
require_once('Models/FacilityDataSet.php');
require_once("Models/Paginator.php");
// Default Filters
$filters = [
'category' => $_GET['category'] ?? '1', // Default category
'term' => $_GET['term'] ?? '', // Default term
'sort' => $_GET['sort'] ?? '1', // Default sort
'dir' => $_GET['dir'] ?? 'asc', // Default direction
'page' => $_GET['page'] ?? 0 // Default to first page
];
// If no query parameters exist (initial page load), redirect to set default ones
if (empty($_GET)) {
redirectWithFilters($filters);
}
// Set row limit
$rowLimit = 7;
// create dataset object
$facilityDataSet = new FacilityDataSet();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
/**
* Unfortunately, ZERO time to fix this, too complex.
*/
if(isset($_POST['updateButton'])) {
$data = [
'id' => $_POST['idUpdate'],
'title' => $_POST['titlUpdate'],
'category' => $_POST['cateUpdate'],
'description' => $_POST['descUpdate'],
'houseNumber' => $_POST['hnumUpdate'],
'streetName' => $_POST['strtUpdate'],
'county' => $_POST['cntyUpdate'],
'town' => $_POST['townUpdate'],
'postcode' => $_POST['postUpdate'],
'lng' => $_POST['lngUpdate'],
'lat' => $_POST['latUpdate'],
'contributor' => $_POST['contUpdate'],
];
$facilityDataSet->addFacility($data);
}
if(isset($_POST['createButton'])) {
$data = [
'title' => $_POST['titlCreate'],
'category' => $_POST['cateCreate'],
'description' => $_POST['descCreate'],
'houseNumber' => $_POST['hnumCreate'],
'streetName' => $_POST['strtCreate'],
'county' => $_POST['cntyCreate'],
'town' => $_POST['townCreate'],
'postcode' => $_POST['postCreate'],
'contributor' => $_POST['contCreate'],
];
$facilityDataSet->addFacility($data);
}
// passes id to delete facility
if (isset($_POST['deleteButton'])) {
$facilityDataSet->deleteFacility($_POST['id']);
}
// Check if filters/sorting changed
$filtersChanged = (
$filters['category'] !== ($_POST['filterCat'] ?? $filters['category']) ||
$filters['term'] !== ($_POST['filter'] ?? $filters['term']) ||
$filters['sort'] !== ($_POST['sort'] ?? $filters['sort']) ||
$filters['dir'] !== ($_POST['dir'] ?? $filters['dir'])
);
// load from post if exists and sanitise, otherwise use defaults
$filters['category'] = filter_input(INPUT_POST, 'filterCat', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? $filters['category'];
$filters['term'] = filter_input(INPUT_POST, 'filter', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? $filters['term'];
$filters['sort'] = filter_input(INPUT_POST, 'sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? $filters['sort'];
$filters['dir'] = filter_input(INPUT_POST, 'dir', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? $filters['dir'];
// Reset page if filters changed
$filters['page'] = $filtersChanged ? 0 : $_POST['paginationButton'] ?? $filters['page'];
redirectWithFilters($filters);
}
// fetch page data from database
$view->allPageData = $facilityDataSet->fetchAll(
['category' => $filters['category'], 'term' => $filters['term']],
['sort' => $filters['sort'], 'dir' => $filters['dir']]
);
// set total facility count to view
$view->totalResults = $view->allPageData['count'];
// create paginator object
$view->paginator = new Paginator($rowLimit, $view->allPageData);
// assign page number to view
$view->pageNumber = $view->paginator->getPageFromUri();
// get current page
$view->pageData = $view->paginator->getPage($view->pageNumber);
// Send result count to view in format "showing x of y results"
$view->dbMessage = $view->paginator->countPageResults($view->pageNumber) == 0
? "No results"
: "Showing " . $view->paginator->countPageResults($view->pageNumber) . " of " . $view->totalResults . " result(s)";
// Redirect function, adds header parameters
function redirectWithFilters($filters) {
// Ensure no unintended keys are passed
$allowedKeys = ['category', 'term', 'sort', 'dir', 'page'];
$filters = array_filter($filters, function($key) use ($allowedKeys) {
return in_array($key, $allowedKeys);
}, ARRAY_FILTER_USE_KEY);
$queryString = http_build_query($filters);
header("Location: ?" . $queryString);
exit;
}