begin process at 2012 05 27 17:59:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] SMARTDIR : LES ITÉRATEURS EN PHP - LECTURE INTELLIGENTE DE RÉPERTOIRE

[PHP5] SMARTDIR : LES ITÉRATEURS EN PHP - LECTURE INTELLIGENTE DE RÉPERTOIRE


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :iterateurs, spl, lecture, répertoire, filtres Niveau :Expert Date de création :20/11/2006 Date de mise à jour :20/11/2006 16:21:40 Vu / téléchargé :6 261 / 251

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

 Description

J'ai décidé de montrer toute la puissance de la SPL (Standard PHP Library) et des itérateurs en PHP5.
Ce package est à personnaliser. Il permet la lecture récursive ou non de répertoire, en appliquant, ou non, des filtres.
FILTER_ON fait un filtre montrant uniquement les fichiers correspondant aux masques :
oSmartDir::FILTER_ON = 'php';
Va filtrer sur les fichiers contenant'php'.
oSmartDir::FILTER_ON = array ('php, 'html', 'js');
va filtrer sur les fichiers contenant php, html, ou js.

FILTER_OFF faut un filtre négatif :
oSmartDir::FILTER_OFF = 'php';
ne montrera que les fichiers ne contenant pas 'php'.
Peut aussi être un tableau de masques.

oSmartDir::DIr = false;
Ne lira pas les répertoire

oSmartDir::FILE = false;
ne montrera pas les fichiers

oSmartDir::RECURSE = false;
Ne lira pas récursivement.

On peut évidemment modifier ces filtres via la méthode myFilter::valid ()

Méthodes :
oSmartDir::getDir ();
permet simplement de récupérer l'itérateur pour l'arborescence définie via les filtres (ou non, d'ailleurs).
Plus tard, j'implémenterai de nouvelles méthodes "outils" : copie, déplacement etc...en tenant compte des filtres.
//////
J'ai mis une méthode copy ().
Attention, elle est effective sur le fichier d'exemple : le zip contient toute une arborescence.  Le fichier exemple lit cette arbo avec divers filtres, pour donner quelques exemples, puis crée un répertoire copie/ dans lequel il copie toute l'arborescence, mais en ne prenan t en compte que les fichiers contenant 'php'.
//////

J'ai volontairement montré un package assez complexe...mais la lecture d'un répertoire de manière récursive peut se faire en 3 lignes grâce aux itérateurs :
<?php

$dir = new RecursiveIteratorIterator(
           new RecursiveDirectoryIterator('.'), true);

foreach ( $dir as $file ) {
    echo str_repeat('-', $dir->getDepth()) . ' '.$file.'<br />';
}
?>
Essayez ce code : il va lire récursivement le répertoire courant (donc, avec ses sous-répertoires), tout en indentant en fonction de l'arborescence.
Si si...!


Source

  • <?php
  • /**
  • * smartDir package
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20011120
  • */
  • /**
  • * class myFilter
  • * check active filters
  • * RecursiveFilterIterator child
  • */
  • class myFilter extends RecursiveFilterIterator {
  • /**
  • * active filter ON (keep these)
  • *
  • * @var mixed
  • */
  • private $mFilterOn;
  • /**
  • * active filter OFF (do not keep these)
  • *
  • * @var mixed
  • */
  • private $mFilterOff;
  • /**
  • * iterator
  • *
  • * @var iterator
  • */
  • private $it = null;
  • /**
  • * error message
  • *
  • * @var string
  • */
  • const ERROR_NO_VALID_FILTER = '{__FILTER__} is not a valid setable filter';
  • /**
  • * Constructor
  • *
  • * @param iterator $it
  • * @param mixed $mFilterOn
  • * @param mixed $mFilterOff
  • */
  • public function __construct ($it, $mFilterOn, $mFilterOff) {
  • parent::__construct ($it);
  • $this -> it = $it;
  • $this -> mFilterOn = $mFilterOn;
  • $this -> mFilterOff = $mFilterOff;
  • }
  • /**
  • * Function accept ()
  • * returns true or false if the current element is accepted or not
  • *
  • * @return boolean
  • */
  • public function accept () {
  • if (!is_null ($this -> mFilterOn)) {
  • if (!is_array ($this -> mFilterOn)) {
  • $mPos = strpos ($this -> it -> getFileName (), (string)$this -> mFilterOn);
  • if (false === $mPos) {
  • return false;
  • }
  • } else {
  • foreach ($this -> mFilterOn as $sFilter) {
  • $mPos = strpos ($this -> it -> getFileName (), (string)$sFilter);
  • if (false !== $mPos) {
  • return true;
  • }
  • }
  • return false;
  • }
  • }
  • if (!is_null ($this -> mFilterOff)) {
  • if (!is_array ($this -> mFilterOff)) {
  • $mPos = strpos ($this -> it -> getFileName (), (string)$this -> mFilterOff);
  • if (false !== $mPos) {
  • return false;
  • }
  • } else {
  • foreach ($this -> mFilterOff as $sFilter) {
  • $mPos = strpos ($this -> it -> getFileName (), (string)$sFilter);
  • if (false !== $mPos) {
  • return false;
  • } else {
  • return true;
  • }
  • }
  • return false;
  • }
  • }
  • return true;
  • }
  • }
  • /**
  • * Class MyRecursiveDirectoryIterator
  • * parent of main class, RecursiveDirectoryIterator child
  • *
  • */
  • class MyRecursiveDirectoryIterator extends RecursiveDirectoryIterator {
  • /**
  • * are dir valid
  • *
  • * @var boolean
  • */
  • protected $bDir = true;
  • /**
  • * are files valid
  • *
  • * @var boolean
  • */
  • protected $bFile = true;
  • /**
  • * filter ON (keep these)
  • *
  • * @var mixed
  • */
  • protected $mFilterOn = null;
  • /**
  • * filter OFF (do not keep these)
  • *
  • * @var mixed
  • */
  • protected $mFilterOff = null;
  • /**
  • * Recursive dir or not
  • *
  • * @var boolean
  • */
  • protected $bRecurse = true;
  • /**
  • * props that can be set
  • *
  • * @var array
  • */
  • protected $aCanBeSet = array (
  • 'FLAG',
  • 'FILTER_ON',
  • 'FILTER_OFF',
  • 'DIR',
  • 'FILE',
  • 'PATH',
  • 'RECURSE'
  • );
  • /**
  • * filter ON (keep these)
  • *
  • * @var RecursiveDirectoryIterator class constant
  • */
  • protected $cFlag = 0;
  • /**
  • * path to be read
  • *
  • * @var string (valid path)
  • */
  • protected $sPath;
  • protected $sCreatedDir = null;
  • /**
  • * error messages
  • *
  • * @var string
  • */
  • const ERROR_PATH_NOT_FOUND = '{__PATH__} has not been found';
  • const ERROR_PROP_NOT_SETABLE = '{__PROP__} is not a setable property';
  • const ERROR_BAD_PROP_VALUE = '{__VAL__} is not a correct value for {__PROP__}';
  • const ERROR_NO_BOOLEAN = '{__PROP__} value must be a boolean';
  • /**
  • * getChildren will retrieve sub path
  • *
  • * @return subiterator
  • */
  • public function getChildren () {
  • $iSub = new self ($this -> getPathname ());
  • $iSub -> bDir = $this -> bDir;
  • $iSub -> bFile = $this -> bFile;
  • $iSub -> mFilterOn = $this -> mFilterOn;
  • $iSub -> mFilterOff = $this -> mFilterOff;
  • return $iSub;
  • }
  • /**
  • * get current key
  • *
  • * @return string
  • */
  • public function key () {
  • return $this -> getPath ();
  • }
  • /**
  • * get current file
  • *
  • * @return string
  • */
  • public function current () {
  • return $this -> getFileName ();
  • }
  • /**
  • * is the current element valid or not
  • *
  • * @return boolean
  • */
  • public function valid () {
  • if (!is_null ($this -> sCreatedDir)) {
  • if ($this -> current () === $this -> sCreatedDir) {
  • return false;
  • }
  • }
  • $oFilter = new myFilter ($this, $this -> mFilterOn, $this -> mFilterOff);
  • if (true === parent::valid ()) {
  • if (false === $oFilter -> accept ()) {
  • if (false === $this -> isDir ()) {
  • parent::next ();
  • return $this -> valid ();
  • } else {
  • return true;
  • }
  • }
  • if (false === $this -> bDir) {
  • if (true === $this -> isDir ()) {
  • parent::next ();
  • return $this -> valid ();
  • }
  • }
  • if (false === $this -> bFile) {
  • if (true === $this -> isFile ()) {
  • parent::next ();
  • return $this -> valid ();
  • }
  • }
  • return true;
  • }
  • return false;
  • }
  • /**
  • * Setter
  • *
  • * @param string $sProp
  • * @param mixed $mVal
  • */
  • public function __set ($sProp, $mVal) {
  • if (!in_array ($sProp, $this -> aCanBeSet)) {
  • throw new Exception (str_replace ('{__PATH__}', $sProp, self::ERROR_PROP_NOT_SETABLE));
  • }
  • switch ($sProp) {
  • case 'FLAG' :
  • if (!in_array ($mVal, array (parent::CURRENT_AS_FILEINFO, parent::KEY_AS_FILENAME, parent::NEW_CURRENT_AND_KEY, 0))) {
  • throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_PATH_NOT_FOUND));
  • }
  • $this -> cFlag = $mVal;
  • break;
  • case 'FILTER_ON' :
  • $this -> mFilterOn = $mVal;
  • $this -> mFilterOff = null;
  • break;
  • case 'FILTER_OFF' :
  • $this -> mFilterOff = $mVal;
  • $this -> mFilterOn = null;
  • break;
  • case 'DIR' :
  • if (!is_bool ($mVal)) {
  • throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
  • }
  • $this -> bDir = $mVal;
  • break;
  • case 'FILE' :
  • if (!is_bool ($mVal)) {
  • throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
  • }
  • $this -> bFile = $mVal;
  • break;
  • case 'RECURSE' :
  • if (!is_bool ($mVal)) {
  • throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
  • }
  • $this -> bRecurse = $mVal;
  • break;
  • case 'PATH' :
  • if (!is_dir ($mVal)) {
  • throw new Exception (str_replace ('{__PATH__}', $mVal, self::ERROR_PATH_NOT_FOUND));
  • }
  • $this -> sPath = $mVal;
  • break;
  • }
  • }
  • }
  • /**
  • * Class oSmartDir
  • * MyRecursiveDirectoryIterator child
  • *
  • */
  • class oSmartDir extends MyRecursiveDirectoryIterator {
  • /**
  • * Constructor
  • *
  • * @param string $sPath (valid path)
  • */
  • const ERROR_COPY_FAILED = 'Failed to copy {__FROM__} to {__TO__}';
  • public function __construct ($sPath) {
  • if (!is_dir ($sPath)) {
  • throw new Exception (str_replace ('{__PATH__}', $sPath, self::ERROR_PATH_NOT_FOUND));
  • }
  • $this -> sPath = $sPath;
  • }
  • /**
  • * getDir will retrieve the asked directory
  • *
  • * @return iterator
  • */
  • public function getDir () {
  • parent::__construct ($this -> sPath, $this -> cFlag);
  • if (true === $this -> bRecurse) {
  • return new RecursiveIteratorIterator ($this, true);
  • } else {
  • return $this;
  • }
  • }
  • public function copy ($sTo) {
  • $aDir = $this -> getDir ();
  • if (!is_dir ($sTo)) {
  • mkdir ($sTo, '0755');
  • }
  • $this -> sCreatedDir = $sTo;
  • while ($aDir -> valid ()) {
  • if ($aDir -> current () !== $sTo && !$aDir -> isDot ()) {
  • if (!$aDir -> isDir ()) {
  • if (!@copy ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ())) {
  • throw new Exception (str_replace (array ('{__FROM__}', '{__TO__}'), array ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ()), self::ERROR_COPY_FAILED));
  • }
  • } else {
  • if (!@mkdir ($sTo.'/'.$aDir -> getPathName (), '0755')) {
  • throw new Exception (str_replace (array ('{__FROM__}', '{__TO__}'), array ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ()), self::ERROR_COPY_FAILED));
  • }
  • }
  • }
  • $aDir -> next ();
  • }
  • $this -> sCreatedDir = null;
  • }
  • }
  • /**
  • * STARTING EXAMPLES
  • */
  • try {
  • $oDir = new oSmartDir ('.');
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • try {
  • echo '<br /><strong>ALL NO RECURSIVE</strong><br />';
  • $oDir -> RECURSE = false; // no recursivity
  • $aDir = $oDir -> getDir ();
  • while ($aDir -> valid ()) {
  • if ($aDir -> isDot ()) {
  • $aDir -> next ();
  • }
  • $sHtml = '';
  • if ($aDir -> isDir ()) {
  • $sHtml.= '<strong>'.$aDir -> current ().'</strong>';
  • } else {
  • $sHtml.= '<em>'.$aDir -> current ().'</em>';
  • }
  • $sHtml .= '<br />';
  • echo $sHtml;
  • $aDir -> next ();
  • }
  • echo '<br /><strong>ALL</strong><br />';
  • $oDir -> RECURSE = true; // recursivity back to true
  • $aDir = $oDir -> getDir ();
  • while ($aDir -> valid ()) {
  • if ($aDir -> isDot ()) {
  • $aDir -> next ();
  • }
  • $sHtml = str_repeat ('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $aDir -> getDepth ());
  • if ($aDir -> isDir ()) {
  • $sHtml.= '<strong>'.$aDir -> current ().'</strong>';
  • } else {
  • $sHtml.= '<em>'.$aDir -> current ().'</em>';
  • }
  • $sHtml .= '<br />';
  • echo $sHtml;
  • $aDir -> next ();
  • }
  • echo '<br /><strong>ALL + fileSize</strong><br />';
  • $oDir -> RECURSE = true; // recursivity back to true
  • $aDir = $oDir -> getDir ();
  • while ($aDir -> valid ()) {
  • if ($aDir -> isDot ()) {
  • $aDir -> next ();
  • }
  • $sHtml = str_repeat ('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $aDir -> getDepth ());
  • if ($aDir -> isDir ()) {
  • $sHtml.= '<strong>'.$aDir -> current ().'</strong>';
  • } else {
  • $sHtml.= '<em>'.$aDir -> current ().' '.round (($aDir -> getSize()/1024), 2).' Ko</em>';
  • }
  • $sHtml .= '<br />';
  • echo $sHtml;
  • $aDir -> next ();
  • }
  • echo '<br /><strong>ALL</strong><br />';
  • $aDir = $oDir -> getDir ();
  • foreach ($aDir as $sK => $sV) {
  • echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
  • }
  • echo '<br /><strong>FILTRE ON SUR PHP</strong><br />';
  • $oDir -> FILTER_ON = 'php'; // only shows files with "php" in them
  • $aDir = $oDir -> getDir ();
  • foreach ($aDir as $sK => $sV) {
  • echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
  • }
  • echo '<br /><strong>DIR = FALSE</strong><br />';
  • $oDir -> DIR = false; // No directory
  • $oDir -> FILTER_ON = null; // no filter ON
  • $aDir = $oDir -> getDir ();
  • foreach ($aDir as $sK => $sV) {
  • echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
  • }
  • echo '<br /><strong>FILE = FALSE</strong><br />';
  • $oDir -> DIR = true; // show directories
  • $oDir -> FILE = false; // No files
  • $aDir = $oDir -> getDir ();
  • foreach ($aDir as $sK => $sV) {
  • echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
  • }
  • echo '<br /><strong>PATH = bla ET FILTRE OFF SUR PHP</strong><br />';
  • $oDir -> PATH = 'bla'; // parth = 'bla'
  • $oDir -> FILE = true; // show files
  • $oDir -> FILTER_OFF = 'php'; // do not show files with "php" in them
  • $aDir = $oDir -> getDir ();
  • foreach ($aDir as $sK => $sV) {
  • //echo $sK, ' => ', $sV, '<br />';
  • echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
  • }
  • /**
  • * Create a copy of the whole directory recursively, but ONLY copy files with php in them ;-)
  • */
  • $oDir -> FILTER_ON = 'php';
  • $oDir -> PATH = '.';
  • $oDir -> copy ('copie');
  • } catch (Exception $e) {
  • echo $e -> getMessage (), ' => ', $e -> getLine ();
  • }
  • ?>
<?php
/**
 * smartDir package
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20011120
 */

/**
 * class myFilter
 * check active filters
 * RecursiveFilterIterator child
 */
class myFilter extends RecursiveFilterIterator {

	/**
	 * active filter ON (keep these)
	 *
	 * @var mixed
	 */
	private $mFilterOn;

	 /**
	 * active filter OFF (do not keep these)
	 *
	 * @var mixed
	 */
	private $mFilterOff;

	 /**
	 * iterator
	 *
	 * @var iterator
	 */
	private $it = null;

	 /**
	 * error message
	 *
	 * @var string
	 */
	const ERROR_NO_VALID_FILTER = '{__FILTER__} is not a valid setable filter';

	/**
	 * Constructor
	 *
	 * @param iterator $it
	 * @param mixed $mFilterOn
	 * @param mixed $mFilterOff
	 */
	public function __construct ($it, $mFilterOn, $mFilterOff) {
		parent::__construct ($it);
		$this -> it = $it;
		$this -> mFilterOn = $mFilterOn;
		$this -> mFilterOff = $mFilterOff;
	}

	/**
	 * Function accept ()
	 * returns true or false if the current element is accepted or not
	 *
	 * @return boolean
	 */
	public function accept () {
     	if (!is_null ($this -> mFilterOn)) {
    		if (!is_array ($this -> mFilterOn)) {
    			$mPos = strpos ($this -> it -> getFileName (), (string)$this -> mFilterOn);
    			if (false === $mPos) {
    				return false;
    			}
    		} else {
	    		foreach ($this -> mFilterOn as $sFilter) {
	    			$mPos = strpos ($this -> it -> getFileName (), (string)$sFilter);
	    			if (false !== $mPos) {
	    				return true;
	    			}
	    		}
	    		return false;
    		}
    	}
    	if (!is_null ($this -> mFilterOff)) {
    		if (!is_array ($this -> mFilterOff)) {
    			$mPos = strpos ($this -> it -> getFileName (), (string)$this -> mFilterOff);
    			if (false !== $mPos) {
    				return false;
    			}
    		} else {
	    		foreach ($this -> mFilterOff as $sFilter) {
	    			$mPos = strpos ($this -> it -> getFileName (), (string)$sFilter);
	    			if (false !== $mPos) {
	    				return false;
	    			} else {
	    				return true;
	    			}
	    		}
	    		return false;
    		}
    	}
    	return true;
	}
}

/**
 * Class MyRecursiveDirectoryIterator
 * parent of main class, RecursiveDirectoryIterator child
 *
 */
class MyRecursiveDirectoryIterator extends RecursiveDirectoryIterator {

	/**
	 * are dir valid
	 *
	 * @var boolean
	 */
	protected $bDir = true;

	/**
	 * are files valid
	 *
	 * @var boolean
	 */
	protected $bFile = true;

	/**
	 * filter ON (keep these)
	 *
	 * @var mixed
	 */
	protected $mFilterOn = null;

	/**
	 * filter OFF (do not keep these)
	 *
	 * @var mixed
	 */
	protected $mFilterOff = null;

	/**
	 * Recursive dir or not
	 *
	 * @var boolean
	 */
	protected $bRecurse = true;

	/**
	 * props that can be set
	 *
	 * @var array
	 */
	protected $aCanBeSet = array (
	'FLAG',
	'FILTER_ON',
	'FILTER_OFF',
	'DIR',
	'FILE',
	'PATH',
	'RECURSE'

	);
	/**
	 * filter ON (keep these)
	 *
	 * @var RecursiveDirectoryIterator class constant
	 */
	protected $cFlag = 0;

	/**
	 * path to be read
	 *
	 * @var string (valid path)
	 */
	protected $sPath;

	protected $sCreatedDir = null;
	 /**
	 * error messages
	 *
	 * @var string
	 */
	const ERROR_PATH_NOT_FOUND = '{__PATH__} has not been found';
	const ERROR_PROP_NOT_SETABLE = '{__PROP__} is not a setable property';
	const ERROR_BAD_PROP_VALUE = '{__VAL__} is not a correct value for {__PROP__}';
	const ERROR_NO_BOOLEAN = '{__PROP__} value must be a boolean';

	/**
	 * getChildren will retrieve sub path
	 *
	 * @return subiterator
	 */
	public function getChildren () {
		$iSub =  new self ($this -> getPathname ());
		$iSub -> bDir = $this -> bDir;
		$iSub -> bFile = $this -> bFile;
		$iSub -> mFilterOn = $this -> mFilterOn;
		$iSub -> mFilterOff = $this -> mFilterOff;
		return $iSub;
	}

	/**
	 * get current key
	 *
	 * @return string
	 */
    public function key () {
        return $this -> getPath ();
    }

    /**
	 * get current file
	 *
	 * @return string
	 */
    public function current () {
    	return $this -> getFileName ();
    }

    /**
     * is the current element valid or not
     *
     * @return boolean
     */
  	public function valid () {
  		if (!is_null ($this -> sCreatedDir)) {
  			if ($this -> current () === $this -> sCreatedDir) {
  				return false;
  			}
  		}
  		$oFilter = new myFilter ($this, $this -> mFilterOn, $this -> mFilterOff);
		if (true === parent::valid ()) {
			if (false === $oFilter -> accept ()) {
				if (false === $this -> isDir ()) {
					parent::next ();
					return $this -> valid ();
				} else {
					return true;
				}
			}
	    	if (false === $this -> bDir) {
	    		if (true === $this -> isDir ()) {
		    		parent::next ();
		    		return $this -> valid ();
	    		}
	    	}
	    	if (false === $this -> bFile) {
	    		if (true === $this -> isFile ()) {
		    		parent::next ();
		    		return $this -> valid ();
	    		}
	    	}
			return true;
		}
		return false;
    }

    /**
     * Setter
     *
     * @param string $sProp
     * @param mixed $mVal
     */
	public function __set ($sProp, $mVal) {
		if (!in_array ($sProp, $this -> aCanBeSet)) {
			throw new Exception (str_replace ('{__PATH__}', $sProp, self::ERROR_PROP_NOT_SETABLE));
		}
		switch ($sProp) {
			case 'FLAG' :
				if (!in_array ($mVal, array (parent::CURRENT_AS_FILEINFO, parent::KEY_AS_FILENAME, parent::NEW_CURRENT_AND_KEY, 0))) {
					throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_PATH_NOT_FOUND));
				}
				$this -> cFlag = $mVal;
				break;
			case 'FILTER_ON' :
				$this -> mFilterOn = $mVal;
				$this -> mFilterOff = null;
				break;
			case 'FILTER_OFF' :
				$this -> mFilterOff = $mVal;
				$this -> mFilterOn = null;
				break;
			case 'DIR' :
				if (!is_bool ($mVal)) {
					throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
				}
				$this -> bDir = $mVal;
				break;
			case 'FILE' :
				if (!is_bool ($mVal)) {
					throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
				}
				$this -> bFile = $mVal;
				break;
			case 'RECURSE' :
				if (!is_bool ($mVal)) {
					throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NO_BOOLEAN));
				}
				$this -> bRecurse = $mVal;
				break;
			case 'PATH' :
				if (!is_dir ($mVal)) {
					throw new Exception (str_replace ('{__PATH__}', $mVal, self::ERROR_PATH_NOT_FOUND));
				}
				$this -> sPath = $mVal;
				break;
		}
	}
}

