From 0d2fd7a0a53c527d3f6f112a149960a52c1082e1 Mon Sep 17 00:00:00 2001
From: polo Infos qui seront affichées sur cette page:
+
+ Nouvel album
+
+
+
+
+
+
+
+ 0)
{
+ if(empty($texte))
+ {
+ header('Location: index.php?erreur=empty_input');
+ }
+
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
$texte = trim($texte);
@@ -34,8 +41,11 @@ function preparationCKeditor($numArticle, $texte)
// réception du HTML créé par l'éditeur
// le nom du fichier est celui dans $_SESSION['nomFichier']
-function submitCKeditor($page, $nomFichier, $contenu)
+function submitCKeditor($nomFichier)
{
+ $page = $_GET['page'];
+ $contenu = $_POST['contenu'];
+
// déjà fait mais on ne sait jamais
if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1)
{
@@ -43,30 +53,45 @@ function submitCKeditor($page, $nomFichier, $contenu)
}
else
{
- // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur)
- // on évitera de perdre un article existant par erreur !!
+ // récupérer les liens multimedia
+ //require("media.php");
+ //$contenu = mediaSubmit($contenu);
+
+ // sécurité faille XSS
+ $configHtmLawed = array(
+ 'safe'=>1, // protection contre les élements et attributs dangereux
+ 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
+ 'deny_attribute'=>'id', // gêner le JS hostile
+ // on garde 'class' et 'style' utilisés par le ckediteur
+ );
+ $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
+ }
+
+ if($page == 'discographie')
+ {
+ $titre = $_POST['titre'];
+ $annee = $_POST['annee'];
+ $pochette = $_POST['pochette'];
+
+ $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed);
+ $titre = trim($titre);
+ $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
+ $annee = htmLawed($annee, $configHtmLawed, $specHtmLawed);
+ $annee = trim($annee);
+ $contenu = trim($contenu);
+ }
+ else // pages comme "melaine"
+ {
+ // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !!
if($contenu == '')
{
header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
}
else
{
- // récupérer les liens multimedia
- //require("media.php");
- //$contenu = mediaSubmit($contenu);
-
- // sécurité faille XSS
- $configHtmLawed = array(
- 'safe'=>1, // protection contre les élements et attributs dangereux
- 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
- // paramètre optionnel: les balises non indiquées sont supprimées
- 'deny_attribute'=>'id', // gêner le JS hostile
- // on garde 'class' et 'style' utilisés par l'ckediteur
- );
- $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
+ // failles XSS
$contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
-
- // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
+ // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
$contenu = trim($contenu);
}
}
@@ -81,22 +106,42 @@ function submitCKeditor($page, $nomFichier, $contenu)
// solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '';
// pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert...
- // echo($page);
- // echo($article);
- // echo($contenu);
- // die();
+ //var_dump($titre, $annee, $pochette, $contenu);
+ //die();
+
+ // modèle
+ $Article = new ArticlesManager;
+ $Article->setPage($page);
// enregistrement
- require('model/melaine-write.php');
if($_GET['article'] == 0)
{
- nouvelArticle($page, $contenu);
+ $Article->create($contenu);
}
else
{
- modifArticle($page, $nomFichier, $contenu);
+ $Article->setFileName($nomFichier);
+ $Article->update($contenu);
+ }
+
+ if($page == 'discographie')
+ {
+ $Album = new AlbumsManager;
+
+ var_dump($_POST);
+ echo('
');
+ //var_dump($_GET['article']);
+
+ // enregistrement
+ if($_GET['article'] == 0)
+ {
+ // ERREUR, il faut le même nombre de paramètre pour une méthode du même nom
+ $Album->create($titre, $annee, $pochette);
+ }
+ else
+ {
+ $Album->update($titre, $annee, $pochette);
+ }
+ die();
}
-
- // debuggage
- //exit();
}
\ No newline at end of file
diff --git a/controller/installation.php b/controller/installation.php
index 4d5791a..b15dce1 100644
--- a/controller/installation.php
+++ b/controller/installation.php
@@ -48,7 +48,7 @@ function installation()
// - modifier soit-même les droits du dossier data (777), quoique 111 serait pas mal non plus
// - modifier ceux du dossier parent (nom du site) avec son client FTP à la mise en ligne chez l'hébergeur et ensuite remettre tout comme avant
- $listePages = array('melaine', 'disco', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives');
+ $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives');
foreach ($listePages as $page)
{
if(!file_exists('data/' . $page))
@@ -56,6 +56,12 @@ function installation()
mkdir('data/' . $page);
chmod('data/' . $page, 0777);
}
+ // un dossier en plus dans discographie
+ if(!file_exists('data/discographie/json'))
+ {
+ mkdir('data/discographie/json');
+ chmod('data/discographie/json', 0777);
+ }
if(!file_exists('data/' . $page . '/html'))
{
mkdir('data/' . $page . '/html');
diff --git a/controller/visitor.php b/controller/visitor.php
index a08ea95..6fa0822 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -32,9 +32,12 @@ function melaineVisitor()
$page_actuelle = "melaine";
$title = "Mais qui est Melaine Favennec?";
- // tableau $articles
- $croissant = False;
- $articles = lireArticles($page_actuelle, $croissant);
+ // modèle
+ $Articles = new ArticlesManager;
+ $Articles->setPage($page_actuelle);
+ $Articles->getFiles();
+ $Articles->reverseFilesArray();
+ $articles = $Articles->getAll();
// vérification pour protéger les visiteurs
// normalement déjà faite dans submit.php, au cas où la base a été trafiquée
@@ -46,8 +49,19 @@ function melaineVisitor()
require('view/template.php');
}
-function discographie()
-{}
+function discoVisitor()
+{
+ $page_actuelle = "discographie";
+ $title = "Discographie";
+
+ // modèle
+ $Albums = new AlbumsManager;
+
+ // variables $css, $js et $content
+ require('view/discographie.php');
+ // HTML
+ require('view/template.php');
+}
function presse()
{}
diff --git "a/data/melaine/images/\303\242non.jpg" "b/data/melaine/images/\303\242non.jpg"
new file mode 100644
index 0000000..5bac4ee
Binary files /dev/null and "b/data/melaine/images/\303\242non.jpg" differ
diff --git a/imageAJAX.php b/imageAJAX.php
index 49c856d..0831986 100644
--- a/imageAJAX.php
+++ b/imageAJAX.php
@@ -1,4 +1,6 @@
$_FILES['upload']['name'],
- //~ 'type' => $_FILES['upload']['type'],
- //~ 'tmp_name' => $_FILES['upload']['tmp_name'],
- //~ 'error' => $_FILES['upload']['error'],
- //~ 'size' => $_FILES['upload']['size']
-//~ );
-// print_r sert à "afficher" un tableau,
-// le 2ème paramètre 'true' permet de produire une simple chaine au lieu d'un affichage HTML
-// $tableau = print_r($_FILES, true);
-// $nom_fichier = "POST_AJAX.log";
-// $fichier = fopen('data/' . $page . '/images/' . $nom_fichier, 'w');
-// // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
-// fputs($fichier, $tableau);
-// fclose($fichier);
-// chmod('data/' . $page . '/images/' . $nom_fichier, 0666);
+/*print_r($_FILES);
+$upload = array(
+ 'name' => $_FILES['upload']['name'],
+ 'type' => $_FILES['upload']['type'],
+ 'tmp_name' => $_FILES['upload']['tmp_name'],
+ 'error' => $_FILES['upload']['error'],
+ 'size' => $_FILES['upload']['size']
+);
+print_r($upload);*/
+
+session_start();
+// et une backdoor de fermée!
+if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 || !isset($_FILES['upload']) || empty($_FILES['upload']))
+{
+ header('Location: index.php?erreur=imageajax');
+}
+// get envoyé avec le javascript
+$page = $_GET['page'];
// déjà fait dans installation.php
if(!file_exists('data/' . $page . '/images'))
diff --git a/index.php b/index.php
index ccce82a..0b6c945 100644
--- a/index.php
+++ b/index.php
@@ -2,48 +2,41 @@
// index.php
//
// routeur MVC ou controlleur principal
-// il récupère les GET, inclut les contrôleurs et appelle des fonctions
+// il traite les GET et passe la main aux contrôleurs
+//
// ce site utilise une architecture Modèle-Vue-Contrôleur (MVC)
// le schéma ci-dessous représente le sens dans lequel le code est interprété
//
-// modèle
-// ^ |
-// | v
+// modèle
+// ^ |
+// | v
// routeur --> contrôleur
-// |
-// v
-// vue ---> envoi de la page au client
+// |
+// v
+// vue ---> envoi de la page au client
//
// pour retrouver quelque chose dans le code, il suffit de suivre un chemin linéaire dont le départ est ici
// pas de croisement, pas de marche arrière, impossible de se perdre!
+// autre avantage: les chemins sont tous relatifs et sont toujours bons, parce que tous les fichiers sont "inclus" dans index.php
//
-// à la racine de l'arbre des fichiers nous avons:
-// - 1 fichier index.php sur lequel se greffe tout le reste
-// - 4 dossiers pricipaux: controller - model - view - public
-// un avantage est que les chemins sont tous relatifs, partent tous de la racine du site et sont toujours bons
-
// Les dossiers:
-// -> contrôleurs: traitements en PHP pur
-// -> modèles: interface entre PHP et données, on y trouve le SQL ou la manipulation de fichiers textes, le PHP y est générlement orienté objet
-// -> vues: le PHP y produit le HTML, il construit les pages,
-// le mélange PHP/HTML étant très vite assez dégueulasse, le HTML figé à placé à part dans le fichier view/template.php
-// -> le dossier public contient CSS, JS, images, polices, medias, etc, il est utilisé par le template
-// -> le dossier lib contient les bibliothèques, il contient notamment le ckeditor qui occupe une place centrale dans le projet, on y trouve aussi la bibli htmLawed qui protège des données dangereuses (failles XSS)
-// -> le dossier data qui est techniquement séparé du site
+// -> controller: traitements en PHP pur
+// -> model: interface entre PHP et données, on y trouve le SQL ou la manipulation de fichiers textes, le PHP y est orienté objet
+// -> view: le PHP y produit le HTML, il construit les pages,
+// le mélange PHP/HTML étant très vite assez dégueulasse, le HTML figé est placé à part dans le fichier view/template.php
+// -> public: contient CSS, JS, images, polices, medias, etc, il est utilisé par template.php
+// -> lib: les bibliothèques, on y trouve en particulier le ckeditor qui occupe une place centrale dans le projet, et aussi htmLawed qui nettoie le HTML produit par l'éditeur (failles XSS)
+// -> data: comme son nom l'indique
//
-// pour le reste nous avons:
-// - le fichier imageAJAX.php traitant les requêtes AJAX
-// ce fichier est appelé sans index.php et est pour cette raison un peu spécial
-// - 1 fichier .htaccess pour la sécurité (configurer le httpd.conf peut être nécessaire)
-// - 1 fichier erreur404.php (fonctionne avec .htaccess)
-// - des bibliothèques externes dans lib:
-// ckeditor5, ckfinder, htmlawed et HtmlFormatter
+// Quelques fichiers spéciaux (indépendants de index.php):
+// - imageAJAX.php traite les requêtes AJAX envoyées par l'éditeur
+// - .htaccess pour la sécurité (configurer le httpd.conf d'apache peut être nécessaire)
+// - erreur404.php (fonctionne avec .htaccess)
//
// le dossier data et son contenu sont "normalement" autorisés en écriture pour deux raisons:
// - placer le contenu pré-existant avec son client FTP
// - autoriser PHP (sinon, c'est comme si on avait un site statique)
-//
-// pour pouvoir installer le site en n'ayant qu'à modifier les droits du dossier data uniquement et éviter les situations pénibles ou l'utilisateur est bloqué sans rien comprendre, on pourra créer ou utiliser des sauvegardes au format ZIP depuis une page spéciale accessible avec le compte admin
+// -> pour pouvoir installer le site en n'ayant qu'à modifier les droits du dossier data uniquement et éviter les situations pénibles ou l'utilisateur est bloqué sans rien comprendre, on pourra créer ou utiliser des sauvegardes au format ZIP depuis une page spéciale accessible avec le compte admin
// au premier démarrage du site
require('controller/installation.php');
@@ -58,25 +51,25 @@ installation();
// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
session_start();
-// sécurité failles XSS
-require('lib/htmlawed/htmLawed.php');
-
// traitement des POST du ckeditor
// la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET
if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
&& isset($_GET['action']) && $_GET['action'] == 'submit'
&& isset($_POST['contenu']) && $_POST['contenu'] != '')
{
- require('controller/ckeditor.php');
+ require('controller/ckeditor.php'); // traitement du POST
+ require('lib/htmlawed/htmLawed.php'); // failles XSS
+ require('model/Classes.php'); // modèle
+
// modification
if(isset($_SESSION['nomFichier']))
{
- submitCKeditor($_GET['page'], $_SESSION['nomFichier'], $_POST['contenu']);
+ submitCKeditor($_SESSION['nomFichier']);
}
// nouvel article
else
{
- submitCKeditor($_GET['page'], '', $_POST['contenu']);
+ submitCKeditor('');
}
// nettoyage
@@ -87,12 +80,12 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
}
// déconnexion: nettoyer et recharger la page
-if(isset($_GET['action']))
+if(isset($_GET['action']) && isset($_GET['page']))
{
if($_GET['action'] == "deconnexion")
{
$_SESSION['admin'] = 0;
- header('Location: index.php');
+ header('Location: index.php?page=' . $_GET['page']);
}
}
@@ -107,7 +100,7 @@ require('controller/visitor.php');
// utile pour presque toutes les pages
if(isset($_GET['page']) && $_GET['page'] != 'menu')
{
- require('model/melaine-read.php');
+ require('model/Classes.php');
}
// contrôleur des pages en mode admin
@@ -136,43 +129,72 @@ if(isset($_GET['page']))
// page melaine
elseif($_GET['page'] == 'melaine')
{
- // ouverture de l'éditeur pour modification
+ // Si ouverture de l'éditeur pour modification:
// le lien utilisé pour ouvrir l'éditeur contient un GET avec le numéro de l'article, mais pas le nom du fichier que le visiteur ne doit pas voir
// GET, POST, cookies => navigation (utiles au visiteur)
// sessions => action
// c'est ici qu'on passe des GET aux sessions
// on associe maintenant le numéro de l'article et le nom du fichier, l'article déjà existant inséré dans l'éditeur DOIT être celui qui sera modifié
- //
+
if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor')
{
// modification
- // A MODIFIER! on a aussi besoin du nom du fichier,
- // infos à mettre dans la session!
-
if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0)
{
- // obtenir le nom du fichier à l'aide du modèle
- $_SESSION['nomFichier'] = getFileName($_GET['page'], $_GET['article']);
-
- melaineEdit($_GET['article']);
+ melaineEdit($_GET['article'], 0);
}
// nouvel article
else
{
- // prévenir une hypothétique perte de donnée
+ // par sécurité
if(isset($_SESSION['nomFichier']))
{
unset($_SESSION['nomFichier']);
}
-
- melaineEdit(0);
+ melaineEdit(0, 0);
}
}
+ // suppression
+ else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
+ {
+ melaineEdit($_GET['article'], 1);
+ }
else
{
melaineVisitor();
}
}
+ // page discographie
+ elseif($_GET['page'] == 'discographie')
+ {
+ if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition')
+ {
+ // modification
+ if(isset($_GET['album']) && is_numeric($_GET['album']) && $_GET['album'] > 0)
+ {
+ discoEdit($_GET['album'], 0);
+ }
+ // nouvel article
+ else
+ {
+ // par sécurité
+ if(isset($_SESSION['nomFichier']))
+ {
+ unset($_SESSION['nomFichier']);
+ }
+ discoEdit(0, 0);
+ }
+ }
+ // suppression
+ else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
+ {
+ discoEdit($_GET['album'], 1);
+ }
+ else
+ {
+ discoVisitor();
+ }
+ }
// page connexion au mode admin
elseif($_GET['page'] == 'connexion')
{
diff --git a/model/Article.php b/model/Article.php
deleted file mode 100644
index aee4f5d..0000000
--- a/model/Article.php
+++ /dev/null
@@ -1,92 +0,0 @@
-page == '')
- {
- die("debug: la méthode setPage() doit être appelée avant toute autre.");
- }
-
- $this->files = glob('data/' . $this->page . '/html/*.html');
-
- if($croissant == False)
- {
- $files = array_reverse($files);
- }
-
- $this->nbArticles = count($this->files);
- }
-
- // fonctions CRUD (create - read - update - delete)
- // ce sont les 4 opérations de base qu'un programme doit permettre pour être complet
-
- // create
- public function create($content)
- {
- if($this->page == '')
- {
- die("debug: la méthode setPage() doit être appelée avant toute autre.");
- }
-
- $nom_fichier = time() . '.html';
- $fichier = fopen('data/' . $this->page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
- fputs($fichier, $content);
- fclose($fichier);
- chmod('data/' . $this->page . '/html/' . $nom_fichier, 0666);
- }
-
- // read
- public function getNumber()
- {
- return $this->nbArticles;
- }
-
- public function getOne()
- {}
-
- public function getAll($croissant)
- {
- $this->croissant = $croissant; // inversion de $files?
- getFiles();
-
- $i = 0;
- $articles = array();
- foreach ($this->files as $file)
- {
- $articles[$i] = file_get_contents($file);
- $i++;
- }
-
- return $articles;
- }
-
- public function getDate($fileNumber)
- {
- // le 2è paramètre exclut le suffixe .html
- $timestamp = basename($this->files[$fileNumber], '.html');
- return getdate($timestamp);
- }
-
- // update
- public function update()
- {}
-
- public function setPage($page)
- {
- $this->page = $page;
- }
-
- // delete
- public function delete()
- {}
-}
diff --git a/model/Classes.php b/model/Classes.php
new file mode 100644
index 0000000..d940e53
--- /dev/null
+++ b/model/Classes.php
@@ -0,0 +1,176 @@
+page = $page;
+ }
+
+ //public function setAscending($croissant)
+ //{
+ // $this->Ascending = $croissant;
+ //}
+
+ public function findFileName($numArticle)
+ {
+ $this->fileName = $this->files[$numArticle - 1];
+ }
+
+ public function setFileName($nomFichier)
+ {
+ $this->fileName = $nomFichier;
+ }
+
+ // GET
+ public function getPage()
+ {
+ return($this->page);
+ }
+
+ public function getFileName()
+ {
+ return($this->fileName);
+ }
+
+ public function nbArticles()
+ {
+ return($this->nbArticles);
+ }
+
+
+ // tableau des noms des articles
+ public function getFiles()
+ {
+ if($this->page == '')
+ {
+ die("debug: la méthode setPage() doit être appelée avant toute autre.");
+ }
+
+ $this->files = glob('data/' . $this->page . '/html/*.html');
+
+ //$this->nbArticles = count($this->files);
+ }
+
+ // ordre du tableau des noms de fichiers
+ public function reverseFilesArray()
+ {
+ $this->files = array_reverse($this->files);
+ }
+
+
+ // fonctions CRUD (create - read - update - delete)
+ // ce sont les 4 opérations de base qu'un programme doit permettre pour être complet
+
+ // create
+ public function create($content)
+ {
+ if($this->page == '')
+ {
+ die("debug: la méthode setPage() doit être appelée avant toute autre.");
+ }
+
+ // nommer les fichiers avec le timestamp
+ // - trie par ordre chronologique
+ // - rendre quasi impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence")
+ $nom_fichier = 'data/' . $this->page . '/html/' . time() . '.html';
+
+ $fichier = fopen($nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
+ fputs($fichier, $content);
+ fclose($fichier);
+ chmod($nom_fichier, 0666);
+ }
+
+ // read
+ public function getNumber()
+ {
+ return $this->nbArticles;
+ }
+
+ public function getOne()
+ {
+ return(file_get_contents($this->fileName));
+ }
+
+ public function getAll()
+ {
+ //$this->getFiles();
+
+ $i = 0;
+ $articles = array();
+ foreach ($this->files as $file)
+ {
+ $articles[$i] = file_get_contents($file);
+ $i++;
+ }
+
+ //print_r($articles);
+ return $articles;
+ }
+
+ public function getDate($fileNumber)
+ {
+ // le 2è paramètre exclut le suffixe .html
+ $timestamp = basename($this->files[$fileNumber], '.html');
+ return getdate($timestamp);
+ }
+
+ // update
+ public function update($content)
+ {
+ $file = fopen($this->fileName, 'w');
+ // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
+ fputs($file, $content);
+ fclose($file);
+ //chown($this->fileName, 'http');
+ chmod($this->fileName, 0666);
+ }
+
+ // delete
+ public function delete()
+ {
+ unlink($this->fileName);
+ }
+}
+
+// note: les pros font de l'hydration
+// le code du modèle est orienté objet et "refactorisé" d'une manière précise:
+// on utilise un objet pour une chose (des articles, commentaires, etc),
+// un objet article contiendrait ainsi tout le nécessaire pour lire, écrire ou modifier un article
+// il y a pour ça un programme appelé "doctrine" (inclu dans symphony) qui est capable de lire une base de données et d'en écrire les objets PHP
+
+class AlbumsManager extends ArticlesManager
+{
+ // variables
+
+ // SET
+
+ // GET
+
+ // fonctions CRUD
+
+ // create
+ public function create()
+ {}
+
+ // read
+ public function read()
+ {}
+
+ // update
+ public function update()
+ {}
+
+ // delete
+ public function delete()
+ {}
+}
\ No newline at end of file
diff --git a/model/melaine-read.php b/model/melaine-read.php
deleted file mode 100644
index 7105acd..0000000
--- a/model/melaine-read.php
+++ /dev/null
@@ -1,59 +0,0 @@
- :checked et une checkbox
+=> ou la balise select qui crée un menu déroulant */
+aside:hover #chronologie
+{
+ display: block;
+}
+
+section
+{
+ /*border: 1px red solid;*/
+}
+
+h3
+{
+ margin-top: 45px;
+}
+
+form p
+{
+ margin: 0px;
+}
+
+input
+{
+ margin: 2px 0;
+}
+
+.boutonAlbum
+{
+ margin-top: 45px;
+ padding-bottom: 20px;
+ border-bottom: 1px black solid;
+}
+.boutonAlbum a
+{
+ padding: 2px;
+ border: 4px black groove;
+}
+
+article
+{
+ margin: 5px 0px;
+}
+
+figure
+{
+ margin: 0px;
+ display: inline-block;
+}
+
+figcaption
+{
+ margin: 2px;
+ color: #666;
+ font-size: small;
+ font-weight: bold;
+ text-align: center;
+}
+
+a
+{
+
+ display: inline-block;
+}
+
+article a:hover
+{
+ border: 2px blue solid;
+}
+
+
+a:hover figure figcaption
+{
+ text-decoration: underline;
+}
+
+@media screen and (min-width: 700px)
+{
+ #titre
+ {
+ width: 630px;
+ height: 171px;
+ background-image: url("mouette.png");
+ }
+
+ #contenu
+ {
+ position: relative;
+ bottom: 35px;
+ }
+}
+
+@media screen and (max-width: 699px)
+{
+ #titre
+ {
+ width: 480px;
+ height: 131px;
+ background-image: url("mouette_petit.png");
+ margin: auto;
+ }
+
+ #contenu
+ {
+ position: relative;
+ bottom: 24px;
+ }
+}
+
+@media screen and (max-width: 479px)
+{
+ #titre
+ {
+ width: 320px;
+ height: 88px;
+ background-image: url("mouette_mini.png");
+ margin: auto;
+ }
+
+ #multicolonnes
+ {
+ flex-direction: column;
+ }
+
+ aside
+ {
+ width: 320px;
+ }
+
+ #chronologie
+ {
+ display: flex;
+
+ }
+
+ #chronologie p
+ {
+ max-width: 80px;
+ margin: 2px;
+ }
+
+ #contenu
+ {
+ position: relative;
+ bottom: 15px;
+ }
+}
diff --git a/public/main.js b/public/main.js
index d4fb43a..1c04dec 100644
--- a/public/main.js
+++ b/public/main.js
@@ -1,6 +1,6 @@
// public/main.js
-function accueil_vers_menu()
+function versMenu()
{
// ergonomique
window.setTimeout("location=('index.php?page=menu');", 10000);
@@ -15,6 +15,19 @@ function deconnexionAutomatique()
//window.setTimeout("location=('index.php?action=deconnexion');", 600000);
}
+// fonction appelée avec onClick dans un lien,
+// si on sélectionne pas "oui", on ne doit pas suivre le lien
+// si javascript est désactivé, le lien fonctionne
+function confirmerSuppression(page)
+{
+ // ne suivre le lien "href" que si on clique sur oui
+ var oui = confirm('Confirmer la suppression de cet article.');
+ if(!oui)
+ {
+ event.preventDefault();
+ }
+}
+
// bouton "mailto", le visiteur ne quitte pas la page
function clientCourriel()
{
diff --git a/public/melaine.css b/public/melaine.css
index 97872da..9736147 100644
--- a/public/melaine.css
+++ b/public/melaine.css
@@ -18,7 +18,7 @@ pre
figure
{
- margin: 5px;
+ /*margin: 5px;*/
}
.boutonArticle
{
@@ -106,56 +106,3 @@ figure
max-width: 320px;
}
}
-
-
-/* CONTENU */
-
-/*.article1_elem1
-{
- color: #2e5487;
- font-size: 150%;
-}
-
-.article1_elem2
-{
- color: #006ffd;
- font-size: 90%;
- font-weight: bold;
-}
-
-.article7_elem1
-{
- color: #141aff;
-}
-
-.article8_elem1
-{
- color: #141aff;
-}
-
-.article9_elem1
-{
- color: #2a5971;
-}
-
-.article10_elem1
-{
- color: #ad8b15;
-}
-
-.article10_elem2
-{
- color: #ad240a;
-}
-
-.article11_elem1
-{
- color: #ad8b15;
-}
-
-.article12_elem1
-{
- color: #2878aa;
- font-size: 125%;
- font-weight: normal;
-}*/
\ No newline at end of file
diff --git a/view/accueil.php b/view/accueil.php
index 3d852d7..a7b6b71 100644
--- a/view/accueil.php
+++ b/view/accueil.php
@@ -5,7 +5,7 @@
ob_start();
?>
-
+
+
+
+
+
+
+
+
+ Ajouter un album
+= $editeurHTML ?>
+
+