Gérer des fichiers de configuration ini [poo]

Description

Encore une classe PHP opérationnelle et complète qui reprend les lignes essentielles de la classe TIniFile disponible en langage Delphi (cf inifiles.pas).

!!!!!!!! IMPORTANT !!!!!!!!
VOUS DEVEZ IMPERATIVEMENT TELECHARGER LE FICHIER "stringlist.php" A L'ADRESSE SUIVANTE:
http://www.phpcs.com/code.aspx?id=33433

Cela me facilite le travail de mise à jour (si cela doit avoir lieu).

La classe est simple d'utilisation et les restrictions de chaîne sont les mêmes que pour TStringList pour que TIniFiles utilise TStringList. On charge l'INI dans la liste qui permet d'en faire une gestion approfondie.

Le vocabulaire employé dans un fichier INI est le suivant :
[BLOC]
CLE = VALEUR

Testé sur:
Apache 1.3.27
PHP 4.3.3
Windows

Source / Exemple :


<?php
  include 'stringlist.php';   //<== n'oubliez pas ;)

  class TIniFile {

//==================================== VARIABLES INTERNE
    /*private*/ var $Ini;

//==================================== UTILITAIRES
    /*private*/ function fgets_line($fic) {
      $Rsl = fgets($fic);
      if (substr($Rsl,strlen($Rsl)-2,2) == chr(13).chr(10))
        $Rsl = substr($Rsl,0,strlen($Rsl)-2);
      return $Rsl;
    }

    /*private*/ function PascalPos($Sub, $S) {
      $Ps = strpos($S,$Sub);
      return $Ps;
    }

//==================================== CORPS PRINCIPAL
    /*public*/ function Init() {
      $this->Ini = new TStringList();
      $this->Ini->ResetList(); //ne pas oublier !!
    }

    /*public*/ function Display() {
      $this->Ini->Display();
    }

    /*public*/ function LoadFromFile($FileName) {
      $this->Ini->Clear();
    //ON CHARGE LE FICHIER INI
      $fichier = fopen($FileName, 'r+');
      fseek($fichier, 0);
      while (!feof($fichier)) {
        $Line = $this->fgets_line($fichier);
        if ((substr($Line,0,1)!=';') && ($Line!=''))
          $this->Ini->Add($Line);
      }
      fclose($fichier);
    }

    /*public*/ function SaveToFile($FileName) {
      if (file_exists($FileName))
        unlink($FileName);
    //ON CREE LE FICHIER
      $fichier = fopen($FileName, 'a+');
      for ($x=0 ; $x<$this->Ini->Count() ; $x++) {
        fputs($fichier, $this->Ini->GetItem($x));
        if ($x != $this->Ini->Count()-1)
          fputs($fichier, chr(13).chr(10));
      }
      fclose($fichier);
    }

    /*public*/ function ReadIni($Section,$KeyName,$DefaultValue) {
      $Result = $DefaultValue;
      $Active = false;

      for ($x=0 ; $x<$this->Ini->Count() ; $x++) {
        //ON RECUPERE L'ITEM DE LISTE
          $Itm = $this->Ini->GetItem($x);

        //ON REGARDE SI ON EST DANS LA BONNE SECTION
          if ($Itm == '['.$Section.']')
            $Active = true;
          else
            if (substr($Itm,0,1)=='[')
              $Active = false;

        //ON RECUPERE LA VALEUR DESIREE
          $Pos = $this->pascalpos('=',$Itm);

          if (($Active) && ($Pos>0)) {
            $CurKey = substr($Itm,0,$Pos);
            $CurValue = substr($Itm,$Pos+1,strlen($Itm));
            if ($CurKey == $KeyName)
              $Result = $CurValue;
          }
      } //fin FOR
      return $Result;
    }

    /*public*/ function WriteIni($Section,$KeyName,$Value) {
      $Result = '';
      $Active = false;
      $Found = false;

      for ($x=0 ; $x<$this->Ini->Count() ; $x++) {
        $Itm = $this->Ini->GetItem($x);

        //ON REGARDE SI ON EST DANS LA BONNE SECTION
          if ($Itm == '['.$Section.']')
            $Active = true;
          else
            if (substr($Itm,0,1)=='[') {
            //AVANT DE DESACTIVER LE BLOC, AJOUTONS LA NOUVELLE CLE SI ELLE N'A PAS ETE TROUVEE
              if ($Active && (!$Found)) {
                $this->Ini->Insert($x,$KeyName.'='.$Value);
                $Found = true;
              }
            //ON QUITTE LE BLOC
              $Active = false;
            }

        //ON RECUPERE LA VALEUR DESIREE
          $Pos = $this->pascalpos('=',$Itm);

          if (($Active) && ($Pos>0)) {
            $CurKey = substr($Itm,0,$Pos);
            if ($CurKey == $KeyName) {
              $this->Ini->SetItem($KeyName.'='.$Value);
              $Found = true;
            }
          }
      } //fin FOR
      if ($Active && (!$Found))
        $this->Ini->Add($KeyName.'='.$Value);
      return $Result;
    }

    /*public*/ function DeleteKey($Section,$KeyName) {
      $Active = false;

      for ($x=0 ; $x<$this->Ini->Count() ; $x++) {
        //ON RECUPERE L'ITEM DE LISTE
          $Itm = $this->Ini->GetItem($x);

        //ON REGARDE SI ON EST DANS LA BONNE SECTION
          if ($Itm == '['.$Section.']')
            $Active = true;
          else
            if (substr($Itm,0,1)=='[')
              $Active = false;

        //ON RECUPERE LA VALEUR DESIREE
          $Pos = $this->pascalpos('=',$Itm);

          if (($Active) && ($Pos>0)) {
            $CurKey = substr($Itm,0,$Pos);
            if ($CurKey == $KeyName)
              $this->Ini->Delete($x);
          }
      } //fin FOR
    }

    /*public*/ function AddBlock($BlockName) {
      if ($this->Ini->IndexOf('['.$BlockName.']')==-1)
        $this->Ini->Add('['.$BlockName.']');
    }

    /*public*/ function DeleteBlock($Section) {
      $Idx = $this->Ini->IndexOf('['.$Section.']');
      if ($Idx != -1)
        while (true) {
          $this->Ini->Delete($Idx);
          if ($Idx == $this->Ini->Count())
            break;
          else
            if (substr($this->Ini->GetItem($Idx),0,1) == '[')
              break;
        }
    }

    /*public*/ function BlockExists($Section) {
      return $this->Ini->IndexOf('['.$Section.']')!=-1;
    }

    /*public*/ function KeyExists($Section,$KeyName) {
      return $this->ReadIni($Section,$KeyName,chr(0))!=chr(0);
      //CHR(0) ne pourra jamais être valeur. On s'en sert donc pour le test
    }

    /*public*/ function EnumBlocks($SepChar) {
      $Rsl = '';
      for ($i=0 ; $i<$this->Ini->Count() ; $i++) {
        $Line = $this->Ini->GetItem($i);
        if ((substr($Line,0,1)=='[') && (substr($Line,strlen($Line)-1,1)==']'))
          $Rsl .= substr($Line,1,strlen($Line)-2) . $SepChar;
      }
      return $Rsl;
    }

    /*public*/ function EnumKeys($BlockName,$SepChar) {
      $Idx = $this->Ini->IndexOf('['.$BlockName.']');
      $Rsl = '';
      if ($Idx != -1)
        for ($i=$Idx+1 ; $i<$this->Ini->Count() ; $i++) {
          $Line = $this->Ini->GetItem($i);
          if ((substr($Line,0,1)=='[') && (substr($Line,strlen($Line)-1,1)==']'))
            break;
          else
            $Rsl .= substr($Line,0,strpos($Line,'=')) . $SepChar;
        }
      return $Rsl;
    }

  } //fin CLASS
?>

Conclusion :


Vous pouvez toujours allez voir http://altert.family.free.fr/

IMPORTANT: le Zip propose un script de démonstration.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.