/**
 * Class oSmartDir
 * MyRecursiveDirectoryIterator child
 *
 */
class oSmartDir extends MyRecursiveDirectoryIterator {

	/**
	 * Constructor
	 *
	 * @param string $sPath (valid path)
	 */

	const ERROR_COPY_FAILED = 'Failed to copy {__FROM__} to {__TO__}';

	public function __construct ($sPath) {
		if (!is_dir ($sPath)) {
			throw new Exception (str_replace ('{__PATH__}', $sPath, self::ERROR_PATH_NOT_FOUND));
		}
		$this -> sPath = $sPath;
	}

	/**
	 * getDir will retrieve the asked directory
	 *
	 * @return iterator
	 */
	public function getDir () {
		parent::__construct ($this -> sPath, $this -> cFlag);
		if (true === $this -> bRecurse) {
			return new RecursiveIteratorIterator ($this, true);
		} else {
			return $this;
		}
	}

	public function copy ($sTo) {
		$aDir = $this -> getDir ();
		if (!is_dir ($sTo)) {
			mkdir ($sTo, '0755');
		}
		$this -> sCreatedDir = $sTo;
		while ($aDir -> valid ()) {
			if ($aDir -> current () !== $sTo && !$aDir -> isDot ()) {
				if (!$aDir -> isDir ()) {
					if (!@copy ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ())) {
						throw new Exception (str_replace (array ('{__FROM__}', '{__TO__}'), array ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ()), self::ERROR_COPY_FAILED));
					}
				} else {
					if (!@mkdir ($sTo.'/'.$aDir -> getPathName (), '0755')) {
						throw new Exception (str_replace (array ('{__FROM__}', '{__TO__}'), array ($aDir -> getPathName (), $sTo.'/'.$aDir -> getPathName ()), self::ERROR_COPY_FAILED));
					}
				}
			}
			$aDir -> next ();
		}
		$this -> sCreatedDir = null;
	}
}


