Création des catégories et enregistrement

Attention, depuis PHP 5.5.0, certaines extensions SQL sans doute utilisées dans ce tutoriel peuvent être obsolètes et seront supprimées dans le futur, vous devez donc adapter les codes! Exemples ici.
Nous allons voir dans cette section comment vont être créés les catégories et c'est un peut spécial car je vous rappel que l'on n'utilise pas d'url rewriting...

Étape 1 :

On ouvre le fichier des fonctions "fonctions.php" et on y place le code ci-dessous :
//fonction pour ré écrire les url
function OptimiseUrl($chaine)
{   
    $chaine=strtolower($chaine);
 
    $accents = Array("/é/", "/è/", "/ê/","/ë/", "/ç/", "/à/", "/â/","/á/","/ä/","/ã/","/å/", "/î/", "/ï/", "/í/", "/ì/", "/ù/", "/ô/", "/ò/", "/ó/", "/ö/");
    $sans = Array("e", "e", "e", "e", "c", "a", "a","a", "a","a", "a", "i", "i", "i", "i", "u", "o", "o", "o", "o");
 
    $chaine = preg_replace($accents, $sans,$chaine); 
    $chaine = preg_replace('#[^A-Za-z0-9]#','-',$chaine);
 
    // Remplace les tirets multiples par un tiret unique
    $chaine = preg_replace('#-+#', '-', $chaine );
    // Supprime le dernier caractère si c'est un tiret
    $chaine = rtrim( $chaine, '-' );
 
    while (strpos($chaine,'--') !== false) $chaine = str_replace('--','-',$chaine);
 
    return $chaine;
}
Explication :

Ce code permet tout simplement de ré écrire tout ce qui passe en paramètre de cette fonction en supprimant les espaces, en passant tout en minuscule, etc... En gros, si on écrit un titre comme : "Créer un site" et que l'on passe ce titre en paramètre de la fonction, il ressortira comme ceci : "creer-un-site". Schématiquement le code devrait ressembler à cela :
$titre = "Créer un site";
echo OptimiseUrl($titre);//affiche creer-un-site
Étape 2 :

Toujours dans le fichier des fonctions, on ajoute le code suivant :
//Nom de dossiers interdits à la création
$dossier_interdit = array('admin','images','protection','ckeditor','ckfinder','sessions');
Explication :

Une des astuces de ce tutoriel pour créer des url propres sans url rewriting, c'est de réellement créer les dossiers des catégories sur le serveur. "L’inconvénient" si on créé le même dossier accidentellement, c'est qu'il "écrase" la version précédente en supprimant tout son contenu. Grâce à la variable "$dossier_interdit", on pourra vérifier au préalable d'une création de catégorie si le dossier existe ou pas .

Étape 3 :

