👤 People
ðŸ˜
$pageID = 'people'; ?> include $_SERVER['DOCUMENT_ROOT'] . '/../includes/db-connection.php'; ?> // Get filters from query parameters $current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1; $personality_filters = isset($_GET['personality']) && is_array($_GET['personality']) ? $_GET['personality'] : []; $match_all = isset($_GET['match_type']) ? $_GET['match_type'] === 'all' : false; // Default to "match any" // Initialize role filter variables $reader_filter = isset($_GET['reader']) ? true : false; $author_filter = isset($_GET['author']) ? true : false; // Initialize name filter variable $name_filter = isset($_GET['name']) ? trim(htmlspecialchars($_GET['name'])) : ''; // Sanitize personality filters $personality_filters = array_map('htmlspecialchars', $personality_filters); $items_per_page = 20; $offset = ($current_page - 1) * $items_per_page; // Get total people count and filtered people $pdo = getDbConnection(); $reader_count = $pdo->query("SELECT COUNT(*) FROM people WHERE is_reader = 1")->fetchColumn(); $author_count = $pdo->query("SELECT COUNT(*) FROM people WHERE is_author = 1")->fetchColumn(); // Build the query with filters $query = 'SELECT DISTINCT p.id, p.name, p.slug, p.image FROM people p'; $params = []; // Initialize params array // Handle personality filters based on match type if (!empty($personality_filters)) { if ($match_all) { // Match ALL personalities (using JOINs) foreach ($personality_filters as $index => $personality) { $join_alias = "pp{$index}"; $pers_alias = "pers{$index}"; $query .= " JOIN person_personality {$join_alias} ON p.id = {$join_alias}.person_id JOIN personalities {$pers_alias} ON {$join_alias}.personality_id = {$pers_alias}.id AND {$pers_alias}.slug = ?"; $params[] = $personality; } } else { // Match ANY personalities (using EXISTS) $query .= " JOIN person_personality pp ON p.id = pp.person_id JOIN personalities pers ON pp.personality_id = pers.id AND pers.slug IN (" . implode(',', array_fill(0, count($personality_filters), '?')) . ")"; $params = array_merge($params, $personality_filters); } } $query .= ' WHERE 1=1'; // Handle role filters based on match type $role_conditions = []; if ($match_all) { // For "match all", add individual conditions if ($reader_filter) { $role_conditions[] = 'p.is_reader = 1'; } if ($author_filter) { $role_conditions[] = 'p.is_author = 1'; } if (!empty($role_conditions)) { $query .= ' AND ' . implode(' AND ', $role_conditions); } } else { // For "match any", OR the conditions $any_role_conditions = []; if ($reader_filter) { $any_role_conditions[] = 'p.is_reader = 1'; } if ($author_filter) { $any_role_conditions[] = 'p.is_author = 1'; } if (!empty($any_role_conditions)) { $query .= ' AND (' . implode(' OR ', $any_role_conditions) . ')'; } } // Handle name filter if (!empty($name_filter)) { $name_words = array_filter(array_map('trim', explode(' ', $name_filter))); if (!empty($name_words)) { $name_conditions = []; foreach ($name_words as $word) { $name_conditions[] = 'LOWER(TRIM(p.name)) LIKE LOWER(?)'; $params[] = '%' . $word . '%'; } $query .= ' AND (' . implode(' OR ', $name_conditions) . ')'; } } // Get total count $count_query = str_replace('SELECT DISTINCT p.id, p.name, p.slug, p.image', 'SELECT COUNT(DISTINCT p.id)', $query); $stmt = $pdo->prepare($count_query); $stmt->execute($params); $total_people = $stmt->fetchColumn(); $total_pages = ceil($total_people / $items_per_page); // Get people for current page $query .= ' ORDER BY p.name ASC LIMIT ? OFFSET ?'; $params[] = $items_per_page; $params[] = $offset; $stmt = $pdo->prepare($query); $stmt->execute($params); $people = $stmt->fetchAll(PDO::FETCH_ASSOC); $query = "SELECT p.personality, p.slug, COUNT(DISTINCT pp.person_id) as people_count FROM personalities p LEFT JOIN person_personality pp ON p.id = pp.personality_id GROUP BY p.id, p.personality, p.slug ORDER BY p.personality ASC"; $personalities = $pdo->query($query)->fetchAll(PDO::FETCH_ASSOC); // Function to build pagination URL with current filters function buildPaginationUrl($page) { $params = $_GET; $params['page'] = $page; return '?' . http_build_query($params); } // Check if there are active filters $has_active_filters = $match_all || $reader_filter || $author_filter || !empty($personality_filters) || !empty($name_filter); // Function to get personality names from slugs function getPersonalityNames($slugs, $personalities) { $names = []; foreach ($slugs as $slug) { foreach ($personalities as $personality) { if ($personality['slug'] === $slug) { $names[] = $personality['personality']; break; } } } return $names; } // Build filter summary text $filter_summary = []; if ($match_all || (!$reader_filter && !$author_filter && !empty($personality_filters))) { $filter_summary[] = 'Match ' . ($match_all ? 'ALL' : 'ANY') . ' criteria'; } if ($reader_filter) { $filter_summary[] = 'Have read books'; } if ($author_filter) { $filter_summary[] = 'Have authored books'; } if (!empty($personality_filters)) { $personality_names = getPersonalityNames($personality_filters, $personalities); $filter_summary = array_merge($filter_summary, $personality_names); } if (!empty($name_filter)) { $filter_summary[] = 'Name contains "' . $name_filter . '"'; } ?> include $_SERVER['DOCUMENT_ROOT'] . '/../includes/global.php'; ?>
include $_SERVER['DOCUMENT_ROOT'] . '/../includes/analytics.php'; ?> # START - Head code ?>ðŸ˜