Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[PHP5] PACKAGE USERS - GESTION UTILISATEURS - LES ITERATEURS EN PHP


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : spl, gestion, utilisateurs, iterator, user Niveau : Expert Date de création : 24/11/2006 Date de mise à jour : 29/11/2006 15:30:27 Vu / téléchargé: 5 520 / 592

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Bon, toujours dans ma croisade pour faire découvrir la SPL, voici un nouveau package.
C'est une gestion utilisateur basique.
Je fournis une classe db basique, avec juste ce dont j'ai besoin. VOus pouvez utiliser la votre, mais attention, certaines méthodes doivent être implémentées, avec ces noms (sinon, cherchez leur utilisation dans la classe oUser et modifiez les appels) :
fetch_assoc ()
query ()
insert_id
C'est tout :-)

Le package gère ceci :
identification d'un utilisateur
création d'un utilisateur
récupération d'un utilisateur
modification d'un utilisateur

Le tout, évidemment, avec gestion des sessions.

je montre 2 exemples:
test.php fait un tour sur les possibilités d'itération, essentiellement.
exemple.php montre une page de formulaire d'identification, avec création à la volée si un utilisateur n'existe pas, identification s'il existe et possibilité de modifier son nom, et gestion d'erreur si il se plante d'identification.

Le tout est basé sur un fichier de configuration XML.
Ce fichier se présente obligatoirement ainsi :
sous la racine, un noeud USER et un noeud SESSION
Dans USER, un noeud ID obligatoire, idem pour SESSION.
Les autres noeuds sous USER et SESSION sont à votre préférence!
Les sous noeuds pour chaque propriétés :
BDD_NAME est le nom du champ dans votre table.
TYPE est son type (en fait, string ou int)
Ca, c'est obligatoire.
Ensuite : IDENT indique que ce champ est utilisé pour l'identification.
MANDATORY indique qu'il est obligatoire pour la création d'un utilisateur (s'il manque, la création renverra une erreur)
DEDOUBLE indique qu'on dédoublonne la table sur ce (ou ces) champ. Exemple, un mec entre un email et un mot de passe; vous dédoublonnez sur l'email : si le couple email/password existe, ok, le mec est identifié. Sinon, si email existe, le mec s'est planté de mot de passe (c'est là le dédoublonnage). Sinon, ben il n'existe pas.

Vous pouvez ajouter autant de champs que vous voulez, pour peu que vous les ayez dans votre table utilisateur, évidemment... : adresse, code postal, ville, etc...
Idem pour la session.

La table créée pour les 2 fichiers exemples :
sous mysql
nom base de donnée : bdd_test
nom table : users
champs :
user_id (int) autoincrement
user_email (varchar)
user_pwd (varchar)
user_nom (varchar)

à vous de la créer.
Voili :-)
 

