From 78caabe3f17e7f952ccdd694b1d0e13f994be1ad Mon Sep 17 00:00:00 2001 From: Denis Monnerat Date: Tue, 5 May 2026 08:47:04 +0200 Subject: [PATCH] tp5 mvc + codeigniter v3 --- R3.01/tp/tp5/README.md | 69 ++++++++++++++++++ R3.01/tp/tp5/img/todo.png | Bin 0 -> 32876 bytes R3.01/tp/tp5/src/assets/style.css | 13 ++++ R3.01/tp/tp5/src/ci/controllers/Todo.php | 64 ++++++++++++++++ R3.01/tp/tp5/src/ci/controllers/User.php | 35 +++++++++ R3.01/tp/tp5/src/ci/models/Model_todo.php | 57 +++++++++++++++ .../tp/tp5/src/ci/views/create_user_form.php | 33 +++++++++ R3.01/tp/tp5/src/ci/views/edit.php | 13 ++++ R3.01/tp/tp5/src/ci/views/layout/footer.php | 3 + R3.01/tp/tp5/src/ci/views/layout/header.php | 15 ++++ R3.01/tp/tp5/src/ci/views/todos.php | 39 ++++++++++ R3.01/tp/tp5/src/sql/todo.sql | 65 +++++++++++++++++ 12 files changed, 406 insertions(+) create mode 100644 R3.01/tp/tp5/README.md create mode 100644 R3.01/tp/tp5/img/todo.png create mode 100644 R3.01/tp/tp5/src/assets/style.css create mode 100644 R3.01/tp/tp5/src/ci/controllers/Todo.php create mode 100644 R3.01/tp/tp5/src/ci/controllers/User.php create mode 100644 R3.01/tp/tp5/src/ci/models/Model_todo.php create mode 100644 R3.01/tp/tp5/src/ci/views/create_user_form.php create mode 100644 R3.01/tp/tp5/src/ci/views/edit.php create mode 100644 R3.01/tp/tp5/src/ci/views/layout/footer.php create mode 100644 R3.01/tp/tp5/src/ci/views/layout/header.php create mode 100644 R3.01/tp/tp5/src/ci/views/todos.php create mode 100644 R3.01/tp/tp5/src/sql/todo.sql diff --git a/R3.01/tp/tp5/README.md b/R3.01/tp/tp5/README.md new file mode 100644 index 0000000..35b4e91 --- /dev/null +++ b/R3.01/tp/tp5/README.md @@ -0,0 +1,69 @@ + +# TP5 : prise en main de codeigniter + +## Installation +Téléchargez les sources de [codeigniter v3](https://github.com/pocketarc/codeigniter) (il s'agit d'un fork qui évite certains +porblèmes de compatibilité avec des versions récentes de php), et placez les dans votre +`public_html`. + +1. Importez dans votre base de données la table [todo.sql](src/sql/todo.sql) +2. Copiez le repertoire [assets](src/assets) à la racine de votre application. +3. Copiez les [contrôleurs](src/ci), [modèles](src/ci) et [vues](src/ci) dans votre application. +4. Configurez les paramètres nécessaires à codeigniter : + - `config/config.php` + - `config/database.php` + +```php +$config['base_url']='/~login/chemin/vers/codeigniter'; +``` +Vous devriez obtenir une application `todolist` fonctionnelle à l'url : +``` +https://dwarves.iut-fbleau.fr/~login/chemin/vers/codeigniter/index.php/todo +``` + +![todo](img/todo.png) + +## Suppression des tâches +Modifiez le code pour la suppression des tâches. + +## Edition des tâches +Modifiez le code (contrôleur et modèle) pour l'édition des tâches. + +## Tri de la todolist +Ajoutez la possibilité de trier la todolist par ordre (croissant/décroissant) alphabètique + +## Création de compte + +1. Ajoutez dans votre de base de données une table `user`, qui permettra de stocker des utilisateurs. + attributs : nom, prenom, email (clé primaire), password. +2. Complétez le contrôleur de création de compte. On rappelle que la base de données doit contenir un hash du mot de passe (cf tp4). + ```php + + ``` + ```php + + ``` + +3. Ajoutez un formulaire d'authentification. +4. Utilisez une session pour proteger l'accès à la todolist par authentification. +5. Ajouter à la table todo un lien vers la table user, et modifez l'ensemble de l'application pour que + chaque utilisateur possède sa propre todolist. diff --git a/R3.01/tp/tp5/img/todo.png b/R3.01/tp/tp5/img/todo.png new file mode 100644 index 0000000000000000000000000000000000000000..4de1f3a48dcbc8782492c51f6b51b86f0e6deec9 GIT binary patch literal 32876 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 literal 0 HcmV?d00001 diff --git a/R3.01/tp/tp5/src/assets/style.css b/R3.01/tp/tp5/src/assets/style.css new file mode 100644 index 0000000..d131c8d --- /dev/null +++ b/R3.01/tp/tp5/src/assets/style.css @@ -0,0 +1,13 @@ +.action{ +text-align : right; +} +.action a { + margin-right : 1rem; +} +table { + +font-size : 1.5rem; +} +body { +padding : 2rem; +} diff --git a/R3.01/tp/tp5/src/ci/controllers/Todo.php b/R3.01/tp/tp5/src/ci/controllers/Todo.php new file mode 100644 index 0000000..9ab1b6a --- /dev/null +++ b/R3.01/tp/tp5/src/ci/controllers/Todo.php @@ -0,0 +1,64 @@ +load->helper('html'); + $this->load->helper('url'); + $this->load->helper('form'); + + $this->load->model('model_todo'); + + $this->filter = $this->input->get('filter') ?? 'all'; + } + + public function index() + { + $todos = $this->model_todo->getTodos($this->filter); + $this->load->view('layout/header'); + $this->load->view('todos',['todos'=>$todos,'filter'=>$this->filter]); + $this->load->view('layout/footer'); + } + + public function delete($id) + { + // TODO + } + + public function toggle($id) + { + $this->model_todo->toggleTodo($id); + redirect('/todo'); + } + + public function add() + { + $todo = ['text'=>$this->input->post('todo'),'done'=>0]; + $this->model_todo->addTodo($todo); + $todos = $this->model_todo->getTodos(); + $this->index(); + } + public function edit($id) + { + + $this->load->library('form_validation'); + $this->load->model('model_todo'); + + $todo = $this->model_todo->getTodo($id); + $this->form_validation->set_rules('todo', 'Todo', 'required'); + if ($this->form_validation->run() === FALSE){ + $this->load->view('layout/header'); + $this->load->view('edit',['todo'=>$todo]); + $this->load->view('layout/footer'); + + + }else{ + // TODO + } + } +} diff --git a/R3.01/tp/tp5/src/ci/controllers/User.php b/R3.01/tp/tp5/src/ci/controllers/User.php new file mode 100644 index 0000000..415532b --- /dev/null +++ b/R3.01/tp/tp5/src/ci/controllers/User.php @@ -0,0 +1,35 @@ +load->library('form_validation'); + $this->form_validation->set_rules('nom', 'Nom', 'required'); + $this->form_validation->set_rules('prenom', 'Prénom', 'required'); + $this->form_validation->set_rules('email', 'Adresse mail', 'valid_email'); + $this->form_validation->set_rules('password', 'current password', 'min_length[5]|required'); + $this->form_validation->set_rules('cpassword', 'confirm password', 'required|matches[password]'); + + + if ($this->form_validation->run() === FALSE){ + $this->load->view('layout/header'); + $this->load->view('create_user_form'); + $this->load->view('layout/footer'); + }else{ + // + // TODO + // + } + } + + public function auth() + { + // + // TODO + // + + } +} diff --git a/R3.01/tp/tp5/src/ci/models/Model_todo.php b/R3.01/tp/tp5/src/ci/models/Model_todo.php new file mode 100644 index 0000000..c8305a3 --- /dev/null +++ b/R3.01/tp/tp5/src/ci/models/Model_todo.php @@ -0,0 +1,57 @@ +load->database(); + } + public function deleteTodo($id) + { + $this->db->delete('todo',['id'=>$id]); + } + + public function getTodos($filter='all') + { + $where_filter = ["done" => 1, "active" => 0, "all" => "%"]; + return $this + ->db + ->query("SELECT * FROM todo WHERE done LIKE ?",[$where_filter[$filter]]) + ->result(); + } + + public function toggleTodo($id){ + + /* en utilisant Query Builder class + * $this + ->db + ->set('done','1-done',false) + ->where('id',$id) + ->update('todo'); + */ + + $sql = "UPDATE todo SET done = 1 - done WHERE id = ?"; + $this + ->db + ->query($sql,[$id]); + } + + public function editTodo($id,$text) + { + // TODO + } + + public function getTodo($id){ + $sql = "SELECT * FROM todo where id = ?"; + return $this + ->db + ->query($sql,[$id])->row(); + } + + public function addTodo($todo) + { + $this->db->insert('todo', $todo); + return $this + ->db + ->insert_id(); + } +} diff --git a/R3.01/tp/tp5/src/ci/views/create_user_form.php b/R3.01/tp/tp5/src/ci/views/create_user_form.php new file mode 100644 index 0000000..28ba201 --- /dev/null +++ b/R3.01/tp/tp5/src/ci/views/create_user_form.php @@ -0,0 +1,33 @@ + + + + +
+ + + + + +
+ + + +
+ + + +
+ + + + diff --git a/R3.01/tp/tp5/src/ci/views/edit.php b/R3.01/tp/tp5/src/ci/views/edit.php new file mode 100644 index 0000000..92f3f09 --- /dev/null +++ b/R3.01/tp/tp5/src/ci/views/edit.php @@ -0,0 +1,13 @@ + +
+id}");?> +
+ + + + + +
+
diff --git a/R3.01/tp/tp5/src/ci/views/layout/footer.php b/R3.01/tp/tp5/src/ci/views/layout/footer.php new file mode 100644 index 0000000..a78654e --- /dev/null +++ b/R3.01/tp/tp5/src/ci/views/layout/footer.php @@ -0,0 +1,3 @@ + + + diff --git a/R3.01/tp/tp5/src/ci/views/layout/header.php b/R3.01/tp/tp5/src/ci/views/layout/header.php new file mode 100644 index 0000000..c7b9317 --- /dev/null +++ b/R3.01/tp/tp5/src/ci/views/layout/header.php @@ -0,0 +1,15 @@ + + + + + TODO APP + + + + + + +
diff --git a/R3.01/tp/tp5/src/ci/views/todos.php b/R3.01/tp/tp5/src/ci/views/todos.php new file mode 100644 index 0000000..dd2f39d --- /dev/null +++ b/R3.01/tp/tp5/src/ci/views/todos.php @@ -0,0 +1,39 @@ +
+
+ +
+ + + + + + + done): ?> + + + + + +
text?> + id}", '')?> + id}", '')?> + id}", '')?> + + + +
text?> + id}", '')?> + id}", '')?> + id}", '')?> + +
+
diff --git a/R3.01/tp/tp5/src/sql/todo.sql b/R3.01/tp/tp5/src/sql/todo.sql new file mode 100644 index 0000000..89cc19a --- /dev/null +++ b/R3.01/tp/tp5/src/sql/todo.sql @@ -0,0 +1,65 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.1 +-- https://www.phpmyadmin.net/ +-- +-- Hôte : localhost +-- Généré le : mar. 23 mai 2023 à 07:22 +-- Version du serveur : 10.11.2-MariaDB +-- Version de PHP : 8.2.4 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + + +-- -------------------------------------------------------- + +-- +-- Structure de la table `todo` +-- + +CREATE TABLE `todo` ( + `id` int(11) NOT NULL, + `text` varchar(256) NOT NULL, + `done` tinyint(1) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Déchargement des données de la table `todo` +-- + +INSERT INTO `todo` (`id`, `text`, `done`) VALUES +(1, 'Avoid excessive caffeine !', 0), +(2, 'Be less provocative !', 1), +(3, 'Be nice to people', 1); + +-- +-- Index pour les tables déchargées +-- + +-- +-- Index pour la table `todo` +-- +ALTER TABLE `todo` + ADD PRIMARY KEY (`id`); + +-- +-- AUTO_INCREMENT pour les tables déchargées +-- + +-- +-- AUTO_INCREMENT pour la table `todo` +-- +ALTER TABLE `todo` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=58; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;