/**
 * STARTING EXAMPLES
 */
try {
	$oDir = new oSmartDir ('.');
} catch (Exception $e) {
	echo $e -> getMessage ();
}
try {

	echo '<br /><strong>ALL NO RECURSIVE</strong><br />';
	$oDir -> RECURSE = false; // no recursivity
	$aDir = $oDir -> getDir ();
	while ($aDir -> valid ()) {
		if ($aDir -> isDot ()) {
			$aDir -> next ();
		}
		$sHtml = '';
		if ($aDir -> isDir ()) {
			$sHtml.= '<strong>'.$aDir -> current ().'</strong>';
		} else {
			$sHtml.= '<em>'.$aDir -> current ().'</em>';
		}
		$sHtml .= '<br />';
		echo $sHtml;
		$aDir -> next ();
	}

	echo '<br /><strong>ALL</strong><br />';
	$oDir -> RECURSE = true; // recursivity back to true
	$aDir = $oDir -> getDir ();
	while ($aDir -> valid ()) {
		if ($aDir -> isDot ()) {
			$aDir -> next ();
		}
		$sHtml = str_repeat ('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $aDir -> getDepth ());
		if ($aDir -> isDir ()) {
			$sHtml.= '<strong>'.$aDir -> current ().'</strong>';
		} else {
			$sHtml.= '<em>'.$aDir -> current ().'</em>';
		}
		$sHtml .= '<br />';
		echo $sHtml;
		$aDir -> next ();
	}

	echo '<br /><strong>ALL + fileSize</strong><br />';
	$oDir -> RECURSE = true; // recursivity back to true
	$aDir = $oDir -> getDir ();
	while ($aDir -> valid ()) {
		if ($aDir -> isDot ()) {
			$aDir -> next ();
		}
		$sHtml = str_repeat ('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $aDir -> getDepth ());
		if ($aDir -> isDir ()) {
			$sHtml.= '<strong>'.$aDir -> current ().'</strong>';
		} else {
			$sHtml.= '<em>'.$aDir -> current ().' '.round (($aDir -> getSize()/1024), 2).' Ko</em>';
		}
		$sHtml .= '<br />';
		echo $sHtml;
		$aDir -> next ();
	}

	echo '<br /><strong>ALL</strong><br />';
	$aDir = $oDir -> getDir ();
	foreach ($aDir as $sK => $sV) {
		echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
	}

	echo '<br /><strong>FILTRE ON SUR PHP</strong><br />';
	$oDir -> FILTER_ON = 'php'; // only shows files with "php" in them
	$aDir = $oDir -> getDir ();
	foreach ($aDir as $sK => $sV) {
		echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
	}

	echo '<br /><strong>DIR = FALSE</strong><br />';
	$oDir -> DIR = false; // No directory
	$oDir -> FILTER_ON = null; // no filter ON
	$aDir = $oDir -> getDir ();
	foreach ($aDir as $sK => $sV) {
		echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
	}

	echo '<br /><strong>FILE = FALSE</strong><br />';
	$oDir -> DIR = true; // show directories
	$oDir -> FILE = false; // No files
	$aDir = $oDir -> getDir ();
	foreach ($aDir as $sK => $sV) {
		echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
	}

	echo '<br /><strong>PATH = bla ET FILTRE OFF SUR PHP</strong><br />';
	$oDir -> PATH = 'bla'; // parth = 'bla'
	$oDir -> FILE = true; // show files
	$oDir -> FILTER_OFF = 'php'; // do not show files with "php" in them
	$aDir = $oDir -> getDir ();
	foreach ($aDir as $sK => $sV) {
		//echo $sK, ' => ', $sV, '<br />';
		echo str_repeat ('-----', $aDir -> getDepth()), $sK, ' => ', $sV, '<br />';
	}

	/**
	 * Create a copy of the whole directory recursively, but ONLY copy files with php in them ;-)
	 */
	$oDir -> FILTER_ON = 'php';
	$oDir -> PATH = '.';
	$oDir -> copy ('copie');

} catch (Exception $e) {
	echo $e -> getMessage (), ' => ', $e -> getLine ();
}
?>


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   it

Télécharger le zip


 Historique

20 novembre 2006 16:21:41 :
Ajout d'une méthode : oSmartDir::copy (string sToDir) Effectue une copie de l'arborescence courante vers le répertoire sToDir. En pratique : cette copie prend en compte les filtres... ;-) Voir le descriptif du package pour plus d'infos, et le fichier exemple (class.oSmartDir.php)

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

FONCTION _SCANDIR UTF8 par LDDL
COURTE ET SIMPLE FONCTION RÉCURSIVE POUR LECTURE DE RÉPERTOI... par mbdx
Source avec Zip GESTION DE FICHIERS AVEC LA SPL par alphanono
Source avec Zip HASHMAP EN PHP AVEC LA SPL par dorian91
Source avec Zip Source avec une capture FILTRER, METTRE EN CACHE OU MAPER, OU TRIER UN ITERATEUR par coucou747

Commentaires et avis

Commentaire de kankrelune le 20/11/2006 13:05:06

Ca à l'air pô mal du tout tout ça... faudra que je teste... .. .

Je connais pas trop les iterator de php5... faut dire que je suis à la traine en ce qui concerne php5... .. . :oS

@ tchaOo°

Commentaire de malalam le 20/11/2006 13:37:42 administrateur CS

C'est très, très puissant...mais très, très complexe lol. Très!
J'ai oublié de mettre un lien bien pratique :
http://www.php.net/~helly/php/ext/spl/main.html

Il montre toutes les implémentations des nombreuses classes de la SPL (bien plus que l'on peut en trouver sur la doc "normale", quelques exemples, et des liens très intéressants vers divers tuto.

Cet exemple n'est certainement pas optimisé, et ne tire certainement pas partie de toute la puissance des itérateurs. Mais bon, j'y travaille, je trouve ça intéressant et du coup, je veux faire partager mes découvertes :-)

Commentaire de jean84 le 20/11/2006 18:53:11

Salut !

Concretement, c'est quoi un iterateur ? J'en avais entendu parler en ce qui concerne les if() else() for & autres mais la j'ai du mal ;-)

Merci !

Commentaire de malalam le 21/11/2006 04:37:29 administrateur CS

'tite insomnie... ;-)
Un itérateur, c'est...heu...une méthode permettant d'accéder aux éléments d'une collection l'un après l'autre. Un itérateur n'utilise de ressource que pour l'élément en cours. Bref pour parcourir 1,2,3, ben via un itérateur, tu vas faire un rewind pour être au début, puis un next et tu ne connaitras toujours que l'élément en cours (1, puis 2, puis 3). Tu traverses la collection (traversablité est un maître mot pour les itérateurs), récursivement si tu utilises un itérateur récursif, sans utiliser d'autre ressource que celle utilisée pour connaître l'élément en cours.
Tu déclares ton itérateur sur un répertoire par exemple, en récursif, et il te suffit d'un foreach () sur ton itérateur pour lire TOUTE l'arborescence. Parce que le foreach () va aller chercher les méthodes de l'itérateur permettant de le traverser : rewind (), next (), valid (), key (), current (), et si récursivité, hasChild (), getChild (). Ca, c'est l'exemple basique hein...pour les interfaces Iterator et RecursiveIterator. Mais il y a des itérateurs implémentant ces interfaces qui permettent bien plus.
La SPL définit des itérateurs pour un peu tout, et surtout, des méthodes et interfaces très complètes pour chacun de ces itérateurs.
Je donnerai d'autres exemples, notamment le très sympa IteratorAggregate.
Ici, par exemple, le coup du "un par un" m'a pas mal embêté pour la méthode oSmartDir::copy () :
je crée mon itérateur sur le répertoire courant pour le copier dans mon nouveau répertoire, puis je crée le répertoire destination. Oui mais comme je copie en traversant mon itérateur...je finis par tomber sur le répertoire que j'ai créé, et dans lequel j'ai copié les éléments précédents! Donc, je fais next (), hasChild () => true ? getChild () ...etc et je copie...récursivement, et dans une boucle infinie. Puisqu'au fur et à mesure que je copie, ben je parcours... ;-)
C'est pourquoi j'ai dû ajouter un filtre privé sortant de la méthode oSmartDir::valid() en false si j'étais sur le répertoire destination. Histoire de ne pas rentrer dedans et le traverser.

Commentaire de TheSin le 23/11/2006 07:28:28

malalam, si je comprend bien ton explication, il ne faut pas confondre itérateur et itération ?

Commentaire de malalam le 23/11/2006 08:08:37 administrateur CS

Pas itération dans le sens "compteur", en tous cas. Mais en français, une itération, c'est une répétition. Et dans ce cadre, un itérateur fait bien des répétitions : current, next, current, next, current, next... ;-)
Bref...peux tu être plus précis dans ta question ? :-) Que veux tu savoir exactement ? je tâcherai de répondre de mon mieux (je ne suis pas un pro des "itérateurs" en php...j'y travaille, lol, mais bon...)

Commentaire de TheSin le 23/11/2006 11:23:38

oui, en fait c'est justement ça.
en cours, on apprend qu'une itération c'est une boucle, qu'elle compte ou non (même un "while(;;)").
ici, si je comprend bien, ce que tu appelle itérateur, c'est le fait qu'on ai une itération implicite via les next ?
Justement, j'aimerais appronfondir les itérateurs, que ça soit en php ou autre ;-)

Commentaire de malalam le 23/11/2006 12:07:42 administrateur CS

Tu remarqueras que je fais des foreach ()...
Bon en gros, le principe de base : dès qu'on implémente une classe ou une interface itérateur (Iterator en anglais), le foreach appelle  implicitement les méthodes itérateurs.
Avec un while, on appelle manuellement les méthodes.
On peut aussi très simplement implémenter dans une classe l'interface iteratorAggregate, et surcharger ou non les méthodes.
Bref, faut bien lire les différents tutos.

regarde ce code :
<?php

$dir = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('.'), true);