Source

  • <?php
  • /**
  • * oUser package
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • */
  • if (!class_exists ('RecursiveArrayIterator')) { // PHP5 < 5.1
  • /**
  • * class RecursiveArrayIterator
  • * @author php.net
  • * implementation for 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 oUserException extends Exception
  • * personalized Exception class for this package
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • */
  • class oUserException extends Exception {
  • const ERROR_GEN_NOT_SETABLE = '{__PROP__} is not a setable property';
  • const ERROR_GEN_NOT_GETABLE = '{__PROP__} is not a getable property';
  • const ERROR_USER_PROP_NOT_EXISTS = '{__PROP__} property does not exist';
  • const ERROR_USER_PROP_HAS_NO_VALUE = '{__PROP__} property has no value';
  • const ERROR_USER_XML_KEY_NOT_COMPLETE = '{__KEY__} has no children';
  • const ERROR_USER_XML_FILE_NOT_EXISTS = '{__FILE__} has not been found';
  • const ERROR_USER_XML_LOADING_FAILED = 'Failed to load {__FILE__}';
  • const ERROR_USER_CHECKIDENT_BAD_VALUES_COUNT = 'Values given in arguments and Authentication fields do not match';
  • const ERROR_USER_MANDATORY_FIELD_MISSING = 'The mandatory field {__FIELD__} is missing';
  • const ERROR_USER_ID_NOT_INTEGER = 'User ID must be an integer';
  • public function __construct($sMsg, $iCode = 0) {
  • parent::__construct($sMsg, $iCode);
  • }
  • }
  • /**
  • * class myFilter extends FilterIterator
  • * filter Iterator class dedicated to oUser class
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • */
  • class myFilter extends FilterIterator {
  • /**
  • * private oIt
  • * Iterator object
  • * @var Iterator
  • */
  • private $oIt = null;
  • /**
  • * private mFilter
  • * main filter
  • * @var string
  • */
  • private $mFilter = null;
  • /**
  • * public function __construct
  • * constructor
  • *
  • * @param (RecursiveIteratorIterator) oIt
  • * @param (string) mFilter
  • */
  • public function __construct (RecursiveIteratorIterator $oIt, $mFilter = null) {
  • parent::__construct ($oIt);
  • $this -> oIt = $oIt;
  • $this -> mFilter = $mFilter;
  • }
  • /**
  • * public function accept
  • *
  • * @return (boolean)
  • */
  • public function accept () {
  • if (!is_null ($this -> mFilter)) {
  • 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;
  • }
  • return true;
  • }
  • }
  • /**
  • * abstract class abstractUser
  • * abstraction class defining oUser
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • */
  • abstract class abstractUser {
  • /**
  • * protected aCanBeGet
  • * array of properties that can be get
  • * @var array
  • */
  • protected $aCanBeGet = array (
  • 'FILTER',
  • 'SUBFILTER',
  • 'ITMODE'
  • );
  • /**
  • * protected aCanBeSet
  • * array of properties that can be set
  • * @var array
  • */
  • protected $aCanBeSet = array (
  • 'FILTER',
  • 'SUBFILTER',
  • 'ITMODE'
  • );
  • /**
  • * protected cItMode
  • * RecursiveIteratorIterator mode
  • * @var RecursiveIteratorIterator constant
  • */
  • protected $cItMode = true;
  • /**
  • * protected mFilter
  • * main filter
  • * @var string
  • */
  • protected $mFilter = null;
  • /**
  • * protected aProps
  • * array of properties
  • * @var array
  • */
  • protected $aProps = array ();
  • /**
  • * public oSession
  • * oSession object
  • * @var oSession
  • */
  • public $oSession = null;
  • /**
  • * protected oXml
  • * simpleXML object
  • * @var simpleXML
  • */
  • protected $oXml = null;
  • /**
  • * public function __construct
  • * constructor
  • * @param (string) $fXml : xml config filename
  • */
  • public function __construct ($fXml) {
  • if (!file_exists ($fXml)) {
  • throw new oUserException (str_replace ('{__FILE__}', $fXml, oUserException::ERROR_USER_XML_FILE_NOT_EXISTS));
  • }
  • if (!($this -> oXml = @simplexml_load_file ($fXml)) instanceof SimpleXMLElement) {
  • throw new oUserException (str_replace ('{__FILE__}', $fXml, oUserException::ERROR_USER_XML_LOADING_FAILED));
  • }
  • $this -> oSession = new oSession ($this -> oXml);
  • $this -> aPropsFill ();
  • }
  • /**
  • * private function aPropsFill
  • * fills the array of properties aProps from oXml
  • */
  • private function aPropsFill () {
  • foreach ($this -> oXml -> USER -> children () as $oNode) {
  • $aTmp = array ();
  • foreach ($oNode -> children() as $oChild) {
  • $aTmp[(string)dom_import_simplexml($oChild) -> tagName] = (string)$oChild['value'];
  • }
  • if (empty ($aTmp)) {
  • throw new oUserException (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
  • * getter
  • * @param (string) sProp
  • * @return sProp value
  • */
  • public function __get ($sProp) {
  • if (!in_array ($sProp, $this -> aCanBeGet) && !array_key_exists ($sProp, $this -> aProps)) {
  • throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_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 oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_USER_NOT_EXISTS));
  • }
  • if (!is_null ($this -> mFilter)) {
  • if (isset ($this -> aProps[$sProp][$this -> mFilter])) {
  • return $this -> aProps[$sProp][$this -> mFilter];
  • }
  • }
  • if (!isset ($this -> aProps[$sProp]['VALUE'])) {
  • //throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_USER_PROP_HAS_NO_VALUE));
  • return null;
  • }
  • return $this -> aProps[$sProp]['VALUE'];
  • break;
  • }
  • }
  • /**
  • * public function __set
  • * setter
  • * @param (string) sProp
  • * @param (mixed) mVal
  • * @return void
  • */
  • public function __set ($sProp, $mVal) {
  • if (!array_key_exists ($sProp, $this -> aProps) && !in_array ($sProp, $this -> aCanBeSet)) {
  • throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_SETABLE));
  • }
  • switch ($sProp) {
  • case 'FILTER' :
  • $this -> mFilter = $mVal;
  • break;
  • case 'ITMODE' :
  • $this -> cItMode = $mVal;
  • break;
  • default :
  • $this -> aProps[$sProp]['VALUE'] = $mVal;
  • break;
  • }
  • }
  • /**
  • * public function getProps
  • * get the aProps array of properties
  • * @return RecursiveIteratorIterator or myFilter Iterator
  • */
  • 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);
  • }
  • }
  • return new RecursiveIteratorIterator (new RecursiveArrayIterator ($this -> aProps), $this -> cItMode);
  • }
  • /**
  • * abstract public function checkIdent
  • * check if a user exists in the database, given IDENT fields in the xml config file
  • * @param (string) sTable : users DB table name
  • * @param (array) aValues : array of fields to be checked, each key being the key of the config file, and the value being the input value
  • */
  • abstract public function checkIdent ($sTable, $aValues);
  • /**
  • * abstract public function createUser
  • * create a user if values are correct
  • * @param (string) sTable : users db table name
  • * @param (array) aValues : array of fields to be created, each key being the key of the config file, and the value being the input value
  • */
  • abstract public function createUser ($sTable, $aValues);
  • /**
  • * abstract public function getUser
  • * get a user from DB
  • * @param (mixed) iUserId : existing user ID in the DB
  • * @param (string) sTable : users db table name
  • * @param (boolean) bSession : true if get values must fill the session (if config file defines these fields for the session), false if not
  • */
  • abstract public function getUser ($iUserId, $sTable, $bSession = true);
  • /**
  • * abstract public function modUser
  • * modify a user in DB
  • * @param (mixed) iUserId : existing user ID in the DB
  • * @param (string) sTable : users db table name
  • * @param (array) aValues : array of fields to be modified, each key being the key of the config file, and the value being the input value
  • * @param (boolean) bSession : true if get values must fill the session (if config file defines these fields for the session), false if not
  • */
  • abstract public function modUser ($iUserId, $sTable, $aValues, $bSession = true);
  • }
  • /**
  • * class oSession
  • * session class
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • *
  • * see abstractUser for info about the methods and properties of this class, same definitions apply here
  • */
  • class oSession {
  • private $aProps = array ();
  • private $oXml;
  • public function __construct (simpleXMLElement $oXml) {
  • $sSessionId = session_id ();
  • if (empty ($sSessionId)) {
  • session_start ();
  • }
  • $this -> oXml = $oXml;
  • $this -> aPropsFill ();
  • }
  • private function aPropsFill () {
  • foreach ($this -> oXml -> SESSION -> children () as $oNode) {
  • $this -> aProps[(string)dom_import_simplexml($oNode) -> tagName] = null;
  • }
  • }
  • public function __get ($sProp) {
  • if (!array_key_exists ($sProp, $this -> aProps)) {
  • throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_SETABLE));
  • }
  • return $this -> aProps[$sProp];
  • }
  • public function __set ($sProp, $mVal) {
  • if (!array_key_exists ($sProp, $this -> aProps)) {
  • throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_GETABLE));
  • }
  • $this -> aProps[$sProp] = $mVal;
  • $_SESSION['USER'][$sProp] = $mVal;
  • }
  • public function __isset ($sProp) {
  • if (!array_key_exists ($sProp, $this -> aProps)) {
  • return false;
  • }
  • return true;
  • }
  • }
  • /**
  • * class oUser extends abstractUser
  • * user class
  • * @author Johan Barbier <johan.barbier@gmail.com>
  • * @version 20061124
  • *
  • * see abstractUser for info about the methods and properties of this class, same definitions apply here
  • */
  • class oUser extends abstractUser {
  • private $oDB;
  • public function __construct ($sXml, $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) {
  • $sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
  • $sCurrentDbName = $this -> aProps [$sKeyName]['BDD_NAME'];
  • if (empty ($aValues[$sKeyName])) {
  • throw new oUserException (oUserException::ERROR_USER_CHECKIDENT_BAD_VALUES_COUNT);
  • }
  • if ($this -> aProps[$sKeyName]['TYPE'] === 'string') {
  • if (isset ($this -> aProps[$sKeyName]['DEDOUBLE'])) {
  • $aDedoub[] = $sCurrentDbName.' = \''.$aValues[$sKeyName].'\'';
  • }
  • $aIdent[] = $sCurrentDbName.' = \''.$aValues[$sKeyName].'\'';
  • } else {
  • if (isset ($this -> aProps[$sKeyName]['DEDOUBLE'])) {
  • $aDedoub[] = $sCurrentDbName.' = '.$aValues[$sKeyName];
  • }
  • $aIdent[] = $sCurrentDbName.' = '.$aValues[$sKeyName];
  • }
  • }
  • $this -> mFilter = $sTmp;
  • if (count ($aValues) !== count ($aIdent)) {
  • throw new oUserException (oUserException::ERROR_USER_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']])) {
  • $this -> oSession -> ID = $aRes[$this -> aProps['ID']['BDD_NAME']];
  • return true;
  • } else {
  • if (!empty ($aDedoub)) {
  • $sWhereDedoubClause = implode (' AND ', $aDedoub);
  • $sQuery = 'SELECT '.$this -> aProps['ID']['BDD_NAME'].' FROM '.$sTable.' WHERE '.$sWhereDedoubClause;
  • $this -> oDB -> query ($sQuery);
  • $aRes = $this -> oDB -> fetch_assoc ();
  • if (!empty ($aRes[$this -> aProps['ID']['BDD_NAME']])) {
  • return -1;
  • }
  • }
  • return false;
  • }
  • }
  • public function createUser ($sTable, $aValues) {
  • $sTmp = $this -> mFilter;
  • $this -> mFilter = 'MANDATORY';
  • $aProps = $this -> getProps ();
  • foreach ($aProps as $sK => $sV) {
  • $sMandatory = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
  • if (empty ($aValues[$sMandatory])) {
  • throw new oUserException (str_replace ('{__FIELD__}', $sMandatory, oUserException::ERROR_USER_MANDATORY_FIELD_MISSING));
  • }
  • }
  • $this -> mFilter = 'BDD_NAME';
  • $aProps = $this -> getProps ();
  • foreach ($aProps as $sV) {
  • $sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
  • if (!empty ($aValues[$sKeyName])) {
  • $aFields[] = $sV;
  • if ($this -> aProps [$aProps -> getInnerIterator () -> getSubIterator (0) -> key ()]['TYPE'] === 'string') {
  • $aVals[] = '\''.$aValues[$sKeyName].'\'';
  • } else {
  • $aVals[] = $aValues[$sKeyName];
  • }
  • }
  • }
  • $this -> mFilter = $sTmp;
  • $sFields = implode (',', $aFields);
  • $sVals = implode (',', $aVals);
  • $sQuery = 'INSERT INTO '.$sTable.' ('.$sFields.') VALUES ('.$sVals.')' ;
  • if ($this -> oDB -> query ($sQuery)) {
  • $this -> oSession -> ID = $this -> oDB -> insert_id ();
  • return true;
  • }
  • return false;
  • }
  • public function getUser ($iUserId, $sTable, $bSession = true) {
  • $sTmp = $this -> mFilter;
  • $this -> mFilter = 'BDD_NAME';
  • $aProps = $this -> getProps ();
  • foreach ($aProps as $sV) {
  • $aFields[] = $sV;
  • }
  • $sFields = implode (',', $aFields);
  • $sQuery = 'SELECT '.$sFields.' FROM '.$sTable.' WHERE '.$this -> aProps['ID']['BDD_NAME'].' = '.$iUserId;
  • $this -> oDB -> query ($sQuery);
  • $aRes = $this -> oDB -> fetch_assoc ();
  • if (empty ($aRes)) {
  • return false;
  • }
  • foreach ($aProps as $sV) {
  • $sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
  • $this -> aProps[$sKeyName]['VALUE'] = $aRes[$sV];
  • // PHP5 < 5.1
  • if (true === $bSession && true === $this -> oSession -> __isset ($sKeyName)) {
  • $this -> oSession -> $sKeyName = $aRes[$sV];
  • }
  • /*PHP5 >= 5.1
  • if (true === $bSession && true === isset ($this -> oSession -> $sKeyName)) {
  • $this -> oSession -> $sKeyName = $aRes[$sV];
  • }
  • */
  • }
  • $this -> mFilter = $sTmp;
  • return true;
  • }
  • public function modUser ($iUserId, $sTable, $aValues, $bSession = true) {
  • $sTmp = $this -> mFilter;
  • $this -> mFilter = 'BDD_NAME';
  • $aProps = $this -> getProps ();
  • foreach ($aProps as $sV) {
  • $sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
  • if (!empty ($aValues[$sKeyName])) {
  • if ($this -> aProps [$aProps -> getInnerIterator () -> getSubIterator (0) -> key ()]['TYPE'] === 'string') {
  • $aVals[] = $sV.'= \''.$aValues[$sKeyName].'\'';
  • } else {
  • $aVals[] = $sV.'='.$aValues[$sKeyName];
  • }
  • // PHP5 < 5.1
  • if (true === $bSession && true === $this -> oSession -> __isset ($sKeyName)) {
  • $this -> oSession -> $sKeyName = $aValues[$sKeyName];
  • }
  • }
  • }
  • $this -> mFilter = $sTmp;
  • if (empty ($aVals)) {
  • return false;
  • }
  • $sVals = implode (',', $aVals);
  • $sQuery = 'UPDATE '.$sTable.' SET '.$sVals.' WHERE '.$this -> aProps['ID']['BDD_NAME'].' = '.$iUserId;
  • if ($this -> oDB -> query ($sQuery)) {
  • return true;
  • }
  • return false;
  • }
  • }
  • ?>
<?php
/**
 * oUser package
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 */
if (!class_exists ('RecursiveArrayIterator')) { // PHP5 < 5.1
	/**
	 * class RecursiveArrayIterator
	 * @author php.net
	 * implementation for 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 oUserException extends Exception
 * personalized Exception class for this package
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 */
class oUserException extends Exception {

	const ERROR_GEN_NOT_SETABLE = '{__PROP__} is not a setable property';
	const ERROR_GEN_NOT_GETABLE = '{__PROP__} is not a getable property';

	const ERROR_USER_PROP_NOT_EXISTS = '{__PROP__} property does not exist';
	const ERROR_USER_PROP_HAS_NO_VALUE = '{__PROP__} property has no value';
	const ERROR_USER_XML_KEY_NOT_COMPLETE = '{__KEY__} has no children';
	const ERROR_USER_XML_FILE_NOT_EXISTS = '{__FILE__} has not been found';
	const ERROR_USER_XML_LOADING_FAILED = 'Failed to load {__FILE__}';
	const ERROR_USER_CHECKIDENT_BAD_VALUES_COUNT = 'Values given in arguments and Authentication fields do not match';
	const ERROR_USER_MANDATORY_FIELD_MISSING = 'The mandatory field {__FIELD__} is missing';
	const ERROR_USER_ID_NOT_INTEGER = 'User ID must be an integer';

	public function __construct($sMsg, $iCode = 0) {
		parent::__construct($sMsg, $iCode);
	}
}

/**
 * class myFilter extends FilterIterator
 * filter Iterator class dedicated to oUser class
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 */
class myFilter extends FilterIterator  {

	/**
	 * private oIt
	 * Iterator object
	 * @var Iterator
	 */
	private $oIt = null;

	/**
	 * private mFilter
	 * main filter
	 * @var string
	 */
	private $mFilter = null;

	/**
	 * public function __construct
	 * constructor
	 *
	 * @param (RecursiveIteratorIterator) oIt
	 * @param (string) mFilter
	 */
    public function __construct (RecursiveIteratorIterator $oIt, $mFilter = null) {
        parent::__construct ($oIt);
        $this -> oIt = $oIt;
        $this -> mFilter = $mFilter;
    }

    /**
     * public function accept
     *
     * @return (boolean)
     */
    public function accept () {
        if (!is_null ($this -> mFilter)) {
        	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;
        }
        return true;
    }

}

/**
 * abstract class abstractUser
 * abstraction class defining oUser
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 */
abstract class abstractUser {

	/**
	 * protected aCanBeGet
	 * array of properties that can be get
	 * @var array
	 */
	protected $aCanBeGet = array (
	'FILTER',
	'SUBFILTER',
	'ITMODE'
	);

	/**
	 * protected aCanBeSet
	 * array of properties that can be set
	 * @var array
	 */
	protected $aCanBeSet = array (
	'FILTER',
	'SUBFILTER',
	'ITMODE'
	);

	/**
	 * protected cItMode
	 * RecursiveIteratorIterator mode
	 * @var RecursiveIteratorIterator constant
	 */
	protected $cItMode = true;

	/**
	 * protected mFilter
	 * main filter
	 * @var string
	 */
	protected $mFilter = null;

	/**
	 * protected aProps
	 * array of properties
	 * @var array
	 */
	protected $aProps = array ();

	/**
	 * public oSession
	 * oSession object
	 * @var oSession
	 */
	public $oSession = null;

	/**
	 * protected oXml
	 * simpleXML object
	 * @var simpleXML
	 */
	protected $oXml = null;

	/**
	 * public function __construct
	 * constructor
	 * @param (string) $fXml : xml config filename
	 */
	public function __construct ($fXml) {
		if (!file_exists ($fXml)) {
			throw new oUserException (str_replace ('{__FILE__}', $fXml, oUserException::ERROR_USER_XML_FILE_NOT_EXISTS));
		}
		if (!($this -> oXml = @simplexml_load_file ($fXml)) instanceof SimpleXMLElement) {
			throw new oUserException (str_replace ('{__FILE__}', $fXml, oUserException::ERROR_USER_XML_LOADING_FAILED));
		}
		$this -> oSession = new oSession ($this -> oXml);
		$this -> aPropsFill ();
	}

	/**
	 * private function aPropsFill
	 * fills the array of properties aProps from oXml
	 */
	private function aPropsFill () {
		foreach ($this -> oXml -> USER -> children () as $oNode) {
			$aTmp = array ();
			foreach ($oNode -> children() as $oChild) {
				$aTmp[(string)dom_import_simplexml($oChild) -> tagName] = (string)$oChild['value'];
			}
			if (empty ($aTmp)) {
				throw new oUserException (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
	 * getter
	 * @param (string) sProp
	 * @return sProp value
	 */
	public function __get ($sProp) {
		if (!in_array ($sProp, $this -> aCanBeGet) && !array_key_exists ($sProp, $this -> aProps)) {
			throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_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 oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_USER_NOT_EXISTS));
				}
				if (!is_null ($this -> mFilter)) {
					if (isset ($this -> aProps[$sProp][$this -> mFilter])) {
						return $this -> aProps[$sProp][$this -> mFilter];
					}
				}
				if (!isset ($this -> aProps[$sProp]['VALUE'])) {
					//throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_USER_PROP_HAS_NO_VALUE));
					return null;
				}
				return $this -> aProps[$sProp]['VALUE'];
				break;
		}
	}

	/**
	 * public function __set
	 * setter
	 * @param (string) sProp
	 * @param (mixed) mVal
	 * @return void
	 */
	public function __set ($sProp, $mVal) {
		if (!array_key_exists ($sProp, $this -> aProps) && !in_array ($sProp, $this -> aCanBeSet)) {
			throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_SETABLE));
		}
		switch ($sProp) {
			case 'FILTER' :
				$this -> mFilter = $mVal;
				break;
			case 'ITMODE' :
				$this -> cItMode = $mVal;
				break;
			default :
				$this -> aProps[$sProp]['VALUE'] = $mVal;
				break;
		}
	}

	/**
	 * public function getProps
	 * get the aProps array of properties
	 * @return RecursiveIteratorIterator or myFilter Iterator
	 */
	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);
			}
		}
		return new RecursiveIteratorIterator (new RecursiveArrayIterator ($this -> aProps), $this -> cItMode);
	}

	/**
	 * abstract public function checkIdent
	 * check if a user exists in the database, given IDENT fields in the xml config file
	 * @param (string) sTable : users DB table name
	 * @param (array) aValues : array of fields to be checked, each key being the key of the config file, and the value being the input value
	 */
	abstract public function checkIdent ($sTable, $aValues);

	/**
	 * abstract public function createUser
	 * create a user if values are correct
	 * @param (string) sTable : users db table name
	 * @param (array) aValues : array of fields to be created, each key being the key of the config file, and the value being the input value
	 */
	abstract public function createUser ($sTable, $aValues);

	/**
	 * abstract public function getUser
	 * get a user from DB
	 * @param (mixed) iUserId : existing user ID in the DB
	 * @param (string) sTable : users db table name
	 * @param (boolean) bSession : true if get values must fill the session (if config file defines these fields for the session), false if not
	 */
	abstract public function getUser ($iUserId, $sTable, $bSession = true);

	/**
	 * abstract public function modUser
	 * modify a user in DB
	 * @param (mixed) iUserId : existing user ID in the DB
	 * @param (string) sTable : users db table name
	 * @param (array) aValues : array of fields to be modified, each key being the key of the config file, and the value being the input value
	 * @param (boolean) bSession : true if get values must fill the session (if config file defines these fields for the session), false if not
	 */
	abstract public function modUser ($iUserId, $sTable, $aValues, $bSession = true);

}

