Compare commits

5 Commits

17 changed files with 657 additions and 316 deletions
+29
View File
@@ -83,3 +83,32 @@ Dans notre fonction ajouter(), nous avons besoin de faire deux actions :
Charger un outil (helper) pour gérer les liens web. L'outil s'appelle 'url' et la commande à utiliser est helper().
Charger l'interface visuelle (vue) qui contiendra le formulaire. Nous allons l'appeler 'formulaire_ajout_vue' et la commande est view().
En utilisant la syntaxe $this->load->..., comment écrirais-tu ces deux lignes complètes à l'intérieur de ta fonction ajouter() ?
## Séance 4 - Finalisation et Intégration du Projet (Front & Back)
**Objectif de la séance :** Terminer l'architecture MVC, finaliser les filtres de tri (, lier le travail de nous deux et corriger les bugs de fusion (merge) pour rendre le site 100 % fonctionnel.
**Travail de Tajeddine :**
* Création des vues publiques de l'application : Accueil, listes de jeux filtrées, résultats de recherche et fiche détaillée.
* Création des contrôleurs associés (`Home`, `Category`, `Genre`, `Game`).
* Implémentation du moteur de recherche par mots-clés.
* Mise en place des modèles de base pour les catégories et les genres.
**Travail d'Ibrahim (:**
* suppression de tout le HTML dans les contrôleurs
* Tri (par Titre et Année) et création de la vue d'administration (`liste_jeux_vue.php`) incluant les boutons d'ajout, de modification et de suppression.
* **Débogage global du projet suite à la fusion :**
* Activation de la base de données dans `$autoload['libraries']` pour éviter les plantages sur les pages publiques.
* Alignement des modèles (`Game_model`, `Category_model`, `Genre_model`) et des vues avec la réalité de la base de données MariaDB (correction des clés primaires `gameId` en `id`, et des colonnes `title` en `name`, `year` en `releaseYear`).
* Résolution du problème d'affichage des images stockées au format `mediumblob` en utilisant un encodage natif PHP (`base64_encode`).
**Difficultés rencontrées :** * Énormément d'erreurs PHP ("Undefined array key") et SQL ("Erreur 1054 : Colonne inconnue") apparues après la fusion des codes, causées par des différences entre le nom des variables et le schéma réel de la base de données.
* Difficulté à afficher l'image (Poster) du jeu
**Usage de l'IA (Séance 4) :**
* **Prompts utilisés :** Envoi des logs d'erreurs CodeIgniter (`Undefined array key`, `Call to undefined method`), requêtes SQL en erreur (Erreur 1054), et questions sur l'affichage d'une image BLOB en HTML.
* **Extraits de réponse jugés utiles :** * L'IA m'a expliqué que la connexion à la BDD n'était pas persistante d'une page à l'autre sans l'Autoload.
* L'IA m'a fourni la syntaxe HTML/PHP exacte (`<img src="data:image/jpeg;base64,...">`) pour afficher notre format d'image.
View File
@@ -58,7 +58,7 @@ $autoload['packages'] = array();
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array();
$autoload['libraries'] = array('database');
/*
| -------------------------------------------------------------------
@@ -8,22 +8,10 @@ class Category extends CI_Controller {
redirect('home');
}
// 1. Charger les modèles nécessaires
$this->load->model('Game_model');
$this->load->model('Category_model');
// 2. Récupérer les infos de la catégorie pour afficher son nom
$this->db->where('categoryId', $id);
$data['category'] = $this->db->get('category')->row_array();
if (empty($data['category'])) {
show_404();
}
// 3. Récupérer tous les jeux de cette catégorie
$data['games'] = $this->Game_model->get_by_category($id);
// 4. Envoyer le tout à une nouvelle vue
$this->load->view('games_list_view', $data);
}
}
@@ -9,17 +9,9 @@ class Genre extends CI_Controller {
}
$this->load->model('Game_model');
$this->load->model('Genre_model');
$this->db->where('genreId', $id);
$data['genre'] = $this->db->get('genre')->row_array();
if (empty($data['genre'])) {
show_404();
}
$data['games'] = $this->Game_model->get_by_genre($id);
$this->load->view('games_list_view', $data);
$this->load->view('genre_games_list_view', $data);
}
}
@@ -3,71 +3,43 @@ defined('BASEPATH') OR exit('No direct script access allowed');
class Jeux extends CI_Controller {
public function ajouter(){
$this->load->helper('url');
$this->load->helper('form');
$this->load->view("formulaire_ajout");
public function ajouter() {
$this->load->helper(array('url', 'form'));
$this->load->model('Category_model');
$this->load->model('Genre_model');
$donnees['categories'] = $this->Category_model->get_all();
$donnees['genres'] = $this->Genre_model->get_all();
$this->load->view("formulaire_ajout", $donnees);
}
public function sauvegarder() {
$this->load->helper('url');
$titre = $this->input->post('titre');
$annee = $this->input->post('annee');
$description = $this->input->post('description');
$prix = $this->input->post('prix');
$titre = $this->input->post('name');
$annee = $this->input->post('releaseYear');
$description = $this->input->post('shortDescription');
$prix = $this->input->post('price');
$developer_name = $this->input->post('developer_name');
$categories = $this->input->post('categories');
$genres = $this->input->post('genres');
$jpeg_data = NULL;
if (!empty($_FILES['poster']['tmp_name'])) {
$jpeg_data = file_get_contents($_FILES['poster']['tmp_name']);
}
$this->load->model('Game_model');
$insertion_reussie = $this->Game_model->ajouter_jeu($titre, $annee, $description, $prix);
$insertion_reussie = $this->Game_model->ajouter_jeu($titre, $annee, $description, $prix, $developer_name, $categories, $genres, $jpeg_data);
if ($insertion_reussie) {
$donnees['titre_message'] = "Succès !";
$donnees['contenu_message'] = "Le jeu " . html_escape($titre) . " a bien été ajouté à la base de données.";
$donnees['lien_retour'] = 'jeux/ajouter';
$donnees['contenu_message'] = "Le jeu a bien été ajouté à la base de données avec toutes ses informations.";
$donnees['lien_retour'] = 'jeux/lister';
} else {
$donnees['titre_message'] = "Erreur";
$donnees['contenu_message'] = "impossible d'ajouter le jeu.";
$donnees['lien_retour'] = 'jeux/ajouter';
}
$this->load->view('message_vue', $donnees);
}
public function mettre_a_jour($id) {
$titre = $this->input->post('titre');
$annee = $this->input->post('annee');
$description = $this->input->post('description');
$prix = $this->input->post('prix');
$this->load->model('Game_model');
$succes = $this->Game_model->modifier_jeu($id, $titre, $annee, $description, $prix);
if ($succes) {
$donnees['titre_message'] = "Succès !";
$donnees['contenu_message'] = "Le jeu " . html_escape($titre) . " a bien été modifié.";
$donnees['lien_retour'] = 'jeux/modifier/' . $id;
} else {
$donnees['titre_message'] = "Erreur";
$donnees['contenu_message'] = "Erreur lors de la modification du jeu.";
$donnees['lien_retour'] = 'jeux/modifier/' . $id;
}
$this->load->view('message_vue', $donnees);
}
public function supprimer($id) {
$this->load->model('Game_model');
$succes = $this->Game_model->supprimer_jeu($id);
if ($succes) {
$donnees['titre_message'] = "Succès !";
$donnees['contenu_message'] = "Le jeu numéro " . $id . " a bien été supprimé de la base de données.";
$donnees['lien_retour'] = 'jeux/ajouter';
} else {
$donnees['titre_message'] = "Erreur";
$donnees['contenu_message'] = "Aïe, impossible de supprimer le jeu.";
$donnees['contenu_message'] = "Impossible d'ajouter le jeu.";
$donnees['lien_retour'] = 'jeux/ajouter';
}
@@ -75,24 +47,69 @@ class Jeux extends CI_Controller {
}
public function modifier($id) {
$this->load->helper(array('url', 'form'));
$this->load->model('Game_model');
$this->load->model('Category_model');
$this->load->model('Genre_model');
$donnees['jeu'] = $this->Game_model->get_jeu($id);
$donnees['jeu'] = $this->Game_model->get_by_id($id);
if (empty($donnees['jeu'])) { show_404(); }
if (empty($donnees['jeu'])) {
show_404();
}
$donnees['categories'] = $this->Category_model->get_all();
$donnees['genres'] = $this->Genre_model->get_all();
$donnees['jeu_categories'] = array_column($this->Category_model->get_by_game($id), 'id');
$donnees['jeu_genres'] = array_column($this->Genre_model->get_by_game($id), 'id');
$this->load->view('formulaire_ajout', $donnees);
}
public function lister($tri = 'name') {
public function mettre_a_jour($id) {
$this->load->helper('url');
$titre = $this->input->post('name');
$annee = $this->input->post('releaseYear');
$description = $this->input->post('shortDescription');
$prix = $this->input->post('price');
$developer_name = $this->input->post('developer_name');
$categories = $this->input->post('categories');
$genres = $this->input->post('genres');
$this->load->model('Game_model');
$succes = $this->Game_model->modifier_jeu($id, $titre, $annee, $description, $prix, $developer_name, $categories, $genres);
$donnees['jeux'] = $this->Game_model->get_tous_les_jeux($tri);
if ($succes) {
$donnees['titre_message'] = "Succès !";
$donnees['contenu_message'] = "Le jeu a bien été mis à jour.";
$donnees['lien_retour'] = 'jeux/lister';
} else {
$donnees['titre_message'] = "Erreur";
$donnees['contenu_message'] = "Erreur lors de la modification.";
$donnees['lien_retour'] = 'jeux/modifier/' . $id;
}
$this->load->view('liste_jeux_vue', $donnees);
$this->load->view('message_vue', $donnees);
}
public function supprimer($id) {
$this->load->model('Game_model');
$succes = $this->Game_model->supprimer_jeu($id);
if ($succes) {
$donnees['titre_message'] = "Succès !";
$donnees['contenu_message'] = "Le jeu a bien été supprimé.";
$donnees['lien_retour'] = 'jeux/lister';
} else {
$donnees['titre_message'] = "Erreur";
$donnees['contenu_message'] = "Impossible de supprimer le jeu.";
$donnees['lien_retour'] = 'jeux/lister';
}
$this->load->view('message_vue', $donnees);
}
public function lister($tri = 'name') {
$this->load->model('Game_model');
$donnees['jeux'] = $this->Game_model->get_tous_les_jeux($tri);
$this->load->view('liste_jeux_vue', $donnees);
}
}
@@ -8,27 +8,20 @@ class Category_model extends CI_Model {
$this->load->database();
}
/**
* Récupère toutes les catégories de la base de données
*/
public function get_all() {
$query = $this->db->get('category');
return $query->result_array();
}
public function get_by_game($game_id) {
$this->db->select('category.*');
$this->db->from('category');
public function get_by_game($game_id) {
$this->db->select('category.*');
$this->db->from('category');
$this->db->join('game_category', 'game_category.categoryId = category.id');
$this->db->join('game_category', 'game_category.categoryId = category.categoryId');
$this->db->where('game_category.gameId', $game_id);
$query = $this->db->get();
return $query->result_array();
}
$this->db->where('game_category.gameId', $game_id);
$query = $this->db->get();
return $query->result_array();
}
}
@@ -1,123 +1,145 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Game_model extends CI_Model {
public function search_by_title($keyword) {
$this->db->select('*');
$this->db->from('game');
$this->db->like('name', $keyword);
$query = $this->db->get('game');
return $query->result();
$query = $this->db->get();
return $query->result_array();
}
}
/**
* Récupère les jeux appartenant à une catégorie spécifique
*/
public function get_by_category($category_id) {
$this->db->select('game.*');
$this->db->from('game');
$this->db->join('game_category', 'game_category.gameId = game.gameId');
$this->db->join('game_category', 'game_category.gameId = game.id');
$this->db->where('game_category.categoryId', $category_id);
$query = $this->db->get();
return $query->result_array();
}
/**
* Récupère les jeux appartenant à un genre spécifique
*/
public function get_by_genre($genre_id) {
$this->db->select('game.*');
$this->db->from('game');
$this->db->join('game_genre', 'game_genre.gameId = game.gameId');
$this->db->join('game_genre', 'game_genre.gameId = game.id');
$this->db->where('game_genre.genreId', $genre_id);
$query = $this->db->get();
return $query->result_array();
}
/**
* Récupère les détails complets d'un jeu (avec développeur et poster)
*/
public function get_by_id($game_id) {
public function get_by_id($game_id) {
$this->db->select('game.*, developer.name as developer_name, poster.jpeg as poster_url');
$this->db->from('game');
$this->db->join('developer', 'developer.id = game.developerId', 'left');
$this->db->join('poster', 'poster.id = game.posterId', 'left');
$this->db->where('game.id', $game_id);
$query = $this->db->get();
return $query->row_array();
}
$this->db->select('game.*, developer.name as developer_name, poster.url as poster_url');
$this->db->from('game');
$this->db->join('developer', 'developer.developerId = game.developerId', 'left');
public function ajouter_jeu($titre, $annee, $description, $prix, $developer_name = null, $categories = [], $genres = [], $jpeg_data = null) {
// 1. Gérer le développeur
$dev_id = NULL;
if (!empty($developer_name)) {
$dev = $this->db->get_where('developer', array('name' => $developer_name))->row_array();
if ($dev) {
$dev_id = $dev['id']; // Il existe déjà
} else {
$this->db->insert('developer', array('name' => $developer_name));
$dev_id = $this->db->insert_id(); // On le crée
}
}
$this->db->join('poster', 'poster.posterId = game.posterId', 'left');
$poster_id = NULL;
if (!empty($jpeg_data)) {
$this->db->insert('poster', array('jpeg' => $jpeg_data));
$poster_id = $this->db->insert_id();
}
$this->db->where('game.gameId', $game_id);
$query = $this->db->get();
return $query->row_array();
}
public function ajouter_jeu($titre, $annee, $description, $prix) {
$donnees = array(
'name' => $titre,
'releaseYear' => $annee,
'shortDescription' => $description,
'price' => empty($prix) ? NULL : $prix
'price' => empty($prix) ? NULL : $prix,
'developerId' => $dev_id,
'posterId' => $poster_id
);
return $this->db->insert('game', $donnees);
$this->db->insert('game', $donnees);
$game_id = $this->db->insert_id();
if (!empty($categories)) {
foreach ($categories as $cat_id) {
$this->db->insert('game_category', array('gameId' => $game_id, 'categoryId' => $cat_id));
}
}
if (!empty($genres)) {
foreach ($genres as $gen_id) {
$this->db->insert('game_genre', array('gameId' => $game_id, 'genreId' => $gen_id));
}
}
return true;
}
public function supprimer_jeu($id) {
return $this->db->delete('game', array('gameId' => $id));
}
public function get_jeu($id) {
$leJeu = $this->db->get_where('game', array('gameId' => $id));
return $leJeu->row_array();
}
public function modifier_jeu($id, $titre, $annee, $description, $prix, $developer_name = null, $categories = [], $genres = []) {
$dev_id = NULL;
if (!empty($developer_name)) {
$dev = $this->db->get_where('developer', array('name' => $developer_name))->row_array();
if ($dev) {
$dev_id = $dev['id'];
} else {
$this->db->insert('developer', array('name' => $developer_name));
$dev_id = $this->db->insert_id();
}
}
public function modifier_jeu($id, $titre, $annee, $description, $prix) {
$donnees = array(
'name' => $titre,
'releaseYear' => $annee,
'shortDescription' => $description,
'price' => empty($prix) ? NULL : $prix
'price' => empty($prix) ? NULL : $prix,
'developerId' => $dev_id
);
$this->db->where('id', $id);
$this->db->update('game', $donnees);
$this->db->where('gameId', $id);
return $this->db->update('game', $donnees);
$this->db->delete('game_category', array('gameId' => $id));
if (!empty($categories)) {
foreach ($categories as $cat_id) {
$this->db->insert('game_category', array('gameId' => $id, 'categoryId' => $cat_id));
}
}
$this->db->delete('game_genre', array('gameId' => $id));
if (!empty($genres)) {
foreach ($genres as $gen_id) {
$this->db->insert('game_genre', array('gameId' => $id, 'genreId' => $gen_id));
}
}
return true;
}
public function supprimer_jeu($id) {
return $this->db->delete('game', array('id' => $id));
}
public function get_tous_les_jeux($critere_tri = 'id') {
$tris_autorises = array('id', 'name', 'releaseYear', 'price');
if (!in_array($critere_tri, $tris_autorises)) {
$critere_tri = 'id';
}
$this->db->order_by($critere_tri, 'ASC');
$query = $this->db->get('game');
return $query->result_array();
}
public function search_by_title($keyword) {
$this->db->select('*');
$this->db->from('game');
$this->db->like('title', $keyword);
$query = $this->db->get();
return $query->result_array();
public function get_all_games() {
return $this->get_tous_les_jeux();
}
}
@@ -17,7 +17,7 @@ class Genre_model extends CI_Model {
$this->db->select('genre.*');
$this->db->from('genre');
$this->db->join('game_genre', 'game_genre.genreId = genre.genreId');
$this->db->join('game_genre', 'game_genre.genreId = genre.id');
$this->db->where('game_genre.gameId', $game_id);
@@ -1,37 +1,113 @@
<h2><?php echo isset($jeu) ? "Modifier le jeu" : "Ajouter un nouveau jeu"; ?></h2>
<?php
if (isset($jeu)) {
// Si modification, on envoie vers la fonction de mise à jour avec l'ID
echo form_open('jeux/mettre_a_jour/' . $jeu['id']);
} else {
// Si ajout, on garde l'ancienne action
echo form_open('jeux/sauvegarder');
}
$est_modification = isset($jeu);
$action_url = $est_modification ? site_url('jeux/mettre_a_jour/' . $jeu['id']) : site_url('jeux/sauvegarder');
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title><?= $est_modification ? 'Modifier le jeu' : 'Ajouter un nouveau jeu' ?></title>
<style>
/* === LE CSS POUR UN BEAU FORMULAIRE PROPRE === */
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 700px; margin: 40px auto; background: #fff; padding: 40px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
<p>
<label for="titre">Titre du jeu :</label>
<input type="text" name="titre" id="titre" value="<?php echo isset($jeu) ? html_escape($jeu['name']) : ''; ?>" required>
</p>
.back-link { display: inline-block; background: #ecf0f1; padding: 8px 15px; border-radius: 5px; color: #2c3e50; text-decoration: none; margin-bottom: 25px; font-weight: bold; transition: background 0.3s; }
.back-link:hover { background: #bdc3c7; }
<p>
<label for="annee">Année de sortie :</label>
<input type="number" name="annee" id="annee" value="<?php echo isset($jeu) ? html_escape($jeu['releaseYear']) : ''; ?>" required>
</p>
h2 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-bottom: 30px; margin-top: 0; }
h3 { color: #34495e; font-size: 18px; margin-top: 30px; border-bottom: 1px solid #eee; padding-bottom: 5px; }
<p>
<label for="description">Description courte :</label><br>
<textarea name="description" id="description" rows="4" cols="50" required><?php echo isset($jeu) ? html_escape($jeu['shortDescription']) : ''; ?></textarea>
</p>
.form-group { margin-bottom: 20px; }
.form-group label { display: block; margin-bottom: 8px; font-weight: 600; color: #34495e; }
.form-group input[type="text"],
.form-group input[type="number"],
.form-group textarea { width: 100%; padding: 12px; border: 1px solid #bdc3c7; border-radius: 4px; font-size: 16px; box-sizing: border-box; outline: none; font-family: inherit; transition: border-color 0.3s; }
.form-group input:focus, .form-group textarea:focus { border-color: #3498db; box-shadow: 0 0 5px rgba(52, 152, 219, 0.3); }
<p>
<label for="prix">Prix (en centimes) :</label>
<input type="number" name="prix" id="prix" value="<?php echo isset($jeu) ? html_escape($jeu['price']) : ''; ?>">
</p>
.checkbox-group { display: flex; flex-wrap: wrap; gap: 15px; margin-top: 15px; }
.checkbox-item { background: #f8f9fa; padding: 10px 15px; border-radius: 6px; border: 1px solid #e0e0e0; font-size: 14px; cursor: pointer; transition: background 0.2s; display: flex; align-items: center; gap: 8px; }
.checkbox-item:hover { background: #eef2f5; }
.checkbox-item input[type="checkbox"] { cursor: pointer; width: 16px; height: 16px; }
<p>
<button type="submit"><?php echo isset($jeu) ? "Mettre à jour" : "Enregistrer"; ?></button>
</p>
.btn-submit { display: block; background-color: #2ecc71; color: white; padding: 15px 25px; border: none; border-radius: 5px; font-size: 18px; font-weight: bold; cursor: pointer; transition: background 0.3s; width: 100%; margin-top: 40px; text-align: center; }
.btn-submit:hover { background-color: #27ae60; }
</form>
.info-text { color: #7f8c8d; font-size: 13px; font-style: italic; margin-top: 5px; display: block; }
</style>
</head>
<body>
<div class="container">
<a href="<?= site_url('jeux/lister') ?>" class="back-link">⬅ Retour à la liste des jeux</a>
<h2><?= $est_modification ? '✏️ Modifier le jeu' : '➕ Ajouter un nouveau jeu' ?></h2>
<form action="<?= $action_url ?>" method="POST" enctype="multipart/form-data">
<div class="form-group">
<label for="name">Nom du jeu :</label>
<input type="text" id="name" name="name" required value="<?= $est_modification ? html_escape($jeu['name']) : '' ?>" placeholder="Ex: Elden Ring">
</div>
<div class="form-group">
<label for="releaseYear">Année de sortie :</label>
<input type="number" id="releaseYear" name="releaseYear" required value="<?= $est_modification ? html_escape($jeu['releaseYear']) : '' ?>" placeholder="Ex: 2022">
</div>
<div class="form-group">
<label for="developer_name">Développeur :</label>
<input type="text" id="developer_name" name="developer_name" value="<?= $est_modification && !empty($jeu['developer_name']) ? html_escape($jeu['developer_name']) : '' ?>" placeholder="Ex: FromSoftware">
</div>
<div class="form-group">
<label for="price">Prix (en centimes) :</label>
<input type="number" id="price" name="price" value="<?= $est_modification ? html_escape($jeu['price']) : '' ?>" placeholder="Ex: 5999 (pour 59,99 €)">
</div>
<div class="form-group">
<label for="shortDescription">Description courte :</label>
<textarea id="shortDescription" name="shortDescription" rows="5" placeholder="Résumé du jeu..."><?= $est_modification ? html_escape($jeu['shortDescription']) : '' ?></textarea>
</div>
<?php if (!$est_modification): ?>
<div class="form-group">
<label for="poster">Image du jeu (Poster) :</label>
<input type="file" id="poster" name="poster" accept="image/jpeg, image/png">
<span class="info-text">L'image est facultative et ne peut être ajoutée qu'à la création du jeu.</span>
</div>
<?php endif; ?>
<h3>Catégories associées :</h3>
<div class="checkbox-group">
<?php foreach ($categories as $cat): ?>
<?php
$checked = ($est_modification && in_array($cat['id'], $jeu_categories)) ? 'checked' : '';
?>
<label class="checkbox-item">
<input type="checkbox" name="categories[]" value="<?= $cat['id'] ?>" <?= $checked ?>>
<?= html_escape($cat['description']) ?>
</label>
<?php endforeach; ?>
</div>
<h3>Genres associés :</h3>
<div class="checkbox-group">
<?php foreach ($genres as $gen): ?>
<?php
$checked = ($est_modification && in_array($gen['id'], $jeu_genres)) ? 'checked' : '';
?>
<label class="checkbox-item">
<input type="checkbox" name="genres[]" value="<?= $gen['id'] ?>" <?= $checked ?>>
<?= html_escape($gen['description']) ?>
</label>
<?php endforeach; ?>
</div>
<button type="submit" class="btn-submit"><?= $est_modification ? '💾 Mettre à jour le jeu' : '➕ Ajouter le jeu à la base' ?></button>
</form>
</div>
</body>
</html>
@@ -4,21 +4,52 @@
<meta charset="UTF-8">
<title>Détails du jeu - <?= html_escape($game['name']) ?></title>
<style>
.game-detail { display: flex; gap: 20px; margin-top: 20px; }
.game-info { max-width: 600px; }
.poster { max-width: 300px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 40px auto; background: #fff; padding: 40px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
.back-link { display: inline-block; background: #ecf0f1; padding: 8px 15px; border-radius: 5px; color: #2c3e50; text-decoration: none; margin-bottom: 20px; font-weight: bold; transition: background 0.3s; }
.back-link:hover { background: #bdc3c7; }
.game-header { display: flex; gap: 40px; margin-bottom: 30px; align-items: flex-start; flex-wrap: wrap; }
.game-poster { flex-shrink: 0; max-width: 300px; width: 100%; }
.game-poster img { width: 100%; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); object-fit: cover; }
.game-poster-empty { width: 100%; height: 350px; background: #ecf0f1; display: flex; align-items: center; justify-content: center; color: #7f8c8d; border-radius: 8px; text-align: center; padding: 20px; box-sizing: border-box; }
.game-info { flex: 1; min-width: 250px; }
h1 { color: #2c3e50; margin-top: 0; margin-bottom: 10px; font-size: 32px; }
h3 { color: #34495e; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-top: 30px; }
p { line-height: 1.6; }
.price-tag { display: inline-block; background: #e8f4fd; border: 1px solid #bde0fe; padding: 10px 20px; border-radius: 6px; font-size: 24px; font-weight: bold; color: #2ecc71; margin: 15px 0; }
.description-box { line-height: 1.6; color: #444; background: #f9f9f9; padding: 20px; border-left: 4px solid #3498db; border-radius: 4px; }
.lists-container { display: flex; gap: 40px; flex-wrap: wrap; margin-top: 20px; }
.list-section { flex: 1; min-width: 250px; }
ul { list-style: none; padding: 0; margin: 0; }
li { background: #f9f9f9; margin-bottom: 8px; padding: 12px 15px; border-radius: 5px; border-left: 4px solid #3498db; transition: transform 0.2s; }
li:hover { transform: translateX(5px); background: #f1f1f1; }
li a { color: #2c3e50; font-weight: bold; text-decoration: none; display: block; }
li a:hover { color: #3498db; }
li.empty-list { background: transparent; border: none; padding: 0; color: #7f8c8d; font-style: italic; }
li.empty-list:hover { transform: none; background: transparent; }
</style>
</head>
<body>
<a href="<?= site_url('home') ?>">⬅ Retour à l'accueil</a>
<div class="game-detail">
<div>
<div class="container">
<a href="<?= site_url('home') ?>" class="back-link">⬅ Retour à l'accueil</a>
<div class="game-header">
<div class="game-poster">
<?php if (!empty($game['poster_url'])): ?>
<img src="<?= base_url('assets/uploads/' . html_escape($game['poster_url'])) ?>" alt="Poster de <?= html_escape($game['name']) ?>" class="poster">
<img src="data:image/jpeg;base64,<?= base64_encode($game['poster_url']) ?>" alt="Poster de <?= html_escape($game['name']) ?>">
<?php else: ?>
<div class="poster" style="background:#eee; padding:50px; text-align:center;">
Aucun poster disponible
<div class="game-poster-empty">
<p>Aucun poster disponible pour ce jeu.</p>
</div>
<?php endif; ?>
</div>
@@ -26,39 +57,57 @@
<div class="game-info">
<h1><?= html_escape($game['name']) ?> (<?= html_escape($game['releaseYear']) ?>)</h1>
<p><strong>Développeur :</strong> <?= !empty($game['developer_name']) ? html_escape($game['developer_name']) : 'Inconnu' ?></p>
<p style="font-size: 18px; color: #7f8c8d;">
<strong>Développeur :</strong> <?= !empty($game['developer_name']) ? html_escape($game['developer_name']) : 'Inconnu' ?>
</p>
<p><strong>Prix :</strong> <?= !empty($game['price']) ? html_escape($game['price']) . ' €' : 'Non renseigné' ?></p>
<div class="price-tag">
<?= !empty($game['price']) ? number_format($game['price'] / 100, 2, ',', ' ') . ' €' : 'Gratuit / Non renseigné' ?>
</div>
<h3>Description :</h3>
<p><?= nl2br(html_escape($game['shortDescription'])) ?></p>
<h3>Description</h3>
<div class="description-box">
<?= nl2br(html_escape($game['shortDescription'])) ?>
</div>
</div>
</div>
<h3>Catégories associées :</h3>
<p>
<div class="lists-container">
<div class="list-section">
<h3>Catégories associées</h3>
<ul>
<?php if (!empty($categories)): ?>
<?php foreach ($categories as $cat): ?>
<a href="<?= site_url('category/view/' . $cat['categoryId']) ?>" style="margin-right: 10px; background: #e0e0e0; padding: 5px 10px; border-radius: 3px; text-decoration: none; color: #333;">
<?= html_escape($cat['name']) ?>
</a>
<li>
<a href="<?= site_url('category/view/' . $cat['id']) ?>">
<?= html_escape($cat['description']) ?>
</a>
</li>
<?php endforeach; ?>
<?php else: ?>
Aucune catégorie pour ce jeu.
<li class="empty-list">Aucune catégorie pour ce jeu.</li>
<?php endif; ?>
</p>
</ul>
</div>
<h3>Genres associés :</h3>
<p>
<div class="list-section">
<h3>Genres associés</h3>
<ul>
<?php if (!empty($genres)): ?>
<?php foreach ($genres as $gen): ?>
<a href="<?= site_url('genre/view/' . $gen['genreId']) ?>" style="margin-right: 10px; background: #d0e0fc; padding: 5px 10px; border-radius: 3px; text-decoration: none; color: #1a4ba8;">
<?= html_escape($gen['name']) ?>
</a>
<li>
<a href="<?= site_url('genre/view/' . $gen['id']) ?>">
<?= html_escape($gen['description']) ?>
</a>
</li>
<?php endforeach; ?>
<?php else: ?>
Aucun genre pour ce jeu.
<li class="empty-list">Aucun genre pour ce jeu.</li>
<?php endif; ?>
</p>
</ul>
</div>
</div>
</div>
</div> </div>
</body>
</html>
@@ -3,14 +3,30 @@
<head>
<meta charset="UTF-8">
<title>Liste des jeux</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
h1 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-bottom: 20px; }
a { color: #3498db; text-decoration: none; }
a:hover { text-decoration: underline; }
ul { list-style: none; padding: 0; }
li { background: #f9f9f9; margin-bottom: 10px; padding: 15px; border-radius: 5px; border-left: 4px solid #3498db; transition: transform 0.2s; display: flex; justify-content: space-between; align-items: center; }
li:hover { transform: translateX(5px); background: #f1f1f1; }
li a { font-weight: bold; color: #2c3e50; text-decoration: none; }
li a:hover { color: #3498db; }
.price-tag { background: #2ecc71; color: white; padding: 4px 10px; border-radius: 4px; font-weight: bold; font-size: 14px; }
.empty-msg { color: #7f8c8d; font-style: italic; }
</style>
</head>
<body>
<a href="<?= site_url('home') ?>">Retour à l'accueil</a>
<div class="container">
<p><a href="<?= site_url('home') ?>">⬅ Retour à l'accueil</a></p>
<?php if (isset($category)): ?>
<h1>Jeux de la catégorie : <?= html_escape($category['name']) ?></h1>
<h1>Jeux de la catégorie : <?= html_escape($category['description']) ?></h1>
<?php elseif (isset($genre)): ?>
<h1>Jeux du genre : <?= html_escape($genre['name']) ?></h1>
<h1>Jeux du genre : <?= html_escape($genre['description']) ?></h1>
<?php else: ?>
<h1>Liste des jeux</h1>
<?php endif; ?>
@@ -19,14 +35,22 @@
<?php if (!empty($games)): ?>
<?php foreach ($games as $game): ?>
<li>
<a href="<?= site_url('game/detail/' . $game['gameId']) ?>">
<?= html_escape($game['name']) ?> (<?= html_escape($game['releaseYear']) ?>)
<a href="<?= site_url('game/detail/' . $game['id']) ?>">
<?= html_escape($game['name']) ?> <span style="color: #7f8c8d; font-weight: normal;">(<?= html_escape($game['releaseYear']) ?>)</span>
</a>
<?php if (isset($game['prix'])): ?>
<span class="price-tag"><?= number_format($game['prix'] / 100, 2, ',', ' ') ?> €</span>
<?php elseif (isset($game['price'])): ?>
<span class="price-tag"><?= number_format($game['price'] / 100, 2, ',', ' ') ?> €</span>
<?php endif; ?>
</li>
<?php endforeach; ?>
<?php else: ?>
<p>Aucun jeu trouvé pour cette sélection.</p>
<p class="empty-msg">Aucun jeu trouvé pour cette sélection.</p>
<?php endif; ?>
</ul>
</div>
</body>
</html>
@@ -2,28 +2,47 @@
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Jeux du genre <?php echo html_escape($genre['name']); ?></title>
<title>Jeux du genre <?php echo isset($genre) ? html_escape($genre['description']) : ''; ?></title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
h1 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-bottom: 20px; }
a { color: #3498db; text-decoration: none; }
a:hover { text-decoration: underline; }
ul { list-style: none; padding: 0; }
li { background: #f9f9f9; margin-bottom: 10px; padding: 15px; border-radius: 5px; border-left: 4px solid #3498db; transition: transform 0.2s; display: flex; justify-content: space-between; align-items: center; }
li:hover { transform: translateX(5px); background: #f1f1f1; }
li a { font-weight: bold; color: #2c3e50; text-decoration: none; }
li a:hover { color: #3498db; }
.price-tag { background: #2ecc71; color: white; padding: 4px 10px; border-radius: 4px; font-weight: bold; font-size: 14px; }
.empty-msg { color: #7f8c8d; font-style: italic; }
</style>
</head>
<body>
<p><a href="<?php echo site_url('home'); ?>">← Retour à l'accueil</a></p>
<div class="container">
<p><a href="<?= site_url('home') ?>">⬅ Retour à l'accueil</a></p>
<h1>Jeux du genre : "<?php echo html_escape($genre['name']); ?>"</h1>
<h1>Jeux du genre <?= isset($genre) ? ' : ' . html_escape($genre['description']) : '' ?></h1>
<?php if (empty($games)): ?>
<p>Aucun jeu trouvé pour ce genre pour le moment.</p>
<p class="empty-msg">Aucun jeu trouvé pour ce genre pour le moment.</p>
<?php else: ?>
<ul>
<?php foreach ($games as $game): ?>
<li>
<a href="<?php echo site_url('game/detail/' . $game['gameId']); ?>">
<strong><?php echo html_escape($game['title']); ?></strong>
</a>
(<?php echo html_escape($game['year']); ?>)
</li>
<?php endforeach; ?>
<?php foreach ($games as $game): ?>
<li>
<a href="<?= site_url('game/detail/' . $game['id']) ?>">
<?= html_escape($game['name']) ?> <span style="color: #7f8c8d; font-weight: normal;">(<?= html_escape($game['releaseYear']) ?>)</span>
</a>
<?php if (isset($game['price'])): ?>
<span class="price-tag"><?= number_format($game['price'] / 100, 2, ',', ' ') ?> €</span>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
</body>
</html>
@@ -3,46 +3,75 @@
<head>
<meta charset="UTF-8">
<title>Univers Jeux Vidéo - Accueil</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
h1 { color: #2c3e50; text-align: center; margin-bottom: 30px; }
h2 { color: #34495e; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-bottom: 20px; }
a { color: #3498db; text-decoration: none; font-weight: 500; }
a:hover { color: #2980b9; text-decoration: underline; }
.admin-link { display: inline-block; background-color: #2ecc71; color: white; padding: 10px 15px; border-radius: 5px; text-decoration: none; font-weight: bold; margin-bottom: 20px; transition: 0.3s; }
.admin-link:hover { background-color: #27ae60; text-decoration: none; }
.search-section { background: #ecf0f1; padding: 25px; border-radius: 8px; margin-bottom: 40px; text-align: center; }
.search-section input[type="text"] { padding: 10px 15px; width: 60%; max-width: 400px; border: 1px solid #bdc3c7; border-radius: 4px; font-size: 16px; outline: none; }
.search-section input[type="text"]:focus { border-color: #3498db; }
.search-section button { padding: 10px 20px; background-color: #3498db; color: white; border: none; border-radius: 4px; font-size: 16px; cursor: pointer; transition: background 0.3s; margin-left: 10px; }
.search-section button:hover { background-color: #2980b9; }
.flex-container { display: flex; gap: 40px; }
.flex-child { flex: 1; }
ul { list-style: none; padding: 0; margin: 0; }
li { background: #f9f9f9; margin-bottom: 10px; padding: 12px 15px; border-radius: 5px; border-left: 4px solid #3498db; transition: transform 0.2s, background 0.2s; }
li:hover { transform: translateX(5px); background: #f1f1f1; }
</style>
</head>
<body>
<div class="container">
<a href="<?php echo site_url('jeux/lister'); ?>" class="admin-link">
🛠 Administration (Gestion des jeux)
</a>
<h1>Bienvenue sur l'application Jeux Vidéo</h1>
<main style="display: flex; gap: 50px;">
<section style="margin-bottom: 30px; background: #f4f4f4; padding: 15px; border-radius: 5px;">
<h2>Rechercher un jeu vidéo</h2>
<form action="<?php echo site_url('home/search'); ?>" method="GET">
<input type="text" name="keyword" placeholder="Ex: Zelda, Mario..." required style="padding: 8px; width: 250px;">
<button type="submit" style="padding: 8px 15px;">Rechercher</button>
</form>
</section>
<section class="search-section">
<h2 style="border:none; text-align:center; margin-top:0;">Rechercher un jeu vidéo</h2>
<form action="<?php echo site_url('home/search'); ?>" method="GET">
<input type="text" name="keyword" placeholder="Ex: Zelda, Mario..." required>
<button type="submit">Rechercher</button>
</form>
</section>
<section>
<h2>Nos Catégories</h2>
<ul>
<?php foreach ($categories as $category): ?>
<li>
<a href="<?php echo site_url('category/view/' . $category['categoryId']); ?>">
<?php echo html_escape($category['name']); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</section>
<main class="flex-container">
<section class="flex-child">
<h2>Nos Catégories</h2>
<ul>
<?php foreach ($categories as $category): ?>
<li>
<a href="<?php echo site_url('category/view/' . $category['id']); ?>">
<?php echo html_escape($category['description']); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</section>
<section>
<h2>Nos Genres</h2>
<ul>
<?php foreach ($genres as $genre): ?>
<li>
<a href="<?php echo site_url('genre/view/' . $genre['genreId']); ?>">
<?php echo html_escape($genre['name']); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</section>
<section class="flex-child">
<h2>Nos Genres</h2>
<ul>
<?php foreach ($genres as $genre): ?>
<li>
<a href="<?php echo site_url('genre/view/' . $genre['id']); ?>">
<?php echo html_escape($genre['description']); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</section>
</main>
</div>
</body>
</html>
@@ -1,15 +1,63 @@
<h2>Liste des jeux</h2>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Administration des Jeux</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
h2 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; }
a { color: #3498db; text-decoration: none; }
a:hover { text-decoration: underline; }
.btn-add { display: inline-block; background-color: #2ecc71; color: white; padding: 10px 15px; border-radius: 5px; margin: 15px 0; font-weight: bold; }
.btn-add:hover { background-color: #27ae60; text-decoration: none; }
.sort-links { background: #f9f9f9; padding: 10px 15px; border-radius: 5px; }
ul { list-style: none; padding: 0; }
li { background: #fff; border: 1px solid #ecf0f1; margin-bottom: 10px; padding: 15px; border-radius: 5px; display: flex; justify-content: space-between; align-items: center; transition: box-shadow 0.2s; }
li:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.05); }
.game-price { margin-left: 15px; background: #e8f4fd; color: #2b6cb0; padding: 3px 8px; border-radius: 4px; font-weight: bold; font-size: 14px; }
.actions a { margin-left: 15px; font-size: 14px; padding: 5px 10px; border-radius: 3px; background: #ecf0f1; color: #333; }
.actions a:hover { text-decoration: none; background: #bdc3c7; }
.actions a.delete-btn { background: #e74c3c; color: white; }
.actions a.delete-btn:hover { background: #c0392b; }
</style>
</head>
<body>
<p>Trier par :
<a href="<?php echo site_url('jeux/lister/name'); ?>">Titre (A-Z)</a> |
<a href="<?php echo site_url('jeux/lister/releaseYear'); ?>">Année de sortie</a>
</p>
<div class="container">
<p><a href="<?= site_url('home') ?>">⬅ Retour au site public</a></p>
<ul>
<?php foreach ($jeux as $jeu): ?>
<li>
<strong><?php echo html_escape($jeu['name']); ?></strong>
- <em>(<?php echo html_escape($jeu['releaseYear']); ?>)</em>
</li>
<?php endforeach; ?>
</ul>
<h2>Administration - Liste des jeux</h2>
<a href="<?= site_url('jeux/ajouter') ?>" class="btn-add">➕ Ajouter un nouveau jeu</a>
<p class="sort-links">
<strong>Trier par :</strong>
<a href="<?= site_url('jeux/lister/name') ?>">Titre (A-Z)</a> |
<a href="<?= site_url('jeux/lister/releaseYear') ?>">Année de sortie</a>
</p>
<ul>
<?php foreach ($jeux as $jeu): ?>
<li>
<div>
<strong><?= html_escape($jeu['name']) ?></strong>
<span style="color: #7f8c8d;"> - (<?= html_escape($jeu['releaseYear']) ?>)</span>
<?php if (isset($jeu['prix'])): ?>
<span class="game-price"><?= number_format($jeu['prix'] / 100, 2, ',', ' ') ?> €</span>
<?php elseif (isset($jeu['price'])): ?>
<span class="game-price"><?= number_format($jeu['price'] / 100, 2, ',', ' ') ?> €</span>
<?php endif; ?>
</div>
<div class="actions">
<a href="<?= site_url('jeux/modifier/' . $jeu['id']) ?>">✏️ Modifier</a>
<a href="<?= site_url('jeux/supprimer/' . $jeu['id']) ?>" class="delete-btn" onclick="return confirm('Es-tu sûr de vouloir supprimer définitivement ce jeu ?');">🗑️ Supprimer</a>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
</body>
</html>
@@ -1,7 +1,37 @@
<h2><?php echo $titre_message; ?></h2>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title><?= html_escape($titre_message) ?></title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; display: flex; justify-content: center; align-items: center; min-height: 80vh; }
<p><?php echo $contenu_message; ?></p>
.container { max-width: 500px; width: 100%; background: #fff; padding: 40px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); text-align: center; }
<p>
<a href="<?php echo site_url($lien_retour); ?>">Retour</a>
</p>
h1 { color: #2c3e50; margin-top: 10px; margin-bottom: 15px; }
p { font-size: 16px; color: #555; line-height: 1.5; margin-bottom: 35px; }
.btn-retour { display: inline-block; background-color: #3498db; color: white; padding: 12px 30px; text-decoration: none; border-radius: 5px; font-weight: bold; transition: background 0.3s; }
.btn-retour:hover { background-color: #2980b9; }
.icon { font-size: 60px; margin-bottom: 10px; }
</style>
</head>
<body>
<div class="container">
<?php if (strpos(strtolower($titre_message), 'succès') !== false): ?>
<div class="icon">✅</div>
<?php else: ?>
<div class="icon">⚠️</div>
<?php endif; ?>
<h1><?= html_escape($titre_message) ?></h1>
<p><?= html_escape($contenu_message) ?></p>
<a href="<?= site_url($lien_retour) ?>" class="btn-retour">Continuer</a>
</div>
</body>
</html>
@@ -2,29 +2,54 @@
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Résultats de recherche pour "<?php echo html_escape($search_keyword); ?>"</title>
<title>Résultats de recherche pour "<?= html_escape($search_keyword) ?>"</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; margin: 0; padding: 20px; }
.container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
h1 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; margin-bottom: 20px; }
a { color: #3498db; text-decoration: none; }
a:hover { text-decoration: underline; }
ul { list-style: none; padding: 0; }
li { background: #f9f9f9; margin-bottom: 10px; padding: 15px; border-radius: 5px; border-left: 4px solid #9b59b6; transition: transform 0.2s; display: flex; justify-content: space-between; align-items: center; }
li:hover { transform: translateX(5px); background: #f1f1f1; }
li a { text-decoration: none; color: #2c3e50; }
li a:hover { color: #9b59b6; }
.price-tag { background: #9b59b6; color: white; padding: 4px 10px; border-radius: 4px; font-weight: bold; font-size: 14px; }
.empty-msg { padding: 15px; background: #ffeaa7; color: #d35400; border-radius: 5px; font-weight: bold; }
.result-count { display: inline-block; background: #ecf0f1; padding: 5px 10px; border-radius: 4px; margin-bottom: 15px; }
</style>
</head>
<body>
<p><a href="<?php echo site_url('home'); ?>">← Retour à l'accueil</a></p>
<div class="container">
<p><a href="<?= site_url('home') ?>">⬅ Retour à l'accueil</a></p>
<h1>Résultats pour : "<?php echo html_escape($search_keyword); ?>"</h1>
<h1>Résultats pour : "<?= html_escape($search_keyword) ?>"</h1>
<?php if (empty($games)): ?>
<p>Aucun jeu vidéo ne correspond à votre recherche.</p>
<p class="empty-msg">Aucun jeu vidéo ne correspond à votre recherche.</p>
<?php else: ?>
<p><strong><?php echo count($games); ?></strong> jeu(x) trouvé(s) :</p>
<p class="result-count"><strong><?= count($games) ?></strong> jeu(x) trouvé(s) :</p>
<ul>
<?php foreach ($games as $game): ?>
<li>
<a href="<?php echo site_url('game/detail/' . $game['gameId']); ?>">
<strong><?php echo html_escape($game['title']); ?></strong>
</a>
(<?php echo html_escape($game['year']); ?>)
<div>
<a href="<?= site_url('game/detail/' . $game['id']) ?>">
<strong><?= html_escape($game['name']) ?></strong>
</a>
<span style="color: #7f8c8d;"> - (<?= html_escape($game['releaseYear']) ?>)</span>
</div>
<?php if (isset($game['prix'])): ?>
<span class="price-tag"><?= number_format($game['prix'] / 100, 2, ',', ' ') ?> €</span>
<?php elseif (isset($game['price'])): ?>
<span class="price-tag"><?= number_format($game['price'] / 100, 2, ',', ' ') ?> €</span>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
</body>
</html>