diff --git a/Controllers/RecipeController.php b/Controllers/RecipeController.php index 8382cb7..a453f75 100644 --- a/Controllers/RecipeController.php +++ b/Controllers/RecipeController.php @@ -55,4 +55,30 @@ final class RecipeController } + public function searchAction(Array $A_urlParams = null, Array $A_postParams = null, Array $A_getParams = null) + { + if (isset($A_getParams["query"])) { + self::searchQueryView($A_urlParams, $A_postParams, $A_getParams); + } else { + self::searchView($A_urlParams, $A_postParams, $A_getParams); + } + } + + private function searchView(Array $A_urlParams = null, Array $A_postParams = null, Array $A_getParams = null) + { + View::show("recipe/search", array("QUERY" => null)); + } + + private function searchQueryView(Array $A_urlParams = null, Array $A_postParams = null, Array $A_getParams = null) + { + + $O_recipeModel = new RecipeModel(); + $A_results = $O_recipeModel->searchRecipesByName($A_getParams["query"]); + + View::show("recipe/search", array( + "QUERY" => $A_getParams["query"], + "RESULTS" => $A_results, + )); + } + } diff --git a/Models/RecipeModel.php b/Models/RecipeModel.php index a6bd09d..978fa70 100644 --- a/Models/RecipeModel.php +++ b/Models/RecipeModel.php @@ -33,4 +33,39 @@ final class RecipeModel return $A_recipe; } + + public function searchRecipesByName($S_query) + { + + $O_model = Model::get(); + $stmt = $O_model->prepare(" + -- split search term at space + with recursive CTE as ( + select + CAST(null as char(255)) as NAME, + CONCAT(:query, ' ') as NAMES + + union all + select substring_index(NAMES, ' ', 1), + substr(NAMES, instr(NAMES, ' ')+1) + from CTE + where NAMES != '' + ) + + -- get a row per occurrence and sort by occurrences number + select RECIPE.ID, RECIPE.NAME + from CTE + JOIN RECIPE + WHERE CTE.NAME is not null + AND INSTR(RECIPE.NAME, CTE.NAME) > 0 + GROUP BY RECIPE.ID + ORDER BY count(RECIPE.ID) DESC + LIMIT 10; + "); + + $stmt->bindParam("query", $S_query); + $stmt->execute(); + + return $stmt->fetchAll(); + } } diff --git a/Views/recipe/search.php b/Views/recipe/search.php index d9d3888..818bf28 100644 --- a/Views/recipe/search.php +++ b/Views/recipe/search.php @@ -1,6 +1,6 @@ @@ -8,19 +8,21 @@
- - "> + + ">
Aucun résultat'; - echo '

Assurez-vous d\'avoir rentré correctement vos termes de recherche ou essayez des mots clefs différents.

'; - } else { - foreach ($search_results as $key => $value) { - View::show("common/recipe", $value); + if ($has_query) { + $search_results = $A_view["RESULTS"]; + if (empty($search_results)) { + echo '

Aucun résultat

'; + echo '

Assurez-vous d\'avoir rentré correctement vos termes de recherche ou essayez des mots clefs différents.

'; + } else { + foreach ($search_results as $key => $value) { + View::show("common/recipe", $value); + } } } ?>