foreach ( $dir as $file ) {
echo str_repeat('-', $dir->getDepth()) . ' '.$file.'<br />';
}
?>
On instancie la classe RecursiveIteratorIterator, qui définit un itérateur récursif (valid, next, key, current, hasChild, getChild, en gros). Il a besoin d'un itérateur dédié : on lui donne donc un itérateur RecursiveDirectoryIterator qui prend un chemin comme argument, et permet de récupérer l'arborescence complète.
Puis on fait un foreach sur l'itérateur récupéré ($dir), qui permet d'afficher toute l'arborescence du répertoire. La méthode getDepth () est simplement là pour indenter l'arborescence.
Le foreach () appelle automatiquement les méthodes nécessaires : rewind () au début, puis valid ?, current (key éventuellement), next...jusqu'à ce que valid renvoie false.

Point barre.

Bref, on peut faire très simple...ou plus compliqué quand on veut faire des choses bien spécifiques (comme moi dans ces codes).

Un autre exemple simple :
http://fr3.php.net/manual/fr/language.oop5.iterations.php
pour parcourir un objet comme on le désire.
Soit en surchargeant Iterator, soit en implémentant l'interface IteratorAggregate.

Commentaire de TheSin le 23/11/2006 12:20:56

aaaa, merci Malalam, c'était complet et direct :-)
J'ai donc compris la subtile différence de vocabulaire ;-)
Je crois qu'on peut pas faire mieux comme tutorial :)

