Advertisement
Guest User

Untitled

a guest
Mar 16th, 2018
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.39 KB | None | 0 0
  1. Bonjour,
  2.  
  3. Ce n'est jamais simple de savoir "quand/comment séparer mon code".
  4. Il faut pour cela se poser les bonnes questions.
  5. Pour commencer:
  6. - Est-ce que je peux découper mon code en fonctionnalité ?
  7.  
  8. Exemple:
  9. J'ai une page d'administration qui affiche la liste des utilisateurs.
  10. Sur cette page, j'ai écrit du code pour vérifier si l'utilisateur est connecté (sinon il n'a pas accès), je récupère la liste des utilisateurs depuis la db, et j'affiche enfin le code html avec mon menu, mon tableau avec mes utilisateurs, mon footer, etc.
  11.  
  12. La page s'affiche convenablement, la logique est bonne. Maintenant, est-ce que je peux découper mon code ?
  13. Pour cela, je vais relire mon code et voir si je peux trouver une certaine logique là dedans.
  14. Le plus simple est encore de prendre une feuille de papier à côté et travailler par point.
  15.  
  16. Pour ma page d'administration, je dois:
  17. - Vérifier si l'utilisateur est connecté
  18. - Si l'utilisateur n'est pas connecté, le rediriger vers la page d'accueil (ou lui afficher un message d'erreur)
  19. - Si l'utilisateur est connecté, lui afficher la page d'administration
  20.  
  21. Là, on voit déjà que j'ai 3 étapes importantes.
  22. On peut donc séparer notre code de cette manière:
  23. - une fonction qui s'occupe de vérifier si l'utilisateur est connecté (retourne par exemple un booléen ou le nom de l'utilisateur connecté)
  24. - une fonction qui redirige le visiteur vers la page d'accueil
  25. - une fonction qui affiche le code html de la page d'administration
  26.  
  27. Dans notre page d'administration, on commencera par appeler la fonction qui vérifie l'utilisateur connecté.
  28. On récupère le retour de cette fonction dans une variable.
  29. On fait une condition avec cette variable.
  30. Si c'est vrai (si l'utilisateur est bien connecté) on call la fonction qui affiche la page d'administration.
  31. Si c'est faux (simple visiteur non connecté) on call la fonction qui redirige vers la page d'accueil.
  32.  
  33. Dans un premier temps, on écrit nos 3 fonctions dans la page d'administration. Pas besoin de les sortir tout de suite.
  34. On devrait donc avoir quelque chose comme ceci:
  35.  
  36. <?php
  37. function checkUser() {...}
  38. function redirectIndex() {...}
  39. function getAdminView() {...}
  40.  
  41. $user = checkUser();
  42. if ($user) { getAdminView(); }
  43. else { redirectIndex(); }
  44. ?>
  45.  
  46. Le code de la page d'administration est déjà plus propre.
  47. On a bien séparé les différents points. C'est plus lisible.
  48. Cependant, la fonction getAdminView est encore assez lourde.
  49. A l'intérieur, on récupère les utilisateurs depuis la db, on construit un tableau avec les utilisateurs, et on affiche notre page d'administration (menu, tableau, footer).
  50.  
  51. Nous allons donc reprendre notre feuille de papier et voir si on peut découper notre code.
  52. Les points de la fonction getAdminView:
  53. - se connecter à la db
  54. - exécuter une requête SQL pour récupérer les utilisateurs
  55. - construire un tableau html avec les utilisateurs
  56. - afficher la page d'administration avec le tableau (layout + injection du tableau des utilisateurs dans le content)
  57.  
  58. Tu l'auras compris, on peut donc créer une fonction par point.
  59.  
  60. - getDB() => retourne l'objet PDO
  61. - getUsers() => dans cette fonction, on call getDB pour récupérer notre PDO, on exécute notre requête SQL et on retourne la liste des utilisateurs
  62. - getUsersTable($users) => on construit le tableau avec la liste des users qu'on aura eu en paramètre. Et on retourne le tableau html (string).
  63. Pourquoi mettre $users en paramètre et pas faire un call de getUsers dans la fonction ? Car de cette façon, on reste générique. On pourra ainsi réutiliser la fonction getUsersTable en lui fournissant en paramètre une autre liste plus ou moins complète. Exemple: sur une autre page, je veux afficher le même tableau mais contenant uniquement les utilisateurs commençant par la lettre B.
  64.  
  65. La structure de getAdminView() sera donc:
  66.  
  67. function getAdminView(){
  68. $users = getUsers();
  69. $table = getUsersTable($users);
  70. $title = 'Page d\'administration';
  71. $content = $table;
  72. include 'includes/layout.php';
  73. }
  74.  
  75. Et voilà, notre page d'administration est donc maintenant découpée par point. Un point = une fonction.
  76. C'est plus long à écrire, le fichier est plus gros, mais la lisibilité est meilleure.
  77. Quand il s'agit d'un gros projet, cette étape est nécessaire. Sinon on se retrouve dans un flou absolu !
  78.  
  79. Maintenant, nous pouvons nous poser une deuxième question:
  80. - Est-ce que le code que j'écris peut s'utiliser ailleurs ?
  81. Si oui, je vais alors déplacer le code dans un autre fichier qui pourra être utilisé ailleurs.
  82. Vu qu'on a déjà découpé notre code en fonction, le travail sera plus simple.
  83. - checkUser => fonction générique, je peux m'en servir ailleurs. Donc je vais le déplacer ailleurs (dans un fichier "tools.php"/"utils.php" par exemple)
  84. - redirectIndex => je peux m'en servir ailleurs. Je déplace.
  85. - getAdminView => propre à ma page d'administration. Logiquement, je ne devrais pas m'en servir en dehors de ma page. Je le laisse donc là.
  86. - getDB => je peux m'en servir ailleurs. Je déplace.
  87. - getUsers => je peux m'en servir ailleurs. Je déplace.
  88. - getUsersTable => propre à ma page d'administration. Pour l'instant, je ne vois pas l'intérêt de le déplacer (toujours possible de le faire plus tard si je dois afficher mes utilisateurs sur une autre page)
  89.  
  90. Pour profiter des fonctions que j'ai déplacé, il suffit d'inclure mon fichier tools.php dans ma page.
  91. Exemple:
  92. require 'tools.php'; // On peut aussi remplacer 'require' par 'include' qu'on a déjà utilisé durant les cours. include=inclure le fichier mais ne retourne pas d'erreur si le fichier n'existe pas. require=fait la même chose que include mais retourne une erreur si le fichier n'existe pas. Dans notre cas, il est préférable d'utiliser require afin de retourner une erreur dès le début vu qu'on a besoin de tools.php pour faire notre call à getUsers.
  93. $users = getUsers();
  94.  
  95.  
  96. C'est terminé pour la partie "découpage".
  97. A noter qu'ici on a découpé au maximum. Mais il n'y a pas règle.
  98. A nous de juger si c'est utile ou non.
  99. Avec la structure MVC, on verra que cette découpe est plus naturelle.
  100.  
  101.  
  102. Pour l'édition d'un utilisateur via un bouton, je te propose d'envoyer l'information en GET à une page d'édition.
  103. Structure:
  104. listing.php (contient une table avec les utilisateurs + un bouton à côté de chaque utilisateur)
  105. edit.php (contient un formulaire d'édition. un input text pour le login, un input password pour le mot de passe)
  106.  
  107. Au moment où je clic sur un bouton, je suis renvoyé à la page edit.php.
  108. l'input text de ma page edit.php sera complété par le login de l'utilisateur que je souhaite éditer.
  109. l'input password de ma page edit.php ne sera pas complété car je suis incapable de connaitre le mot de passe de l'utilisateur (il est hashé).
  110.  
  111. Au niveau du bouton, 2 façons de faire:
  112. - un formulaire
  113. - un lien hypertext
  114.  
  115. Pour le formulaire, on aura:
  116. - un input hidden contenant la valeur de l'identifiant de l'utilisateur qu'on souhaite éditer (ne pas oublier d'ajouter le paramètre name dans la balise)
  117. - un input submit pour valider le formulaire (notre fameux bouton)
  118. - une action qui redirige vers edit.php avec method GET
  119. Pour le lien hypertext, on aura:
  120. - un href qui redirige vers edit.php en rajoutant l'identifiant de l'utilisateur en paramètre dans l'url.
  121. On aura donc quelque chose comme ceci: href="edit.php?id=1234"
  122. (Note: il est possible avec bootstrap de transformer le rendu visuel d'une balise <a> en bouton via des classes comme btn. Voir doc)
  123.  
  124. La récupération de l'id se fera bien sûr en php (Exemple pour l'hypertexte: href="edit.php?id=<?php echo $user['id'] ?>")
  125.  
  126. De cette manière, on aura envoyé l'identifiant de l'utilisateur à la page edit.php.
  127. Avec cette information, notre page pourra alors lancer une requête SQL afin de récupérer les informations de l'utilisateur qu'on souhaite éditer.
  128. Exemple pour la requête: 'SELECT * FROM user WHERE id ="'.$_GET['id'].'";'
  129.  
  130.  
  131. Si tu bloques encore, ou si mes explications ne sont pas claires, on en reparle demain au cours.
  132.  
  133. Il s'agissait ici de deux questions de logique.
  134. Et en tant que développeur, la logique est très importante !
  135. Pour l'instant, c'est normal de bloquer sur ce genre de chose.
  136. Pas de quoi s'inquiéter. Cela fait partie du cours.
  137.  
  138. Mon but est justement de vous mettre dans ce genre de situation.
  139. C'est en pratiquant qu'on forge notre logique.
  140.  
  141.  
  142. A la fin du module, vous serez capable de créer un site web dynamique.
  143. C'est bien, mais je ne te le cache pas: n'importe quel étudiant sortant d'une école informatique est capable de le faire.
  144.  
  145. Mon objectif est de vous démarquer des autres.
  146. En plus de développer un site/une application, vous serez capable de le faire proprement (c'est très important pour une entreprise !).
  147. De booster votre logique (qui est en lien direct avec la propreté de votre code).
  148. D'avoir le réflexe d'aller voir de la doc, de trouver des solutions face à un problème, une inconnue.
  149. D'utiliser et maitriser rapidement des nouveaux outils/librairies.
  150.  
  151. Et quand je vois que des étudiants cherchent à améliorer la structure du code/la logique, c'est qu'on a déjà atteint quelques objectifs.
  152. Je ne m'inquiète donc vraiment pas sur votre parcours professionnel ! ;)
  153.  
  154.  
  155. Bonne journée !
  156.  
  157. François Bruynbroeck
  158.  
  159.  
  160. De : FreeDemoCss <guillaume.cornez@gmail.com>
  161. Envoyé : mercredi 14 mars 2018 01:28
  162. À : François Bruynbroeck
  163. Objet : RE: Problème include, et footer
  164.  
  165. Bonsoir ou bonjour .
  166.  
  167. Je vous recontacte car j’ai 2 questions . dont une ou je peux pas faire sans vous.
  168. Si jamais vous n’avez pas le temps ce n’est pas grave j’attendrais jeudi .
  169.  
  170. Quand en classe vous parliez de splitter le code, est ce que dans le code ci-joint c’est bon pour vous ou ce n’est pas comme ça qu’il fallait faire ? J’avoue que j’était pas super concentré sur ce que vous disiez du coup, j’ai regarder un peu sur les codes des personnes de ma classe mais ça me semble un peut hasardeux chez eux .
  171.  
  172. La deuxième c’est concernant l’édition des membres.
  173. J’ai rajouter un bouton édit (qui ne sert à rien pour l’instant.)
  174. J’aurais aimer qu’on puisse éditer ce membre la en particulier via son bouton édit qui lui est attribué, mais je ne sais pas trop comment m’i prendre ni comment poser la question sur Google, que ce soit en français ou en anglais .
  175. Du coup je me demandais si vous pouviez m’aiguiller de comment faire ma recherche sur Google ou quelque chose du genre.
  176.  
  177. Merci beaucoup et bonne journée/soirée.
  178. Encore une fois si vous n’avez pas le temps de me répondre ou quoi c’est pas du tout un problème je sais attendre jusqu’à jeudi.
  179.  
  180. Provenance : Courrier pour Windows 10
  181.  
  182. De : François Bruynbroeck
  183. Envoyé le :vendredi 9 mars 2018 18:38
  184. À : FreeDemoCss
  185. Objet :RE: Problème include, et footer
  186.  
  187. Bonsoir,
  188.  
  189. Pour le footer, le problème est qu'au niveau de ta css custom, tu places le footer en position absolue:
  190. .footer {
  191. position: absolute;
  192. }
  193.  
  194. Du coup, il passe au dessus de ton content. Il suffit de retirer la ligne "position: absolute" pour que cela fonctionne (et ton footer sera alors en bas de page).
  195.  
  196. Concernant l'include (je suppose que tu parles du formulaire d'authentification), le problème est un peu plus complexe.
  197.  
  198. Ton formulaire est dans le fichier header.php avec comme action "include/secret.php".
  199. Quand tu valides le formulaire, tu es renvoyé vers include/secret.php (jusque là, c'est normal car tu as bien un dossier include avec un fichier secret.php).
  200.  
  201. Dans le fichier secret.php, tu fais un include de header.php (qui se trouve un niveau en dessous du dossier include).
  202. Du coup, quand tu souhaites valider le formulaire depuis secret.php (donc depuis l'url: http://monprojet.local/include/secret.php) l'action de ton formulaire reste "include/secret.php".
  203. Et donc, tu seras redirigé vers la page include/include/secret.php (url: http://monprojet.local/include/include/secret.php) car ton action est faite depuis monprojet.local/include/secret.php et non depuis monprojet.local/header.php.
  204.  
  205. La solution serait donc de ne pas appeler le formulaire (include './header.php') depuis un autre niveau (dans ton cas, depuis le dossier Include).
  206.  
  207. Niveau structure, je te propose quelque chose comme ceci:
  208.  
  209. MonProjet/
  210. index.php
  211. login.php
  212. logout.php
  213.  
  214. Include/
  215. header.php
  216. content.php
  217. footer.php
  218. layout.php
  219.  
  220. css/
  221. style.css
  222.  
  223.  
  224. index.php va contenir la page d'accueil (en initialisant les variables (ex: title/content) + l'include de include/layout.php).
  225. login.php va vérifier si la personne est connectée. Si pas, afficher le formulaire de connexion (formulaire qui sera placé dans la variable content qui sera envoyé dans la layout. Même principe que pour index.php)
  226. logout.php va supprimer la session et rediriger l'utilisateur vers la page index.php (pas besoin d'écrire de l'html ou d'include la layout. On aura que du php).
  227. Pour info:
  228. - session_unset(); // unset la variable $_SESSION
  229. - session_destroy(); // détruit les données de la session
  230. - header('Location: index.php'); // Rediriger l'utilisateur vers la page index.php
  231.  
  232. Côté include:
  233. header.php va contenir le menu (navbar)
  234. content.php va contenir la structure du content (ex: <div class="container"><?= $content ?></div>). C'est grâce à la variable content que l'on va pouvoir alimenter notre page.
  235. footer.php va contenir le pied de page (logiquement, pas besoin d'écrire de php là dedans. Juste de l'html)
  236. layout.php va récupérer le header, le content et le footer via des includes. Le tout, dans le body. (ex: https://github.com/FBruynbroeck/cours.php.base/blob/master/04_includes/includes/layout.php)
  237.  
  238. Je te propose de faire un tour dans le dossier 04_includes accessible à cette adresse: https://github.com/FBruynbroeck/cours.php.base/tree/master/04_includes
  239. Cela va te donner une idée.
  240.  
  241. J'espère avoir pu éclaircir tes zones d'ombre.
  242.  
  243. Sache cependant qu'il ne s'agit pas ici d'une structure conventionnelle.
  244. Pour cela, nous verrons le MVC d'ici 2 semaines (pas de stress, ça va aller ! Si tu parviens à jongler avec les includes/requires, le MVC en php ne sera pas trop compliqué).
  245.  
  246. Si tu as d'autres questions n'hésite pas.
  247. Passe un bon week-end.
  248.  
  249. François Bruynbroeck
  250.  
  251.  
  252. De : FreeDemoCss <guillaume.cornez@gmail.com>
  253. Envoyé : vendredi 9 mars 2018 17:40
  254. À : francois.bruynbroeck@hotmail.com
  255. Objet : Problème include, et footer
  256.  
  257.  
  258.  
  259. Provenance : Courrier pour Windows 10
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement