Vous êtes sur la page 1sur 13

PHP

Initiation partie 3

Modifier les pages dans le back-office

Créer des pages dans le back-office

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 1


Avant de commencer

L'utilisateur va pouvoir ajouter des pages au site.


Il va donc falloir créer des nouveaux documents, insérer les valeurs respectives
dans les tables correspondantes et permettre de publier ou non les pages.

Tout est déjà en place dans les tables, nous allons donc commencer par la
publication ou non d'une page.

Pour ce faire il va suffire de récupérer la valeur de visible de la page dans les


deux tables, l'une servant pour les liens l'autre pour les pages.

En utilisant ces valeurs nous pourrons décider si les pages apparaissent ou non
dans le site.

Il va falloir modifier le document menuGauche.php pour que la prise en compte


de la visibilité des pages soit prise en compte.

Comme nous allons faire un appel vers la BDD nous avons besoin de
connecteur.php.

Le document inclus devient relatif au document qui l'appelle, menuGauche.php


est placé dans inclus et son relatif est le niveau racine puisqu'il est appelé
depuis les documents du site.

require("php/connecteur.php");

Ensuite on applique l'appel à la table tabLiens en ne sélectionnant que les


éléments dont le docVisible est à 1.

$liens_aff = mysql_db_query(BASE,"SELECT * FROM `tabLiens` WHERE `docVisible` =1");

En testant si la connexion se fait nous allons boucler pour remplir deux tableaux.
Un pour les liens un autre pour les textes des liens.

if($liens_aff){
while ($fetch_tabLiens_aff = mysql_fetch_object ($liens_aff)) {

$tab_defLien_aff[]=$fetch_tabLiens_aff->defLien;
$tab_lien_aff[]=$fetch_tabLiens_aff->lien;

}
}

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 2


Suite à cette connexion nous allons créer une boucle en appelant les éléments
des tableaux. Pour stopper cette boucle il va nous falloir un maximum. Ce sera le
nombre d'éléments contenus dans le tableau $tab_lien_aff.

$lMax = count($tab_lien_aff);

Une fois que nous avons le maximum pour la boucle il suffit de la mettre en
place. Cette boucle va remplacer les appels de fonction précédents. Les
indexations des tableaux vont permettre l'appel des valeurs de ces tableaux.

Attention ne supprimez pas la fonction elle même.

for($n=0;$n<$lMax;$n++){
affiche($tab_lien_aff[$n],$tab_defLien_aff[$n]);
}

Le document menuGauche.php mis à jour :

$liens_aff = mysql_db_query(BASE,"SELECT * FROM `tabLiens` WHERE `docVisible` =1");

if($liens_aff){
while ($fetch_tabLiens_aff = mysql_fetch_object ($liens_aff)) {

$tab_defLien_aff[]=$fetch_tabLiens_aff->defLien;
$tab_lien_aff[]=$fetch_tabLiens_aff->lien;

}
}
$lMax = count($tab_lien_aff);

// la fonction
function affiche($li_URL,$li_txt){

$lienURL = substr($_SERVER['REQUEST_URI'],1);

if($lienURL ==""){
$lienURL ="index.php";
}
if($li_URL == $lienURL){
$var_lien ="<p><strong>$li_txt</strong></p>";
}else{
$var_lien ="<p><a href=\"$li_URL\"
class=\"lienMG\">$li_txt</a></p>";
}

echo $var_lien;
}
// utilisation
for($n=0;$n<$lMax;$n++){
affiche($tab_lien_aff[$n],$tab_defLien_aff[$n]);
}

En testant en localhost vous ne devriez pas voir de différence avec la page


précédente.

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 3


La modification des liens et des titres

Nous allons permettre la modification des intilulés des liens et des liens par
l'utilisateur. Nouveau document dans le dossier login : modifPage.php

Le plus simple est d'enregistrer-sous le document index.php. Ces deux


documents vont avoir la liste de choix en commun.

Si vous avez créé le document modifPage.php à partir de index.php supprimez


la partie qui fait référence à l'éditeur. Gardez la partie liste et vérification
d'erreurs.

La partie formulaire du document existe déjà, récupérez la à l'URL indiquée et


copiez la dans la partie HTML du document modifPage.php.
Ce formulaire doit remplacer le formulaire qui servait pour l'éditeur.

À la suite du code php pour la liste il va falloir déclarer nos variables post.

$defLienPage = $_POST['defLienPage'];
$titreHtmPage = $_POST['titreHtmPage'];
$lienPage = $_POST['lienPage'];
$docVisible = $_POST['docVisible'];

