Initiation partie 2
Éditer un back-office
Dans le cas du site de Fiction Services, un accès par .htaccess sera suffisant si
les mots de passe ce dernier sont cryptés. Nous mettrons la sécurité en place en
dernier afin de ne pas avoir à valider le mot de passe à chaque nouvelle
session. Sur un développement en ligne c’est par là qu’il faudra commencer.
Dans le cas présent chaque utilisateur “logué” pourra éditer l’ensemble du site.
Dans le cas présent le cas est simple, l’utilisateur veut pouvoir mettre à jour ses
pages web et le cas échéant en ajouter d’autres. Il veut pouvoir nommer ses
pages pour apparaître de façon ciblée dans les moteurs de recherche.
Il veut pouvoir éditer une page et revenir le lendemain pour la finir et la mettre
en ligne.
Comment le construire?
Pour l'éditeur nous allons utiliser fckeditor un éditeur gratuit simple et efficace
qui remplit toutes les conditions requise. À télécharger via sourceforge.
http://www.fckeditor.net/download
En plus des insertions dans la BDD, si l’on crée des documents html contenant
uniquement le contenu de la partie document de la page, on peut y faire
référence et l'afficher dans la page par un identifiant unique.
include_once("pages/page0001.html");
---------------------------------------------------------------------------------------------------
fictServBDD.tabPages
---------------------------------------------------------------------------------------------------
fictServBDD.tabLiens
---------------------------------------------------------------------------------------------------
type : int(100)
int pour integer, signifie que ce champ ne pourra contenir que des chiffres.
la valeur 100 qui suit est le nombre de caractères que peut contenir ce champ,
ce champ peut donc contenir un chiffre composé de 100 caractères.
type : smallint(2)
smallint pour small integer, signifie que ce champ ne pourra contenir que des chiffres
de 255 caractères maxi. Sa porté est toutefois réduite à 2 caractères maxi.
type : tinyint(2)
tinyint pour tiny integer, signifie que ce champ ne pourra contenir que des chiffres de
255 caractères maxi. Sa porté est toutefois réduite à 2 caractères maxi.
type : varchar(255)
varchar pour variable character field, signifie que ce champ ne pourra contenir que des
séquences de 255 caractères maxi ce qui convient bien pour un chemin local. Il est donc
positionné en valeur maximum à 255.
type : text
text pour texte, signifie que ce champ va contenir des données au format texte, MySQL
va donc traiter les retours chariots comme tels dans les données.
Sa quantité maximale est définie selon la doc en ligne comme étant aussi grande que
possible.
Son équivalent BLOB pour binary large object, ne traitera pas les données comme du
texte mais comme du code. mediumtext va contenir moins de données.
Interclassement : latin1_general_cs
latin1_general_cs rattaché à texte, cela signifie que les données vont être stockées
sous le format ISO-8859-1, le charset des pages HTML, ce qui convient parfaitement ici.
Le _cs à la fin signifie que la sensibilité à la casse est activée pour ce champ.
Le _ci son alter ego signifie que la sensibilité à la casse n'est pas activée.
À ce propos prêtez toujours attention aux charsets des pages du site à interfacer avec la
base de données. Il peut arriver des choses étranges aux données lorsque la table dans
la BDD et la page n'ont pas le même charset.
extra : auto_increment
auto_increment rattaché à num, cela signifie qu'à chaque nouvelle insertion dans la
table le champ num va contenir un numéro unique, attribué et incrémenté
automatiquement.
Null : oui
Null : oui rattaché à visible, cela signifie qu'à chaque nouvelle insertion dans la table le
champ visible devra contenir une valeur, si rien n'est spécifié la valeur par défaut a été
attribuée à la valeur : 1. Dans le cas présent c'est la valeur qui va décider si une page
est publiée, donc visible, ou non. On utilise habituellement les valeurs 0 pour non et 1
pour oui.
Selon l'utilitaire WAMP/easyPhp que vous utilisez vous trouverez l'URL dans le
menu déroulant du démarrage rapide.
requête SQL:
fictServBDD.tabPages
fictServBDD.tabLiens
Petit truc
Pour une connexion via un doc.php il va tout d'abord falloir ouvrir une connexion
à la base, avant même de lancer une quelconque requête.
Dans ce dossier créez un document index.php avec tous les entêtes HTML .
À partir de ce document, l'utilisateur final pourra modifier une page de son site
et en créer une.
Dans ce document nous allons stocker des variables ainsi que l'ouverture de la
connexion à la base.
<?
//Les valeurs peuvent changer selon les paramètres de vos serveurs.
define (NOM,"root");
define (SERVEUR,"localhost:8889");
define (BASE,"fictServBDD");
define (PASSE,"root");
?>
À la suite de : define(PASSE,"root");
$connexion = mysql_connect(SERVEUR,NOM,PASSE);
// et on arrête tout
exit;
}
// et on arrête tout
exit;
}
// sinon la connexion a bien eu lieu
<?
require_once("../php/connecteur.php");
?>
Pour afficher le choix des pages à modifier une liste déroulante est ce qui est de
plus pratique. Cette liste déroulante ne va pas être associé à un bouton mais
va envoyer automatiquement vers la page sélectionnée par le client.
Pour ce faire nous allons utiliser le javaScript de DreamWeaver.
</form>
<script type="text/JavaScript">
<!--
function MM_jumpMenu(targ,selObj,restore){ //v3.0
eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0;
}
//-->
</script>
<option value="1">Index</option>
<option value="2">page 1</option>
<option value="3">page 2</option>
".location='?page=
apostrophe guillemet
eval(targ+".location='?page="+selObj.options
Testez votre page sur localhost. On note toute fois que l'index étant sélectionné
il n'est pas possible d'y accéder. Nous allons ré-écrire les données de la liste en
PHP afin de pouvoir insérer la commande de sélection dans la liste. Cette
commande de sélection sera celle qui correspondra à la valeur de page.
$page = $_GET['page'];
Création du tableau :
foreach($tab_select as $elementListe){
//test
echo "$elementListe <br />";
}
Dans cette liste nous avons besoin des valeurs texte pour le client et des
valeurs numériques pour la variable $page. En utilisant une variable numérique,
par exemple $n, nous allons à la fois pouvoir inscrire une valeur numérique et
faire appel à cette valeur numérique comme index du tableau $elementListe.
$n = 0;
$selPages = "";
foreach($tab_select as $elementListe){
Le code complet :
$page = $_GET['page'];
$n = 0;
$selPages = "";
foreach($tab_select as $elementListe){
if($n == $page ){
}else{
$selPages.="<option value=\"$n\">".$tab_select[$n]."</option>\n";
$n++;
Testez en localhost.
Une fois que cela fonctionne nous allons pouvoir récupérer les valeurs dans la
base et les remplacer par nos valeurs en dur.
Nous voulons sélectionner dans la base tous les éléments de la table tabLiens
En associant cette référence à une variable nous pourrons stocker les valeurs
dans un tableau dans la page php avec mysql_fetch_object
$tab_defLien[]=$recupere->defLien;
Pour afficher les données récupérées en une seule fois, c'est print_r que nous
allons utiliser.
print_r($tab_defLien);
Pour récupérer toutes les données il va falloir créer une boucle while
La boucle while
while (expression){
commandes
}
exemples :
$a = 0;
while ($a < 10){
echo "a = $a ";
$a++;
}
$b = 10;
$a = 0;
while ($a <= $b){
echo "a = $a et b = $b";
$a++;
}
if($fetch_tabLiens){
while ($recupere = mysql_fetch_object ($fetch_tabLiens)) {
$tab_defLien[]=$recupere->defLien;
}
}
print_r($tab_defLien);
Pour afficher les données individuellement c'est un echo avec un index que
nous allons utiliser.
echo $tab_defLien[2];
//Va afficher la valeur du champ defLien 3;
En testant la valeur d'une variable $page nous allons pouvoir savoir quel est le
document actif.
$page = $_GET['page'];
Cette variable doit être supérieure à zéro puisque notre premier élément de
numLien est égal à 1.
if($fetch_tabLiens){
}
}
$n=0;
$selPages = "";
foreach($tab_defLien as $elementListe){
if($n == $page ){
$n++;
<?
$tab_defLien = array("Faites un choix de page dans la liste.");
if($fetch_tabLiens){
while ($recupere = mysql_fetch_object ($fetch_tabLiens)) {
$tab_defLien[]=$recupere->defLien;
}
}
$page = $_GET['page'];
$n=0;
$selPages = "";
foreach($tab_defLien as $elementListe){
if($n == $page ){
$selPages.="<option value=\"$n\" selected=\"selected\">".
$tab_defLien[$n]."</option> \n";
}else{
$n++;
}
?>
mysql_db_query(BASE," REQUÊTE")
$fetch_tabPages = mysql_fetch_row($req_tabPages);
$fetch_tabPages = mysql_fetch_row($req_tabPages);
Une dernière chose à faire va être clore la connexion à la base pour libérer les
ressources. Cette fonction se place bien entendu à la fin de toute requête.
mysql_close($connexion);
// Nouvel éditeur
$oFCKeditor = new FCKeditor('FCKeditor1');
Voilà pour l'éditeur. En testant cette page en localhost vous devriez pouvoir
visualiser l'ensemble.
Pour envoyer les données de l'éditeur vers le champ doc de la table tabPages
nous allons éditer un nouveau document strictement php, CAD qui ne contiendra
rien d'autre que du php. Ce document apparaîtra dans l'action du formulaire
formEdit du document index.php. sous le nom de envoiData.php
le document envoiData.php renverra vers le doc index.php avec les données
mises à jour.
if ( isset( $_POST ) )
$postArray = &$_POST ;
else
$postArray = &$HTTP_POST_VARS ;
{
if ( get_magic_quotes_gpc() )
$uri=rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
C'est une requête mySQL qui est construite comme les autres.
la table mise à jour est doc et le choix se fait via la valeur de num donc $page
et on ferme la connexion
mysql_close($connexion);
Afin d'éviter que ce document soit appelé alors que $page est vide ou que sa
valeur ne contient pas un nombre nous allons intégrer toute la séquence dans
un if qui va tester si $page est un nombre.
if(number_format($page)){
et insérez
en fin de document.
Le code statut HTTP doit toujours être le premier à être envoyé au client, il doit
donc être placé en tête de document. Si des valeurs ont déjà été transmises via
htpp, apache va générer un message d'erreur.
$host=$_SERVER['HTTP_HOST'];
Ensuite il faut finir cette chaîne avec la valeur du document à atteindre et tant
qu'à faire la valeur de la page en cours.
Cette valeur va s'insérer dans la condition de if(number_format($page))afin de
ne générer la page de retour avec une valeur numérique pour $page.
$extra="login/index.php?page=$page";
$host=$_SERVER['HTTP_HOST'];
$extra="login/index.php?page=$page";
header ("Location: http://$host/$extra");
Pour tester ce document vous devrez y faire appel via index.php dans login en
cliquant sur l'icône sauvegarder.
Le document envoiData.php
<?
require_once("../php/connecteur.php");
$page = $_REQUEST['page'];
$URL = '';
if(number_format($page)){
if ( isset( $_POST ) )
$postArray = &$_POST ;
else
$postArray = &$HTTP_POST_VARS ;
foreach ( $postArray as $sForm => $value )
{
if ( get_magic_quotes_gpc() )
$postedValue = stripslashes( $value ) ;
else
$postedValue = $value ;
$URL.=$postedValue;
}
$extra="login/index.php?page=$page";
$URL_Bdd = addslashes( $URL) ;
$requete = mysql_db_query(BASE,"UPDATE `fictServBDD`.`tabPages`
SET `doc` = '$URL_Bdd' WHERE `tabPages`.`num` =$page LIMIT 1 ");
mysql_close($connexion);
}
$host=$_SERVER['HTTP_HOST'];
header ("Location: http://$host/$extra");
?>
Au lieu d'utiliser un if() nous allons utiliser un switch qui fonctionne un peu de la
même façon mais est plus pratique à utiliser
$test = 2;
switch ($test){
case 1:
echo "test = 1";
break;
case 2:
echo "test = 2";
break;
case 3:
echo "test = 3";
break;
}
$test1 = "linux";
switch ($test1){
case "apple":
echo "test = apple";
break;
case "linux":
echo "test = linux";
break;
case "windows":
echo "test = windows";
break;
}
L'avantage de switch est de pouvoir tester toutes les valeurs à la suite. Toutes
les valeurs trouvées après celle qui correspond seront affichées. Si rien n'est
vrai, rien ne sera affiché.
$test1 = "apple";
switch ($test1){
case "apple":
echo "test = apple? <br>";
case "linux":
echo "test = linux? <br>";
case "windows":
echo "test = windows? <br>";
}
$test1 = "unix";
switch ($test1){
case "apple":
echo "test = apple";
break;
case "linux":
echo "test = linux";
break;
case "windows":
echo "test = windows";
break;
default:
echo "test1 n'est pas apple, pas linux, pas windows.";
}
switch ($erreur){
case 1:
echo $erreurRetour = "<h2>Les données n'ont pas été mises à
jour. Erreur de base de données.</h2>";
break;
case 2:
echo $erreurRetour = "<h2>Des données sont manquantes.</h2>";
break;
default :
$erreurRetour ="";
}
<?
require_once("../php/connecteur.php");
$page = $_REQUEST['page'];
$URL = '';
if(number_format($page)){
if ( isset( $_POST ) )
$postArray = &$_POST ;
else
$postArray = &$HTTP_POST_VARS ;
if(!$requete){
$extra="login/index.php?page=$page&erreur=1";
}
mysql_close($connexion);
// fin du if(number_format($page)){
}else{
$extra="login/index.php?erreur=2";
}
$host=$_SERVER['HTTP_HOST'];
header ("Location: http://$host/$extra");
?>
Nous avons tout ce qu'il faut pour mettre à jour le contenu des pages mais ce
contenu n'est pas encore répercuté sur les pages du site.
Le plus simple va être d'insérer une valeur numérique dans chaque page. Cette
valeur va correspondre à l'index de la table tabPages
Avec cette valeur nous pourrons faire appel à des données particulières dans la
table.
Le PHP devra être placé avant l'élément HTML <title>xxx</title> afin de pouvoir
l'utiliser.
<?
require("php/connecteur.php");
$numPage = 1;
?>
Il suffit de faire un appel vers la base pour récupérer les valeurs dont nous
avons besoin.
Cet appel va être ciblé sur le seul contenu de doc correspondant à l'index num
dans la table tabPages.
<?
require("php/connecteur.php");
$numPage = 1;
?>
Pour finir placez vous dans le contenu du index.php et remplacez le contenu par
<?
echo $fetch_tabPages[0];
?>
<?
$req_tabPages = mysql_db_query(BASE,"SELECT `doc` FROM `tabPages` where
`num` = $numPage");
$fetch_tabPages = mysql_fetch_row($req_tabPages);
?>
<?
require("php/connecteur.php");
$numPage = 1;
include_once("inclus/contenu.php");
?>
Il suffit donc de placer ce code dans toutes les pages du site sans omettre
l'affichage.
Pour les documents contact et demandes seules les parties qui ne sont pas
sous forme de formulaire vont être éditables.
Les formulaires doivent rester en dur dans la page.
Chaque page devrait avoir un titre modifiable, pour ce faire nous allons ajouter
la requête vers la base dans le document contenu.php et nous allons remplacer
le titre de chaque document par un affichage en php issu de la BDD.
contenu.php
Le site est en place, toutefois d'autres éléments devraient pouvoir être modifiés
comme le titre HTML des documents et les intitulés des liens.