Modification des catégories

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 partie comment modifier les catégories. Pour commencer, je vous suggère de prévoir un thermos de café voir même un tube d'aspro .

Lorsque nous avons créé la page d'accueil de l'administration, nous avons créé des liens dont un qui permet d'accéder aux modifications des catégories...pour rappel, voici le lien en question :
<a href="modifier-categorie.php?id='.$affiche['id'].'&rewrite='.$affiche['titre_rewrite'].'"><img src="images/modifier.png" alt="Modifier"/></a>
Le fichier que l'on va donc créer va se nommer "modifier-categorie.php" et l'on voit également que des informations transites par l'url...

Étape 1 :

On prend toujours comme base notre "gabarit" du dossier "admin" pour créer un fichier "modifier-categorie.php" auquel on inclue les fonctions, les données de connexion et la récupération des variables qui transites par l'url :
<?php
include('../fonctions.php');
//On se connecte à la base de données
include('../connexion_bd.php');
connexion_bd();
 
//on récupère ce qui est transmit par l'url
$id_transmit = $_GET["id"];
$titre_transmit = $_GET["rewrite"];
?>
<!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" />
<title>Modifier une cat&eacute;gorie</title> 
<link href="style.css" rel="stylesheet" type="text/css"/>
 
</head>
 
<body>
 
<div id="moncadre">
 
<?php include('menu.php');?>
 
<div class="cadrecentrale">
 
<h1>Modifier cat&eacute;gorie</h1>
 
</div>
 
<?php include('footer.php');?>
 
</div>
 
</body>
 
</html>
Étape 2 :

On créer un formulaire qui va chercher les données de la catégorie en BD à partir de l'identifiant récupéré dans l'url :
<form action="modifier-categorie.php?id=<?php echo $id_transmit;?>&rewrite=<?php echo $titre_transmit;?>" method="post">
<fieldset>
 
<?php
//On va chercher les infos de la catégorie
$result = mysql_query("SELECT nom_categorie,description_categorie FROM CATEGORIES WHERE id = $id_transmit");
 
while($affiche = mysql_fetch_array($result))
{
    ?>
    <p>Titre de la cat&eacute;gorie :<br/>
    <input name="titre" size="65" value="<?php echo $affiche['nom_categorie'];?>" type="text"/>
    </p>
 
    <p>Description de la cat&eacute;gorie :<br/>
    <textarea name="description" rows="10" cols="50" ><?php echo $affiche['description_categorie'];?></textarea>
    </p>
 
    <input name="Modifier" value="Modifier" type="submit"/>
    <input name="Effacer" value="Effacer" type="reset"/>
 
    </fieldset>
 
    </form>
    <?php
    //On ferme la boucle while
}
?>
Étape 3 :