Commentaire de malalam le 23/11/2006 12:37:25 administrateur CS

Bah merci, heureux si ça sert au moins à une personne ;-)
Tien, en primeur, parce que je ne posterai pas vce code avant longtemps je pense, le début d'une vraie classe utilisateur (ce n'est que le début mais ça fait déjà pas mal de choses). C'est long, attention, mais ça te montrera un autre exemple. Elle est faite pour fonctionner à partir de PHP5.0.X (compliqué, en-dessous de PHP 5.1, donc j'ai galéré lol).:
Fichier de classe class.oUser.php

<?php
if (!class_exists ('RecursiveArrayIterator')) { // PHP5 < 5.1
class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {

private $ref;

function hasChildren () {
return is_array ($this -> current ());
}

function getChildren () {
if ($this -> current () instanceof self) {
return $this -> current ();
}
if (empty ($this -> ref)) {
$this -> ref = new ReflectionClass ($this);
}
return $this -> ref -> newInstance($this -> current ());
}
}
}

class myFilter extends FilterIterator  {

private $oIt = null;
private $mFilter = null;
private $mSubFilter = null;

const ERROR_BAD_FILTERS = 'You cannot have a null FILTER and a not null SUBFILTER';

    public function __construct ($oIt, $mFilter = null, $mSubFilter = null) {
        parent::__construct ($oIt);
        $this -> oIt = $oIt;
        $this -> mFilter = $mFilter;
        $this -> mSubFilter = $mSubFilter;
    }

