From f8c0d6d1b237f93fda4feec4bfb28a855e445538 Mon Sep 17 00:00:00 2001
From: Benjamin
Date: Fri, 3 Apr 2026 14:42:43 +0200
Subject: [PATCH] Fix create form and add edit Recettes / delete Recettes
---
public/assets/css/style.css | 71 +++++++-
public/assets/js/form.js | 169 ++++++++++++++++++
src/Domain/Recettes/RecettesAPIController.php | 37 ++--
src/Domain/Recettes/RecettesController.php | 11 ++
.../Recettes/RecettesManagementController.php | 68 +++++++
views/home.php | 11 --
views/recettes/create.php | 77 ++++++++
views/recettes/edit.php | 77 ++++++++
views/recettes/index.php | 2 +-
views/recettes/show.php | 53 ++++++
10 files changed, 542 insertions(+), 34 deletions(-)
create mode 100644 public/assets/js/form.js
create mode 100644 views/recettes/create.php
create mode 100644 views/recettes/edit.php
create mode 100644 views/recettes/show.php
diff --git a/public/assets/css/style.css b/public/assets/css/style.css
index 2156e6d..8fcb5cc 100755
--- a/public/assets/css/style.css
+++ b/public/assets/css/style.css
@@ -432,31 +432,88 @@ ul {
}
.recette-form {
- height: 100%;
- width: 100%;
+ height: 80%;
+ width: 80%;
margin: 10px;
padding: 10px;
+ border: 1px solid black;
+ background: white;
+ border-radius: 20px;
}
.recette-form-group {
display: flex;
flex-direction: column;
+ padding: 5px;
}
#recette-form-div-desc {
- height: 400px;
+ height: 300px;
}
#recette-form-description {
height: 95%;
}
+.recette-add-form-all {
+ display: flex;
+ flex-direction: row;
+ overflow: hidden;
+}
+
+.recette-form-add {
+ flex: 3;
+}
+
+.recette-form-add-ingr {
+ height: 30%;
+}
+
+.recette-form-add-tag {
+ height: 30%;
+}
+
+.recette-form-add-additional{
+ flex: 1;
+ padding-right: 10px;
+}
+
+.err {
+ color: red;
+ display: none;
+ text-align: center;
+ padding-top: 20px;
+}
+
+.liste-ingr-elem {
+ display: flex;
+ height: 100px;
+ padding:5px;
+ background-color: #c6fdefe0;
+ color: #000000;
+ border: 1px solid black;
+ border-radius: 10px;
+ box-shadow: 1px 1px 1px black;
+}
+
+.liste-ingr-elem-text {
+ width: 100%;
+ height: 100%;
+ flex:12;
+ padding-left: 20px;
+ line-height: 100px;
+}
+
+.ingr-image {
+ flex: 1;
+ border: 1px solid black;
+ border-radius: 10px;
+}
+
/*Footer et son contenue*/
footer{
padding: 25px;
background: rgb(11, 189, 144);
color: white;
-}
-
-
-
+ border-top: 1px solid black;
+}
\ No newline at end of file
diff --git a/public/assets/js/form.js b/public/assets/js/form.js
new file mode 100644
index 0000000..a6f31f4
--- /dev/null
+++ b/public/assets/js/form.js
@@ -0,0 +1,169 @@
+document.addEventListener("DOMContentLoaded", function(){
+
+
+ let compl_form = document.getElementById("recette-form-complete");
+ console.log(compl_form);
+
+ function formulaire_ingredient_update(event) {
+
+ event.preventDefault();
+
+ console.log(event);
+
+ let form = document.getElementById("recette-form-ingr-add");
+
+ let cible = document.getElementById("recette-form-ingr");
+ let nomIngredient = document.getElementById("recette-form-ingr-nom");
+ let image = document.getElementById("recette-form-ingr-photo");
+ if( nomIngredient.value === "" || image.value === "" ){
+ alert( "Un champ requis est manquant." );
+ return;
+ }
+
+ let ingr = form.nom;
+
+ let form_data = new FormData(form);
+
+ fetch("/api/ingredients/create", {
+ method : "POST",
+ body: form_data
+ }).then( reponse => {
+ if (!reponse.ok) {
+ let div_err = document.getElementById("recette-form-div-err-ingr");
+
+ div_err.style.display = "inherit";
+ div_err.innerText = "Erreur de connection au serveur";
+
+ }
+ else {
+ reponse.json().then( data => {
+ if (data.success) {
+ let new_elem = document.createElement("option");
+
+ new_elem.setAttribute("value",document.getElementById('recette-form-ingr-nom').value);
+ new_elem.innerText = document.getElementById('recette-form-ingr-nom').value;
+
+ cible.appendChild(new_elem);
+
+ document.getElementById('recette-form-ingr-nom').value = "";
+ }
+ })
+ }
+ })
+
+ }
+
+ function formulaire_tag_update(event){
+
+ event.preventDefault();
+
+ let form = document.getElementById("recette-form-tag-add");
+
+ let cible = document.getElementById("recette-form-tag");
+ let nomTag = document.getElementById("recette-form-tag-nom");
+ if( nomTag.value === "" ){
+ alert( "Un champ requis est manquant." );
+ return;
+ }
+
+ let tag = form.tag;
+
+ let form_data = new FormData(form);
+
+ fetch("/api/tags/create", {
+ method : "POST",
+ body: form_data
+ }).then( reponse => {
+ if (!reponse.ok) {
+ let div_err = document.getElementById("recette-form-div-err-tag");
+
+ div_err.style.display = "inherit";
+ div_err.innerText = "Erreur de connection au serveur";
+
+ }
+ else {
+ reponse.json().then( data => {
+ if (data.success) {
+ let new_elem = document.createElement("option");
+
+ new_elem.setAttribute("value",nomTag.value);
+ new_elem.innerText = nomTag.value;
+
+ cible.appendChild(new_elem);
+
+ nomTag.value = "";
+ }
+ })
+ }
+ })
+
+ }
+
+ function formulaire_traitement(event){
+
+ event.preventDefault();
+
+ console.log( event );
+
+ let nom = document.getElementById('recette-form-nom');
+ let temps = document.getElementsByName('recette-form-nom');
+ let photo = document.getElementById('recette-form-photo');
+ let ingredients = document.getElementById('recette-form-ingr');
+ let tags = document.getElementById('recette-form-tag');
+ let description = document.getElementById('recette-form-description');
+
+ if( nom.value === "" || temps.value == "" || ingredients.value === "" || tags.value === ""){
+ console.log( "Another field" );
+ alert( "Un champ requis est manquant." );
+ return;
+ }
+ if( !IS_EDIT && photo.value === ""){
+ console.log( "Photo field" );
+ alert( "Un champ requis est manquant." );
+ return;
+ }
+
+ if( temps <= 0 ){
+ alert( "Le temps doit être positif ou supérieur à 0." );
+ return;
+ }
+
+ let form_data = new FormData(compl_form);
+ form_data.append( "ingredients", form_data.getAll("ingr").join(",") );
+ form_data.append( "tags", form_data.getAll( "tag").join(",") );
+ if( RECETTE_ID !== 0 )
+ form_data.append( 'id', RECETTE_ID );
+
+ let endpoint = IS_EDIT ? "/api/recettes/edit" : "/api/recettes/create";
+
+ fetch( endpoint, {
+ method : "POST",
+ body: form_data
+ }).then( reponse => {
+ if (!reponse.ok) {
+ alert( "Erreur survenie" );
+ }
+ else {
+ reponse.json().then( data => {
+ if (data.success) {
+ alert( "Envoyé" );
+ } else {
+ alert( data.error || "" );
+ }
+ })
+ }
+ })
+
+ }
+
+ let ingr_form = document.getElementById("recette-form-ingr-add");
+
+ ingr_form.addEventListener('submit', formulaire_ingredient_update);
+
+ let tag_form = document.getElementById("recette-form-tag-add");
+
+ tag_form.addEventListener('submit', formulaire_tag_update);
+ compl_form.addEventListener('submit', formulaire_traitement);
+
+
+})
\ No newline at end of file
diff --git a/src/Domain/Recettes/RecettesAPIController.php b/src/Domain/Recettes/RecettesAPIController.php
index 7811cf2..9698c57 100644
--- a/src/Domain/Recettes/RecettesAPIController.php
+++ b/src/Domain/Recettes/RecettesAPIController.php
@@ -41,13 +41,17 @@ class RecettesAPIController extends Controller {
$recetteRepo = new RecetteRepository();
$resp = $recetteRepo->advancedRecetteSearch( $title, $tagsId, $ingredientsId );
- $resp = array_map( function($recette) use ($recetteRepo){
- $r = $recetteRepo->getByID( $recette['num_recette'] );
- $r->url = Router::getRouteURL( 'recettes->show', $r->slug );
- $r->nb_ingredients = $r->getNumberOfIngredients();
- return $r;
- }, $resp ?? [] );
- JSONResponse::sendSuccess( [ 'data' => $resp ] );
+ $objResp = [];
+ foreach( $resp as $r ){
+ $r = $recetteRepo->getByID( $r['num_recette'] );
+ $r->url = Router::getRouteURL( 'recettes->show', $r->slug );
+ $r->nb_ingredients = $r->getNumberOfIngredients();
+ if( !in_array( $r, $objResp ) ){
+ $objResp[] = $r;
+ }
+ }
+
+ JSONResponse::sendSuccess( [ 'data' => $objResp ] );
}
@@ -58,8 +62,8 @@ class RecettesAPIController extends Controller {
$temps = Request::post( 'temps' ) ?? "";
$fileField = "image";
- $tagsId = explode( ",", Request::post( 'tag' ) ) ?? [];
- $ingredientsId = explode( ",", Request::post( 'ingr' ) ) ?? [];
+ $tagsId = explode( ",", Request::post( 'tags' ) ) ?? [];
+ $ingredientsId = explode( ",", Request::post( 'ingredients' ) ) ?? [];
if( $tagsId == [ "" ] )
$tagsId = [];
@@ -83,13 +87,16 @@ class RecettesAPIController extends Controller {
// Vérification d'une entrée qui existerait déjà.
$slug = strtolower( $name );
- $slug = str_replace( ' ', '-', $slug );
+ $slug = str_replace( ' ', '', $slug );
$recetteRepo = new RecetteRepository();
if( $recetteRepo->getBySlug( $slug ) ){
JSONResponse::sendError( [ 'error' => "Recette already exists" ] );
}
+ if( in_array( $slug, [ 'create', 'edit', 'delete' ] ) ){
+ JSONResponse::sendError( [ 'error' => "Recette already exists" ] );
+ }
// Création de la recette.
$recette = new Recette();
@@ -98,7 +105,7 @@ class RecettesAPIController extends Controller {
$recette->titre_recette = $name;
$recette->slug = $slug;
- $recette->temps_de_preparation = intval( $temps );
+ $recette->temps_de_preparation = intval( $temps <= 0 ? 1 : $temps );
$recette->photo = $urlOrError;
$recette->description_recette = $description;
$recette->publication_date = date("Y-m-d");
@@ -140,8 +147,8 @@ class RecettesAPIController extends Controller {
$temps = Request::post( 'temps' ) ?? "";
$fileField = "image";
- $tagsId = explode( ",", Request::post( 'tag' ) ) ?? [];
- $ingredientsId = explode( ",", Request::post( 'ingr' ) ) ?? [];
+ $tagsId = explode( ",", Request::post( 'tags' ) ) ?? [];
+ $ingredientsId = explode( ",", Request::post( 'ingredients' ) ) ?? [];
if( $tagsId == [ "" ] )
$tagsId = [];
@@ -173,12 +180,12 @@ class RecettesAPIController extends Controller {
// Vérification d'une entrée qui existerait déjà.
$slug = strtolower( $name );
- $slug = str_replace( ' ', '-', $slug );
+ $slug = str_replace( ' ', '', $slug );
$recette->titre_recette = $name;
$recette->slug = $slug;
- $recette->temps_de_preparation = intval( $temps );
+ $recette->temps_de_preparation = intval( $temps <= 0 ? 1 : $temps );
$recette->description_recette = $description;
// Importation de la recette.
diff --git a/src/Domain/Recettes/RecettesController.php b/src/Domain/Recettes/RecettesController.php
index 6264eb0..655ce01 100644
--- a/src/Domain/Recettes/RecettesController.php
+++ b/src/Domain/Recettes/RecettesController.php
@@ -33,4 +33,15 @@ class RecettesController extends Controller {
] );
}
+ public function show( string $slug ): View {
+
+ $recette = new RecetteRepository()->getBySlug( $slug );
+ if( !$recette )
+ die( "Recette not found" );
+
+ return new View( 'recettes/show', [
+ 'recette' => $recette,
+ ]);
+ }
+
}
\ No newline at end of file
diff --git a/src/Domain/Recettes/RecettesManagementController.php b/src/Domain/Recettes/RecettesManagementController.php
index 1a4cdab..698440b 100644
--- a/src/Domain/Recettes/RecettesManagementController.php
+++ b/src/Domain/Recettes/RecettesManagementController.php
@@ -3,6 +3,12 @@
namespace App\Domain\Recettes;
use App\Domain\Controller;
+use App\Domain\Ingredients\IngredientRepository;
+use App\Domain\Tags\TagRepository;
+use App\Helpers\Authentification;
+use App\Http\JSONResponse;
+use App\Http\Request;
+use App\Infrastructure\View;
class RecettesManagementController extends Controller {
@@ -11,7 +17,69 @@ class RecettesManagementController extends Controller {
return [
self::Route( routeUrl: '/recettes/create', routeName: 'recettes->create', routeAction: 'create' ),
self::Route( routeUrl: '/recettes/edit/{int}', routeName: 'recettes->edit', routeAction: 'edit' ),
+ self::Route( routeUrl: '/recettes/delete/{int}', routeName: 'recettes->delete', routeAction: 'delete' ),
];
}
+
+ public function create(): View {
+ if( !Authentification::isLoggedIn() )
+ die( "Not logged in" );
+
+ return new View( 'recettes/create', [
+ 'tags' => new TagRepository()->getAll(),
+ 'ingredients' => new IngredientRepository()->getAll(),
+ ] );
+ }
+
+ public function edit( int $idRecette ): View {
+ if( !Authentification::isLoggedIn() )
+ die( "Not logged in" );
+
+ $recette = new RecetteRepository()->getByID( $idRecette );
+ if( !$recette )
+ die( "Recette not found" );
+
+ $tagsID = array_map( function($tag) {
+ return $tag->getId();
+ }
+ , $recette->getAllLinkedTags() ?? [] );
+
+ $ingredientsID = array_map( function($tag) {
+ return $tag->getId();
+ }
+ , $recette->getAllLinkedIngredients() ?? [] );
+
+ return new View( 'recettes/edit', [
+ 'recette' => $recette,
+ 'recetteTags' => $tagsID,
+ 'recetteIngr' => $ingredientsID,
+ 'tags' => new TagRepository()->getAll(),
+ 'ingredients' => new IngredientRepository()->getAll(),
+ ]);
+ }
+
+ public function delete( int $idRecette ): never {
+ if( !Authentification::isLoggedIn() )
+ die( "Not logged in" );
+
+ $recette = new RecetteRepository()->getByID( $idRecette );
+ if( !$recette )
+ die( "Recette not found" );
+
+ $recetteRepo = new RecetteRepository();
+
+ // Retirer tous les liens Ingrédients/Tags.
+ foreach( ( $recette->getAllLinkedIngredients() ?? [] ) as $ingr ){
+ $recetteRepo->removeAnIngredient( $ingr, $recette );
+ }
+ foreach( ( $recette->getAllLinkedTags() ?? [] ) as $tag ){
+ $recetteRepo->removeATag( $tag, $recette );
+ }
+
+ if( !$recetteRepo->delete( $recette ) )
+ JSONResponse::sendError( [ 'error' => 'An error occured while deleting recette' ] );
+
+ Request::redirectTo( 'recettes->index' );
+ }
}
\ No newline at end of file
diff --git a/views/home.php b/views/home.php
index 8698283..bf307b7 100644
--- a/views/home.php
+++ b/views/home.php
@@ -1,13 +1,2 @@
Coucou
$md
"; ?>
-
-num_ingredient = 0;
- $ing->nom_ingredient = "coucou";
- new \App\Domain\Ingredients\IngredientRepository()->add($ing);
-*/
-
- var_dump( new \App\Domain\Recettes\RecetteRepository()->advancedRecetteSearch( "", [ 4 ], [] ) );
-?>
diff --git a/views/recettes/create.php b/views/recettes/create.php
new file mode 100644
index 0000000..bbf8e30
--- /dev/null
+++ b/views/recettes/create.php
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/views/recettes/edit.php b/views/recettes/edit.php
new file mode 100644
index 0000000..c21c7ed
--- /dev/null
+++ b/views/recettes/edit.php
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/views/recettes/index.php b/views/recettes/index.php
index 900f8c8..3d40431 100644
--- a/views/recettes/index.php
+++ b/views/recettes/index.php
@@ -5,7 +5,7 @@