Le but ici va être de récupérer les valeurs déjà stockées dans les tables afin de
les afficher dans le document pour qu'elles puissent être modifiées par
l'utilisateur. Nous n'allons pas lui permettre de renommer les pages pour le
moment.

$req_tabLiensModif = mysql_db_query(BASE,"SELECT * FROM `tabLiens` where


`numLien` = $page");
$fetch_tabLiensModif = mysql_fetch_row($req_tabLiensModif);

La première chose à faire va être d'afficher dans les champs correspondants les
valeurs récupérées dans la base.

<label class="boxColor1">
Nom de la page (non modifiable)
<? echo $fetch_tabLiensModif[1]; ?>
</label>

N'allez pas à la ligne dans les champs input

Lien vers la page


<input name="defLienPage" type="text" id="defLienPage" value="
<? echo $fetch_tabLiensModif[2]; ?>
" />

Titre HTML de la page


<input name="titreHtmPage" type="text" id="titreHtmPage" value="
<? echo $fetch_tabLiensModif[3]; ?>
" />

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 4


Testez en localhost; Les valeurs doivent apparaître dans les champs.

La seconde chose à faire va être de tester si le bouton est activé puisque les
données des tables auront été récupérées via la connexion pour créer la liste.

if($_POST['creaPage']){

Dans ce if nous allons insérer nos requêtes de mises à jour des tables.

if($_POST['creaPage']){

/*pour éviter la confusion entre les données récupérées et les données


envoyées des nouvelles variable post sont créées.*/

$dlp =$_POST['defLienPage'];
$thp =$_POST['titreHtmPage'];
$lp = $_POST['lienPage'];
$dv = $_POST['docVisible'];

// n'allez pas à la ligne dans $requete

$requete = mysql_db_query(BASE,"UPDATE `fictServBDD`.`tabLiens` SET


`defLien` = '$dlp',`titreHtm` = '$thp',`docVisible` = '$dv' WHERE
`tabLiens`.`numLien` =$page LIMIT 1 ;");

// n'allez pas à la ligne dans $requete2

$requete2 = mysql_db_query(BASE,"UPDATE `fictServBDD`.`tabPages` SET


`visible` = '$dv' WHERE `tabPages`.`num` =$page LIMIT 1 ;");

// n'allez pas à la ligne dans $req_tabLiensModif

$req_tabLiensModif = mysql_db_query(BASE,"SELECT * FROM `tabLiens` where


`numLien` = $page");

//on refait une requête pour mettre à jour les données dans la page.

$fetch_tabLiensModif = mysql_fetch_row($req_tabLiensModif);

$messagerie = "La page a été modifiée.


<a href=\"index.php?page=$page\">Éditer cette page</a>";

// affichage des messages.


echo $messagerie;

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 5


Les boutons radio

Pour que les boutons radio prennent en compte la valeur stockée il va falloir les
intialiser avec php.

C'est à partir de la valeur $fetch_tabLiensModif[5] qui contient soit 1 soit 0 que


vont être initialisés les boutons radio.
Si la valeur est à 1 la valeur de l'élément radio docVisible qui est sur 1 sera
checked
dans le cas contraire ce sera son alter ego qui sera checked.

Si aucune valeur n'a été détectée aucun des bouton radio ne sera coché.

$radioCheck = "checked=\"checked\"";

switch ($fetch_tabLiensModif[5]){

case "0":
$cocheRadio1="<input name=\"docVisible\" type=\"radio\" value=\"1\" />";
$cocheRadio0="<input name=\"docVisible\" type=\"radio\" value=\"0\"
$radioCheck />";
break;

case "1":
$cocheRadio1=" <input name=\"docVisible\" type=\"radio\" value=\"1\"
$radioCheck />";
$cocheRadio0="<input name=\"docVisible\" type=\"radio\" value=\"0\" />";
break;

default :
$cocheRadio1="<input name=\"docVisible\" type=\"radio\" value=\"1\" />";
$cocheRadio0="<input name=\"docVisible\" type=\"radio\" value=\"0\" />";

Les boutons radios vont être remplacés par le code php produit dans le switch

<label class="petitLabel">
<? echo $cocheRadio1; ?>page publiée
</label>

<label class="petitLabel">
<? echo $cocheRadio0; ?>page non publi&eacute;e
</label>

Si les messages d'erreur n'ont pas été mis à jour c'est le moment.

afficheErr($defLienPage," Le champ Lien vers la page est vide.");


afficheErr($titreHtmPage," Le champ Titre HTML de la page est vide.");
afficheErr($docVisible," docVisible n'est pas coché.");

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 6


Les données textuelles qui sont stockées dans les tables devraient être au
format HTML pour éviter toute erreur d'affichage.

Il va donc falloir modifier le contenu avant de mettre à jour.

htmlentities va convertir tous les caractères éligibles en entités HTML.

cette fonction possède des paramètres

ENT_COMPAT
Convertit les guillemets doubles, et ignore les guillemets simples.

ENT_QUOTES
Convertit les guillemets doubles et les guillemets simples.

ENT_NOQUOTES
Ignore les guillemets doubles et les guillemets simples.

$test = htmlentities("L'élément encodé comme ça..",ENT_QUOTES);


echo $test;

Pour visualiser les modifications il faut que vous affichiez le code source de la
page.

D'autres options internationales existent.


http://fr.php.net/manual/fr/function.htmlentities.php

Le code va s'appliquer aux éléments textes avant leur mise à jour.

$dlp = htmlentities($_POST['defLienPage'],ENT_QUOTES);

$thp =htmlentities($_POST['titreHtmPage'],ENT_QUOTES);

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 7


Création des nouvelles pages

La création des nouvelles pages va devoir prendre en compte à la fois la mise en


page globale du site ainsi que la valeur de la variable $numPage.

Il va aussi falloir vérifier qu'une page du même nom n'existe pas, qu'une page
ne porte pas le même lien ou même titre.

Le plus simple est de créer un document modéle et de le modifier en fonction


des besoins.

Commençons par le document de création à proprement dit.

Créez un nouveau document et enregistrez le en tant que creaPage.php dans


le dossier login

Le formulaire du document modifPage.php va nous resservir.


Copiez le formulaire et collez le dans dans creaPage.php.

Copiez également les déclarations des post et la fonction de message d'erreur.

$defLienPage = $_POST['defLienPage'];

$titreHtmPage = $_POST['titreHtmPage'];

$lienPage = $_POST['lienPage'];

$docVisible = $_POST['docVisible'];

$afficheErrMssg ="";

function afficheErr($err,$errTxt){
if(!strlen($err)){
global $afficheErrMssg;
$afficheErrMssg .= " ".$errTxt." <br />";
}
}

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 8


Nous allons créer une nouvelle fonction pour tester si les données à insérer
existent dans la base

function chercheExiste($dataExiste,$dataNew,$mssgDonnee){
if($dataExiste == $dataNew){
global $afficheErrMssg;
$afficheErrMssg .= " ".$mssgDonnee." <br />";
}
}

afficheErr($lienPage," Le champ <strong>Nom de la page</strong> est vide.");


afficheErr($defLienPage," Le champ <strong>Lien vers la page</strong> est
vide.");
afficheErr($titreHtmPage," Le champ <strong>Titre HTML de la page</strong>
est vide.");

afficheErr($docVisible,"Vous n'avez pas décidé de la publication.");

$mssgMail ="";

Nous allons aussi vérifier de nouveau si des caractères interdits existent dans le
nouveau nom du document à créer.

$tableau_chars = array(
"â","ä","à","é","è","ç","\"","'","ê","\\","/","!","?","ï","î","ô","ö","œ"
,"%","ù","#","&","(",")","*","$","€","§","ü","û","|","ñ","`","<",">","+",
"=","^","¨","°","£",",",";" );

foreach ($tableau_chars as $valeur){

$pos = strpos($lienPage,$valeur);

if($pos !== false ){


$mssgMail .= $valeur." ";
$mssgErreurMail = "Caractère(s) interdit(s) trouvé(s): ".$mssgMail;
}

}
$afficheErrMssg .= $mssgErreurMail;

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 9


Vérification de l'activation du bouton d'envoi et de l'existence des données.

if($_POST['creaPage']){

//test si la valeur de page existe déjà dans la BDD

$req_tabLiens = mysql_db_query(BASE,"SELECT * FROM `tabLiens` ORDER BY


`tabLiens`.`numLien` ASC");

$fetch_tabLiensNum = mysql_num_rows($req_tabLiens);

for($r=1;$r<=$fetch_tabLiensNum;$r++){

$fetch_tabLiens[$r] = mysql_fetch_row($req_tabLiens);

$lienPageExiste = $lienPage.".php";

chercheExiste($fetch_tabLiens[$r][1],$lienPageExiste,"Une page
<strong>$lienPageExiste</strong> existe déjà.");

chercheExiste($fetch_tabLiens[$r][2],$defLienPage,"Un lien
<strong>$defLienPage</strong> existe déjà.");

chercheExiste($fetch_tabLiens[$r][3],$titreHtmPage,"Un titre
<strong>$titreHtmPage</strong> existe déjà.");

if(!$afficheErrMssg){

//la création de la page se fera ici.

}else{
echo $afficheErrMssg;
}

Avant de continuer il va falloir créer notre fichier modèle.

Lancez l'index.php du niveau racine et enregistrez le en tant que modele.php.

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 10


modele.php ressembe à ceci :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"
/>
<?
require("php/connecteur.php");
$numPage = 1;
include_once("inclus/contenu.php");
?>
<title><? echo $req_tabTitre[0]; ?></title>
<link href="stylesEcran.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="document">

<h1><img src="images/logo.png" alt="Logo" width="204" height="100" />


Index</h1>
<div id="menuGauche">
<?
include_once("inclus/menuGauche.php");
?>
</div>
<p>&nbsp;</p>
<?
echo $fetch_tabPages[0];
?>
</div>
</body>
</html>

Tout ce que nous allons devoir faire est d'insérer une nouvelle valeur à la
variable $numPage .

Remplacez $numPage = 1; par $numPage = leNumeroRemplace;

La chaine de caractère leNumeroRemplace sera remplacée par une valeur


numérique dans le nouveau document. Tout ce que nous aurons à faire va être
de rechercher cette chaîne dans le document et de la remplacer par le n° que va
porter le nouveau document.

Le document à copier se trouve hors du dossier login, nous allons donc devoir
indiquer à PHP que le traitement se fera au niveau supérieur.

chdir('..');

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 11


$newPageRec = mysql_query ("SELECT * FROM fckeditorLiens");

$nbr_res = mysql_num_rows($newPageRec);
// donne le N° de la dernière la page auquel on ajoute 1
$nbr_PageBdd = $nbr_res+1;

//changement de dossier
chdir('..');

// dénomination de la copie en ajoutant .php à la variable $lienPage


$fichierACopier = $lienPage.".php";

// la copie n'existe pas?


if(!file_exists($fichierACopier)){

//alors on copie le doc


copy('modele.php', $fichierACopier);

// on ouvre la copie
$fichierOuvert=fopen($fichierACopier,"r+");

//on stocke le contenu du doc


$docCont=fread($fichierOuvert,filesize($fichierACopier));

//rechercher "leNumeroRemplace" pour le remplacer par un nombre


$transform = array("leNumeroRemplace" => $nbr_PageBdd);
$fichierRempli = strtr($docCont, $transform);

//retour au début du doc


fseek($fichierOuvert,0);

//vide le doc pour faire correspondre sa nouvelle longueur


ftruncate($fichierOuvert,0);

//puis ajoute le n° dans la page


fputs($fichierOuvert,$fichierRempli);

//envoie les données


fflush($fichierOuvert);

//ferme le doc
fclose($fichierOuvert);

// les données BDD seront insérées ici.

}else{
//on informe notre utilisateur...
$afficheErrMssg.="La copie a échoué, la page n'a pas étécréée";
echo $afficheErrMssg;
}

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 12


Un fois que cette partie fonctionne nous pouvons insérer les données dans les
tables.

//les liens
$crea_lien = mysql_db_query(BASE," insert into `tabLiens` (
numLien,lien,defLien,titreHtm,chemin,docVisible) VALUES
(NULL,'$fichierACopier','$defLienPage','$titreHtmPage','','$docVisible')"
);

//les pages
$crea_page = mysql_db_query(BASE,"INSERT INTO `fictServBDD`.`tabPages`
(`num` ,`doc` ,`visible`)VALUES (NULL , '', '$docVisible');");

$req_tabLiensRes = mysql_db_query(BASE,"SELECT numLien FROM


`tabLiens`");
$fetch_tabLiensRes = mysql_num_rows($req_tabLiensRes);

//on affiche la nouvelle à l'utilisateur


echo "La nouvelle page \"$lienPage\" a été créée. <a
href=\"index.php?page=$fetch_tabLiensRes\">Modifier cette page</a>";

//on vide les champs pour ne pas les afficher dans les boites de texte
$defLienPage ="";
$titreHtmPage ="";
$lienPage ="";
$docVisible ="";

php partie 3 - © S. Jeanneau sjcpi.fr - 2008 Page n° 13

Vous aimerez peut-être aussi