    public function accept () {
        if (!is_null ($this -> mFilter) && is_null ($this -> mSubFilter)) {
         if ($this -> oIt -> key () === $this -> mFilter && $this -> oIt -> getDepth () === 0) {
         return true;
         }
         if ($this -> oIt -> key () === $this -> mFilter && $this -> oIt -> getDepth () === 1) {
return true;
         }
         if ($this -> oIt -> getDepth () > 0 && $this -> oIt -> getSubIterator (0) -> key () === $this -> mFilter) {
return true;
         }
         return false;
        }
        if (!is_null ($this -> mFilter) && !is_null ($this -> mSubFilter)) {
         if ($this -> oIt -> getDepth () > 0 && $this -> oIt -> getSubIterator (0) -> key () === $this -> mFilter) {
     if ($this -> key () === $this -> mSubFilter) {
     return true;
     }
         return false;
         }
         return false;
        }
        if (is_null ($this -> mFilter) && !is_null ($this -> mSubFilter)) {
         throw new Exception (self::ERROR_BAD_FILTERS);
        }
        return true;
    }

}

abstract class abstractUsers extends RecursiveArrayIterator {

protected $aCanBeGet = array (
'FILTER',
'SUBFILTER',
'ITMODE'
);

protected $aCanBeSet = array (
'FILTER',
'SUBFILTER',
'ITMODE'
);

protected $aEachProp = array (
'BDD_NAME' => null,
'VALUE' => null,
'TYPE' => null,
'MANDATORY' => null
);

protected $cItMode = true;
protected $mFilter = null;
protected $mSubFilter = null;
protected $aProps = array ();

protected $oSession = null;
protected $oXml = null;

const ERROR_NOT_SETABLE = '{__PROP__} is not a setable property';
const ERROR_NOT_GETABLE = '{__PROP__} is not a getable property';
const ERROR_PROP_NOT_EXISTS = '{__PROP__} property does not exist';
const ERROR_XML_KEY_NOT_COMPLETE = '{__KEY__} has no children';
const ERROR_XML_FILE_NOT_EXISTS = '{__FILE__} has not been found';
const ERROR_XML_LOADING_FAILED = 'Failed to load {__FILE__}';
const ERROR_PROP_HAS_NO_VALUE = '{__PROP__} property has no value';
const ERROR_CHECKIDENT_BAD_VALUES_COUNT = 'Values given in arguments and Authentication fields do not match';

public function __construct ($fXml) {
if (!file_exists ($fXml)) {
throw new Exception (str_replace ('{__FILE__}', $fXml, self::ERROR_XML_FILE_NOT_EXISTS));
}
if (!($this -> oXml = @simplexml_load_file ($fXml)) instanceof SimpleXMLElement) {
throw new Exception (str_replace ('{__FILE__}', $fXml, self::ERROR_XML_LOADING_FAILED));
}
$this -> oSession = new oSession ($this -> oXml);
$this -> aPropsFill ();
}

private function aPropsFill () {
foreach ($this -> oXml -> USER -> children () as $oNode) {
foreach ($oNode -> children() as $oChild) {
$aTmp[(string)dom_import_simplexml($oChild) -> tagName] = (string)$oChild['value'];
}
if (empty ($aTmp)) {
throw new Exception (str_replace ('{__KEY__}', (string)dom_import_simplexml($oNode) -> tagName, self::ERROR_XML_KEY_NOT_COMPLETE));
}
$this -> aProps[(string)dom_import_simplexml($oNode) -> tagName] = $aTmp;
}
}

public function __get ($sProp) {
if (!in_array ($sProp, $this -> aCanBeGet) && !array_key_exists ($sProp, $this -> aProps)) {
throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NOT_GETABLE));
}
switch ($sProp) {
case 'FILTER' :
return $this -> mFilter;
break;
case 'SUBFILTER' :
return $this -> mSubFilter;
break;
case 'ITMODE' :
return $this -> cItMode;
break;
default :
if (!isset ($this -> aProps[$sProp])) {
throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_PROP_NOT_EXISTS));
}
if (!isset ($this -> aProps[$sProp]['VALUE'])) {
throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_PROP_HAS_NO_VALUE));
}
return $this -> aProps[$sProp]['VALUE'];
break;
}
}

public function __set ($sProp, $mVal) {
if (!array_key_exists ($sProp, $this -> aProps) && !in_array ($sProp, $this -> aCanBeSet)) {
throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_NOT_SETABLE));
}
switch ($sProp) {
case 'FILTER' :
$this -> mFilter = $mVal;
break;
case 'SUBFILTER' :
$this -> mSubFilter = $mVal;
break;
case 'ITMODE' :
$this -> cItMode = $mVal;
break;
default :
$this -> aProps[$sProp]['VALUE'] = $mVal;
break;
}
}

public function getProps () {
if (!is_null ($this -> mFilter)) {
if (is_string ($this -> mFilter)) {
return new myFilter (new RecursiveIteratorIterator (new RecursiveArrayIterator ($this -> aProps), $this -> cItMode), $this -> mFilter, $this -> mSubFilter);
}
}
return new RecursiveIteratorIterator (new RecursiveArrayIterator ($this -> aProps), $this -> cItMode);
}

abstract public function checkIdent ($sTable, $aValues);

}

class oSession {

private $aProps = array ();
private $oXml;

public function __construct ($oXml) {
$sSessionId = session_id ();
if (empty ($sSessionId)) {
session_start ();
}
$this -> oXml = $oXml;
}

private function aPropsFill () {
foreach ($this -> oXml -> SESSION -> children () as $oNode) {
foreach ($oNode as $oChild) {
$this -> aProps[(string)dom_import_simplexml($oChild) -> tagName] = null;
}
}
print_r ($this -> aProps);
}

public function __get ($sProp) {

}

public function __set ($sProp, $mVal) {

}
}