/**
 * class oSession
 * session class
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 *
 * see abstractUser for info about the methods and properties of this class, same definitions apply here
 */
class oSession {

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

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

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

	public function __get ($sProp) {
		if (!array_key_exists ($sProp, $this -> aProps)) {
			throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_SETABLE));
		}
		return $this -> aProps[$sProp];
	}

	public function __set ($sProp, $mVal) {
		if (!array_key_exists ($sProp, $this -> aProps)) {
			throw new oUserException (str_replace ('{__PROP__}', $sProp, oUserException::ERROR_GEN_NOT_GETABLE));
		}
		$this -> aProps[$sProp] = $mVal;
		$_SESSION['USER'][$sProp] = $mVal;
	}

	public function __isset ($sProp) {
		if (!array_key_exists ($sProp, $this -> aProps)) {
			return false;
		}
		return true;
	}
}

/**
 * class oUser extends abstractUser
 * user class
 * @author Johan Barbier <johan.barbier@gmail.com>
 * @version 20061124
 *
 * see abstractUser for info about the methods and properties of this class, same definitions apply here
 */
class oUser extends abstractUser {

	private $oDB;

	public function __construct ($sXml, $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) {
			$sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
			$sCurrentDbName = $this -> aProps [$sKeyName]['BDD_NAME'];
			if (empty ($aValues[$sKeyName])) {
				throw new oUserException (oUserException::ERROR_USER_CHECKIDENT_BAD_VALUES_COUNT);
			}
			if ($this -> aProps[$sKeyName]['TYPE'] === 'string') {
				if (isset ($this -> aProps[$sKeyName]['DEDOUBLE'])) {
					$aDedoub[] = $sCurrentDbName.' = \''.$aValues[$sKeyName].'\'';
				}
				$aIdent[] = $sCurrentDbName.' = \''.$aValues[$sKeyName].'\'';
			} else {
				if (isset ($this -> aProps[$sKeyName]['DEDOUBLE'])) {
					$aDedoub[] = $sCurrentDbName.' = '.$aValues[$sKeyName];
				}
				$aIdent[] = $sCurrentDbName.' = '.$aValues[$sKeyName];
			}
		}
		$this -> mFilter = $sTmp;
		if (count ($aValues) !== count ($aIdent)) {
			throw new oUserException (oUserException::ERROR_USER_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']])) {
			$this -> oSession -> ID = $aRes[$this -> aProps['ID']['BDD_NAME']];
			return true;
		} else {
			if (!empty ($aDedoub)) {
				$sWhereDedoubClause = implode (' AND ', $aDedoub);
				$sQuery = 'SELECT '.$this -> aProps['ID']['BDD_NAME'].' FROM '.$sTable.' WHERE '.$sWhereDedoubClause;
				$this -> oDB -> query ($sQuery);
				$aRes = $this -> oDB -> fetch_assoc ();
				if (!empty ($aRes[$this -> aProps['ID']['BDD_NAME']])) {
					return -1;
				}
			}
			return false;
		}
	}

