From 3b369122645b07b290f7fcc7bccb4787745cd5ea Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 24 Mar 2026 22:39:29 +0100 Subject: =?UTF-8?q?mode=20maintenance,=20optimisation=20moins=20de=20contr?= =?UTF-8?q?=C3=B4les=20en=20mode=20run,=20dossier=20service=20et=20d=C3=A9?= =?UTF-8?q?placement=20fichiers,=20sessions=20et=20entit=C3=A9=20User=20pr?= =?UTF-8?q?=C3=A9par=C3=A9es=20=C3=A0=20l'impl=C3=A9mentation=20hypoth?= =?UTF-8?q?=C3=A9tique=20des=20r=C3=B4les,=20entit=C3=A9=20AppMetadata,=20?= =?UTF-8?q?meilleure=20s=C3=A9curit=C3=A9=20de=20fillStartingDatabase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/router.php | 384 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 src/service/router.php (limited to 'src/service/router.php') diff --git a/src/service/router.php b/src/service/router.php new file mode 100644 index 0000000..fc6b028 --- /dev/null +++ b/src/service/router.php @@ -0,0 +1,384 @@ + 1er test, méthode http: GET, POST ou autre chose +=> 2ème test, type de contenu (méthode POST uniquement): +"application/x-www-form-urlencoded" = formulaire +"application/json" = requête AJAX avec fetch() +"multipart/form-data" = upload d'image par tinymce +$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non utilisée +=> 3ème test, comme le 2ème test mais uniquement si IS_ADMIN est vrai +*/ + +declare(strict_types=1); + +if($request->getMethod() === 'GET'){ + // table "user" vide + if(!UserController::existUsers($entityManager)){ + require AbstractBuilder::VIEWS_PATH . 'user_create.php'; + die; + } + + // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là) + if($request->query->has('action') && $request->query->get('action') === 'deconnection'){ + UserController::disconnect($entityManager); + } + + // articles suivants + if($request->query->has('fetch') && $request->query->get('fetch') === 'next_articles'){ + ArticleController::fetch($entityManager, $request); + } + + // données du calendrier + // création du calendrier et changement de dates affichées (boutons flèches mais pas changement de vue) + if($request->query->has('action') && $request->query->get('action') === 'get_events' + && $request->query->has('start') && $request->query->has('end') && empty($request->getPayload()->all())) // getPayload ne récupère pas que des POST + { + CalendarController::getData($entityManager); + } + + // pages interdites + if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails'])){ + header('Location: ' . new URL); + die; + } + + if(IS_ADMIN === true){ + // ... + } + + // construction d'une page + $response = (new ViewController)->buildView($entityManager, $request); // utilise Model + // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4 +} + + +elseif($request->getMethod() === 'POST'){ + /* -- contrôleurs appellables par tout le monde -- */ + + // table "user" vide + if(!UserController::existUsers($entityManager)){ + UserController::createAdminUser($entityManager); + } + + // requêtes JSON avec fetch() + if($_SERVER['CONTENT_TYPE'] === 'application/json') + { + $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true); + + if(isset($_GET['action'])) + { + // formulaire de contact + if($_GET['action'] === 'send_email'){ + ContactFormController::sendVisitorEmail($entityManager, $json); + } + } + } + + // envoi formulaire HTML + elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded'){ + // tentative de connexion + if($request->query->has('action') && $request->query->get('action') === 'connection'){ + //$response = + UserController::connect($entityManager); + } + } + + + if(IS_ADMIN === true) + { + /* -- requêtes AJAX -- */ + + // requêtes JSON avec fetch() + if($_SERVER['CONTENT_TYPE'] === 'application/json') + { + $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true); + + if($request->query->has('action')) + { + /* -- manipulation des articles -- */ + if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])){ + ArticleController::editorSubmit($entityManager, $json); + } + elseif($_GET['action'] === 'delete_article' && isset($json['id'])){ + $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX + } + elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){ + ArticleController::switchPositions($entityManager, $json); + } + elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])){ + ArticleController::dateSubmit($entityManager, $json); + } + + /* -- bloc Formulaire -- */ + elseif($_GET['action'] === 'keep_emails'){ + ContactFormController::keepEmails($entityManager, $json); + } + elseif($_GET['action'] === 'set_retention_period'){ + ContactFormController::setEmailsRetentionPeriod($entityManager, $json); + } + elseif($_GET['action'] === 'set_email_param'){ + ContactFormController::setEmailParam($entityManager, $json); + } + elseif($_GET['action'] === 'test_email'){ + ContactFormController::sendTestEmail($entityManager, $json); + } + + /* -- page emails -- */ + elseif($_GET['action'] === 'delete_email'){ + ContactFormController::deleteEmail($entityManager, $json); + } + elseif($_GET['action'] === 'toggle_sensitive_email'){ + ContactFormController::toggleSensitiveEmail($entityManager, $json); + } + + /* -- upload d'image dans tinymce par copier-coller -- */ + // collage de HTML contenant une ou plusieurs balises + elseif($request->query->get('action') === 'upload_image_url'){ + ImageUploadController::uploadImageHtml(); + } + // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML + elseif($request->query->get('action') === 'upload_image_base64'){ + ImageUploadController::uploadImageBase64(); + } + + + /* -- requêtes spécifiques au calendrier -- */ + elseif($request->query->get('action') === 'new_event'){ + CalendarController::newEvent($json, $entityManager); + } + elseif($request->query->get('action') === 'update_event'){ + CalendarController::updateEvent($json, $entityManager); + } + elseif($request->query->get('action') === 'remove_event'){ + CalendarController::removeEvent($json, $entityManager); + } + else{ + echo json_encode(['success' => false]); + die; + } + } + + /* -- site entier (header, footer, favicon) -- */ + elseif($request->query->has('head_foot_text')){ + HeadFootController::setTextData($entityManager, $request->query->get('head_foot_text'), $json); + } + elseif($request->query->has('head_foot_social_check')){ + HeadFootController::displaySocialNetwork($entityManager, $request->query->get('head_foot_social_check'), $json); + } + + /* -- page Menu et chemins -- */ + elseif(isset($_GET['menu_edit'])) + { + // ne suit pas la règle, faire ça dans un contrôleur? + Model::$menu = new Menu($entityManager); // récupération des données + + // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions + if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){ + MenuAndPathsController::MoveOneLevelUp($entityManager, $json); + } + // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent + elseif($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){ + MenuAndPathsController::MoveOneLevelDown($entityManager, $json); + } + elseif($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){ + MenuAndPathsController::switchPositions($entityManager, $json); + } + elseif($_GET['menu_edit'] === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){ + MenuAndPathsController::displayInMenu($entityManager, $json); + } + elseif($_GET['menu_edit'] === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){ + MenuAndPathsController::editUrl($entityManager, $json); + } + } + + /* -- mode Modification d'une page -- */ + // partie "page" + elseif(isset($_GET['page_edit'])) + { + // titre de la page + if($_GET['page_edit'] === 'page_title'){ + PageManagementController::setPageTitle($entityManager, $json); + } + // description dans les métadonnées + elseif($_GET['page_edit'] === 'page_description'){ + PageManagementController::setPageDescription($entityManager, $json); + } + } + + // partie "blocs" + elseif($request->query->has('bloc_edit')) + { + if($request->query->get('bloc_edit') === 'rename_page_bloc'){ + PageManagementController::renameBloc($entityManager, $json); + } + elseif($request->query->get('bloc_edit') === 'switch_blocs_positions'){ + PageManagementController::SwitchBlocsPositions($entityManager, $json); + } + elseif($request->query->get('bloc_edit') === 'change_articles_order'){ + PageManagementController::changeArticlesOrder($entityManager, $json); + } + elseif($request->query->get('bloc_edit') === 'change_presentation'){ + PageManagementController::changePresentation($entityManager, $json); + } + elseif($request->query->get('bloc_edit') === 'change_cols_min_width'){ + PageManagementController::changeColsMinWidth($entityManager, $json); + } + elseif($request->query->get('bloc_edit') === 'change_pagination_limit'){ + PageManagementController::changePaginationLimit($entityManager, $json); + } + } + } + + // upload avec FormData + elseif(strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false) + { + // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer) + if($request->query->has('action') && $request->query->get('action') === 'upload_image_tinymce'){ + ImageUploadController::imageUploadTinyMce(); + } + // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64 + elseif($request->query->has('action') && $request->query->get('action') === 'upload_file_tinymce'){ + FileUploadController::fileUploadTinyMce(); + } + elseif($request->query->has('head_foot_image')){ + HeadFootController::uploadAsset($entityManager, $request->query->get('head_foot_image')); + } + } + + // requêtes XMLHttpRequest + elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') + { + //echo "requête XMLHttpRequest reçue par le serveur"; + echo json_encode(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR + die; + } + + /* -- envoi formulaire HTML -- */ + elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded') + { + if($request->query->has('action') && $request->query->get('action') === 'delete_article' && isset($_GET['id'])){ + $response = ArticleController::deleteArticle($entityManager, $_GET); // version formulaire + } + + /* -- nouvelle page -- */ + elseif(isset($_POST['page_name']) && $_POST['page_name'] !== null + && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null + && isset($_POST['page_location']) && $_POST['page_location'] !== null + && isset($_POST['page_description']) && $_POST['page_description'] !== null + && isset($_POST['new_page_hidden']) && $_POST['new_page_hidden'] === '') + { + PageManagementController::newPage($entityManager, $_POST); + } + + /* -- suppression d'une page -- */ + elseif(isset($_POST['page_id']) && $_POST['page_id'] !== null + && isset($_POST['submit_hidden']) && $_POST['submit_hidden'] === '') + { + PageManagementController::deletePage($entityManager); + } + + + /* -- mode Modification d'une page -- */ + + // modification du chemins en snake_case + elseif(isset($_POST['page_menu_path']) && $_POST['page_menu_path'] !== null + && isset($_POST['page_id']) && $_POST['page_id'] !== null + && isset($_POST['page_name_path_hidden']) && $_POST['page_name_path_hidden'] === '') + { + PageManagementController::updatePageMenuPath($entityManager); + } + // ajout d'un bloc dans une page + elseif(isset($_POST['bloc_title']) && $_POST['bloc_title'] !== null + && isset($_POST['bloc_select']) && $_POST['bloc_select'] !== null + && isset($_POST['bloc_title_hidden']) && $_POST['bloc_title_hidden'] === '') // contrôle anti-robot avec input hidden + { + PageManagementController::addBloc($entityManager); + } + // suppression d'un bloc de page + elseif(isset($_POST['delete_bloc_id']) && $_POST['delete_bloc_id'] !== null + && isset($_POST['delete_bloc_hidden']) && $_POST['delete_bloc_hidden'] === '') // contrôle anti-robot avec input hidden + { + PageManagementController::deleteBloc($entityManager); + } + + + /* -- page Menu et chemins -- */ + + // création d'une entrée de menu avec une URL + elseif(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){ + MenuAndPathsController::newUrlMenuEntry($entityManager); + } + // suppression d'une entrée de menu avec une URL + elseif(isset($_POST['delete']) && isset($_POST['x']) && isset($_POST['y'])){ // 2 params x et y sont là parce qu'on a cliqué sur une image + MenuAndPathsController::deleteUrlMenuEntry($entityManager); + } + + + /* -- page Mon compte -- */ + elseif($request->query->has('action') && $request->query->get('action') === 'update_username') + { + UserController::updateUsername($entityManager); + } + elseif($request->query->has('action') && $request->query->get('action') === 'update_password') + { + UserController::updatePassword($entityManager); + } + + // redirection page d'accueil + else{ + header("Location: " . new URL(['error' => 'paramètres inconnus'])); + die; + } + } + // POST admin ne matchant pas + else{ + echo json_encode(['success' => false]); + die; + } + } + // POST non admin ne matchant pas + else{ + echo json_encode(['success' => false]); + die; + } +} + +// méthode inconnue +else{ + header("Location: " . new URL(['error' => 'tu fais quoi là mec?'])); + die; +} + + + +/* -- utilisation de la réponse -- */ +if(isset($response)){ + // cas gérés (d'autres sont à prévoir): mauvais id de la page article, accès page création d'article sans être admin + if($request->isMethod('GET') && $response->getStatusCode() == 302){ // 302 redirection temporaire + header('Location: ' . new URL(['page' => $_GET['from'] ?? ''])); + } + // redirection après traitement de formulaires HTTP + elseif($request->getMethod() === 'POST' && $_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded'){ + $response_data = json_decode(($response)->getContent(), true); + $url = new URL(['page' => $_GET['from'] ?? '']); + $url->addParams(['success' => $response_data['success'], 'message' => $response_data['message']]); + header('Location: ' . $url); + } + // affichage d'une page OU requête AJAX + else{ + $response->send(); + } +} +// pas utilisation de RESPONSE (cas destiné à disparaître) +else{ + if($request->getMethod() === 'POST' && $_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded'){ + header("Location: " . new URL(['error' => 'erreur côté serveur'])); + } + else{ + http_response_code(500); + echo "erreur côté serveur"; + } +} +//die; // inutile \ No newline at end of file -- cgit v1.2.3