class oUser extends abstractUsers {

private $oDB;

public function __construct ($sXml, oDB $oDB) {
parent::__construct ($sXml);
$this -> oDB = $oDB;
}

public function checkIdent ($sTable, $aValues) {
$sTmp = $this -> mFilter;
$this -> mFilter = 'IDENT';
$aProps = $this -> getProps ();
foreach ($aProps as $sV) {
$sCurrentDbName = $this -> aProps [$aProps -> getInnerIterator () -> getSubIterator (0) -> key ()]['BDD_NAME'];
if (empty ($aValues[$sCurrentDbName])) {
throw new Exception (self::ERROR_CHECKIDENT_BAD_VALUES_COUNT);
}
$aIdent[] = $sCurrentDbName.' = \''.$aValues[$sCurrentDbName].'\'';
}
$this -> mFilter = $sTmp;
if (count ($aValues) !== count ($aIdent)) {
throw new Exception (self::ERROR_CHECKIDENT_BAD_VALUES_COUNT);
}
$sWhereClause = implode (' AND ', $aIdent);
$sQuery = 'SELECT '.$this -> aProps['ID']['BDD_NAME'].' FROM '.$sTable.' WHERE '.$sWhereClause;
$this -> oDB -> query ($sQuery);
$aRes = $this -> oDB -> fetch_assoc ();
if (!empty ($aRes[$this -> aProps['ID']['BDD_NAME']])) {
echo 'OK';
return true;
} else {
echo 'KO';
return false;
}
}
}
?>

Fichier test.php
<?php
DEFINE ('SQL_LOGIN', 'xxx');
DEFINE ('SQL_PWD', 'xxx');
DEFINE ('SQL_DB', 'xxx');
DEFINE ('SQL_HOST',     'xxx');

require_once 'class.oDB.php';
require_once 'class.oUser.php';

$oDB = new oDB(SQL_HOST, SQL_LOGIN, SQL_PWD, SQL_DB);

$fXml = 'config.xml';
try {
$oUser = new oUser ($fXml, $oDB);
} catch (Exception $e) {
echo $e -> getMessage ();
}

try {
echo '<br /><strong>ALL NO VALUE</strong><br />';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo str_repeat ('---', $aProps -> getDepth ()), $sK, ' => ', $sV, '<br />';
}

$oUser -> EMAIL = 'test@test.com';
$oUser -> PASSWORD = 'mypass';
$oUser -> ID = 666;

echo '<br /><strong>EMAIL VALUE</strong><br />';
echo $oUser -> EMAIL, '<br />';

echo '<br /><strong>ALL with VALUES</strong><br />';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo str_repeat ('---', $aProps -> getDepth ()), $sK, ' => ', $sV, '<br />';
}

echo '<br /><strong>ONLY VALUES</strong><br />';
$oUser -> FILTER = 'VALUE';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo $sK, ' => ', $sV, '<br />';
}

echo '<br /><strong>ONLY BDD_NAMES</strong><br />';
$oUser -> FILTER = 'BDD_NAME';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo $sK, ' => ', $sV, '<br />';
}

echo '<br /><strong>ONLY EMAIL</strong><br />';
$oUser -> FILTER = 'EMAIL';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo str_repeat ('---', $aProps -> getInnerIterator () -> getDepth ()), $sK, ' => ', $sV, '<br />';
}

echo '<br /><strong>ONLY EMAIL BDD_NAME</strong><br />';
$oUser -> FILTER = 'EMAIL';
$oUser -> SUBFILTER = 'BDD_NAME';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo $sK, ' => ', $sV, '<br />';
}

$oUser -> FILTER = null;
$oUser -> SUBFILTER = null;
echo '<br /><strong>BACK TO ALL NO FILTER</strong><br />';
$aProps = $oUser -> getProps ();
foreach ($aProps as $sK => $sV) {
echo str_repeat ('---', $aProps -> getDepth ()), $sK, ' => ', $sV, '<br />';
}

} catch (Exception $e) {
echo $e -> getMessage ();
}

try {
echo '<br /><strong>CHECK IDENT (WRONG ONE)</strong><br />';
$oUser -> checkIdent ('users', array ('user_pwd' => 'pwd', 'user_email' => 'moi@moi.com'));

echo '<br /><strong>CHECK IDENT (GOOD ONE)</strong><br />';
$oUser -> checkIdent ('users', array ('user_pwd' => 'toto', 'user_email' => 'toto@bled.com'));
} catch (Exception $e) {
echo $e -> getMessage ();
}


$oDB -> close ();
?>

et le fichier de config xml :
<?xml version="1.0" encoding="iso-8859-1"?>
<CONFIG>
<USER>
<ID>
<BDD_NAME value="user_id" />
<TYPE value="int" />
<MANDATORY value="true" />
</ID>
<EMAIL>
<BDD_NAME value="user_email" />
<TYPE value="string" />
<MANDATORY value="true" />
<IDENT value="true" />
</EMAIL>
<PASSWORD>
<BDD_NAME value="user_pwd" />
<TYPE value="string" />
<MANDATORY value="true" />
<IDENT value="true" />
</PASSWORD>
</USER>
<SESSION>
<ID />
<USEREMAIL />
</SESSION>
</CONFIG>

Pour le reste, tu te débrouilles ;-)

Commentaire de TheSin le 23/11/2006 13:00:16

ok, merci pour l'exemple, c'est sympa :-)
je regarderais tout ça plus tard, je suis en cours quand même, et malheuresement, le PHP et le C ça se mélange pas :( (pour ceux qui n'ont pas compris, je suis en train de faire du C en cours).

Ton exemple m'a l'air très instructif, encore merci.

Commentaire de jean84 le 24/11/2006 19:30:28

Hello !

Sa a l'air sympa ces iterateurs (d'ailleurs merci TheSin pour la difference entre iterateurs et iterations -je savais bien que sa me disait quelque chose..).
Sa ressemble beaucoup au liste chainee du C/C++, j'imagine que c'est la meme chose ?
Derniere question : tu as une doc (en fr please ;-)) qui aprle des iterateurs (fonctionnalite, utilite, mise en oeuvre dans le genre de la doc du DOM par exemple -je sais j'abuse ^^)

Merci et @++

Commentaire de malalam le 26/11/2006 09:35:19 administrateur CS

Hello Jean,

ben non, je suis désolé, je n'ai pas trouvé de doc complète sur la SPL en Français. Je ne pense pas que cela existe encore. Ni même en anglais, à dire vrai...(cet url mis à part : http://www.php.net/~helly/php/ext/spl/main.html mais il reste très complexe à lire).
C'est beaucoup pour ça que j'ai mis ces codes sur CS : monter des exemples concrêts d'utilisation, divers, et complets (pas juste 3 lignes de code simple).
Mais je ne suis pas assez calé pour écrire plus complet, lol, ou pour écrire un vrai tuto.
Faut se contenter des docs et tutos en anglais, pour le moment.

Commentaire de jean84 le 27/11/2006 18:00:53

Yep !

Bah en fait j'ai regarder sur la doc officielle (chm telecharger sur php.net en fr) et j'ai trouve la section sur la spl. Je suis tres decu car aucune fonction est documentee (meme pas un bout de code pour presenter la chose... :-( )
Resultat : je part a la chasse aux infos ^^
Par contre petite question : tu utilises des filtres et j'ai vu que php5 en utilise aussi (je travaille sur les classes en ce moment, j'explore toutes les possibilites offertes en poo), y'a-t-il des points commums ? Petit detaille ton systeme de filtre ?

Merci ;-)

Commentaire de jean84 le 27/11/2006 18:02:41

ERRATUM :
Dans "Petit detaille ton systeme de filtre ?" faut comprendre "Peut tu detaille ton systeme de filtre ?"

Desole pour la faute ^^

Commentaire de malalam le 27/11/2006 18:22:31 administrateur CS

