184 lines
10 KiB
PHP
184 lines
10 KiB
PHP
<?php
|
|
session_start();
|
|
require_once 'db/config.php';
|
|
|
|
// Fetch settings and redirect if in single coach mode
|
|
$settings_stmt = db()->query('SELECT * FROM settings');
|
|
$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR);
|
|
$coach_mode = $settings['coach_mode'] ?? 'multi';
|
|
$single_coach_id = $settings['single_coach_id'] ?? null;
|
|
|
|
if ($coach_mode === 'single' && !empty($single_coach_id)) {
|
|
header('Location: profile.php?id=' . $single_coach_id);
|
|
exit;
|
|
}
|
|
|
|
// Pagination
|
|
$limit = 6; // Number of coaches per page
|
|
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
|
|
$offset = ($page - 1) * $limit;
|
|
|
|
try {
|
|
// Get total number of coaches for pagination
|
|
$total_coaches_stmt = db()->query('SELECT count(*) FROM coaches');
|
|
$total_coaches = $total_coaches_stmt->fetchColumn();
|
|
$total_pages = ceil($total_coaches / $limit);
|
|
|
|
// Fetch coaches for the current page
|
|
$stmt = db()->prepare('SELECT id, name, specialties, bio, photo_url FROM coaches ORDER BY name ASC LIMIT :limit OFFSET :offset');
|
|
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
|
|
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
|
|
$stmt->execute();
|
|
$coaches = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
} catch (PDOException $e) {
|
|
// It's a good practice to log the error and show a user-friendly message
|
|
error_log($e->getMessage());
|
|
$coaches = [];
|
|
$total_pages = 0;
|
|
// For a real application, you might want to redirect to an error page
|
|
}
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Browse Coaches</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
<link rel="stylesheet" href="assets/css/custom.css">
|
|
</head>
|
|
<body class="bg-gray-100">
|
|
|
|
<!-- Header -->
|
|
<header class="bg-white shadow">
|
|
<nav class="container mx-auto px-6 py-3">
|
|
<div class="flex justify-between items-center">
|
|
<a href="index.php" class="text-2xl font-bold text-gray-800">Coaching Platform</a>
|
|
<div class="flex space-x-4">
|
|
<a href="index.php" class="text-gray-600 hover:text-blue-500">Home</a>
|
|
<?php if ($coach_mode === 'multi'): ?>
|
|
<a href="coaches.php" class="text-blue-500 font-semibold">Coaches</a>
|
|
<?php endif; ?>
|
|
<?php if (isset($_SESSION['user_id'])): ?>
|
|
<a href="dashboard.php" class="text-gray-600 hover:text-blue-500">Dashboard</a>
|
|
<a href="messages.php" class="text-gray-600 hover:text-blue-500">Messages</a>
|
|
<a href="logout.php" class="text-gray-600 hover:text-blue-500">Logout</a>
|
|
<?php else: ?>
|
|
<a href="login.php" class="text-gray-600 hover:text-blue-500">Login</a>
|
|
<a href="register-client.php" class="text-gray-600 hover:text-blue-500">Sign Up</a>
|
|
<a href="register-coach.php" class="text-gray-600 hover:text-blue-500">Become a Coach</a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
|
|
<!-- Main Content -->
|
|
<main class="container mx-auto px-6 py-12">
|
|
<h1 class="text-4xl font-bold text-center text-gray-800 mb-12">Meet Our Coaches</h1>
|
|
|
|
<?php if (!empty($coaches)): ?>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
<?php foreach ($coaches as $coach): ?>
|
|
<?php
|
|
$package_stmt = db()->prepare('SELECT * FROM service_packages WHERE coach_id = ?');
|
|
$package_stmt->execute([$coach['id']]);
|
|
$packages = $package_stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
?>
|
|
<div class="bg-white rounded-lg shadow-lg overflow-hidden">
|
|
<img class="w-full h-56 object-cover object-center" src="<?= htmlspecialchars($coach['photo_url'] ?: 'https://via.placeholder.com/400x300.png?text=No+Image') ?>" alt="<?= htmlspecialchars($coach['name']) ?>">
|
|
<div class="p-6">
|
|
<h2 class="text-2xl font-bold text-gray-800 mb-2"><?= htmlspecialchars($coach['name']) ?></h2>
|
|
<p class="text-sm text-blue-500 font-semibold mb-4"><?= htmlspecialchars($coach['specialties']) ?></p>
|
|
<?php if (!empty($coach['bio'])): ?>
|
|
<p class="text-gray-600 leading-relaxed mb-4"><?= htmlspecialchars(substr($coach['bio'], 0, 100)) ?>...</p>
|
|
<?php endif; ?>
|
|
<a href="profile.php?id=<?= $coach['id'] ?>" class="inline-block bg-blue-500 text-white font-bold py-2 px-4 rounded hover:bg-blue-600 transition duration-300">View Profile</a>
|
|
</div>
|
|
<?php if (!empty($packages)): ?>
|
|
<div class="p-6 border-t border-gray-200">
|
|
<h3 class="text-xl font-bold text-gray-800 mb-4">Coaching Packages</h3>
|
|
<div class="space-y-4">
|
|
<?php foreach ($packages as $package): ?>
|
|
<?php
|
|
$items_stmt = db()->prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN ("one_on_one", "group_session")');
|
|
$items_stmt->execute([$package['id']]);
|
|
$items_result = $items_stmt->fetch();
|
|
$total_sessions = $items_result['total_sessions'] ?? 0;
|
|
?>
|
|
<div class="border rounded-lg p-4">
|
|
<h4 class="font-bold text-lg"><?= htmlspecialchars($package['name']) ?></h4>
|
|
<p class="text-gray-600 text-sm mb-2"><?= htmlspecialchars($package['description']) ?></p>
|
|
<div class="flex justify-between items-center">
|
|
<div>
|
|
<span class="font-bold text-blue-600">
|
|
<?php if ($package['payment_type'] === 'one_time'): ?>
|
|
$<?= htmlspecialchars(number_format($package['price'], 2)) ?>
|
|
<?php else: ?>
|
|
$<?= htmlspecialchars(number_format($package['price'], 2)) ?> / <?= htmlspecialchars($package['payment_plan_interval']) ?> for <?= htmlspecialchars($package['payment_plan_installments']) ?> installments
|
|
<?php endif; ?>
|
|
</span>
|
|
<?php if ($total_sessions > 0): ?>
|
|
<span class="text-gray-600 text-sm">for <?= htmlspecialchars($total_sessions) ?> sessions</span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<a href="purchase-package.php?package_id=<?= $package['id'] ?>" class="inline-block bg-green-500 text-white font-bold py-2 px-4 rounded hover:bg-green-600 transition duration-300">Purchase</a>
|
|
<a href="purchase-gift.php?package_id=<?= $package['id'] ?>" class="inline-block bg-blue-500 text-white font-bold py-2 px-4 rounded hover:bg-blue-600 transition duration-300 ml-2">Purchase as Gift</a>
|
|
|
|
</div>
|
|
<div class="text-sm text-gray-500 mt-2">
|
|
<span>Type: <?= htmlspecialchars(ucfirst(str_replace('_', ' ', $package['type']))) ?></span>
|
|
<?php if($package['client_limit']): ?>
|
|
| <span>Client Limit: <?= htmlspecialchars($package['client_limit']) ?></span>
|
|
<?php endif; ?>
|
|
<?php if($package['start_date']): ?>
|
|
| <span>Starts: <?= htmlspecialchars(date('M j, Y', strtotime($package['start_date']))) ?></span>
|
|
<?php endif; ?>
|
|
<?php if($package['end_date']): ?>
|
|
| <span>Ends: <?= htmlspecialchars(date('M j, Y', strtotime($package['end_date']))) ?></span>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<!-- Pagination -->
|
|
<div class="mt-12 flex justify-center">
|
|
<nav class="flex rounded-md shadow">
|
|
<?php if ($page > 1): ?>
|
|
<a href="?page=<?= $page - 1 ?>" class="px-4 py-2 text-gray-700 bg-white rounded-l-md hover:bg-gray-50">Previous</a>
|
|
<?php endif; ?>
|
|
|
|
<?php for ($i = 1; $i <= $total_pages; $i++): ?>
|
|
<a href="?page=<?= $i ?>" class="px-4 py-2 <?= $i == $page ? 'text-white bg-blue-500' : 'text-gray-700 bg-white' ?> hover:bg-gray-50"><?= $i ?></a>
|
|
<?php endfor; ?>
|
|
|
|
<?php if ($page < $total_pages): ?>
|
|
<a href="?page=<?= $page + 1 ?>" class="px-4 py-2 text-gray-700 bg-white rounded-r-md hover:bg-gray-50">Next</a>
|
|
<?php endif; ?>
|
|
</nav>
|
|
</div>
|
|
|
|
<?php else: ?>
|
|
<div class="text-center">
|
|
<p class="text-xl text-gray-600">No coaches found.</p>
|
|
</div>
|
|
<?php endif; ?>
|
|
</main>
|
|
|
|
<!-- Footer -->
|
|
<footer class="bg-gray-800 text-white py-8">
|
|
<div class="container mx-auto px-6 text-center">
|
|
<p>© <?= date("Y") ?> Coaching Platform. All rights reserved.</p>
|
|
</div>
|
|
</footer>
|
|
|
|
</body>
|
|
</html>
|