	public function createUser ($sTable, $aValues) {
		$sTmp = $this -> mFilter;
		$this -> mFilter = 'MANDATORY';
		$aProps = $this -> getProps ();
		foreach ($aProps as $sK => $sV) {
			$sMandatory = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
			if (empty ($aValues[$sMandatory])) {
				throw new oUserException (str_replace ('{__FIELD__}', $sMandatory, oUserException::ERROR_USER_MANDATORY_FIELD_MISSING));
			}
		}
		$this -> mFilter = 'BDD_NAME';
		$aProps = $this -> getProps ();
		foreach ($aProps as $sV) {
			$sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
			if (!empty ($aValues[$sKeyName])) {
				$aFields[] = $sV;
				if ($this -> aProps [$aProps -> getInnerIterator () -> getSubIterator (0) -> key ()]['TYPE'] === 'string') {
					$aVals[] = '\''.$aValues[$sKeyName].'\'';
				} else {
					$aVals[] = $aValues[$sKeyName];
				}
			}
		}
		$this -> mFilter = $sTmp;
		$sFields = implode (',', $aFields);
		$sVals = implode (',', $aVals);
		$sQuery = 'INSERT INTO '.$sTable.' ('.$sFields.') VALUES ('.$sVals.')' ;
		if ($this -> oDB -> query ($sQuery)) {
			$this -> oSession -> ID = $this -> oDB -> insert_id ();
			return true;
		}
		return false;
	}

