diff options
| author | polo <ordipolo@gmx.fr> | 2024-02-09 15:56:55 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2024-02-09 15:56:55 +0100 |
| commit | 949737cf5fc2a21b36c4a269a437d0dc2e965441 (patch) | |
| tree | 5a6962408f833e6e2b04519fed544193e41e6360 /articles | |
| download | lelionetlecolibri-master.tar.gz lelionetlecolibri-master.tar.bz2 lelionetlecolibri-master.zip | |
Diffstat (limited to 'articles')
49 files changed, 694 insertions, 0 deletions
diff --git a/articles/a-bout-de-souffle.jpg b/articles/a-bout-de-souffle.jpg new file mode 100644 index 0000000..591496c --- /dev/null +++ b/articles/a-bout-de-souffle.jpg | |||
| Binary files differ | |||
diff --git a/articles/acoustic-guitar.png b/articles/acoustic-guitar.png new file mode 100644 index 0000000..5503dd0 --- /dev/null +++ b/articles/acoustic-guitar.png | |||
| Binary files differ | |||
diff --git a/articles/ajoutarticle.php b/articles/ajoutarticle.php new file mode 100644 index 0000000..56f63a1 --- /dev/null +++ b/articles/ajoutarticle.php | |||
| @@ -0,0 +1,103 @@ | |||
| 1 | <?php | ||
| 2 | // PAGE SÉCURISÉE ! impossible de la voir si la variable $_SESSION['mdpvalide'] ne vaut pas 1 | ||
| 3 | |||
| 4 | session_start(); | ||
| 5 | if (isset ($_SESSION["mdpvalide"])) | ||
| 6 | { | ||
| 7 | if($_SESSION["mdpvalide"]) // booléen, test si ça vaut 1 | ||
| 8 | {} // dans ce cas on fait rien et on laisse php lire la suite | ||
| 9 | else | ||
| 10 | { | ||
| 11 | header('Location: ../connexion.php'); | ||
| 12 | exit (); | ||
| 13 | // exit() sert à interrompre php qui n'a alors surtout pas besoin d'aller jusqu'en bas de la page | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | header('Location: ../connexion.php'); | ||
| 19 | exit (); | ||
| 20 | } | ||
| 21 | |||
| 22 | |||
| 23 | // connexion à la base de données | ||
| 24 | include("../connexionbase.php"); | ||
| 25 | |||
| 26 | |||
| 27 | // récupérer les POST, complèter la base et uploader des photos | ||
| 28 | if (isset ($_FILES['photo']) AND $_FILES['photo']['error'] == 1) // fichier trop lourd | ||
| 29 | { | ||
| 30 | header('Location: ../administration.php?nouvarticle=2'); | ||
| 31 | exit (); | ||
| 32 | } | ||
| 33 | elseif ($_FILES['photo']['error'] == 0 AND $_POST['titre'] != '') // présence d'un titre | ||
| 34 | { | ||
| 35 | // extension du fichier | ||
| 36 | $infophoto = pathinfo ($_FILES['photo']['name']); // pathinfo renvoie un tableau, qui contient notamment l'extension du fichier | ||
| 37 | $extautorisées = array ('jpg', 'jpeg', 'png', 'gif', 'JPG', 'JPEG', 'PNG', 'GIF'); | ||
| 38 | if (in_array ($infophoto['extension'], $extautorisées)) // on compare l'extension dans le tableau avec les extensions qu'on a choisi | ||
| 39 | { | ||
| 40 | // on récupère la variable $nom | ||
| 41 | $nom = basename ($_FILES['photo']['name']); | ||
| 42 | |||
| 43 | // vérification et formatage du nom du fichier | ||
| 44 | // supprimer les accents, problème: la méthode avec la fonction strstr marche mal avec l'UTF-8, | ||
| 45 | // on préfèrera celle-ci qui utilise str_replace et qui marche mieux (mais pas avec les majuscules accentuées): | ||
| 46 | $nom = str_replace( | ||
| 47 | array('à','â','ä','á','ã','å','î','ï','ì','í','ô','ö','ò','ó','õ','ø','ù','û','ü','ú','é','è','ê','ë','ç','ÿ','ñ'), | ||
| 48 | array('a','a','a','a','a','a','i','i','i','i','o','o','o','o','o','o','u','u','u','u','e','e','e','e','c','y','n'), | ||
| 49 | $nom); | ||
| 50 | // minuscules | ||
| 51 | $nom = mb_strtolower($nom, 'UTF-8'); | ||
| 52 | $infophoto['extension'] = mb_strtolower($infophoto['extension'], 'UTF-8'); | ||
| 53 | // ce qui n'est pas une lettre ou un chiffre est remplacé par un tiret, y compris les espaces | ||
| 54 | $nom = preg_replace('/([^.a-z0-9]+)/i', '-', $nom); | ||
| 55 | |||
| 56 | // ajout article avec photo | ||
| 57 | if (move_uploaded_file ($_FILES['photo']['tmp_name'], '/var/www/lelionetlecolibri.ordipolo.fr/articles/' . $nom)) | ||
| 58 | // on doit pouvoir écrire dans le dossier d'arrivée (mettre le chemin absolu) et dans /tmp | ||
| 59 | // pour permettre à PHP l'écriture et la traversée du dossier, taper: sudo chmod 733 /var/www/dossier/qu'on/veut | ||
| 60 | { | ||
| 61 | // nom de la miniature | ||
| 62 | $mini_nom = "mini_" . $nom; | ||
| 63 | |||
| 64 | $requête = $base->prepare('INSERT INTO articles (nomarticle, contenu, nomphoto, miniature) VALUES (?, ?, ?, ?)'); | ||
| 65 | $requête->execute(array( | ||
| 66 | $_POST['titre'], | ||
| 67 | $_POST['article'], | ||
| 68 | $nom, | ||
| 69 | $mini_nom)); | ||
| 70 | |||
| 71 | // création de la miniature | ||
| 72 | include("miniatures.php"); | ||
| 73 | |||
| 74 | header('Location: ../administration.php?nouvarticle=5'); // succès, move_uploaded_file renvoie la valeur TRUE | ||
| 75 | exit (); | ||
| 76 | } | ||
| 77 | else // echec à l'enregistrement, la fonction renvoie FALSE | ||
| 78 | { | ||
| 79 | header('Location: ../administration.php?nouvarticle=4'); | ||
| 80 | exit (); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | else // mauvais format | ||
| 84 | { | ||
| 85 | header('Location: ../administration.php?nouvarticle=3'); | ||
| 86 | exit (); | ||
| 87 | } | ||
| 88 | } | ||
| 89 | elseif ($_POST['titre'] != '') // article sans photo | ||
| 90 | { | ||
| 91 | $requête = $base->prepare('INSERT INTO articles (nomarticle, contenu) VALUES (?, ?)'); | ||
| 92 | $requête->execute(array( | ||
| 93 | $_POST['titre'], | ||
| 94 | $_POST['article'])); | ||
| 95 | |||
| 96 | header('Location: ../administration.php?nouvarticle=5'); | ||
| 97 | exit (); | ||
| 98 | } | ||
| 99 | else // pas de titre | ||
| 100 | { | ||
| 101 | header('Location: ../administration.php?nouvarticle=1'); | ||
| 102 | } | ||
| 103 | ?> | ||
diff --git a/articles/articlesliste.php b/articles/articlesliste.php new file mode 100644 index 0000000..f56cea7 --- /dev/null +++ b/articles/articlesliste.php | |||
| @@ -0,0 +1,179 @@ | |||
| 1 | <?php | ||
| 2 | // PAGE SÉCURISÉE ! impossible de la voir si la variable $_SESSION['mdpvalide'] ne vaut pas 1 | ||
| 3 | |||
| 4 | session_start(); | ||
| 5 | if (isset ($_SESSION["mdpvalide"])) | ||
| 6 | { | ||
| 7 | if($_SESSION["mdpvalide"]) // booléen, test si ça vaut 1 | ||
| 8 | {} // dans ce cas on fait rien et on laisse php lire la suite | ||
| 9 | else | ||
| 10 | { | ||
| 11 | header('Location: ../connexion.php'); | ||
| 12 | exit (); | ||
| 13 | // exit() sert à interrompre php qui n'a alors surtout pas besoin d'aller jusqu'en bas de la page | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | header('Location: ../connexion.php'); | ||
| 19 | exit (); | ||
| 20 | } | ||
| 21 | ?> | ||
| 22 | |||
| 23 | <!DOCTYPE html> | ||
| 24 | <html lang="fr" > | ||
| 25 | <head> | ||
| 26 | <meta charset="utf-8" /> | ||
| 27 | <title>modifier, supprimer un article</title> | ||
| 28 | <link rel="shortcut icon" type="image/x-icon" href="../favicon.ico" /> | ||
| 29 | <link rel="stylesheet" href="../blog.css" /> | ||
| 30 | <meta name="viewport" content="width=device-width" /> | ||
| 31 | <style> | ||
| 32 | section | ||
| 33 | { | ||
| 34 | margin: 10px 0px; | ||
| 35 | padding: 10px; | ||
| 36 | width: 960px; | ||
| 37 | } | ||
| 38 | </style> | ||
| 39 | </head> | ||
| 40 | |||
| 41 | <body> | ||
| 42 | <div id="bloc_page"> | ||
| 43 | |||
| 44 | <header> | ||
| 45 | <h1><img class="sakura" src="../sakura.png" alt="sakura" /> | ||
| 46 | Modifier ou supprimer un article | ||
| 47 | <img class="sakura" src="../sakura.png" alt="sakura" /></h1> | ||
| 48 | </header> | ||
| 49 | |||
| 50 | <li id="admin" > | ||
| 51 | <p><a href="../administration.php" >retour page précédente</a></p> | ||
| 52 | </li> | ||
| 53 | |||
| 54 | |||
| 55 | <!-- connexion à la base de données --> | ||
| 56 | <?php include("../connexionbase.php"); ?> | ||
| 57 | |||
| 58 | |||
| 59 | <?php // message de retour avec des GET venant de supprconfirmée.php | ||
| 60 | if (isset ($_GET['erreursuppr'])) | ||
| 61 | { | ||
| 62 | if($_GET['erreursuppr'] == 1) | ||
| 63 | { | ||
| 64 | echo('<p><i>Erreur à la suppression d\'une image ou d\'un article,<br/> | ||
| 65 | si cet avertissement vous semble étrange, contactez ordipolo.</i></p>'); | ||
| 66 | } | ||
| 67 | else | ||
| 68 | {} | ||
| 69 | } | ||
| 70 | elseif (isset ($_GET['suppr'])) | ||
| 71 | { | ||
| 72 | if($_GET['suppr'] == 1) | ||
| 73 | { | ||
| 74 | echo('<i>L\'image a bien été supprimée !</i>'); | ||
| 75 | } | ||
| 76 | elseif($_GET['suppr'] == 2) | ||
| 77 | { | ||
| 78 | echo('<i>L\'article a bien été supprimé !</i>'); | ||
| 79 | } | ||
| 80 | else | ||
| 81 | {} | ||
| 82 | } | ||
| 83 | else | ||
| 84 | {} | ||
| 85 | ?> | ||
| 86 | |||
| 87 | |||
| 88 | <?php | ||
| 89 | $réponse = $base->query('SELECT id, nomarticle, contenu, nomphoto, miniature, DATE_FORMAT(dateheure, \'article ajouté le %d/%m/%Y à %Hh%i\') | ||
| 90 | AS date FROM articles ORDER BY id DESC'); | ||
| 91 | while ($données = $réponse->fetch()) | ||
| 92 | { | ||
| 93 | echo('<section> | ||
| 94 | <article> | ||
| 95 | <p class="dateheure" >' . $données['date'] . '</p>'); // date | ||
| 96 | |||
| 97 | // titre et texte | ||
| 98 | echo('<p><b>Modifier le titre et le texte.</b></p>'); | ||
| 99 | |||
| 100 | echo('<form method="post" action="modifarticle.php" >'); | ||
| 101 | |||
| 102 | echo('<p><label for="titre" >Titre:</label> | ||
| 103 | <input type="text" name="titre" id="titre" value="' | ||
| 104 | . htmlspecialchars($données['nomarticle']) . '" size="30" /></p>'); // titre | ||
| 105 | |||
| 106 | echo('<p><label for="article" >Texte:</label> | ||
| 107 | <textarea name="article" id="article" rows="10" cols="50" >' | ||
| 108 | . htmlspecialchars($données['contenu']) . '</textarea></p>'); // texte | ||
| 109 | |||
| 110 | echo('<p><input type="hidden" name="ligne" id="ligne" value="' | ||
| 111 | . $données['id'] . '" /></p>'); // numéro de la ligne dans la base | ||
| 112 | |||
| 113 | echo('<p><input type="submit" value="VALIDER LE NOUVEAU TEXTE" /></p> | ||
| 114 | </form>'); // bouton | ||
| 115 | |||
| 116 | // image | ||
| 117 | if ($données['nomphoto'] == '') // pas d'image | ||
| 118 | { | ||
| 119 | echo('<form method="post" action="modifarticle.php" enctype="multipart/form-data" >'); | ||
| 120 | |||
| 121 | echo('<p><label><b>Ajouter une image à l\'article depuis mon PC / tablette / téléphone:</b></label><br/> | ||
| 122 | <input type="file" name="photo" id="photo" /> | ||
| 123 | <input type="hidden" name="MAX_FILE_SIZE" value="8000000" ></p>'); // nouvelle image | ||
| 124 | |||
| 125 | echo('<p><input type="hidden" name="ligne" id="ligne" value="' | ||
| 126 | . $données['id'] . '" /></p>'); // numéro de la ligne dans la base | ||
| 127 | |||
| 128 | echo('<p><input type="submit" value="VALIDER L\'IMAGE" /></p> | ||
| 129 | </form>'); // bouton | ||
| 130 | } | ||
| 131 | else // y a déjà une image | ||
| 132 | { | ||
| 133 | echo('<form method="post" action="modifarticle.php" enctype="multipart/form-data" >'); | ||
| 134 | |||
| 135 | echo('<p><label><b>Choisir une autre image sur mon PC / tablette / téléphone:</b></label><br/> | ||
| 136 | <input type="file" name="photo" id="photo" /> | ||
| 137 | <input type="hidden" name="MAX_FILE_SIZE" value="8000000" ></p>'); // nouvelle image | ||
| 138 | |||
| 139 | echo('<div><p>Image actuelle =<img src="' . $données['miniature'] . '" alt="aucune" /></p></div>'); // montrer l'image | ||
| 140 | |||
| 141 | echo('<p><input type="hidden" name="ligne" id="ligne" value="' | ||
| 142 | . $données['id'] . '" /></p>'); // numéro de la ligne dans la base | ||
| 143 | |||
| 144 | echo('<p><input type="submit" value="VALIDER LA NOUVELLE IMAGE" /></p> | ||
| 145 | </form>'); // bouton | ||
| 146 | |||
| 147 | // supprimer l'image | ||
| 148 | // utilisation d'un POST au lieu d'un GET pour ne rien révéler de la base de données | ||
| 149 | echo ('<form method="post" action="supprarticle.php" > | ||
| 150 | <p><label><b>Supprimer l\'image illustrant cet article:</b></label></p> | ||
| 151 | <input type="hidden" name="quoi" value="image" > | ||
| 152 | <input type="hidden" name="ligne" value="' . $données['id'] . '" > | ||
| 153 | <p><input type="submit" value="SUPPRIMER L\'IMAGE" /></p> | ||
| 154 | </form>'); | ||
| 155 | |||
| 156 | echo ('<p>Note: pour supprimer uniquement le texte, il suffit que le formulaire "Texte" soit vide et de cliquer sur "VALIDER LE NOUVEAU TEXTE".</p>'); | ||
| 157 | } | ||
| 158 | |||
| 159 | //supprimer tout l'article | ||
| 160 | // utilisation d'un POST au lieu d'un GET pour ne rien révéler de la base de données | ||
| 161 | echo('<form method="post" action="supprarticle.php" > | ||
| 162 | <p><label><b>Supprimer l\'article entier:</b></label></p> | ||
| 163 | <input type="hidden" name="quoi" value="article" > | ||
| 164 | <input type="hidden" name="ligne" value="' . $données['id'] . '" > | ||
| 165 | <p><input type="submit" value="SUPPRIMER L\'ARTICLE" /></p> | ||
| 166 | </form>'); | ||
| 167 | |||
| 168 | echo('<p><b>Ne rien faire tout compte fait.</b></p> | ||
| 169 | <p><a href="../administration.php" >Retour page précédente</a></p>'); | ||
| 170 | |||
| 171 | echo('</article> | ||
| 172 | </section>'); | ||
| 173 | } | ||
| 174 | $réponse->closeCursor(); | ||
| 175 | ?> | ||
| 176 | |||
| 177 | </div> | ||
| 178 | </body> | ||
| 179 | </html> | ||
diff --git a/articles/atelier-franssmann-mpt-penhars.jpg b/articles/atelier-franssmann-mpt-penhars.jpg new file mode 100644 index 0000000..4a6a83f --- /dev/null +++ b/articles/atelier-franssmann-mpt-penhars.jpg | |||
| Binary files differ | |||
diff --git a/articles/baleine-bouchons.jpg b/articles/baleine-bouchons.jpg new file mode 100644 index 0000000..f972330 --- /dev/null +++ b/articles/baleine-bouchons.jpg | |||
| Binary files differ | |||
diff --git a/articles/breizh-color.jpg b/articles/breizh-color.jpg new file mode 100644 index 0000000..61d6611 --- /dev/null +++ b/articles/breizh-color.jpg | |||
| Binary files differ | |||
diff --git a/articles/cafe-philo.jpg b/articles/cafe-philo.jpg new file mode 100644 index 0000000..0904644 --- /dev/null +++ b/articles/cafe-philo.jpg | |||
| Binary files differ | |||
diff --git a/articles/composteur.jpg b/articles/composteur.jpg new file mode 100644 index 0000000..7b700e9 --- /dev/null +++ b/articles/composteur.jpg | |||
| Binary files differ | |||
diff --git a/articles/emmaus.jpg b/articles/emmaus.jpg new file mode 100644 index 0000000..9cfeb9e --- /dev/null +++ b/articles/emmaus.jpg | |||
| Binary files differ | |||
diff --git a/articles/fanfare-invisible-manif-climat.jpg b/articles/fanfare-invisible-manif-climat.jpg new file mode 100644 index 0000000..8642016 --- /dev/null +++ b/articles/fanfare-invisible-manif-climat.jpg | |||
| Binary files differ | |||
diff --git a/articles/housse-ukulele-reduite.jpg b/articles/housse-ukulele-reduite.jpg new file mode 100644 index 0000000..f8fcd6b --- /dev/null +++ b/articles/housse-ukulele-reduite.jpg | |||
| Binary files differ | |||
diff --git a/articles/housse-ukulele.jpg b/articles/housse-ukulele.jpg new file mode 100644 index 0000000..5262b3c --- /dev/null +++ b/articles/housse-ukulele.jpg | |||
| Binary files differ | |||
diff --git a/articles/installation-stand.jpg b/articles/installation-stand.jpg new file mode 100644 index 0000000..5b87c56 --- /dev/null +++ b/articles/installation-stand.jpg | |||
| Binary files differ | |||
diff --git a/articles/kig-ar-farz.jpg b/articles/kig-ar-farz.jpg new file mode 100644 index 0000000..0c94d33 --- /dev/null +++ b/articles/kig-ar-farz.jpg | |||
| Binary files differ | |||
diff --git a/articles/la-guitare-pour-les-nuls.jpg b/articles/la-guitare-pour-les-nuls.jpg new file mode 100644 index 0000000..e359861 --- /dev/null +++ b/articles/la-guitare-pour-les-nuls.jpg | |||
| Binary files differ | |||
diff --git a/articles/lombricomposteur.jpg b/articles/lombricomposteur.jpg new file mode 100644 index 0000000..d3bd801 --- /dev/null +++ b/articles/lombricomposteur.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_a-bout-de-souffle.jpg b/articles/mini_a-bout-de-souffle.jpg new file mode 100644 index 0000000..e4add77 --- /dev/null +++ b/articles/mini_a-bout-de-souffle.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_acoustic-guitar.png b/articles/mini_acoustic-guitar.png new file mode 100644 index 0000000..c330ad4 --- /dev/null +++ b/articles/mini_acoustic-guitar.png | |||
| Binary files differ | |||
diff --git a/articles/mini_atelier-franssmann-mpt-penhars.jpg b/articles/mini_atelier-franssmann-mpt-penhars.jpg new file mode 100644 index 0000000..e1e03d7 --- /dev/null +++ b/articles/mini_atelier-franssmann-mpt-penhars.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_baleine-bouchons.jpg b/articles/mini_baleine-bouchons.jpg new file mode 100644 index 0000000..04354fd --- /dev/null +++ b/articles/mini_baleine-bouchons.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_breizh-color.jpg b/articles/mini_breizh-color.jpg new file mode 100644 index 0000000..d8f820d --- /dev/null +++ b/articles/mini_breizh-color.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_cafe-philo.jpg b/articles/mini_cafe-philo.jpg new file mode 100644 index 0000000..cf2ffa2 --- /dev/null +++ b/articles/mini_cafe-philo.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_composteur.jpg b/articles/mini_composteur.jpg new file mode 100644 index 0000000..aa24816 --- /dev/null +++ b/articles/mini_composteur.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_emmaus.jpg b/articles/mini_emmaus.jpg new file mode 100644 index 0000000..b183b4f --- /dev/null +++ b/articles/mini_emmaus.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_fanfare-invisible-manif-climat.jpg b/articles/mini_fanfare-invisible-manif-climat.jpg new file mode 100644 index 0000000..69490a8 --- /dev/null +++ b/articles/mini_fanfare-invisible-manif-climat.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_housse-ukulele.jpg b/articles/mini_housse-ukulele.jpg new file mode 100644 index 0000000..eec6917 --- /dev/null +++ b/articles/mini_housse-ukulele.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_installation-stand.jpg b/articles/mini_installation-stand.jpg new file mode 100644 index 0000000..eeb7ee2 --- /dev/null +++ b/articles/mini_installation-stand.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_kig-ar-farz.jpg b/articles/mini_kig-ar-farz.jpg new file mode 100644 index 0000000..b45cda5 --- /dev/null +++ b/articles/mini_kig-ar-farz.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_la-guitare-pour-les-nuls.jpg b/articles/mini_la-guitare-pour-les-nuls.jpg new file mode 100644 index 0000000..f8289fc --- /dev/null +++ b/articles/mini_la-guitare-pour-les-nuls.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_lombricomposteur.jpg b/articles/mini_lombricomposteur.jpg new file mode 100644 index 0000000..0fb7bc6 --- /dev/null +++ b/articles/mini_lombricomposteur.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_nettoyage-des-bois.jpg b/articles/mini_nettoyage-des-bois.jpg new file mode 100644 index 0000000..1227a78 --- /dev/null +++ b/articles/mini_nettoyage-des-bois.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_nora-isaac-22-millions-de-vue.jpg b/articles/mini_nora-isaac-22-millions-de-vue.jpg new file mode 100644 index 0000000..aa6b52c --- /dev/null +++ b/articles/mini_nora-isaac-22-millions-de-vue.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_poney.png b/articles/mini_poney.png new file mode 100644 index 0000000..b6e4413 --- /dev/null +++ b/articles/mini_poney.png | |||
| Binary files differ | |||
diff --git a/articles/mini_reseau.png b/articles/mini_reseau.png new file mode 100644 index 0000000..5097a1d --- /dev/null +++ b/articles/mini_reseau.png | |||
| Binary files differ | |||
diff --git a/articles/mini_rouget.jpg b/articles/mini_rouget.jpg new file mode 100644 index 0000000..1e39f49 --- /dev/null +++ b/articles/mini_rouget.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_seules-les-betes.jpg b/articles/mini_seules-les-betes.jpg new file mode 100644 index 0000000..2e50e5b --- /dev/null +++ b/articles/mini_seules-les-betes.jpg | |||
| Binary files differ | |||
diff --git a/articles/mini_surf.png b/articles/mini_surf.png new file mode 100644 index 0000000..73d6e9f --- /dev/null +++ b/articles/mini_surf.png | |||
| Binary files differ | |||
diff --git a/articles/miniatures.php b/articles/miniatures.php new file mode 100644 index 0000000..48f3525 --- /dev/null +++ b/articles/miniatures.php | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | <?php | ||
| 2 | if ($infophoto['extension'] == 'png' OR $infophoto['extension'] == 'PNG') | ||
| 3 | { | ||
| 4 | $source = imagecreatefrompng($nom); | ||
| 5 | $hauteur_source = imagesy($source); | ||
| 6 | |||
| 7 | if ($hauteur_source > 250) | ||
| 8 | { | ||
| 9 | // dimensions des deux images | ||
| 10 | $largeur_source = imagesx($source); | ||
| 11 | $forme = $hauteur_source / $largeur_source; // si image plus haute que large: >1, si plus large: <1 | ||
| 12 | $hauteur_destination = 250; // hauteur arbitraire | ||
| 13 | $largeur_destination = 250 / $forme; // largeur proportionnée | ||
| 14 | |||
| 15 | // créer la miniature | ||
| 16 | $destination = imagecreatetruecolor($largeur_destination, 250); | ||
| 17 | imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); | ||
| 18 | |||
| 19 | // enregistrer la nouvelle image | ||
| 20 | imagepng($destination, $mini_nom); | ||
| 21 | } | ||
| 22 | else | ||
| 23 | { | ||
| 24 | // enregistrer l'image de départ avec le nom d'une miniature | ||
| 25 | imagepng($source, $mini_nom); | ||
| 26 | } | ||
| 27 | } | ||
| 28 | elseif ($infophoto['extension'] == 'jpg' OR $infophoto['extension'] == 'jpeg') | ||
| 29 | { | ||
| 30 | $source = imagecreatefromjpeg($nom); | ||
| 31 | $hauteur_source = imagesy($source); | ||
| 32 | ; | ||
| 33 | if ($hauteur_source > 250) | ||
| 34 | { | ||
| 35 | // dimensions des deux images | ||
| 36 | $largeur_source = imagesx($source); | ||
| 37 | $forme = $hauteur_source / $largeur_source; // si image plus haute que large: >1, si plus large: <1 | ||
| 38 | $hauteur_destination = 250; // hauteur arbitraire | ||
| 39 | $largeur_destination = 250 / $forme; // largeur proportionnée | ||
| 40 | |||
| 41 | // créer la miniature | ||
| 42 | $destination = imagecreatetruecolor($largeur_destination, 250); | ||
| 43 | imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); | ||
| 44 | |||
| 45 | // enregistrer la nouvelle image | ||
| 46 | imagejpeg($destination, $mini_nom); | ||
| 47 | } | ||
| 48 | else | ||
| 49 | { | ||
| 50 | // enregistrer l'image de départ avec le nom d'une miniature | ||
| 51 | imagejpeg($source, $mini_nom); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | elseif ($infophoto['extension'] == 'gif') | ||
| 55 | { | ||
| 56 | $source = imagecreatefromgif($nom); | ||
| 57 | $hauteur_source = imagesy($source); | ||
| 58 | |||
| 59 | if ($hauteur_source > 250) | ||
| 60 | { | ||
| 61 | // dimensions des deux images | ||
| 62 | $largeur_source = imagesx($source); | ||
| 63 | $forme = $hauteur_source / $largeur_source; // si image plus haute que large: >1, si plus large: <1 | ||
| 64 | $hauteur_destination = 250; // hauteur arbitraire | ||
| 65 | $largeur_destination = 250 / $forme; // largeur proportionnée | ||
| 66 | |||
| 67 | // créer la miniature | ||
| 68 | $destination = imagecreatetruecolor($largeur_destination, 250); | ||
| 69 | imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); | ||
| 70 | |||
| 71 | // enregistrer la nouvelle image | ||
| 72 | imagegif($destination, $mini_nom); | ||
| 73 | } | ||
| 74 | else | ||
| 75 | { | ||
| 76 | // enregistrer l'image de départ avec le nom d'une miniature | ||
| 77 | imagegif($source, $mini_nom); | ||
| 78 | } | ||
| 79 | } | ||
| 80 | else // echec à l'enregistrement, la fonction renvoie FALSE | ||
| 81 | { | ||
| 82 | header('Location: ../administration.php'); | ||
| 83 | exit (); | ||
| 84 | } | ||
| 85 | ?> | ||
diff --git a/articles/modifarticle.php b/articles/modifarticle.php new file mode 100644 index 0000000..e8cc827 --- /dev/null +++ b/articles/modifarticle.php | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | <?php | ||
| 2 | // PAGE SÉCURISÉE ! impossible de la voir si la variable $_SESSION['mdpvalide'] ne vaut pas 1 | ||
| 3 | |||
| 4 | session_start(); | ||
| 5 | if (isset ($_SESSION["mdpvalide"])) | ||
| 6 | { | ||
| 7 | if($_SESSION["mdpvalide"]) // booléen, test si ça vaut 1 | ||
| 8 | {} // dans ce cas on fait rien et on laisse php lire la suite | ||
| 9 | else | ||
| 10 | { | ||
| 11 | header('Location: ../connexion.php'); | ||
| 12 | exit (); | ||
| 13 | // exit() sert à interrompre php qui n'a alors surtout pas besoin d'aller jusqu'en bas de la page | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | header('Location: ../connexion.php'); | ||
| 19 | exit (); | ||
| 20 | } | ||
| 21 | |||
| 22 | |||
| 23 | // connexion à la base de données | ||
| 24 | include("../connexionbase.php"); | ||
| 25 | |||
| 26 | |||
| 27 | // récupérer les POST, compléter la base et uploader des photos | ||
| 28 | if (isset ($_FILES['photo'])) | ||
| 29 | { | ||
| 30 | if ($_FILES['photo']['error'] == 0) | ||
| 31 | { | ||
| 32 | // vérification de l'extension | ||
| 33 | $infophoto = pathinfo ($_FILES['photo']['name']); // pathinfo renvoie un tableau, qui contient notamment l'extension du fichier | ||
| 34 | $extautorisées = array ('jpg', 'jpeg', 'png', 'gif', 'JPG', 'JPEG', 'PNG', 'GIF'); | ||
| 35 | if (in_array ($infophoto['extension'], $extautorisées)) // on compare l'extension dans le tableau avec les extensions qu'on a choisi | ||
| 36 | { | ||
| 37 | // on récupère la variable $nom | ||
| 38 | $nom = basename ($_FILES['photo']['name']); | ||
| 39 | |||
| 40 | // vérification et formatage du nom du fichier | ||
| 41 | // supprimer les accents, problème: la méthode avec la fonction strstr marche mal avec l'UTF-8, | ||
| 42 | // on préfèrera celle-ci qui utilise str_replace et qui marche mieux (mais pas avec les majuscules accentuées): | ||
| 43 | $nom = str_replace( | ||
| 44 | array('à','â','ä','á','ã','å','î','ï','ì','í','ô','ö','ò','ó','õ','ø','ù','û','ü','ú','é','è','ê','ë','ç','ÿ','ñ'), | ||
| 45 | array('a','a','a','a','a','a','i','i','i','i','o','o','o','o','o','o','u','u','u','u','e','e','e','e','c','y','n'), | ||
| 46 | $nom); | ||
| 47 | // minuscules | ||
| 48 | $nom = mb_strtolower($nom, 'UTF-8'); | ||
| 49 | $infophoto['extension'] = mb_strtolower($infophoto['extension'], 'UTF-8'); | ||
| 50 | // ce qui n'est pas une lettre ou un chiffre est remplacé par un tiret, y compris les espaces | ||
| 51 | $nom = preg_replace('/([^.a-z0-9]+)/i', '-', $nom); | ||
| 52 | |||
| 53 | // modification de l'image | ||
| 54 | if (move_uploaded_file ($_FILES['photo']['tmp_name'], '/var/www/lelionetlecolibri.ordipolo.fr/articles/' . $nom)) | ||
| 55 | // on doit pouvoir écrire dans le dossier d'arrivée (mettre le chemin absolu) et dans /tmp | ||
| 56 | // pour permettre à PHP l'écriture et la traversée du dossier, taper: sudo chmod 733 /var/www/dossier/qu'on/veut | ||
| 57 | { | ||
| 58 | // nom de la miniature | ||
| 59 | $mini_nom = "mini_" . $nom; | ||
| 60 | |||
| 61 | $requête = $base->prepare('UPDATE articles SET nomphoto = :photo, miniature = :mini WHERE id = :li'); | ||
| 62 | $requête->execute(array( | ||
| 63 | 'photo' => $nom, | ||
| 64 | 'mini' => $mini_nom, | ||
| 65 | 'li' => $_POST['ligne'] | ||
| 66 | )); | ||
| 67 | |||
| 68 | // création d'une miniature | ||
| 69 | include("miniatures.php"); | ||
| 70 | |||
| 71 | header('Location: ../administration.php?nouvarticle=6'); // succès, move_uploaded_file renvoie la valeur TRUE | ||
| 72 | exit (); | ||
| 73 | } | ||
| 74 | else // echec à l'enregistrement, la fonction renvoie FALSE | ||
| 75 | { | ||
| 76 | header('Location: ../administration.php?nouvarticle=4'); | ||
| 77 | exit (); | ||
| 78 | } | ||
| 79 | } | ||
| 80 | else // mauvais format | ||
| 81 | { | ||
| 82 | header('Location: ../administration.php?nouvarticle=3'); | ||
| 83 | exit (); | ||
| 84 | } | ||
| 85 | } | ||
| 86 | else | ||
| 87 | { | ||
| 88 | header('Location: ../administration.php?nouvarticle=7'); | ||
| 89 | exit (); | ||
| 90 | } | ||
| 91 | } | ||
| 92 | elseif ($_POST['titre'] != '') // il faut au moins mettre un titre | ||
| 93 | { | ||
| 94 | // modification du texte | ||
| 95 | echo $_POST['ligne']; | ||
| 96 | |||
| 97 | $requête = $base->prepare('UPDATE articles SET nomarticle = :tit, contenu = :cont WHERE id = :li'); | ||
| 98 | $requête->execute(array( | ||
| 99 | 'tit' => $_POST['titre'], | ||
| 100 | 'cont' => $_POST['article'], | ||
| 101 | 'li' => $_POST['ligne'] | ||
| 102 | )); | ||
| 103 | |||
| 104 | header('Location: ../administration.php?nouvarticle=6'); | ||
| 105 | exit (); | ||
| 106 | } | ||
| 107 | else // pas de photo ni titre | ||
| 108 | { | ||
| 109 | header('Location: ../administration.php?nouvarticle=1'); | ||
| 110 | } | ||
| 111 | ?> | ||
diff --git a/articles/nettoyage-des-bois.jpg b/articles/nettoyage-des-bois.jpg new file mode 100644 index 0000000..bc91586 --- /dev/null +++ b/articles/nettoyage-des-bois.jpg | |||
| Binary files differ | |||
diff --git a/articles/nora-isaac-22-millions-de-vue.jpg b/articles/nora-isaac-22-millions-de-vue.jpg new file mode 100644 index 0000000..b6595cf --- /dev/null +++ b/articles/nora-isaac-22-millions-de-vue.jpg | |||
| Binary files differ | |||
diff --git a/articles/poney.png b/articles/poney.png new file mode 100644 index 0000000..eb3a7fd --- /dev/null +++ b/articles/poney.png | |||
| Binary files differ | |||
diff --git a/articles/reseau.png b/articles/reseau.png new file mode 100644 index 0000000..59f36c9 --- /dev/null +++ b/articles/reseau.png | |||
| Binary files differ | |||
diff --git a/articles/rouget.jpg b/articles/rouget.jpg new file mode 100644 index 0000000..5c581c1 --- /dev/null +++ b/articles/rouget.jpg | |||
| Binary files differ | |||
diff --git a/articles/seules-les-betes.jpg b/articles/seules-les-betes.jpg new file mode 100644 index 0000000..f85f57f --- /dev/null +++ b/articles/seules-les-betes.jpg | |||
| Binary files differ | |||
diff --git a/articles/supprarticle.php b/articles/supprarticle.php new file mode 100644 index 0000000..53b2477 --- /dev/null +++ b/articles/supprarticle.php | |||
| @@ -0,0 +1,131 @@ | |||
| 1 | <?php | ||
| 2 | // PAGE SÉCURISÉE ! impossible de la voir si la variable $_SESSION['mdpvalide'] ne vaut pas 1 | ||
| 3 | |||
| 4 | session_start(); | ||
| 5 | if (isset ($_SESSION["mdpvalide"])) | ||
| 6 | { | ||
| 7 | if($_SESSION["mdpvalide"]) // booléen, test si ça vaut 1 | ||
| 8 | {} // dans ce cas on fait rien et on laisse php lire la suite | ||
| 9 | else | ||
| 10 | { | ||
| 11 | header('Location: ../connexion.php'); | ||
| 12 | exit (); | ||
| 13 | // exit() sert à interrompre php qui n'a alors surtout pas besoin d'aller jusqu'en bas de la page | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | header('Location: ../connexion.php'); | ||
| 19 | exit (); | ||
| 20 | } | ||
| 21 | ?> | ||
| 22 | |||
| 23 | <!DOCTYPE html> | ||
| 24 | <html lang="fr" > | ||
| 25 | <head> | ||
| 26 | <meta charset="utf-8" /> | ||
| 27 | <title>suppression définitive</title> | ||
| 28 | <link rel="shortcut icon" type="image/x-icon" href="../favicon.ico" /> | ||
| 29 | <link rel="stylesheet" href="../blog.css" /> | ||
| 30 | <meta name="viewport" content="width=device-width" /> | ||
| 31 | <style> | ||
| 32 | section | ||
| 33 | { | ||
| 34 | margin: 10px 0px; | ||
| 35 | padding: 10px; | ||
| 36 | width: 960px; | ||
| 37 | } | ||
| 38 | </style> | ||
| 39 | </head> | ||
| 40 | |||
| 41 | <body> | ||
| 42 | <div id="bloc_page"> | ||
| 43 | <header> | ||
| 44 | <h1><img class="sakura" src="../sakura.png" alt="sakura" /> | ||
| 45 | Suppression définitive !! | ||
| 46 | <img class="sakura" src="../sakura.png" alt="sakura" /></h1> | ||
| 47 | </header> | ||
| 48 | |||
| 49 | <li id="admin" > | ||
| 50 | <p><a href="articlesliste.php" >retour page précédente</a></p> | ||
| 51 | </li> | ||
| 52 | |||
| 53 | <section> | ||
| 54 | |||
| 55 | <?php | ||
| 56 | // connexion à la base de données | ||
| 57 | include("../connexionbase.php"); | ||
| 58 | |||
| 59 | // confirmation suppression de l'image | ||
| 60 | if ($_POST['quoi'] == 'image') | ||
| 61 | { | ||
| 62 | $requête = $base->prepare('SELECT nomarticle, contenu, nomphoto, DATE_FORMAT(dateheure, \'article ajouté le %d/%m/%Y à %Hh%i\') | ||
| 63 | AS date FROM articles WHERE id = :li'); | ||
| 64 | $requête->execute(array( | ||
| 65 | 'li' => $_POST['ligne'] | ||
| 66 | )); | ||
| 67 | while ($données = $requête->fetch()) | ||
| 68 | { | ||
| 69 | echo('<p><i>Vous êtes sur le point de supprimer définitivement l\'image liée à cet article.</i></p>'); | ||
| 70 | echo('<article><p class="dateheure" >' . $données['date'] . '</p>'); | ||
| 71 | echo('<h2>' . htmlspecialchars($données['nomarticle']) . '</h2>'); | ||
| 72 | echo('<div class="contenu" > | ||
| 73 | <div><img src="' . $données['nomphoto'] . '" alt="" /></div>'); | ||
| 74 | echo('<div class="contenutexte" ><pre>' . htmlspecialchars($données['contenu']) . '</pre></div> | ||
| 75 | </div></article>'); | ||
| 76 | |||
| 77 | echo('<p><i><b>Êtes-vous sûr de vouloir supprimer définitivement cette image?<br/> | ||
| 78 | Cliquer sur le bouton ci-dessous pour confirmer:</b></i></p>'); | ||
| 79 | |||
| 80 | echo('<form method="post" action="supprconfirmée.php" > | ||
| 81 | <input type="hidden" name="quoi" value="image" > | ||
| 82 | <input type="hidden" name="confirmation" value="oui" > | ||
| 83 | <input type="hidden" name="ligne" value="' . $_POST['ligne'] . '" > | ||
| 84 | <p><input type="submit" value="CONFIRMER" /></p> | ||
| 85 | </form>'); | ||
| 86 | } | ||
| 87 | $requête->closeCursor(); | ||
| 88 | |||
| 89 | } | ||
| 90 | // confirmation suppression de l'article entier | ||
| 91 | elseif ($_POST['quoi'] == 'article') | ||
| 92 | { | ||
| 93 | $requête = $base->prepare('SELECT nomarticle, contenu, nomphoto, DATE_FORMAT(dateheure, \'article ajouté le %d/%m/%Y à %Hh%i\') | ||
| 94 | AS date FROM articles WHERE id = :li'); | ||
| 95 | $requête->execute(array( | ||
| 96 | 'li' => $_POST['ligne'] | ||
| 97 | )); | ||
| 98 | while ($données = $requête->fetch()) | ||
| 99 | { | ||
| 100 | echo('<p><i>Vous êtes sur le point de supprimer définitivement cet article (le texte, l\'image, tout).</i></p>'); | ||
| 101 | echo('<article><p class="dateheure" >' . $données['date'] . '</p>'); | ||
| 102 | echo('<h2>' . htmlspecialchars($données['nomarticle']) . '</h2>'); | ||
| 103 | echo('<div class="contenu" > | ||
| 104 | <div><img src="' . $données['nomphoto'] . '" alt="" /></div>'); | ||
| 105 | echo('<div class="contenutexte" ><pre>' . htmlspecialchars($données['contenu']) . '</pre></div> | ||
| 106 | </div></article>'); | ||
| 107 | |||
| 108 | echo('<p><i><b>Êtes-vous sûr de vouloir supprimer définitivement cet article?<br/> | ||
| 109 | Cliquer sur le bouton ci-dessous pour confirmer:</b></i></p>'); | ||
| 110 | |||
| 111 | echo('<form method="post" action="supprconfirmée.php" > | ||
| 112 | <input type="hidden" name="quoi" value="article" > | ||
| 113 | <input type="hidden" name="confirmation" value="oui" > | ||
| 114 | <input type="hidden" name="ligne" value="' . $_POST['ligne'] . '" > | ||
| 115 | <p><input type="submit" value="CONFIRMER" /></p> | ||
| 116 | </form>'); | ||
| 117 | } | ||
| 118 | $requête->closeCursor(); | ||
| 119 | |||
| 120 | } | ||
| 121 | else | ||
| 122 | { | ||
| 123 | header('Location: articlesliste.php'); | ||
| 124 | exit (); | ||
| 125 | } | ||
| 126 | ?> | ||
| 127 | |||
| 128 | </section> | ||
| 129 | </div> | ||
| 130 | </body> | ||
| 131 | </html> | ||
diff --git a/articles/supprconfirmée.php b/articles/supprconfirmée.php new file mode 100644 index 0000000..0b5c08a --- /dev/null +++ b/articles/supprconfirmée.php | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | <?php | ||
| 2 | // PAGE SÉCURISÉE ! impossible de la voir si la variable $_SESSION['mdpvalide'] ne vaut pas 1 | ||
| 3 | |||
| 4 | session_start(); | ||
| 5 | if (isset ($_SESSION["mdpvalide"])) | ||
| 6 | { | ||
| 7 | if($_SESSION["mdpvalide"]) // booléen, test si ça vaut 1 | ||
| 8 | {} // dans ce cas on fait rien et on laisse php lire la suite | ||
| 9 | else | ||
| 10 | { | ||
| 11 | header('Location: ../connexion.php'); | ||
| 12 | exit (); | ||
| 13 | // exit() sert à interrompre php qui n'a alors surtout pas besoin d'aller jusqu'en bas de la page | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | header('Location: ../connexion.php'); | ||
| 19 | exit (); | ||
| 20 | } | ||
| 21 | |||
| 22 | |||
| 23 | // connexion à la base de données | ||
| 24 | include("../connexionbase.php"); | ||
| 25 | |||
| 26 | |||
| 27 | // supprimer l'image | ||
| 28 | if (isset ($_POST['quoi']) AND ($_POST['confirmation'])) | ||
| 29 | { | ||
| 30 | if ($_POST['quoi'] == 'image' AND $_POST['confirmation'] == 'oui' ) | ||
| 31 | { | ||
| 32 | // pour l'image | ||
| 33 | $requête = $base->prepare('SELECT nomphoto, miniature FROM articles WHERE id = :li'); | ||
| 34 | $requête->execute(array( | ||
| 35 | 'li' => $_POST['ligne'] | ||
| 36 | )); | ||
| 37 | while ($données = $requête->fetch()) | ||
| 38 | { | ||
| 39 | unlink ($données['nomphoto']); | ||
| 40 | unlink ($données['miniature']); | ||
| 41 | } | ||
| 42 | |||
| 43 | // pour le nom de l'image dans la base de données | ||
| 44 | $requête = $base->prepare('UPDATE articles SET nomphoto = \'\', miniature = \'\' WHERE id = :li'); | ||
| 45 | $requête->execute(array( | ||
| 46 | 'li' => $_POST['ligne'] | ||
| 47 | )); | ||
| 48 | |||
| 49 | header('Location: articlesliste.php?suppr=1'); | ||
| 50 | exit (); | ||
| 51 | } | ||
| 52 | elseif ($_POST['quoi'] == 'article' AND $_POST['confirmation'] == 'oui' ) | ||
| 53 | { | ||
| 54 | // pour l'image | ||
| 55 | $requête = $base->prepare('SELECT nomphoto, miniature FROM articles WHERE id = :li'); | ||
| 56 | $requête->execute(array( | ||
| 57 | 'li' => $_POST['ligne'] | ||
| 58 | )); | ||
| 59 | while ($données = $requête->fetch()) | ||
| 60 | { | ||
| 61 | unlink ($données['nomphoto']); | ||
| 62 | unlink ($données['miniature']); | ||
| 63 | } | ||
| 64 | |||
| 65 | // pour la ligne dans la base de données | ||
| 66 | $requête = $base->prepare('DELETE FROM articles WHERE id = :li'); | ||
| 67 | $requête->execute(array( | ||
| 68 | 'li' => $_POST['ligne'] | ||
| 69 | )); | ||
| 70 | |||
| 71 | header('Location: articlesliste.php?suppr=2'); | ||
| 72 | exit (); | ||
| 73 | } | ||
| 74 | else | ||
| 75 | { | ||
| 76 | header('Location: articlesliste.php?erreursuppr=1'); | ||
| 77 | exit (); | ||
| 78 | } | ||
| 79 | } | ||
| 80 | else | ||
| 81 | { | ||
| 82 | header('Location: articlesliste.php?erreursuppr=1'); | ||
| 83 | exit (); | ||
| 84 | } | ||
| 85 | ?> | ||
diff --git a/articles/surf.png b/articles/surf.png new file mode 100644 index 0000000..eb6c2df --- /dev/null +++ b/articles/surf.png | |||
| Binary files differ | |||
