CE BLOG N'EST PLUS MIS A JOUR !
POUR DES INFORMATIONS RECENTES VEUILLEZ VOUS RENDRE ICI
Bienvenue sur le blog d'un développeur web : Actualités du monde informatique et scientifique, morceaux de programmations et diverses informations intéréssantes.

Editer un fichier de constantes php via un formulaire.

Posté par : Neg le : 2011-07-17 16:47:47



Prenons un cas concret d'un site multi-langues, ou les textes pour chacune des langues sont gérés par un fichier de constantes. Exemple : lang_fr.php, lang_uk.php... contenant :

lang_fr.php


//GENERAL
define('ERREUR_GENERALE','Une erreur est survenue ! ');
define('BONJOUR' , 'Bonjour');
define('DECONNEXION' , 'Déconnexion');
define('URL_INVALIDE', 'url invalide !');
define('PAGE_INACCESSIBLE', 'page inaccessible!');
define('PROFIL_INACCESSIBLE', 'profil inaccessible!');
...


Nos fichiers correspondant pour les autres langues contiennent exactement la même chose, c'est-à-dire qu'ils ne sont pas encore traduit. Comment mettre en place un système d'administration permettant de les traduire ? Cela permettra ainsi à une personne extérieur (le traducteur) de gérer ces modification sans avoir à allez directement dans le code du fichier php, et sans voir le nom des constantes qui ne le concerne pas.

Ce que nous allons faire consiste donc à lire notre fichier de constantes, faire les traitements pour ne récupérer que le texte des constantes, et par la même occasion les commentaires qui permettrons de se repérer. Ensuite nous affichons un formulaire pour chacune des lignes et un bouton "submit" permettant de les modifier. Voici les 2 fonctions permettant de mettre ce système en place. Commentés comme il se doit.

Tout d'abord la fonction lisant notre fichier (dont le nom sera passé en paramètre), et pour chacune des lignes, créant le formulaire de modification :


function formTraduction($langue='lang_fr')
{
$content='';
//on ouvre le fichier
$monfichier = fopen($langue.'.php', 'r+');
$i=0;
//Pour chacune des ligne parcourus
while($ligne = fgets($monfichier))
{
//suppression des espaces inutiles au cas ou
$ligne=trim($ligne);
//si la ligne n'est pas l'ouverture/fermeture des balises php, ou vide :
if($ligne!='<?php' && $ligne!='?>' && $ligne!='')
{
//on vérifie les 2 premiers caractères
$debut=substr($ligne, 0, 2);
if($debut=='//')
{
//si c'est un commentaire on l'affiche sous forme de titre
$ligne=str_replace('//', '', $ligne);
$content.='<h2>'.$ligne.'</h2>';
}
else
{
//sinon on traite notre ligne par quelque petits bricolages pour ne récupérer que le contenu texte de la constante et pas son nom
$tabligne=explode(',', $ligne, 2);
$tabligne[1]=trim($tabligne[1]);
$tabligne[1]=substr($tabligne[1], 1);
$tabligne[1]=substr($tabligne[1], 0, -3);
$tabligne[1]=stripslashes($tabligne[1]);

//on stoque aussi le nom de la constante

$tabligne[0]=trim($tabligne[0]);
$tabligne[0]=substr($tabligne[0], 8);
$tabligne[0]=trim($tabligne[0]);
$tabligne[0]=substr($tabligne[0], 0, -1);
//on met en place le formulaire permettant de modifier la ligne, ils nous faut garder en champs caché le numéro de la ligne ainsi que le nom de la constante et bien sur celui du fichier
$content.='<form class="trad" action="" method="post">';
$content.='<input type="text" name="texte" value="'.$tabligne[1].'">';
$content.='<input type="hidden" name="langue" value="'.$langue.'">';
$content.='<input type="hidden" name="ligne" value="'.$i.'"&>';
$content.='<input type="hidden" name="nom" value="'.$tabligne[0].'">';
$content.='<input type="submit" name="edittext" value="Ok"&>';
$content.='</form>';
}
}
$i++;
}
//on ferme le fichier
fclose($monfichier);
return $content;
}


maintenant que nos formulaire sont prêt, voici la fonction permettant de le traiter, pour cela nous allons créez un fichier temporaire, copiant chaque ligne de l'autre fichier. Excepté celle que l'on veux modifier. On supprime ensuite l'ancien fichier pour le remplacer par le temporaire que l'on renomme. Le code :


//on attend les données posté par notre formulaire mis en place ci-dessus.
function editLangue($data)
{
extract($data);
$monfichier = fopen($langue.'.php', 'r+');
$monfichier_temp = fopen(temp_'.$langue.'.php', 'a+');
$i=0;
while($parcours = fgets($monfichier))
{
if($i==($ligne))
{
$texte=str_replace("\n", "", $texte);
//si on est sur notre ligne à modifier, on reconstruit la ligne avec le "define" le nom de la constante et son texte.
$newligne="define('".$nom."' , '".$texte."');"."\n";
fputs($monfichier_temp, $newligne);
}
else
{
//sinon on copie simplement la même ligne dans le nouveau fichier
fputs($monfichier_temp, $parcours);
}
$i++;
}
fclose($monfichier);
fclose($monfichier_temp);
unlink($langue.'.php');
rename(temp_'.$langue.'.php', $langue.'.php');
}


voila, avec ces 2 fonctions, il suffit de faire quelque chose de ce type pour pouvoir traduite la langue via une administration basique :


if(isset($_POST["edittext"]))
{
editLangue($_POST);
}
//on appelle la fonction avec le nom du fichier voulu en paramètre
echo formTraduction('lang_fr');


c'est fonctionnel, mais je ne sais pas si les explications sont bien claires... En espérant une nouvelle fois que ça pourra aider certaines personnes.

avec un peu d'astuce et de mise en page on arrive à un aperçu de ce type :

lien direct : http://numa-bord.com/old/leblog/chezneg-leblog.php?id_art=257&titre=Editer-un-fichier-de-constantes-php-via-un-formulaire.
tags : Informatique (68), php (21), editer (1), fichier (1), constante (1), traduction (1), administration (1),


J'aime, 5 personnes aiment çaCommentaire(s)(0)

propulsé par Neg