query("SELECT * FROM company_settings LIMIT 1"); $settings = $stmt->fetch(PDO::FETCH_ASSOC); } catch (Exception $e) { // Log error or ignore if table doesn't exist yet } // Default values if no settings found if (!$settings) { $settings = [ 'company_name' => 'My Restaurant', 'address' => '123 Food Street', 'phone' => '555-0199', 'email' => 'info@restaurant.com', 'vat_rate' => 0.00, 'currency_symbol' => '$', 'currency_decimals' => 2 ]; } } return $settings; } // Function to format currency using settings function format_currency($amount) { $settings = get_company_settings(); return $settings['currency_symbol'] . number_format((float)$amount, (int)$settings['currency_decimals']); } /** * Paginate a query result. * * @param PDO $pdo The PDO connection object. * @param string $query The base SQL query (without LIMIT/OFFSET). * @param array $params Query parameters. * @param int $default_limit Default items per page. * @return array Pagination result with keys: data, total_rows, total_pages, current_page, limit. */ function paginate_query($pdo, $query, $params = [], $default_limit = 20) { // Get current page $page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1; if ($page < 1) $page = 1; // Get limit (allow 20, 50, 100, or -1 for all) $limit = isset($_GET['limit']) ? (int)$_GET['limit'] : $default_limit; // Validate limit, default to 20 if not standard, allow custom if needed but standardizing is safer if ($limit != -1 && !in_array($limit, [20, 50, 100])) { $limit = $default_limit; } // If limit is -1, fetch all if ($limit == -1) { $stmt = $pdo->prepare($query); $stmt->execute($params); $data = $stmt->fetchAll(); return [ 'data' => $data, 'total_rows' => count($data), 'total_pages' => 1, 'current_page' => 1, 'limit' => -1 ]; } // Count total rows using a subquery to handle complex queries safely $count_sql = "SELECT COUNT(*) FROM ($query) as count_table"; $stmt = $pdo->prepare($count_sql); $stmt->execute($params); $total_rows = $stmt->fetchColumn(); $total_pages = ceil($total_rows / $limit); if ($page > $total_pages && $total_pages > 0) $page = $total_pages; // Calculate offset $offset = ($page - 1) * $limit; if ($offset < 0) $offset = 0; // Add LIMIT and OFFSET // Note: PDO parameters for LIMIT/OFFSET can be tricky with some drivers, sticking to direct injection for integers is safe here $query .= " LIMIT " . (int)$limit . " OFFSET " . (int)$offset; $stmt = $pdo->prepare($query); $stmt->execute($params); $data = $stmt->fetchAll(); return [ 'data' => $data, 'total_rows' => $total_rows, 'total_pages' => $total_pages, 'current_page' => $page, 'limit' => $limit ]; } /** * Render pagination controls and limit selector. * * @param array $pagination The result array from paginate_query. * @param array $extra_params Additional GET parameters to preserve. */ function render_pagination_controls($pagination, $extra_params = []) { $page = $pagination['current_page']; $total_pages = $pagination['total_pages']; $limit = $pagination['limit']; // Build query string for limit change $params = array_merge($_GET, $extra_params); unset($params['page']); // Reset page when limit changes // Limit Selector $limits = [20, 50, 100, -1]; echo '
'; echo '
'; // Preserve other GET params foreach ($params as $key => $val) { if ($key !== 'limit') echo ''; } echo 'Show:'; echo ''; echo '
'; // Pagination Links if ($total_pages > 1) { echo ''; } else { echo 'Total: ' . $pagination['total_rows'] . ''; } echo '
'; }