Le formulaire est envoyé, on vérifie si les données ne sont pas vides :
<?php
if(isset($_POST["Modifier"]))
{
    $titre = htmlspecialchars(stripcslashes(trim($_POST["titre"])));
    $description = htmlspecialchars(stripcslashes($_POST["description"]));
    //on vérifie si le titre ou la description sont vides
    if(empty($titre) || empty($description)){
        echo '<div class="erreur">Le titre et/ou la description de la catégorie doit être renseigné!</div>';
    }
Étape 4 :

On vérifie si la catégorie existe en BD au cas ou il y aurait une modification et on vérifie également que le titre de la catégorie ne porte pas le même nom qu'un dossier interdit à la création (fichier "fonctions.php", variable "$dossier_interdit") :
    else{
        //on ré écrit le nom du dossier
        $titre_rewrite = OptimiseUrl($_POST["titre"]);
        //On regarde si le titre existe déja. Si le titre na pas changé, on risque une erreur puisque la requête ci-dessous va chercher un titre qui correspond...c'est pour ça que l'on ajoute une recherche sur un identifiant différent.
        $categorie_exist = mysql_query("SELECT titre_rewrite FROM CATEGORIES WHERE titre_rewrite='".mysql_real_escape_string($titre_rewrite)."' AND id!='".mysql_real_escape_string($id_transmit)."'");
        $total = mysql_num_rows($categorie_exist);
        if($total >= 1){
            echo '<div class="erreur">Il existe déjà une catégories portant ce titre.</div>';
        }   
        //On vérifie si le nom du dossier est autorisé (fichier fonctions.php)
        else if(in_array($titre_rewrite , $dossier_interdit)){
            echo '<div class="erreur">Ce titre est interdit car il existe un dossier portant ce nom.</div>';
        }
Étape 5 :

Le nom de la catégorie est accepté, on modifie les données en BD :
        else{
            // on enregistre les données
            $result = mysql_query(" UPDATE CATEGORIES SET nom_categorie='".mysql_real_escape_string($titre)."', description_categorie='".mysql_real_escape_string($description)."', titre_rewrite='".mysql_real_escape_string($titre_rewrite)."' WHERE id = '$id_transmit'");
 
            //Si il y a une erreur, on crie ^^
            if (!$result) {
                die('Requête invalide : ' . mysql_error());
            }
Étape 6 :

L'enregistrement c'est bien passé, il faut maintenant modifier le nom du dossier si le nom de la catégorie à changé. On vérifie donc au préalable si le dossier existe sur le serveur (théoriquement oui mais on ne sait jamais..), puis on compare le nom du dossier passé en paramètre dans l'url au nom du dossier ré écrit du formulaire et si il a changé, on renomme le dossier :
            else {
                //Cas 1 - Le nom du dossier passé en paramètre dans l'url existe sur le serveur
                if (file_exists("../".$titre_transmit)) {
                    // on compare les 2 noms de dossier et si ils sont différents, c'est que le titre à changé
                    if($titre_transmit != $titre_rewrite){
                        //on renome le dossier
                        rename ("../".$titre_transmit, "../".$titre_rewrite);
                    }   
                    //on informe le webmaster
                    echo '<div class="ok"><p>La modification à été effectué avec succès. Redirection automatique en cours...</p></div>';
                    //on redirige
                    echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';   
                }
Étape 7 :

Pour une raison inconnue, le dossier de la catégorie n'existe pas sur le serveur...il faut donc le re créer sans oublier également de re créer le fichier "index.php" :
                //Cas 2 - Le nom du dossier dossier passé en paramètre dans l'url n'existe pas sur le serveur
                else if(!file_exists("../".$titre_transmit)){
                    //On informe le webmaster
                    echo '<div class="erreur">1-Pour une raison indéterminée, le dossier "'.$titre_transmit.'" n\'existe pas sur le serveur!</div>';
                    //on créé automatiquement un dossier en prenant le titre ré écrit de la catégorie au cas ou le webmaster change le titre
                    mkdir ("../".$titre_rewrite, 0777);
                    //On créé un fichier index dans ce même dossier pour lister les pages de la dite catégorie
                    $fichier_a_ouvrir = fopen ("../".$titre_rewrite."/index.php", "w+");
                    //on écrite le code php suivant
                    fwrite($fichier_a_ouvrir,"<?php include('../categorie.php');?>");
                    //On informe que le dossier à été re créé
                    echo '<div class="ok">2-Le dossier "'.$titre_rewrite.'" a été créé!</div>';
Étape 8 :

A ce stade, le dossier de la catégorie à donc été re créé (si manquant sur le serveur) mais si la catégorie contient des articles, les fichiers des articles n'existes plus aussi et il faut donc également les re créer si besoin :
                    //on va chercher tout les articles de la catégorie pour re créer les fichiers manquants
                    $article = mysql_query("SELECT titre_rewrite FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_transmit)."'");
                    //On compte le nombre d'article
                    $total = mysql_num_rows($article);
                    //Si il y a quelque chose
                    if(!empty($total)){
                        //On boucle
                        while($affiche = mysql_fetch_array($article)){
                            //On re créer les fichiers
                            $fichier_a_ouvrir = fopen ("../".$titre_rewrite."/".$affiche['titre_rewrite']."", "w+");
                            fwrite($fichier_a_ouvrir,"<?php include('../page1.php');?>");
                        }
                        //Si erreur, on crie
                        if (!$article) {
                            die('Requête invalide : ' . mysql_error());
                        }
                        //Tout c'est bien passé
                        else{
                            //On informe le webmaster
                            echo '<div class="ok">3-L\'ensemble des fichiers ont été re créés!<br/>Redirection automatique en cours...</div>';
                            //on redirige
                            echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';   
                        }
                    }
Étape 9 :

Si la catégorie ne contient aucun article, on informe le webmaster et on ferme tout :
                    else{
                        //Aucun fichier à re créer, on informe le webmaster
                        echo '<div class="ok">3-Il n\'y a aucun article dans cette catégorie!<br/>Redirection automatique en cours...</div>';
                        //on redirige
                        echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';   
                    }
                    //on ferme
                    fclose ($fichier_a_ouvrir);
                }
            }   
        }   
    }
//on ferme if(isset($_POST["Modifier"]))   
}
?>
ça y est, c'est enfin fini , pas trop mal au crâne?

Histoire de bien comprendre le fonctionnement de ce fichier, je vous fais un petit résumé.
  1. On récupère les données qui transites par l'url.
  2. On affiche les données dans le formulaire à partir des info. récupéré dans l'url.
L'action de validation est faite :
  1. On vérifie si la catégorie existe.
  2. On vérifie si la création du dossier est autorisé.
  3. On enregistre.
Le dossier de la catégorie :
  1. Si le dossier existe et si le titre de la catégorie na pas changé, on informe le webmaster que la modification a été faite.
  2. Si pour une raison inconnue le dossier de la catégorie n'existe pas sur le serveur, on le créé ainsi que le fichier "index.php" tout en informant le webmaster.
  3. On vérifie si la catégorie contient des articles et si besoin, on créer les fichiers correspondants aux articles tout en informant le webmaster.
Le fichier "modifier-categorie.php" :
<?php
include('../fonctions.php');
//On se connecte à la base de données
include('../connexion_bd.php');
connexion_bd();
 
//on récupère ce qui est transmit par l'url
$id_transmit = $_GET["id"];
$titre_transmit = $_GET["rewrite"];
?>
<!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" />
<title>Modifier une cat&eacute;gorie</title>  
<link href="style.css" rel="stylesheet" type="text/css"/>
 
</head>
 
<body>
 
<div id="moncadre">
 
<?php include('menu.php');?>
 
<div class="cadrecentrale">
 
<h1>Modifier cat&eacute;gorie</h1>
 
<?php
if(isset($_POST["Modifier"]))
{
	$titre = htmlspecialchars(stripcslashes(trim($_POST["titre"])));
	$description = htmlspecialchars(stripcslashes($_POST["description"]));
	//on vérifie si le titre ou la description sont vides
	if(empty($titre) || empty($description)){
		echo '<div class="erreur">Le titre et/ou la description de la catégorie doit être renseigné!</div>';
	}
	else{
		//on ré écrit le nom du dossier
		$titre_rewrite = OptimiseUrl($_POST["titre"]);
		//On regarde si le titre existe déja. Si le titre na pas changé, on risque une erreur puisque la requête ci-dessous va chercher un titre qui correspond..c'est pour ça que l'on ajoute une recherche sur un identifiant différent.
		$categorie_exist = mysql_query("SELECT titre_rewrite FROM CATEGORIES WHERE titre_rewrite='".mysql_real_escape_string($titre_rewrite)."' AND id!='".mysql_real_escape_string($id_transmit)."'");
		$total = mysql_num_rows($categorie_exist);
		if($total >= 1){
			echo '<div class="erreur">Il existe déja une catégories portant ce titre.</div>';
		}	
		//On vérifie si le nom du dossier est autorisé (fichier fonctions.php)
		else if(in_array($titre_rewrite , $dossier_interdit)){
			echo '<div class="erreur">Ce titre est interdit car il existe un dossier portant ce nom.</div>';
		}
		else{
			// on enregistre les données
			$result = mysql_query(" UPDATE CATEGORIES SET  nom_categorie='".mysql_real_escape_string($titre)."',  description_categorie='".mysql_real_escape_string($description)."',  titre_rewrite='".mysql_real_escape_string($titre_rewrite)."' WHERE id = '$id_transmit'");
 
			//Si il y a une erreur, on crie ^^
			if (!$result) {
				die('Requête invalide : ' . mysql_error());
			}
			else {
				//Cas 1 - Le nom du dossier passé en parametre dans l'url existe sur le serveur
				if (file_exists("../".$titre_transmit)) {
					// on compare les 2 noms de dossier et si ils sont différents, c'est que le titre à changé
					if($titre_transmit != $titre_rewrite){
						//on renome le dossier
						rename ("../".$titre_transmit, "../".$titre_rewrite);
					}	
					//on informe le webmaster
					echo '<div class="ok"><p>La modification à été éffectué avec succès. Redirection automatique en cours...</p></div>';
					//on redirige
					echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';	
				}
				//Cas 2 - Le nom du dossier dossier passé en parametre dans l'url n'existe pas sur le serveur
				else if(!file_exists("../".$titre_transmit)){
					//On informe le webmaster
					echo '<div class="erreur">1-Pour une raison indéterminée, le dossier "'.$titre_transmit.'" n\'existe pas sur le serveur!</div>';
					//on créé automatiquement un dossier en prenant le titre ré écrit de la catégorie au cas ou le webmaster change le titre
					mkdir ("../".$titre_rewrite, 0777);
					//On créé un fichier index dans ce même dossier pour lister les pages de la dite catégorie
					$fichier_a_ouvrir = fopen ("../".$titre_rewrite."/index.php", "w+");
					//on écrite le code php suivant
					fwrite($fichier_a_ouvrir,"<?php include('../categorie.php');?>");
					//On informe que le dossier à été re créé
					echo '<div class="ok">2-Le dossier "'.$titre_rewrite.'" a été créé!</div>';
					//on va chercher tout les articles de la catégorie pour re créer les fichiers manquants
					$article = mysql_query("SELECT titre_rewrite FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_transmit)."'");
					//On compte le nombre d'article
					$total = mysql_num_rows($article);
					//Si il y a quelque chose
					if(!empty($total)){
						//On boucle
						while($affiche = mysql_fetch_array($article)){
							//On re créer les fichiers
							$fichier_a_ouvrir = fopen ("../".$titre_rewrite."/".$affiche['titre_rewrite']."", "w+");
							fwrite($fichier_a_ouvrir,"<?php include('../page1.php');?>");
						}
						//Si erreur, on crie
						if (!$article) {
							die('Requête invalide : ' . mysql_error());
						} 
						//Tout c'est bien passé
						else{
							//On informe le webmaster
							echo '<div class="ok">3-L\'ensemble des fichiers ont été re créés!<br/>Redirection automatique en cours...</div>';
							//on redirige
							echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';	
						}
					}
					else{
						//Aucun fichier à re créer, on informe le webmaster
						echo '<div class="ok">3-Il n\'y a aucun article dans cette catégorie!<br/>Redirection automatique en cours...</div>';
						//on redirige
						echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php\');",6000) </script>';	
					}
					//on ferme
					fclose ($fichier_a_ouvrir);
				}
			}	
		}	
	}
//on ferme if(isset($_POST["Modifier"]))	
}
?>
 
<form action="modifier-categorie.php?id=<?php echo $id_transmit;?>&rewrite=<?php echo $titre_transmit;?>" method="post">
<fieldset>
 
<?php
//On va chercher les info de la catégorie
$result = mysql_query("SELECT nom_categorie,description_categorie FROM CATEGORIES WHERE id = $id_transmit");
 
while($affiche = mysql_fetch_array($result))
{
	?>
	<p>Titre de la cat&eacute;gorie :<br/>
	<input name="titre" size="65" value="<?php echo $affiche['nom_categorie'];?>" type="text"/>
	</p>
 
	<p>Description de la cat&eacute;gorie :<br/>
	<textarea name="description" rows="10" cols="50" ><?php echo $affiche['description_categorie'];?></textarea>
	</p>
 
	<input name="Modifier" value="Modifier" type="submit"/>
	<input name="Effacer" value="Effacer" type="reset"/>
 
	</fieldset>
 
	</form>
	<?php
	//On ferme la boucle while
}
?>
 
</div>
 
<?php include('footer.php');?>
 
</div>
 
</body>
 
</html>
Modification normal de la catégorie
Modification de la catégorie avec gestion des erreurs
Modification de la catégorie avec gestion des erreurs dossier et fichier
Voir/déposer un commentaire (0) | Signaler un problème