Gérer des listes avec tstringlist [poo]

Soyez le premier à donner votre avis sur cette source.

Vue 8 213 fois - Téléchargée 849 fois

Description

Gestion de panier: ajouter, insérer, déplacer, supprimer, trier, repérer, vider, enregistrer dans un fichier, afficher dans le navigateur...

C'est une classe PHP opérationnelle, testée et retestée (!) qui reprend les lignes essentielles de la classe TStringList disponible en langage Delphi (cf classes.pas).

Le fonctionnement de la classe est simple : tous les items sont juxtaposés dans une chaîne de caractères et séparés par le caractère #0 de la table ASCII (non disponible sur le clavier).
ATTENTION: si vous ajoutez un item comportant ce caractère, toute la liste sera faussée. Le caractère est paramétrable via la variable $FSep.

En principe, avec cette classe, on peut gérer facilement des paniers sachant que la classe a des relations E/S permettant des enregistrements et des restaurations faciles depuis les fichiers.

Testé sur:
Apache 1.3.27
PHP 4.3.3
Windows

Source / Exemple :


<?php
  class TStringList {

//==================================== VARIABLES INTERNES
    /*private*/ var $FSep = '';
    /*private*/ var $FContent = '';

//==================================== UTILITAIRES
    /*private*/ function CountCharInStr($Char, $String) {
      $Cnt = 0;
      for ($x=0 ; $x<strlen($String) ; $x++)
        if ($String[$x] == $Char)
          $Cnt++;
      return $Cnt;
    }

    /*private*/ function IL_CheckError($Index) {
      return ($Index<0) || ($Index>=$this->Count());
    }

    /*private*/ function Min($I1, $I2) {
      if ($I1<$I2)
        return $I1;
      else
        return $I2;
    }

    /*private*/ function AnsiCompareString($S1, $S2) {
      for ($idx=0 ; $idx < $this->Min(strlen($S1),strlen($S2)) ; $idx++)
        if (Ord($S1[$idx]) < Ord($S2[$idx]))
          return true;
        else
          return false;
    }

//==================================== CORPS GENERAL
    /*public*/ function ResetList() {
      $this->FSep = chr(0);
      $this->FContent = '';
    }

    /*public*/ function Count() {
      return $this->CountCharInStr($this->FSep, $this->FContent);
    }

    /*public*/ function Add($Value) {
      $this->FContent .= $Value . $this->FSep;
    }

    /*public*/ function Delete($Index) {
      if ($this->IL_CheckError($Index))
        Exit;
      $Rsl = '';
      for ($x=0 ; $x<=$this->Count() - 1 ; $x++)
        if ($x != $Index)
          $Rsl .= $this->GetItem($x) . $this->FSep;
      $this->FContent = $Rsl;
    }

    /*public*/ function Insert($Index, $Value) {
      $Rsl = '';
      for ($x=0 ; $x<$this->Count() ; $x++) {
        if ($x == $Index)
          $Rsl .= $Value . $this->FSep;
        $Rsl .= $this->GetItem($x) . $this->FSep;
      }
      if ($Index == $this->Count())
        $Rsl .= $Value . $this->FSep;
      $this->FContent = $Rsl;
    }

    /*public*/ function Move($CurIndex, $NewIndex) {
      $Rsl = $this->GetItem($CurIndex);
      $this->Delete($CurIndex);
      if ($NewIndex > $CurIndex)
        $NewIndex--;
      $this->Insert($NewIndex,$Rsl);
    }

    /*public*/ function GetItem($Index) {
      $Rsl = '';
      $Last = 0;
      $Cnt = 0;
      if ($this->IL_CheckError($Index))
        Exit;
      for ($x=0 ; $x<strlen($this->FContent) ; $x++)
        if ($this->FContent[$x] == $this->FSep) {
          if ($Index == $Cnt) {
            $Rsl = substr($this->FContent, $Last, $x-$Last);
            break;
          }
          $Cnt++;
          $Last = $x+1;
        }
      return $Rsl;
    }

    /*public*/ function SetItem($Index, $Value) {
      if ($Index > $this->Count()-1)
        $this->Add($Value);
      else {
        if ($this->IL_CheckError($Index))
          Exit;
        $Rsl = '';
        for ($x=0 ; $x<=$this->Count()-1 ; $x++) 
          if ($x == $Index)
            $Rsl .= $Value . $this->FSep;
          else
            $Rsl .= $this->GetItem($x) . $this->FSep;
        $this->FContent = $Rsl;
      }
    }

    /*public*/ function Clear () {
      $this->FContent = '';
    }

      /*private*/ function SortEx($SortMode) {
        for ($i=1 ; $i<$this->Count() ; $i++) {
          $Locked = false;
          for ($n=0 ; $n<$i ; $n++) {
            if (($this->AnsiCompareString($this->GetItem($i), $this->GetItem($n))==$SortMode) && !$Locked) {
              $this->Move($i,$n);
              $Locked = true;
            }
          }
        }
      }

    /*public*/ function Sort() {
      $this->SortEx(true);
    }

    /*public*/ function RevSort() {
      $this->SortEx(false);
    }

    /*public*/ function IndexOf($Value) {
      $Position = -1;
      for ($x=0 ; $x<$this->Count() ; $x++)
        if ($this->GetItem($x)==$Value) {
          $Position=$x;
          break;
        }
      return $Position;
    }

    /*public*/ function AddToFile($FileName) {
      $fichier = fopen($FileName, 'a+');
      fputs($fichier, $this->FContent);
      fclose($fichier);
    }

    /*public*/ function LoadFromString($Value) {
      $this->FContent = $Value;
    }

    /*public*/ function LoadFromFile($FileName) {
      $fichier = fopen($FileName, 'r');
      $this->FContent = fread($fichier, filesize($FileName));
      fclose($fichier);
    }

    /*public*/ function Display() {
      echo str_replace($this->FSep, '<br>', $this->FContent);
    }

  } //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 Commentaire
Messages postés
11
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
6 mai 2006

Bon, je suis nul en php, et il me falait un panier, et bien cette source qui est marqué initié, et bien elle est facilement compréhensible grace au fichier magique index.php, tout semble si simple, j'ai réussi a mettre en place ma boutique.

un grand merci pour cette class facil d'usage, mais bon apres je m'aventure pas dans le code de la class, c'est du chinoi melanger au russe. ;)

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.