	public function getUser ($iUserId, $sTable, $bSession = true) {
		$sTmp = $this -> mFilter;
		$this -> mFilter = 'BDD_NAME';
		$aProps = $this -> getProps ();
		foreach ($aProps as $sV) {
			$aFields[] = $sV;
		}
		$sFields = implode (',', $aFields);
		$sQuery = 'SELECT '.$sFields.' FROM '.$sTable.' WHERE '.$this -> aProps['ID']['BDD_NAME'].' = '.$iUserId;
		$this -> oDB -> query ($sQuery);
		$aRes = $this -> oDB -> fetch_assoc ();
		if (empty ($aRes)) {
			return false;
		}
		foreach ($aProps as $sV) {
			$sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
			$this -> aProps[$sKeyName]['VALUE'] = $aRes[$sV];
			// PHP5 < 5.1
			if (true === $bSession && true === $this -> oSession -> __isset ($sKeyName)) {
				$this -> oSession -> $sKeyName = $aRes[$sV];
			}
			/*PHP5 >= 5.1
			if (true === $bSession && true === isset ($this -> oSession -> $sKeyName)) {
				$this -> oSession -> $sKeyName = $aRes[$sV];
			}
			*/
		}
		$this -> mFilter = $sTmp;
		return true;
	}

	public function modUser ($iUserId, $sTable, $aValues, $bSession = true) {
		$sTmp = $this -> mFilter;
		$this -> mFilter = 'BDD_NAME';
		$aProps = $this -> getProps ();
		foreach ($aProps as $sV) {
			$sKeyName = $aProps -> getInnerIterator () -> getSubIterator (0) -> key ();
			if (!empty ($aValues[$sKeyName])) {
				if ($this -> aProps [$aProps -> getInnerIterator () -> getSubIterator (0) -> key ()]['TYPE'] === 'string') {
					$aVals[] = $sV.'= \''.$aValues[$sKeyName].'\'';
				} else {
					$aVals[] = $sV.'='.$aValues[$sKeyName];
				}
				// PHP5 < 5.1
				if (true === $bSession && true === $this -> oSession -> __isset ($sKeyName)) {
					$this -> oSession -> $sKeyName = $aValues[$sKeyName];
				}
			}
		}
		$this -> mFilter = $sTmp;
		if (empty ($aVals)) {
			return false;
		}
		$sVals = implode (',', $aVals);
		$sQuery = 'UPDATE '.$sTable.' SET '.$sVals.' WHERE '.$this -> aProps['ID']['BDD_NAME'].' = '.$iUserId;
		if ($this -> oDB -> query ($sQuery)) {
			return true;
		}
		return false;
	}
}
?>

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

29 novembre 2006 15:30:28 :
Tite optimisation, suppression de SUBFILTER, devenu inutile.

Commentaires et avis

signaler à un administrateur
Commentaire de Naixn le 24/11/2006 14:14:57

Hé bé, c'est un truc bien complet.
J'ai pas testé, parceque 1/ je sais que ça marche 2/ Flemme de créer une table MySQL, mais sinon ça m'a l'air bien  complet.

Juste deux remarques, notemment au niveau de dbfactory :
1/ Même pas utilisé les réflexions, tssss :p
2/ Je ne vois pas du tout à quoi te sert ton __construct ? Vu qu'il est protégé, et que tu utilise le singleton, il ne peut donc être qu'appelé par des classes filles, mais... Tu ne te serts ni de la fonction dbfactory::singleton(), ni de parent::__construct dans la classe qui étend dbfactory.

D'ailleurs, je remarque aussi qu'en fait tu n'utilises même pas la méthode singleton : ta fonction dbfactory::factory() te retourne à chaque fois une nouvelle instance de la classe, même si une instance a déjà été créée.

Après, si c'est volontaire, à savoir que tu utilises une classe générique pour différentes utilisations, alors là je comprends mieux. Mais il est vrai que je ne suis pas habitué à voir du code non utilisé dans des trucs d'exemples XD.

