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.
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.