BlueGEEK Journal

Accueil > Programmes > Projets PHP pour Sites WEB > Agendas > Cyber Agenda ++ > Cyber-Agenda++ (Projet) > Editer le Journal

AGENDA

Editer le Journal

PHP

mercredi 8 mars 2006, par bluegyn_spip

Toute la difficulté vient de la gestion séquentielle du fichier, qui contrairement à une base de données ne permet pas la modification ponctuelle (ou aléatoire) d’un enregistrement quelconque, (ici une seule journée) un artifice assez simple (champ masqué) a été trouvé dans ce nouveau script...

PAGE AFFICHER_JOUR.PHP

<html>

<head><title>Cyber Agenda - **{:- Bluegyn 2006 [AFFICHER JOURNEE]</title>



<style>

body {font-family:arial}

</style>



<?

require('admin/agenda.inc.php');

require('admin/mydata.inc.php');

require('admin/saints.fnc.php');



//define("_DEBUG_",TRUE );

define("_DEBUG_",FALSE);



define("_INIT_",0   );

define("_ACTION_",1 );

$_SELF=$_SERVER['PHP_SELF']; // Nom de la page elle mÝme



?>



</head>



<!-- DEBUT PAGE HTML -->



<body bgcolor="<?echo$agenda_couleur_fond?>">

<!-- Place le focus sur le lieu -->

<?

// =============================================================================

// TESTE LE MODE D'ENTREE INIT = 0 si GET/POST est vide

// =============================================================================

$mode = isset($_POST['mode'])?$_POST['mode'] : _INIT_;



$msg='';

$date_actu='1-1-2006';



if (isset($_GET["date_actu"]))

        $date_actu=$_GET["date_actu"];

if (isset($_GET["msg"]))

        $msg=$_GET["msg"];



$tab = explode("-",$date_actu);



?>

<table width="100%"><tr><td WIDTH="33%"><h1>

<a href="agenda.php?d=<?echo$mydata?>"><?echo$agenda_titre?></a></h1></td><td WIDTH="33%" align="center">

<h3><img src="img/add.bmp"> &nbsp;Editer le journal</h3></td><td align="right">

<?echo date("d-m-Y").'<br>'.saint_jour();?></td></tr>

</table>

<!-- $_GET RECUPERE L'URL -->

<hr>

<center>



<?



switch ($mode)

{



// 00000000000000000000000000000000000000000000000000000000

case _INIT_ :

// 00000000000000000000000000000000000000000000000000000000



echo '

 <form  method="post" action="'.$_SELF.'">

 <table border=0 bgcolor="yellow" cellspacing="2" width="80%">

 <caption><h1>'.$date_actu.'</font></h1></caption>

 <tr>

 <th bgcolor="yellow"></th>

 <th>Heure</th><th valign="top" bgcolor="yellow">

 '.$legende_lieu.'</th><th bgcolor="yellow">

 '.$legende_objet.'</th><th bgcolor="yellow">

 !</th></tr><tr>';



$_F=fopen($dir_data.'/'.$mydata,"r+"); // r+ = Lecture ET écriture

$i=0;



while(!feof($_F))

{ // $tableau[$i]=explode("|",fgets($_F,256));

        $ligne=explode("|",fgets($_F,256));

        $tab_date_actu=explode("-",$date_actu);

 $jd_date_actu=gregoriantojd($tab_date_actu[1],$tab_date_actu[0],$tab_date_actu[2]);



        if ((!empty($ligne[0])) && ($jd_date_actu==$ligne[0]))

 {

 if(_DEBUG_)echo "ligne 0 =$ligne[0]<br>";

 echo '

   <tr bgcolor='.(($i/2)==(int)($i/2) ? "silver":"snow").'>

   <th width="3%">'.($i+1).'

     <input type="hidden" name="index['.$i.']" value="'.$ligne[0].'">

     <input type="hidden" name="dates['.$i.']" value="'.$ligne[1].'">

   </td>

   <th>

     <input name="heures['.$i.']" value="'.$ligne[2].'" size="3"></th>

   <td>

     <input name="lieux['.$i.']" value="'.$ligne[3].'" size="40"></td>

   <th width="10%">

     <input name="objets['.$i.']" value="'.$ligne[4].'" size="80"></th>

   <td>

     <input name="important['.$i.']" value="'.$ligne[5].'" size="1"></td>

     </tr><tr>';

 }

 else

 // Si pas la date du jour affiche tout sous formecahcé poru garder

 // l'ordre séquentiel du fichier data

 {

   if (!empty($ligne[0]))

   {

     echo'

     <input type="hidden" name="index['.$i.']" value="'.$ligne[0].'">

     <input type="hidden" name="dates['.$i.']" value="'.$ligne[1].'">

     <input type="hidden" name="heures['.$i.']" value="'.$ligne[2].'">

     <input type="hidden" name="lieux['.$i.']" value="'.$ligne[3].'">

     <input type="hidden" name="objets['.$i.']" value="'.$ligne[4].'">

     <input type="hidden" name="important['.$i.']" value="'.$ligne[5].'">';

     };

   }

        $i++;

};

fclose($_F);



echo '

 </tr></table><hr>

 

 <input type="button" value="Retour" onClick="self.close();">

 <input type="hidden" name="mode" value="1">

 <input type="submit" value="Enregistrer les modifications">

 </form>';



break;



case _ACTION_ :



 $index  = isset( $_POST['index'])   ? $_POST['index']   : "0";

 $dates  = isset( $_POST['dates'])   ? $_POST['dates']   : "1-1-1";

 $heures = isset( $_POST['heures'])  ? $_POST['heures']  : "00:00";

 $lieux  = isset( $_POST['lieux'])   ? $_POST['lieux']   : "";

 $objets = isset( $_POST['objets'])  ? $_POST['objets']  : "";

 $important = isset( $_POST['important'])  ? $_POST['important']  : "";



$_F = fopen($dir_data.'/'.$mydata, 'w');



$i=0;

foreach($dates as $date)

{

 $ligne = $index[$i]."|".$dates[$i]."|".$heures[$i]."|".

           $lieux[$i]."|".$objets[$i]."|".$important[$i]."|\n";

 if(_DEBUG_) echo "ligne = $ligne<br>";;

 fputs ($_F,$ligne);

 $i++;

 }; // End (for each)



fclose ($_F);

if(!_DEBUG_) print('<meta http-equiv="refresh" content="0;URL=agenda.php">');



break;



}; /* SWITCH */

?>



</body>

</html>

Comme il s’agit d’un fichier séquentiel

- Il ne peut qu’être lu en entier du premier au dernier enregistrement

- Puis réécrit du 1er au dernier pour sauvegarder les modification

- L’artifice utilisé ici est que tous les champs sont lus mais :

  • Les enregistrements du jour sont affichés :
    • BALISE INPUT avec l’attribut TYPE="TEXT"
  • Tous les autres sont masqués :
    • BALISE INPUT avec l’attribut TYPE="HIDDEN"

- Chaque champs reçoit comme nom le numéro de la ligne dans le fichier

- Pour la sauvegarde il suffit d’appeler chaque ligne, cachée ou pas, de 0 à count()-1 ...

Il suffisait d’y penser