A partir du gabarit (admin), on créer un nouveau fichier nommé "ajouter-categorie.php" :
<?php include('../fonctions.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr-fr">
 
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<title>Ajouter une cat&eacute;gorie</title>
</head>
 
<body>
 
<div id="moncadre">
<?php include('menu.php');?>
 
<div class="cadrecentrale">
 
<h1>Ajouter une cat&eacute;gorie</h1>
 
</div>
 
<?php include('footer.php');?>
 
</div>
 
</body>
 
</html>
Pour enregistrer des données et notamment un titre et une description, il nous faut un formulaire. Dans le code ci-dessous, j'ai directement ajouté la gestion des erreurs et un "masquage" du formulaire sinon ce tutoriel serait interminable .
<?php if(isset($message_ok)) echo $message_ok;
//On masque le formulaire
if($masquer_formulaire == 0) {
?>
 
<form action="#ok" method="post">
<?php if(isset($alerte0)) echo $alerte0;?>
<?php if(isset($alerte_categorie_exist)) echo $alerte_categorie_exist;?>
<p>Titre de la cat&eacute;gorie :<br/>
<input name="titre" size="65" value="<?php if (!empty($_POST["titre"])) { echo stripcslashes(htmlspecialchars($_POST["titre"],ENT_QUOTES)); } ?>" type="text"/>
</p>
<?php if(isset($alerte1)) echo $alerte1;?>
<p>Description de la cat&eacute;gorie :<br/>
<textarea name="description" rows="10" cols="50" ><?php
if (!empty($_POST["description"])) {
    echo stripcslashes(htmlspecialchars($_POST["description"],ENT_QUOTES));
}
?></textarea>
</p>
 
<p>
<input name="Valider" value="Valider" type="submit"/>
<input name="Effacer" value="Effacer" type="reset"/>
</p>
</form>
<?php
//Fin masque formulaire
}
?>
Le formulaire mis en place, nous attaquons la partie gestion des erreurs et l'enregistrement en BD.
Que doit faire le code?
  • Vérifier les erreurs.
  • Vérifier si la catégorie existe ou pas en BD.
  • Vérifier si le nom de la catégorie est autorisé à la création ($dossier_interdit).
  • Enregistrer les données du formulaire en BD.
  • Créer le dossier de la catégorie ...

On prépare les données :
<?php
//On se connecte à la base de données
include('../connexion_bd.php');
connexion_bd();
 
//initialisation du masquage du formulaire
$masquer_formulaire = 0;
 
//Traitement du formulaire
if(isset($_POST["Valider"]))
{
    $titre = htmlspecialchars(stripcslashes(trim(strtolower($_POST["titre"]))));
    //Pour le pseudo rewrite
    $titre_rewrite = OptimiseUrl($titre);
    $description = htmlspecialchars(stripcslashes($_POST["description"]));
    //Vérification du formulaire
    if(empty($titre)){
        $alerte0 ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie de titre.</div>';
    }
On vérifie si le titre existe dans la base de données :
    //On regarde si le titre existe déjà en BD
    $categorie_exist = mysql_query("SELECT titre_rewrite FROM CATEGORIES WHERE titre_rewrite='".mysql_real_escape_string($titre_rewrite)."'");
    $total = mysql_num_rows($categorie_exist);
    if($total >= 1){
        $alerte_categorie_exist ='<div class="erreur"><a name="ok"></a>Il existe d&eacute;ja une cat&eacute;gorie portant ce titre.</div>';
    }
On vérifie si le titre ne correspond pas à un dossier interdit ($dossier_interdit):
     //On vérifie si le nom du dossier est autorisé (fichier fonctions.php)
    else if(in_array($titre , $dossier_interdit)){
        echo '<div class="erreur">Ce titre est interdit car il existe un dossier portant ce nom.</div>';
    }
On vérifie la description :
     else if(empty($description)){
        $alerte1 ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie de description.</div>';
    }
Toutes les vérifications sont Ok, on enregistre, on informe le webmaster et on masque le formulaire:
     //Si tout est ok
    else
    {
        // on enregistre les données
        $result = mysql_query("INSERT INTO CATEGORIES VALUES ( '', '".mysql_real_escape_string($titre)."', '".mysql_real_escape_string($description)."', '".mysql_real_escape_string($titre_rewrite)."' ) ");
        //Si il y a une erreur, on crie ^^
        if (!$result) {
            die('Requête invalide : ' . mysql_error());
        }
        else{
            //Si tout est ok, on informe le webmaster
            $message_ok = '<div class="ok"><a name="ok"></a>Cat&eacute;gorie enregistr&eacute;e avec succ&egrave;s! Redirection en cours...<img src="images/loading.gif" alt="Loading"/></div>';
                    //on masque le formulaire
        $masquer_formulaire=1;
Les données enregistrés en BD, ont passent maintenant à la création du dossier physique sur le serveur :
            //-----------------Création des dossiers des catégorie-------------------------------
            //on crée le nom du dossier
            $dossier_categorie = "../".OptimiseUrl($titre);
            //si le dossier n'existe pas, on le créé
            if (!file_exists($dossier_categorie)) {
                //on créé automatiquement un dossier
                mkdir ("$dossier_categorie", 0777);
Décortiquons un peut le code car une autre astuce réside dans la partie suivante...
Dabord, en créer le nom du dossier grâce à la fonction "OptimiseUrl()" puis si le dossier n'existe pas à la racine du site, on le créé avec tout les droits (CHMOD 0777). A ce stade, le dossier est maintenant créé et présent sur le serveur.
Lorsque nous allons créer de futurs articles, ceux si vont être enregistrés en base de données et en même temps créés physiquement sur le serveur...ce qui signifie que les fichiers doivent être classés dans la bonne catégorie ...ce qui m’amène donc à la partie suivante du code :
                //On créé un fichier index dans ce même dossier pour lister les pages de la dite catégorie
                $fichier_a_ouvrir = fopen (''.$dossier_categorie.'/index.php', "w+");
                //on écrite le code php suivant
                fwrite($fichier_a_ouvrir,"<?php include('../categorie.php');?>");
                //on ferme
                fclose ($fichier_a_ouvrir);
            }
            //--------------------------------------------------------------------------------
Dans le dossier fraichement créé, est créer automatiquement un fichier nommé "index.php" qui contient lui même une include vers un fichier nommé "categorie.php".

Pour bien comprendre la chose et son fonctionnement je vais détailler l'astuce :

Quand on créer un catégorie, son titre, sa description, son titre ré écrit et un id est enregistré en bd dans la table "CATEGORIES". Le titre de la catégorie ré écrit en bd correspond exactement au nom du dossier qui est créé sur le serveur. Le fichier "index.php" qui est créé automatiquement à la racine de chaque dossier (donc pour chaque catégorie créée) appel par le biais d'une include le fichier "catagorie.php" qui ce dernier permet de lister les articles de chaque catégorie.

Si vous avez comprit cette partie du tutoriel (ou pas), vous savez maintenant que l'ensemble de ce CMS axé sur fee.fr repose en partie sur la manipulation de dossiers et de fichiers (création/lecture/écriture/déplacement/suppression/renommage) .

Le fichier "ajouter-categorie.php" dans son ensemble :
<?php
include('../fonctions.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr-fr">
 
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<title>Ajouter une cat&eacute;gorie</title>
</head>
 
<body>
 
<div id="moncadre">
<?php include('menu.php');?>
 
<div class="cadrecentrale">
 
<h1>Ajouter une cat&eacute;gorie</h1>
 
<?php
//On se connecte à la base de données
include('../connexion_bd.php');
connexion_bd();
 
//initialisation du masquage du formulaire
$masquer_formulaire = 0;
 
//Traitement du formulaire
if(isset($_POST["Valider"]))
{
	$titre = htmlspecialchars(stripcslashes(trim(strtolower($_POST["titre"]))));
	//Pour le pseudo rewrite
	$titre_rewrite = OptimiseUrl($titre);
	$description = htmlspecialchars(stripcslashes($_POST["description"]));
	//Vérification du formulaire
	if(empty($titre)){
		$alerte0 ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie de titre.</div>';
	}	
	//On regarde si le titre existe déja en BD
	$categorie_exist = mysql_query("SELECT titre_rewrite FROM CATEGORIES WHERE titre_rewrite='".mysql_real_escape_string($titre_rewrite)."'");
	$total = mysql_num_rows($categorie_exist);
	if($total >= 1){
		$alerte_categorie_exist ='<div class="erreur"><a name="ok"></a>Il existe d&eacute;ja une cat&eacute;gorie portant ce titre.</div>';
	}	
	//On vérifie si le nom du dossier est autorisé (fichier fonctions.php)
	else if(in_array($titre , $dossier_interdit)){
		echo '<div class="erreur">Ce titre est interdit car il existe un dossier portant ce nom.</div>';
	}	
	else if(empty($description)){
		$alerte1 ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie de description.</div>';
	}
	//Si tout est ok
	else
	{
		// on enregistre les données
		$result = mysql_query("INSERT INTO CATEGORIES VALUES ( '', '".mysql_real_escape_string($titre)."', '".mysql_real_escape_string($description)."', '".mysql_real_escape_string($titre_rewrite)."' ) ");
		//Si il y a une erreur, on crie ^^
		if (!$result) {
			die('Requête invalide : ' . mysql_error());
		}
		else{
			//Si tout est ok, on informe le webmaster
			$message_ok = '<div class="ok"><a name="ok"></a>Cat&eacute;gorie enregistr&eacute;e avec succ&egrave;s! Redirection en cours...<img src="images/loading.gif" alt="Loading"/></div>';
					//on masque le formulaire
		$masquer_formulaire=1;
			//-----------------Création des dossiers des catégorie-------------------------------
			//on crée le nom du dossier
			$dossier_categorie = "../".OptimiseUrl($titre);
			//si le dossier n'existe pas, on le créé
			if (!file_exists($dossier_categorie)) {
				//on créé automatiquement un dossier
				mkdir ("$dossier_categorie", 0777);
				//On créé un fichier index dans ce même dossier pour lister les pages de la dite catégorie
				$fichier_a_ouvrir = fopen (''.$dossier_categorie.'/index.php', "w+");
				//on écrite le code php suivant
				fwrite($fichier_a_ouvrir,"<?php include('../categorie.php');?>");
				//on ferme
				fclose ($fichier_a_ouvrir);
			}
			//--------------------------------------------------------------------------------
			//on redirige vers l'index
			echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';
		}
		//On ferme else
	}
	//On ferme if(isset($_POST["Valider"]))
}
?>
<?php if(isset($message_ok)) echo $message_ok;
//On masque le formulaire
if($masquer_formulaire == 0) { 
?>
 
<form action="#ok" method="post">
<?php if(isset($alerte0)) echo $alerte0;?>
<?php if(isset($alerte_categorie_exist)) echo $alerte_categorie_exist;?>
<p>Titre de la cat&eacute;gorie :<br/>
<input name="titre" size="65" value="<?php if (!empty($_POST["titre"])) { echo stripcslashes(htmlspecialchars($_POST["titre"],ENT_QUOTES)); } ?>" type="text"/>
</p>
<?php if(isset($alerte1)) echo $alerte1;?>
<p>Description de la cat&eacute;gorie :<br/>
<textarea name="description" rows="10" cols="50" ><?php
if (!empty($_POST["description"])) {
	echo stripcslashes(htmlspecialchars($_POST["description"],ENT_QUOTES));
}
?></textarea>
</p>
 
<p>
<input name="Valider" value="Valider" type="submit"/>
<input name="Effacer" value="Effacer" type="reset"/>
</p>
</form>
<?php
//Fin masque formulaire
}
?>
</div>
 
<?php include('footer.php');?>
 
</div>
 
</body>
 
</html>
Création des catégories
Voir/déposer un commentaire (0) | Signaler un problème