signaler à un administrateur
Commentaire de malalam le 24/11/2006 14:48:58 administrateur CS

Hello,

à dire vrai, j'ai pris une classe incomplète pour la DB, vu que ce n'était pas du tout le sujet de ce package. J'ai juste réécrit rapidement ce qui me manquait. Je mise plutôr sur le fait que les gens vont utiliser leur propre classe de DB.
Mais pour te répondre : j'ai 2 classes : une pour mysql, et une pour mssql en réalité. Là, je n'ai mis que mysql.
Le constructeur de la classe parente est automatiquement utilisé, vu que les filles n'en ont pas.
Le singleton est optionnel, simplement, je le règle si je veux un singleton. En général, je n'en veux pas, car j'utilise souvent plusieurs serveurs de bdd (à mon taf en tous cas).
Mais il est là, juste au cas où...j'aurais pu l'utiliser ici en effet. Mais bon...je t'ai dit, la classe est juste là comme support au package, parce qu'il me fallait bien une classe DB.
Ce n'est même pas la classe DB que j'utilise généralement, mais la mienne est exclusivement mssql.

signaler à un administrateur
Commentaire de Naixn le 24/11/2006 15:18:37

Ok, c'est bien ce que je pensais :)

Bon boulot quoiqu'il en soit. C'est marrant que tu t'amuses à appliquer les itérateurs un peu partout en tout cas :)

Bonne continuation ;)

signaler à un administrateur
Commentaire de malalam le 24/11/2006 15:27:59 administrateur CS

Bah le but est double :
- essayer de comprendre parfaitement cette *** de SPL...parce que je sens bien que c'est très puissant...mais ça reste très complexe à utiliser quand même, là. Et je sais déjà ce que je veux en faire en plus, un gros, gros projet...
- montrer aux autres ce qu'on peut faire avec (en suivant mon évolution dessus évidemment), parce que les tuto présents sur le web sont pour le moment très basiques.

Et merci ;-)

signaler à un administrateur
Commentaire de bj33 le 27/11/2006 13:35:01

salut malalam

heu...superbe!

je ne comprend pas tout mais je vais décortiquer, c'est sur.

une petite suggestion, dans exemple.php, le prologue xml est écrit en html directement, ce qui créer une erreur.

echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//

comme çà y en à plus

j'ai aussi çà :

Code inaccessible dans la fonction query() (ligne 44)
Code inaccessible dans la fonction connect() (ligne 22)

dans le fichier mysql.cls.php

je ne comprend pas trop comment fonctionne le fichier xml.

signaler à un administrateur
Commentaire de malalam le 27/11/2006 14:23:41 administrateur CS

Hello Bj,

merci, déjà :-)

L'en-tête XML du XHTML : tu as une erreur parce que tu es en short_open_tags à On. Il faut qu'il soit à Off.
ceci dit, chez un -mauvais- hébergeur, quand on ne peut pas modifier le php.ini, effectivement, il faut faire un echo :-)
Je travaille avec mes propres serveurs, donc je n'ai pas ce problème, ils sont bien configurés ;-)

Mais je sais que tu as cette erreur parce que tu as utilisé ZEND Studio, et son analyseur de code...et je n'ai jamais réussi à le mettre en short_open_tags à Off, celui-là. Mais c'est une mauvaise configuration du moteur interpréteur PHP de Zend, sur ce coup.

Pour la classe DB, c'est fort possible : j'ai récupéré un vieux bout de classe qui trainait, sans chercher à comprendre : le but n'est pas de montrer une classe DB, et la plupart des utilisateurs utiliseront la leur. Ce n'est pas la classe que j'utilise, parce que la mienne est faire pour mssql, à dire vrai. Bref, elle est juste là pour l'exemple. Il faut instancier la sienne.

Le fichier XML...bon...
Il décrit les champs que l'on utilise.
Il faut comprendre que ce package est un package que j'utilise dans mon taf. Mais il est simplifiée (bah oui...ma version est plus poussée vu que je la "vends", lol). Je suis parti du constat que dans certains types de sites que je devais développer, la gestion utilisateur était sensiblement toujours la même.
Sauf que les champs différaient un peu.
Dans un site, je vais avoir besoin uniquement d'un email, dans d'autres, des coordonnées postales, d'autres encore, de quelques champs supplémentaires.
Par contre, chaque fois, j'ai une table utilisateurs, et le besoin de pouvoir identifier un utilisateur, en créer un, vérifier qu'il n'y ait pas de doublon, ou encore, en modifier un.
Et évidemment, de récupérer les données utilisateur.
Du coup, j'au créé ce module.
Les itérateurs me permettent surtout de parcourir mon utilisateur, et de récupérer ce que je veux facilement : soit tout, soit uniquement les valeurs, soit uniquement les noms des champs, juste l'email, etc...
J'ai ajouté les méthodes pourt faire du get, du set, de l'update, etc.
Et j'avais besoin d'une classe DB, et que ma classe user soit capable d'attaquer la table utilisateurs, quels que soient le nom des champs, ou leur nombre. Ou leurs spécifités.
Et enfin, d'une classe SESSION, avec la même problématique : on a pas toujorus besoin des mêmes variables de session.

En décortiquant ça, j'en suis arrivé à cette classe, et à ce fameux fichier de configuration XML.
Il décrit la structure de l'utilisateur, que ce soit pour ses propriétés, ou celles de la session.

Dans les deux cas, j'ai un champ obligatoire: ID. Forcément.
Et pour les champs propriétés de l'utilisateur, 2 descriptions obligatoires :
BDD_NAME qui est le nom dans la table utilisateur, du champ en question.
ex:
<ID>
<BDD_NAME value="user_id" />
</ID>

La seconde, c'est le type. Dans ce package simplifié, j'en utilise 2 seulement : string et int (c'est surtout pour faire des INSERT ou des UPDATE...pour savoir si oui ou non, j'ai besoin de quotes.

Ensuite, j'ai défini des descriptions  dont je peux avoir besoin :
IDENT indique que la propriété est utilisée pour l'identification.
Dans mon exemple, ce sont les propriétés EMAIL et PASSWORD.
Bref, pour identifier un mec, je dois faire le match sur ces 2 champs.

Et enfin, MANDATORY indique qu'une propriété est obligatoire pour la création d'un utilisateur (à priori, les champs décrits comme IDEBT sont aussi MANDATORY).

En clair, ce fichier XML est le descriptif de mon utilisateur, pour un site donné.
Si on a ça comme table utilisateur :
user_id, user_nom, user_prenom, user_cp, user_ville, user_email, user_pwd, et que dans ma session on a besoin de son ID, de son Email, et de son nom + prénom, que le compte
est identifié via email et pwd, et que tous les champs sont nécessaires, on aura un truc du genre :
<root>
<USER>
<ID>
<BDD_NAME value="user_id" />
<TYPE value="int" />
</ID>
<NOM>
<BDD_NAME value="user_nom" />
<TYPE value="string" />
<MANDATORY />
</NOM>
<PRENOM>
<BDD_NAME value="user_prenom" />
<TYPE value="string" />
<MANDATORY />
</PRENOM>
<CODE_POSTAL>
<BDD_NAME value="user_cp" />
<TYPE value="string" />
<MANDATORY />
</CODE_POSTAL>
<VILLE>
<BDD_NAME value="user_ville" />
<TYPE value="string" />
<MANDATORY />
</VILLE>
<EMAIL>
<BDD_NAME value="user_email" />
<TYPE value="string" />
<IDENT />
<MANDATORY />
</EMAIL>
<EMAIL>
<BDD_NAME value="user_pwd" />
<TYPE value="string" />
<IDENT />
<MANDATORY />
</EMAIL>
</USER>
<SESSION>
<ID />
<EMAIL />
<NOM />
<PRENOM />
</SESSION>
</root>

J'espère que c'est plus clair.

signaler à un administrateur
Commentaire de malalam le 27/11/2006 14:26:39 administrateur CS

Au passage, le code inutilisé, ce sont les unset () et return false après les throw new Exception () dans les deux méthodes citées. Suffit de les virer.

signaler à un administrateur
Commentaire de bj33 le 27/11/2006 18:59:03

<< malalam

>> tu as une erreur parce que tu es en short_open_tags à On.

non, non, ils sont bien à off.configuration php 5 recommandée strictement appliquée.pour php 4, c'est plus laxiste mais je ne teste que mes scripts avec php 4.

>> tu as cette erreur parce que tu as utilisé ZEND Studio

éffectivement, çà ne change rien à la source générée.c'est juste génant avec la plupart des ide qui renvoi une erreur qui n'en ai pas une.j'ai aussi testé avec maguma, même combat.mais c'est juste un détail, c'est un bug connu de zend mais aussi d'autres.

>> J'espère que c'est plus clair.

je commence à voir la lumière ;) ma culture "scriptique" n'est pas aussi vaste que la tienne mais en travaillant dessus je devrais pouvoir en tirer des enseignements et peut être
l'utiliser pour ma future zone membre.ton concept n'est pas simple, je vais donc travailler les scripts.

merci beaucoup d'avoir pris le temps d'écrire toutes ces lignes d'explications.

signaler à un administrateur
Commentaire de malalam le 28/11/2006 08:23:56 administrateur CS

De toute façon, si ce package est utilisable tel quel sans problème, comme je l'ai dit, j'en utilise une version plus complexe et complète. Il mérite qu'on l'adapte, le cas échéant. Mais ce n'est pas nécessaire.
Pour te donner une idée, dans ma version, entre autre, j'ai largement complexifié le getter de la classe abstraite pour pouvoir accéder plus facilement à tout.
De plus, un exemple d'amélioration rapide et pratique, qui ne nécessite pas d'ajout de code du tout : je travaille avec une classe de traitement de formulaire, à qui on passe notamment un masque. Par exemple, basiquement, pour traiter un email, je lui balancerais le masque "EMAIL" (y a d'autres options, mais on s'en fout là). Du coup, j'ai stocké les masques relatifs à chaque propriété de mon utilisateur : EMAIL pour l'email, TEXT pour le nom et le prénom, CODE_POSTAL pour le code postal etc...
C'est ainsi très facile à récupérer, cela fait partie de la configuration du site, et je n'ai pas à ajouter de code, juste à ajouter une description à mon fichier XML.

signaler à un administrateur
Commentaire de franco_se le 02/05/2007 19:13:01

comme d'ab malalam nous pond ici un pur bonheur ! :D
mais j'avais une question, somme toute conne mais ....... pourquoi , parti comme tu étais ds cette classe, tu n'as pas aussi geré la deconnection ("propre" ) du membre ? ......
( j'avais prevenu, elle est conne )

signaler à un administrateur
Commentaire de malalam le 23/05/2007 19:40:13 administrateur CS

Parce que je n'y ai pas du tout pensé...

signaler à un administrateur
Commentaire de slyfog le 21/07/2007 18:57:10

Salut, bravo pour cette class et merci malalam de nous faire découvrir la puissance des itérateurs.
J'ai trouvé un petit défaut, lors de la creation/modification d'un utilisateur le script teste si la chaine qu'on lui fournie n'est pas vide avec un !empty(), et comme le 0 est considéré comme vide, ça ne les prend pas en compte, ce qui peut etre assez gênant dans certains cas...

Si d'autres ont rencontré le même problème voici la modif pour que ça fonctionne, ligne 456 et 513 remplacer :
if (!empty ($aValues[$sKeyName]))
par :
if ($aValues[$sKeyName] != '')

signaler à un administrateur
Commentaire de slyfog le 21/07/2007 19:13:29