ttp://www.php.net/~helly/php/ext/spl/main.html
ça, C'EST la doc officielle hein...juste une page spécifique pour la SPL, plus complète, bien plus, que celle qu'on trouve ici:
http://fr3.php.net/manual/fr/ref.spl.php

"tu utilises des filtres et j'ai vu que php5 en utilise aussi"
Que veux-tu dire par là...? De quels filtres PHP5 parles-tu?

J'utilise la classe SPL FilterIterator pour implémenter ces filtres.
C'est simplement plus simple pour gférér des filtres appliqués à des itérateurs (en l'occurencence, là, à un DirectoryIterator).

Bon, en détaillant un peu :
La classe smartdir possède deux propriétés de filtres (outre DIR et FILES hein...):
FILTER_ON
FILTER_OFF
La 1ère permet de filtrer, donc, de manière active sur quelquechose. On ne verra que ce qui matche ce filtre.
La 2de fait le contraire : on verra tout SAUF ce qui matche ce filtre.

Je passe par un setter pour les initialiser (__set).

Bien, maintenant, ce qui est important, c'est la classe MyFilter, qui étend RecursiveFilterIterator (elle-même étendant FilterIterator...).
Cette classe se construit avec un itérateur, et pour ma classe, 2 filtres optionnels.
public function __construct ($it, $mFilterOn, $mFilterOff) {
parent::__construct ($it);
$this -> it = $it;
$this -> mFilterOn = $mFilterOn;
$this -> mFilterOff = $mFilterOff;
}

Ici, (et c'est différents pour mes 2 autres package utilisant les itérateurs postés ici), je l'appelle à chaque itération sur mon itérateur courant (le répertoire, quoi).

Les FilterIterator ont plusieurs méthodes, dont 1 qui m'intéresse plus particulièrement:
FilterIterator::accept ().
Je l'ai surchargée, et voici ce que la mienne fait: elle vérifie si quels filtres sont non nuls...déjà ;-)
Puis elle vérifie le type (string, ou tableau de string).
Ensuite, pour la valeur de courante de mon InnerIterator (voir ma classe oUser, gestion utilisateurs, pour plus d'infos à ce sujet...et des filtres plus élaborés), elle vérifie si elle matche le ou la valeur du filtre.
Si oui, et selon le filtre (ON ou OFF), elle retourne un booléen true ou false.

C'est tout...

Le fonctionnement de la SPL se charge du reste : quand je fais mon foreach () ou mon while () sur mon répertoire, si j'ai défini un filtre, ben ce qui doit s'afficher s'affiche.


Commentaire de jean84 le 28/11/2006 21:34:15

Wahou ...
laisse moi le temps de digerer tout sa ^^

Commentaire de malalam le 29/11/2006 09:15:15 administrateur CS

Pour les filtres, j'ai pigé de quoi tu parlais : l'extension expérimentale PHP5.
ben...non, c'est différent. Ca fonctionne différemment.
Les filtres dont tu parles sont plus des masques destinés à valider ou invalider des données externes arrivant à PHP.
Mais bon, dans le fond, dans les deux cas, ça reste du filtrage oui...mais les 2 n'ont aucun rapport.

Commentaire de kankrelune le 29/11/2006 10:30:33

Le filtre dont parlent Jean84 sont des filtres qui reposent sur le principe du poka yoké... .. .

@ tchaOo°

Commentaire de malalam le 29/11/2006 11:10:36 administrateur CS

Ah ben dans ce cas, oui, c'est la même chose, ce sont bien les classes Iterator.

Commentaire de jean84 le 01/12/2006 17:36:17

Ah heu.. autant pour moi ^^

@++

Commentaire de webdeb le 07/01/2007 21:29:53

Non "au temps pour moi" :)

Commentaire de mkaffel le 11/12/2007 17:33:17

Salut!

Je tiens premièrement à te féliciter pour ce code de qualité et pour l'utilisation avancé de la librairie SPL.

Dans mon projet j'utilise les différentes classes que tu partages ici, mais je bute sur un problème :

je n'arrive pas à avoir une liste complète des fichiers uniquement depuis le répertoire source (en clair si mon répertoire source est C:\, je veux tous les fichiers de mon disque dur)

existe-t-il une solution à mon problème ?

je voulais également savoir si ton code était sous une licence spécifique ou il s'agit d'un code totalement libre ?

Merci beaucoup pour tout ce travail c'est vraiment propre

bonne soirée

Cordialement

Commentaire de malalam le 11/12/2007 19:53:43 administrateur CS

Hello,
déjà merci:-)
Ensuite, je mets désormais la licence de mes codes, tellement cette question m'a été posée :-) Donc : LGPL.

Enfin...il ne devrait pas y avoir de problème particulièer quant à la racine du répertoire lu. Quand tu dis "je n'arrive pas à avoir une liste complète des fichiers uniquement depuis le répertoire source (en clair si mon répertoire source est C:\, je veux tous les fichiers de mon disque dur)", que vois tu au juste ? Tu en vois juste une partie? Tu ne vois rien ?

Commentaire de mkaffel le 12/12/2007 09:37:50

Merci de ta réponse,

pour le moment je suis capable de récupérer la liste des fichiers se trrouvant direcetement dans ce répertoire(pas de recherche dans les sous dossiers en clair), mais mon besoin est différent je voudrais récupérer tous les fichiers depuis le répertoire que je spécifie (avec recherche dans les sous-dossiers donc)

Je voudrais donc savoir comment faire pour avoir une liste de tous les fichiers

merci encore

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Lecture de fichier [ par koko ] Je voudrais lire un fichier fichier.txt dans la page index.phpvoici ma fonction&lt;? echo "Texte: ". $fp = fopen("fichier.txt","r"); $donnees = fgets changer les propriétés d'un fichier [ par PierScher ] j'ai posté sur le ftp de free une police arial.ttf. A ce fichier, il ya plusieurs groupes Proprio, Utilisateurs et Tous. Par défaut, les attributs son Lecture d'un dossier... [ par RockmanX ] Voila mon "problème":Dans le dossier ci-dessous, il y a des images nommées:smile1.gif,smile2.gif,...smile8.gifj''ai écrit le script ci-dessous mais au Fichier INDEX auto-exécutable [ par BSide ] BSideBonjour,j'utilise EasyPHP1.6.Habituellement, quand je veux exécuter un script PHP, je vais sur le web local, je sélectionne le répertoire qui m'i lecture et affichage de fichiers word [ par dolu007 ] je dois réaliser un moteur de recherche et lorsque j'affiche la ligne avec le mot cherché les accents et caractère spéciaux sont écris n'importe comme sous-repertoire fichier ............ [ par TRASH52 ] TRASH52bon je vous met le code!En fait, je voudrais que mon programme a partir d'u lecture de fichier [ par saad123 ] bonjourje suis en train de faire un petit projet VB je voudrais lire le contenu d'un fichier puis l'afficher dans une text box. le truc c kil m'affich ftp_get php [ par CC24 ] bonjour à tous !est-ce que l'un d'entre vous pourrait m'indiquer la syntaxe à utiliser pour télécharger un fichier situé dans un sous-répertoire du ré Lecture des dossier et sous-dossier.... [ par meridius ] Hello tout le monde,Voilà j'aimerais parcourir tout mes dossiers et sous-dossiers pour trouver le fichier le plus récent et en récupérer la date pour Rechercher capacité d'un répertoire sur un serveur [ par twiems ] TwiemsJe souhaite rechercher et afficher la capacité d'un répertoire sur le serveur auquel mon pc est connecté.Y a t il une fonction ou une procédure


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales