Gérer des fichiers de configuration ini [poo]

Soyez le premier à donner votre avis sur cette source.

Vue 9 148 fois - Téléchargée 329 fois

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

Ajouter un commentaire

Commentaires

Naeith
Messages postés
2
Date d'inscription
jeudi 5 juin 2008
Statut
Membre
Dernière intervention
15 juin 2009
-
au passage compatible php 4 & 5?
Naeith
Messages postés
2
Date d'inscription
jeudi 5 juin 2008
Statut
Membre
Dernière intervention
15 juin 2009
-
Intéréssant code, vais tester ca et je t'en donne des nouvelles, je connais la méthode sous parse_ini_file, vais tester si ton code est plus facile a comprendre ^^
Merci en tout cas. A bientôt.
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
8 -
Je rajouterai également que cette classe offre une flexibilité non négligeable sur la manipulation des données INI. Seul reproche: Apache est lent, car un tel code source en Win32 est très rapide.
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
8 -
Initialement, je n'avais pas prévu de faire ce code. Mais comme son fonctionnement pouvait hériter de mon code précédent N°33433 qui gère des listes, j'ai voulu voir ce que ça donne, histoire de montrer un autre champ d'application de la classe TStringList.

Concernant ton idée: oui, pourquoi pas, mais je ne connaissais pas.
cs_jeca
Messages postés
341
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
14 juillet 2011
10 -
Bonjour,

Tu aurais pu utiliser la fonction "parse_ini_file" qui retourne un tableau associatif dont les clés sont les sections et les rubrique du fichier ini.
Dans le cas présent :
$IniFile['code']['Author'] = 'grandvizir'
$IniFile['code']['WebSite'] = http://altert.family.free.fr/

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.