Gestion de paramètres arborescente : classe + GUI

Eléphanteau du PHP | 19 Messages

24 sept. 2014, 14:35

Bonjour,

Voici une classe de gestion de paramètres arborescents, à la façon de la base de registre de windows.
J'ai fourni une exemple d'utilisation, sous la forme d'une interface de saisie de cet arbre de paramètres (en PHP + javascript/AJAX classique, aucune surcouche)

Pour toi public, j'ai mis tous les fichiers nécessaires au même niveau,dans un seul .zip, que je vais essayer d'uploader. (vous pourrez dispachez pages PHP, JS, images, CSS etc. comme vous voudrez en adaptant le code, facile)

Sources et images

Je mettrais aussi les sources dans les messages suivants, avec quelques explications.
Dernière édition par wolflarsen le 24 sept. 2014, 15:26, édité 1 fois.

Eléphanteau du PHP | 19 Messages

24 sept. 2014, 15:04

Tout d'abord, la commande SQL pour créer la table: ici c'est du postgreSQL mais c'est facile à adapter à ce que vous voulez.
CREATE TABLE nparam
(
  prm_value text,
  prm_code character varying(50) NOT NULL,
  prm_path text NOT NULL,
  prm_path_parent text,
  prm_level integer NOT NULL DEFAULT 0,
  CONSTRAINT nparam_pk PRIMARY KEY (prm_path),
  CONSTRAINT nparam_fk01_self FOREIGN KEY (prm_path_parent)
      REFERENCES nparam (prm_path) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE nparam
  OWNER TO postgres;

-- Index: fki_nparam_fk01_self

-- DROP INDEX fki_nparam_fk01_self;

CREATE INDEX fki_nparam_fk01_self
  ON nparam
  USING btree
  (prm_path_parent COLLATE pg_catalog."default");

-- Index: idx_parent_path

-- DROP INDEX idx_parent_path;

CREATE INDEX idx_parent_path
  ON nparam
  USING btree
  (prm_path_parent COLLATE pg_catalog."default" NULLS FIRST);

-- Index: prm_idx_path

-- DROP INDEX prm_idx_path;

CREATE INDEX prm_idx_path
  ON nparam
  USING btree
  (prm_path COLLATE pg_catalog."default");

Vous pouvez ignorer la partie intégrité, ça fonctionnera quand même. Exemple, au plus simple:
CREATE TABLE nparam
(
  prm_value text,
  prm_code character varying(50) NOT NULL,
  prm_path text NOT NULL,
  prm_path_parent text,
  prm_level integer NOT NULL DEFAULT 0,
  CONSTRAINT nparam_pk PRIMARY KEY (prm_path)
)
Les colonnes de type 'text' peuvent être remplacées par du varchar(500) ou plus.
Dernière édition par wolflarsen le 24 sept. 2014, 15:07, édité 1 fois.

Eléphanteau du PHP | 19 Messages

24 sept. 2014, 15:06

La classe principale: nParametre
<?php
//==================================================================
// Classe 'nparametre'
// permet de lire et mettre a jour les valeurs de parametres arborescents
//==================================================================
$_version = 'V1c 18/09/2014';

require_once("cnx_smvts.class.php");
require_once("logmsg.class.php");

class nParametre {
	private $_dbCnx;
	private $_statement_exists = null;		// rqt preparee pour verif existence
	private $_statement_read = null;		// rqt preparee pour lecture
	private $_statement_liste = null;		// rqt preparee pour liste
	private $_statement_liste_null = null;	// rqt preparee pour liste
	private $_statement_listerec = null;	// rqt preparee pour liste
	private $_statement_update = null;		// rqt preparee pour mise mise a jour
	private $_statement_insert = null;		// rqt preparee pour mise insertion
	private $_statement_update_add = null;	// rqt preparee pour mise maj cumulative
	// separateur de path de la clef
	private $PATH_SEP = "~";

//==================================================================
// Constructeur : ouvre la connexion et prepare les requetes
//==================================================================
	function nParametre($environnement) {
		try {
			$cs = new cnx_smvts($environnement);
			if ( ! ($this->_dbCnx = $cs->handle())) {
				$log = new LogMsg("classe nParametre", "constructeur", "Erreur obtention connexion", $cs->error(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR connexion BDD env=".$environnement);
			}
			// PrepStmt pour verif existence
			$sqlQuery = "SELECT count(*) as NBRE FROM nparam WHERE PRM_PATH = :prm_path";
			$this->_statement_exists = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_exists) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour lecture valeur
			$sqlQuery = "SELECT PRM_VALUE FROM nparam WHERE PRM_PATH = :prm_path";
			$this->_statement_read = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_read) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour suppression valeur
			$sqlQuery = "DELETE FROM nparam WHERE PRM_PATH = :prm_path";
			$this->_statement_delete = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_delete) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour liste noeuds d'un noeud
			$sqlQuery = "SELECT PRM_PATH, PRM_PATH_PARENT, PRM_CODE, PRM_VALUE, PRM_LEVEL FROM nparam WHERE PRM_PATH_PARENT = :prm_path_parent ORDER BY PRM_PATH";
			$this->_statement_liste = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_liste) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour liste noeuds de la racine
			$sqlQuery = "SELECT PRM_PATH, PRM_PATH_PARENT, PRM_CODE, PRM_VALUE, PRM_LEVEL FROM nparam WHERE PRM_PATH_PARENT IS NULL ORDER BY PRM_PATH";
			$this->_statement_liste_null = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_liste_null) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour liste recursive de valeurs
			$sqlQuery = "
				WITH RECURSIVE sousparam(PRM_PATH, PRM_VALUE, PRM_PATH_PARENT, PRM_CODE, PRM_LEVEL) AS (
					SELECT PRM_PATH, PRM_VALUE, PRM_PATH_PARENT, PRM_CODE, PRM_LEVEL
					FROM nparam WHERE PRM_PATH_PARENT = :prm_path_parent
					UNION ALL
					SELECT p.PRM_PATH, p.PRM_VALUE, p.PRM_PATH_PARENT, p.PRM_CODE, p.PRM_LEVEL
					FROM sousparam  AS sp, nparam AS p 
					WHERE p.PRM_PATH_PARENT = sp.PRM_PATH
				)
				SELECT PRM_PATH, PRM_VALUE, PRM_PATH_PARENT, PRM_CODE, PRM_LEVEL FROM sousparam ORDER BY PRM_PATH;
			";
			$this->_statement_listerec = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_listerec) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour maj valeur
			$sqlQuery = "UPDATE nparam set PRM_VALUE = :prm_value WHERE PRM_PATH = :prm_path";
			$this->_statement_update = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_update) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour ajout valeur
			$sqlQuery = "INSERT INTO nparam (PRM_PATH, PRM_PATH_PARENT, PRM_CODE, PRM_VALUE, PRM_LEVEL) VALUES (:prm_path, :prm_path_parent, :prm_code, :prm_value, :prm_level)";
			$this->_statement_insert = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_insert) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe nParametre", "constructeur", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			
			// PrepStmt pour ajout valeur à contenu existant
			switch ( strtoupper( $cs->type_BDD() ) ) {
			case 'MYSQL':
				$sqlQuery = "UPDATE nparam set PRM_VALUE = concat( PRM_VALUE, :prm_value ) WHERE PRM_PATH = :prm_path";
				break;
			case 'PGSQL':
				$sqlQuery = "UPDATE nparam set PRM_VALUE = PRM_VALUE || :prm_value WHERE PRM_PATH = :prm_path";
				break;
			default:
				$log = new LogMsg("classe nParametre", "constructeur", "Type de BDD non gere", $cs->type_BDD());
			}
			$this->_statement_update_add = $this->_dbCnx->prepare($sqlQuery);
			if (!$this->_statement_update_add) {
				$err = $this->_dbCnx->errorInfo();
				$log = new LogMsg("classe Parametre", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
		}
		catch (PDOException $except) {
			$log = new LogMsg("classe nParametre", "exception / constructeur", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			die( "ERREUR:" . $except->getMessage() );
		}
	}

//==================================================================
// Verifie l'existence d'un path
//==================================================================
    function exists( $pPath , $pParentPath = null) {
//$log = new LogMsg("classe nParametre", "e0 exists", "path=".$pPath, 'Parent='.$pParentPath );
		try {
			if ( $pParentPath == null || $pParentPath == ''  )
				$path_to_search = $pPath;
			else
				$path_to_search = trim($pParentPath) . $this->PATH_SEP . trim($pPath);
			
			$this->_statement_exists->bindValue(':prm_path', $path_to_search, PDO::PARAM_STR);
			if ( ! $this->_statement_exists->execute()) {
				$err = $this->_statement_exists->errorInfo();
				$log = new LogMsg("classe Parametre", "methode: exists", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die("ERREUR" .  $err[1] . $err[2]);
			}
			$result = $this->_statement_exists->fetch(PDO::FETCH_ASSOC);
//$log = new LogMsg("classe nParametre", "e1 exists", "nbre res=".$result['NBRE'] );
			if ( $result['NBRE'] == 0 ) {
				return false;
			}
			else {
				return true;
			}
		}
		catch (PDOException $except) {
			$log = new LogMsg("classe nParametre", "methode: exists / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			die( "ERREUR:" . $except->getMessage() );
		}
	}

//==================================================================
// Effectue une creation/mise à jour d'un parametre
//==================================================================
    function set($pPath, $pValeurParametre, $pParentPath=null) {
//$log = new LogMsg("classe nParametre", "s0 set/first", "path=".$pPath, "Val=".$pValeurParametre, 'Parent='.$pParentPath );
		if ( $pPath != NULL && trim( $pPath ) != "") {
			try {
				if ( $pParentPath == NULL || $pParentPath == '' ) {
					$path_to_search = trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
				}
				else {
					$path_to_search = trim($pParentPath) . $this->PATH_SEP . trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
				}
//$log = new LogMsg("classe nParametre", "s1 set/info", "path_to_search", $path_to_search );
				// determine la valeur du 'parent_path'
				$parent_path = null;
//$log = new LogMsg("classe nParametre", "s1b nbre token=", count( $table_cles ));
				if ( count( $table_cles ) > 1 ) {
					$idx = 0;
					$parent_path = $table_cles[0];
					while ( $idx < count( $table_cles ) - 2 ) {
						$idx++;
						$parent_path = $parent_path . $this->PATH_SEP . trim($table_cles[ $idx ]);
					}
//$log = new LogMsg("classe nParametre", "s1c parenpath=", $parent_path );
//$log = new LogMsg("classe nParametre", "s2 set/determination parent", $parent_path, "existe?", $this->exists ( $parent_path ) );
				}
				// creation recursive des niveaux superieurs
				if ( $parent_path != null && $parent_path != '' && ! $this->exists ( $parent_path ) ) {
//$log = new LogMsg("classe nParametre", "s3 set/ demande create level", $parent_path );
					$this->set( $parent_path, null);
				}
				
				$code = $table_cles[ count( $table_cles ) - 1 ];
				
				if ( $this->exists( $path_to_search ) ) {
					// mise a jour s'il existe
					$this->_statement_update->bindValue(':prm_path', $path_to_search, PDO::PARAM_STR);
					$this->_statement_update->bindValue(':prm_value', $pValeurParametre, PDO::PARAM_STR);
					if ( ! $this->_statement_update->execute()) {
						$err = $this->_statement_update->errorInfo();
						$log = new LogMsg("classe nParametre", "methode: set", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
						die("ERREUR" .  $err[1] . $err[2]);
					}
				}
				else {
//$log = new LogMsg("classe nParametre", "s4 set/create effectif", $path_to_search,, "parent=", $parent_path );
					// creation s'il n'existe pas 
					$this->_statement_insert->bindValue(':prm_path', $path_to_search, PDO::PARAM_STR);
					if ( $parent_path != null && $parent_path != '' )
						$this->_statement_insert->bindValue(':prm_path_parent', $parent_path, PDO::PARAM_STR);
					else
						$this->_statement_insert->bindValue(':prm_path_parent', null, PDO::PARAM_INT);
					$this->_statement_insert->bindValue(':prm_level', count( $table_cles ) - 1, PDO::PARAM_STR);
					$this->_statement_insert->bindValue(':prm_code', $code, PDO::PARAM_STR);
					$this->_statement_insert->bindValue(':prm_value', $pValeurParametre, PDO::PARAM_STR);
					
					if ( ! $this->_statement_insert->execute()) {
						$err = $this->_statement_insert->errorInfo();
						$log = new LogMsg("classe nParametre", "methode: set", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
						die("ERREUR" .  $err[1] . $err[2]);
					}
				}
			}
			catch (PDOException $except) {
				$log = new LogMsg("classe nParametre", "methode: set / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die( "ERREUR:" . $except->getMessage() );
			}
		}
		else {
			$log = new LogMsg("classe nParametre", "methode: set", "Le Path est vide...", "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			return 'Parametres incorrects';
		}
	}

//==================================================================
// Renvoie la valeur d'un parametre
//==================================================================
    function concat($pPath, $pValeurParametre, $pParentPath=null) {
		if ( $pPath != null && trim( $pPath ) != "") {
			try {
				$this->set( $pPath, $this->read( $pPath, $pParentPath ) . $pValeurParametre, $pParentPath );
			}
			catch (PDOException $except) {
				$log = new LogMsg("classe Parametre", "methode: concat / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die( "ERREUR:" . $except->getMessage() );
			}
		}
		else {
			$log = new LogMsg("classe nparametre", "methode: concat", "Le Path est vide...", "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			return 'Parametres incorrects';
		}
	}

//==================================================================
// Effectue une creation/mise à jour d'un parametre
//==================================================================
	function read( $pPath, $pParentPath=null ) {
		if ( $pPath != null && trim( $pPath ) != "") {
			try {
				if ( $pParentPath == null || $pParentPath == '' ) {
					$path_to_search = trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
					// determine la valeur du 'parent_path'
					$parent_path = null;
					if ( count( $table_cles ) > 1 ) {
						$idx = 0;
						$parent_path = $table_cles[0];
						while ( $idx < count( $table_cles ) - 2 ) {
							$parent_path = $parent_path . $this->PATH_SEP . trim($table_cles[ $idx ]);
							$idx++;
						}
					}
				}
				else {
					$parent_path = trim( $pParentPath );
					$path_to_search = $parent_path . $this->PATH_SEP . trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
				}
				
				$this->_statement_read->bindValue(':prm_path', $path_to_search, PDO::PARAM_STR);
				if (!$this->_statement_read->execute()) {
					$err = $this->_statement_read->errorInfo();
					$log = new LogMsg("classe nParametre", "methode: read", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
					die("ERREUR" .  $err[1] . $err[2]);
				}
				$result = $this->_statement_read->fetch(PDO::FETCH_NAMED);
				return $result['PRM_VALUE'];
			}
			catch (PDOException $except) {
				$log = new LogMsg("classe nParametre", "methode: read / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die( "ERREUR:" . $except->getMessage() );
			}
		}
		else {
			$log = new LogMsg("classe nParametre", "methode: read", "Le Path est vide...", "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			return 'Parametres incorrects';
		}
	}

//==================================================================
// Renvoie la liste des parametres d'un niveau
//==================================================================
	function liste( $pParentPath=null, $pRecursif = false ) {
		try {
			if ( $pRecursif ) {
				if ( $pParentPath != null && $pParentPath != '' ) {
					$this->_statement_listerec->bindValue(':prm_path_parent', $pParentPath, PDO::PARAM_STR);
				}
				else {
					$this->_statement_listerec->bindValue(':prm_path_parent', null, PDO::PARAM_INT);
				}
				if (!$this->_statement_listerec->execute()) {
					$err = $this->_statement_listerec->errorInfo();
					$log = new LogMsg("classe nParametre", "methode: Liste(rec)", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
					die("ERREUR" .  $err[1] . $err[2]);
				}
				$result0 = $this->_statement_listerec->fetchAll(PDO::FETCH_NAMED);
			}
			
			else {
				if ( $pParentPath != null && $pParentPath != '' ) {
					$this->_statement_liste->bindValue(':prm_path_parent', $pParentPath, PDO::PARAM_STR);
					if (!$this->_statement_liste->execute()) {
						$err = $this->_statement_liste->errorInfo();
						$log = new LogMsg("classe nParametre", "methode: Liste", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
						die("ERREUR" .  $err[1] . $err[2]);
					}
					$result0 = $this->_statement_liste->fetchAll(PDO::FETCH_NAMED);
				}
				else {
					if (!$this->_statement_liste_null->execute()) {
						$err = $this->_statement_liste_null->errorInfo();
						$log = new LogMsg("classe nParametre", "methode: Liste", $err[1], $err[2], "Fichier:". __FILE__ ." Ligne:". __LINE__ );
						die("ERREUR" .  $err[1] . $err[2]);
					}
					$result0 = $this->_statement_liste_null->fetchAll(PDO::FETCH_NAMED);
				}
			}
			$result = array();
			foreach ( $result0 as $cle=>$valeur ) {
/*
				$result[$valeur['PRM_CODE']]['PRM_PATH'] = $valeur['PRM_PATH'];
				$result[$valeur['PRM_CODE']]['PRM_PATH_PARENT'] = $valeur['PRM_PATH_PARENT'];
				$result[$valeur['PRM_CODE']]['PRM_CODE'] = $valeur['PRM_CODE'];
				$result[$valeur['PRM_CODE']]['PRM_VALUE'] = $valeur['PRM_VALUE'];
				$result[$valeur['PRM_CODE']]['PRM_LEVEL'] = $valeur['PRM_LEVEL'];
*/
				$result[$valeur['PRM_PATH']]['PRM_PATH'] = $valeur['PRM_PATH'];
				$result[$valeur['PRM_PATH']]['PRM_PATH_PARENT'] = $valeur['PRM_PATH_PARENT'];
				$result[$valeur['PRM_PATH']]['PRM_CODE'] = $valeur['PRM_CODE'];
				$result[$valeur['PRM_PATH']]['PRM_VALUE'] = $valeur['PRM_VALUE'];
				$result[$valeur['PRM_PATH']]['PRM_LEVEL'] = $valeur['PRM_LEVEL'];
			}
			return $result;
		}
		catch (PDOException $except) {
			$log = new LogMsg("classe nParametre", "methode: liste / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			die( "ERREUR:" . $except->getMessage() );
		}
	}

//==================================================================
// supprime un parametres
//==================================================================
	function delete( $pPath, $pParentPath=null, $pRecursif = false ) {
		if ( $pPath != null && trim( $pPath ) != "") {
			try {
				if ( $pParentPath == null || $pParentPath == '' ) {
					$path_to_search = trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
					// determine la valeur du 'parent_path'
					$parent_path = null;
					if ( count( $table_cles ) > 1 ) {
						$idx = 0;
						$parent_path = $table_cles[0];
						while ( $idx < count( $table_cles ) - 2 ) {
							$parent_path = $parent_path . $this->PATH_SEP . trim($table_cles[ $idx ]);
							$idx++;
						}
					}
				}
				else {
					$parent_path = trim($pParentPath);
					$path_to_search = $parent_path . $this->PATH_SEP . trim( $pPath );
					$table_cles = explode( $this->PATH_SEP, $path_to_search );
				}
				
				if ( $pRecursif ) {
				// en cas de suppresion en cascade, suppression des enfants
					$enfants = $this->liste( $path_to_search );
					if ( count( $enfants ) > 0 ) {
						foreach ( $enfants as $cle_enfant=>$valeur_enfant ) {
							$this->delete( $valeur_enfant['PRM_PATH'], null, true );
						}
					}
				}
				
				if ( count( $this->liste( $path_to_search ) ) == 0 ) {
					$this->_statement_delete->bindValue(':prm_path', $path_to_search, PDO::PARAM_STR);
					if (!$this->_statement_delete->execute()) {
						$err = $this->_statement_delete->errorInfo();
						return $err[1] . '/' . $err[2];
					}
					return '';
				}
				else {
					return 'Suppression impossible';
				}
			}
			catch (PDOException $except) {
				$log = new LogMsg("classe nParametre", "methode: delete / exception", $except->getMessage(), "Fichier:". __FILE__ ." Ligne:". __LINE__ );
				die( "ERREUR:" . $except->getMessage() );
			}
		}
		else {
			$log = new LogMsg("classe nParametre", "methode: read", "Le Path est vide...", "Fichier:". __FILE__ ." Ligne:". __LINE__ );
			return 'Parametres incorrects';
		}
	}

//==================================================================
// renvoie le separateur
//==================================================================
	function getsep() {
		return $this->PATH_SEP;
	}

} // class nParametre

la ligne:
require_once("cnx_smvts.class.php");
utilise une classe de connexion personnelle( les fichiers nécessaires sont dans le zip), mais vous pouvez faire comme vous voulez, en adaptant la classe nParametre.
Pour information, le fichier de paramétrage de la connexion, utilisé par la class cnx_smvts, est smvts.conf.php . Exemple:
<?php
defined('SMVTS_OK') or die('Acc&egrave;s refus&eacute;');
$prefix = 'pgsql';
$server = 'localhost';
$port = '5432';
$dbname = 'mabaseamoi';
$user = 'postgres';
$passw = 'mon_mdp';
La classe de connexion, utilisé dans la ligne:
require_once("logmsg.class.php");
<?php
//=========================================================
// classe cnx_smvts
// gere une connexion a la BDD smvts
//=========================================================
$_version = 'V2 29/07/2014';

class cnx_smvts {

	private $_cnx;
	private $_prefix;
	private $_errmsg;
	const PATH_PRD = "smvts.conf.php";
	const PATH_RCT = "smvts_rct.conf.php";

	// Constructeur
	function cnx_smvts($environnement) {
		if ( ! defined('SMVTS_OK') )
            define('SMVTS_OK', true );
		switch ($environnement) {
		case 'PRD':
			require(self::PATH_PRD );
			break;
		case 'RCT':
			require(self::PATH_RCT );
			break;
		default:
			$this->_cnx = false;
			$this->_errmsg = "Erreur type environnement:".$environnement;
		}
		
		if ( isset($prefix) ) {
			$this->_prefix = $prefix;

			switch ($prefix) {
			case 'mysql':
				$dsn = "mysql:host=$server;port=$port;dbname=$dbname";
				$options = array(
					PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
					,PDO::ATTR_PERSISTENT => false
					,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
					,PDO::ATTR_CASE => PDO::CASE_UPPER
				);

				try {
					$this->_cnx = new PDO($dsn, $user, $passw, $options);
					$this->_errmsg = "";
				}
				catch (PDOException $e) {
					$this->_cnx = false;
					$this->_errmsg = "Erreur connexion '$dbname:$port' : " . $e->getMessage();
				}
				break;
			case 'pgsql':
				$dsn = "pgsql:host=$server;port=$port;dbname=$dbname";
				$options = array(
					PDO::ATTR_PERSISTENT => false
					,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
					,PDO::ATTR_CASE => PDO::CASE_UPPER
				);

				try {
					$this->_cnx = new PDO($dsn, $user, $passw, $options);
					$this->_errmsg = "";
				}
				catch (PDOException $e) {
					$this->_cnx = false;
					$this->_errmsg = "Erreur connexion '$dbname:$port' : " . $e->getMessage();
				}
				break;
			default:
				$this->_cnx = false;
				$this->_errmsg = "Erreur type de connexion:".$prefix;
			}
		}
	}

	// renvoie l'objet de connexion à la BDD
	function handle() {
		return $this->_cnx;
	}

	// renvoie le type de BDD
	function type_BDD() {
		return $this->_prefix;
	}

	// renvoie le dernier message d'erreur
	function error() {
		return $this->_errmsg;
	}

}
N.B.: le nom SMVTS que vous voyez un peu partout est le nom de la base qui héberge la table nparam... Désolé pour le coté 'spécifique' du nom.

Eléphanteau du PHP | 19 Messages

24 sept. 2014, 15:24

Le reste des fichiers, c'est une interface de gestion de cette arborescence de paramètres, en PHP + javascript, full Ajax

La page de contrôle est gere_nparam.php
<?php

//$environnement = strtoupper( $_GET['env'] );
$environnement = 'PRD';

require_once("nparametre.class.php");
$param = new nParametre($environnement);
$path_sep = $param->getsep();
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<link href="nparam.css" media="all" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="func_ajax_common.js"></script>
<script type="text/javascript">
var ENVIRONNEMENT = "<?php echo $environnement; ?>";
var PATH_SEP = "<?php echo $path_sep; ?>";
</script>
<script type="text/javascript" src="gere_nparam.js"></script>

<title>Gestion des param&egrave;tres</title>
</head>
<body>

<div 
	class="mainblock"
>
<input 
	type="hidden" 
	name="env" 
	value="<?php echo $environnement; ?>"
>
<img
	id="importexport"
	src="../_img/paperclip-2x.png" 
	alt="F" 
	class="petitbouton" 
	title="Glissez une branche sur cette icone pour l'exporter.
Glissez l'icone sur une branche pour l'y ajouter.
Glissez l'icone sur un code '+' pour l'ajouter à la branche." 
	ondragover="allowDrop(event)"
	ondrop="exportation(event)"
	ondragstart="depart_import(event)"';
/>
<table>
<tr
	id="BRA_"
>
</tr>
</table>
<div id="infos">
</div>
</div>
<script type="text/javascript">

liste ( '' );

</script>
</body>
</html>
Le code JavaScript est dans gere_nparam.js
[javascript]function parent_path( path ) {
"use strict";
var liste = path.split( PATH_SEP );
liste.pop();
return liste.join( PATH_SEP );
}

function path_code( path ) {
"use strict";
var liste = path.split( PATH_SEP );
return liste.pop();
}

function openclose(id) {
"use strict";

var ligne = document.getElementById("BRA_"+id);
var btn = document.getElementById("OPCL_"+id);

if ( ligne.getElementsByTagName('td').length == 2) {
btn.src = "caret-bottom-2x.png";
btn.title = 'Masquer les paramètres contenus dans cette branche ';
liste(id);
}
else {
btn.src = "caret-right-2x.png";
btn.title = 'Afficher les paramètres contenus dans cette branche ';
ligne.deleteCell(-1);
}

}

function maj(id) {
"use strict";
var valeur = document.getElementById("VAL_"+id);
var erreur = document.getElementById("ERR_"+id);
var xhr = getXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
erreur.innerHTML = xhr.responseText;
valeur.style.backgroundColor = "";
}
};

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=maj";
script = script + "&path="+encodeURIComponent(id);
script = script + "&value="+encodeURIComponent(valeur.value);
script = script + "&seed=" + makeId(10);
//alert(script);

// xhr.open("GET", script, true);
// xhr.send(null);
xhr.open("POST",scriptphp,true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
}

function setNormalCell( id ) {
"use strict";
var elem_code = document.getElementById("CNEW_" + id);
var cellulec = elem_code.parentNode;
var ligne = cellulec.parentNode;
var cellulev = document.getElementById("VCELL_" + id);
var path = elem_code.value;
if ( id != '' && id != null ) {
path = id + PATH_SEP + path;
}

// ligne TR
ligne.id = 'BRA_'+path;
// cellule TD 'code'
var contenuc = '';
contenuc = contenuc + '<span';
contenuc = contenuc + ' id="CODE_' + path + '"';
contenuc = contenuc + ' ondblclick="javascript:openclose(\'' + path + '\');"';
contenuc = contenuc + ' ondragstart="drag_code(event)"';
contenuc = contenuc + ' ondragover="allowDrop(event)"';
contenuc = contenuc + ' ondrop="drop_on_code(event)"';
contenuc = contenuc + '>'
contenuc = contenuc + elem_code.value;
contenuc = contenuc + '</span>';
contenuc = contenuc + '&nbsp;';
contenuc = contenuc + '<span class="bouton_a_droite">';
contenuc = contenuc + '<img';
contenuc = contenuc + ' id="OPCL_' + path + '"';
contenuc = contenuc + ' src="caret-right-2x.png"';
contenuc = contenuc + ' onclick="javascript:openclose(\'' + path + '\');"';
contenuc = contenuc + ' title="Afficher les param&egrave;tres contnus dans cette branche"';
contenuc = contenuc + ' alt=">"';
contenuc = contenuc + '/>';
contenuc = contenuc + '</span>';
cellulec.innerHTML = contenuc;

// cellule TD 'valeur'
var contenuv = '';
contenuv = contenuv + '<textarea';
contenuv = contenuv + ' id="VAL_' + path + '"';
contenuv = contenuv + ' rows="1"';
contenuv = contenuv + ' cols="3"';
contenuv = contenuv + ' title="Saisissez la nouvelle valeur pour le code: "' + elem_code.value;
contenuv = contenuv + ' onchange="javascript:maj(\'' + path + '\');"';
contenuv = contenuv + ' onKeydown="javascript:colore_maj(\'VAL_\',\'' + path + '\');"';
contenuv = contenuv + ' onBlur="javascript:decolore_maj(\'VAL_\',\'' + path + '\');"';
contenuv = contenuv + '></textarea>';
// bouton supprimer
contenuv = contenuv + '<span class="bouton_a_droite">';
contenuv = contenuv + '<img';
contenuv = contenuv + ' src="delete-2x.png"';
contenuv = contenuv + ' alt="x"';
contenuv = contenuv + ' onclick="javascript:del(\'' + path + '\');"';
contenuv = contenuv + ' title="Suprimer le code: ' + elem_code.value + '"';
contenuv = contenuv + '/>';
contenuv = contenuv + '</span>';

contenuv = contenuv + '<span';
contenuv = contenuv + ' id="ERR_' + path + '"';
contenuv = contenuv + ' style="display:inline-block; align=right; font-size:0.75em;"';
contenuv = contenuv + '</span>';
cellulev.innerHTML = contenuv;
cellulev.id = null;

var newval = document.getElementById("VAL_" + path);
newval.focus();

}

function addEmptyNewCell( id ) {
"use strict";
var refid = "TAB_";
if ( id != null )
refid = refid + id;
var conteneur = document.getElementById( refid );
var contenuc = '';
var contenuv = '';

var nl = conteneur.insertRow(-1);
var newelem_code = nl.insertCell(-1);
var newelem_valeur = nl.insertCell(-1);

contenuc = '';
contenuc = contenuc + '<textarea';
contenuc = contenuc + ' id="CNEW_' + id + '"';
contenuc = contenuc + ' rows="1" cols="6"';
contenuc = contenuc + ' title="Saisissez ici le code a creer dans ce niveau"';
contenuc = contenuc + ' onchange="javascript:newparam(\'' + id + '\');"';
contenuc = contenuc + ' onKeydown="javascript:colore_maj(\'CNEW_\',\'' + id + '\');"';
contenuc = contenuc + ' onBlur="javascript:decolore_maj(\'CNEW_\',\'' + id + '\');"';
contenuc = contenuc + ' ondragover="allowDrop(event)"';
contenuc = contenuc + ' ondrop="drop_on_newcode(event)"';
contenuc = contenuc + ' placeholder="+"';
contenuc = contenuc + '></textarea>';
newelem_code.innerHTML = contenuc;

newelem_valeur.id = 'VCELL_' + id;
contenuv = '';
contenuv = contenuv + '<div';
contenuv = contenuv + ' id="ENEW_' + id + '"';
contenuv = contenuv + ' style="display:inline-block; font-size:0.75em; vertical-align:top;"';
contenuv = contenuv + '>';
contenuv = contenuv + '</div>';
newelem_valeur.innerHTML = contenuv;

}

function newparam( id ) {
"use strict";

var elem_code = document.getElementById("CNEW_"+id);
var val_code = elem_code.value;
var erreur = document.getElementById("ENEW_"+id);

if ( val_code != '' ) {
elem_code.style.backgroundColor = "#D0FFD0";

var xhr = getXMLHttpRequest();

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=NEW";
script = script + "&path="+encodeURIComponent(id);
script = script + "&code="+encodeURIComponent(val_code);
script = script + "&seed=" + makeId(10);

// xhr.open("GET", script, false);
// xhr.send(null);
xhr.open("POST",scriptphp,false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
elem_code.style.backgroundColor = "";
erreur.innerHTML = xhr.responseText;
if (xhr.responseText == '') {
addEmptyNewCell( id );
setNormalCell( id );
}
}
}

function verif_suppression( id ) {
"use strict";

var xhr = getXMLHttpRequest();

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=CTRL_DEL";
script = script + "&path="+encodeURIComponent(id);
script = script + "&seed=" + makeId(10);

// xhr.open("GET", script, false);
// xhr.send(null);
xhr.open("POST",scriptphp,false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
if (xhr.responseText != '') {
return ( xhr.responseText );
}
else {
return ( 0 );
}
}

function del( id ) {
"use strict";

var msg_ctrl = verif_suppression(id);
var reponse;
if ( ! msg_ctrl ||
( msg_ctrl && confirm ( msg_ctrl + "\nEtes-vous sûr de vouloir tout supprimer ?") )
) {
var valeur = document.getElementById("VAL_"+id);
var erreur = document.getElementById("ERR_"+id);
var cellule = valeur.parentNode;
var ligne = cellule.parentNode;
var tbl = ligne.parentNode;

var xhr = getXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
if (xhr.responseText != '') {
erreur.innerHTML = xhr.responseText;
}
else {
tbl.deleteRow(ligne.rowIndex);
}
}
};

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=del";
script = script + "&path="+encodeURIComponent(id);
script = script + "&seed=" + makeId(10);

// xhr.open("GET", script, true);
// xhr.send(null);
xhr.open("POST",scriptphp,true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
}
}

function liste( id ) {
"use strict";

var refid = "BRA_";
if ( id != null )
refid = refid + id;
var cellule = document.getElementById( refid ).insertCell(-1);
var xhr = getXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
cellule.innerHTML = xhr.responseText;
}
};


// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=liste";
script = script + "&path="+encodeURIComponent(id);
script = script + "&admin=Y";
script = script + "&seed=" + makeId(10);

//alert('liste script'+script);
// xhr.open("GET", script, true);
// xhr.send(null);
xhr.open("POST",scriptphp,true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
}

function colore_maj(prefixe, id) {
"use strict";
var champ = document.getElementById(prefixe+id);
champ.style.backgroundColor = "#E0E0F8";

var tb_champ = champ.value.split( "\n" );
var nbrows;
if ( tb_champ.length > 19 )
nbrows = 20;
else
nbrows = tb_champ.length;
champ.rows = nbrows;

var max_length = 1;
var index;
for (index = 0; index < tb_champ.length; ++index) {
if ( tb_champ[index].length > max_length )
max_length = tb_champ[index].length;
}
if ( max_length > 100 )
max_length = 100;
if ( max_length < champ.cols )
max_length = champ.cols;
champ.cols = max_length;
}


function decolore_maj(prefixe, id) {
"use strict";
var champ = document.getElementById(prefixe+id);
champ.style.backgroundColor = "";
}


function allowDrop(ev) {
ev.preventDefault();
}

function drag_code(ev) {
"use strict";
ev.dataTransfer.setData("text/html", ev.target.id);
//alert("dragcode-target_id:"+ev.target.id);
}

function drop_on_newcode(ev) {
ev.preventDefault();
var elem = ev.dataTransfer.getData("text/html");
if ( elem == 'importexport' ) {
// import
var id = ev.target.id.substr( ev.target.id.indexOf("_",0) + 1 );
var xhr = getXMLHttpRequest();

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=IMPORT";
script = script + "&parent="+encodeURIComponent(id);
script = script + "&seed=" + makeId(10);

// xhr.open("POST", script, false);
// xhr.send(null);
xhr.open("POST",scriptphp, false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
if ( xhr.responseText != '' ) {
document.getElementById("infos").innerHTML = xhr.responseText;
}
else {
alert( 'Import effectué.' );
}
openclose(id);
openclose(id);
}
else {
// copie
var id = elem.substr( elem.indexOf("_",0) + 1 );
// ev.target.appendChild(document.getElementById(id));
// document.getElementById());
}
}

function drop_on_code(ev) {
ev.preventDefault();
var elem = ev.dataTransfer.getData("text/html");
//alert("droponcode:"+elem+" target="+ev.target.id);
if ( elem == 'importexport' ) {
// import
var id = ev.target.id.substr( ev.target.id.indexOf("_",0) + 1 );
var xhr = getXMLHttpRequest();

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=IMPORT";
script = script + "&parent="+encodeURIComponent(id);
script = script + "&seed=" + makeId(10);

// xhr.open("GET", script, false);
// xhr.send(null);
xhr.open("POST",scriptphp, false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
if ( xhr.responseText != '' ) {
document.getElementById("infos").innerHTML = xhr.responseText;
}
else {
alert( 'Import effectué.' );
}
openclose(id);
openclose(id);
}
else {
// copie
var id = elem.substr( elem.indexOf("_",0) + 1 );
// ev.target.appendChild(document.getElementById(id));
// document.getElementById());
}
}

function exportation(ev) {
ev.preventDefault();
var elem = ev.dataTransfer.getData("text/html");
var id = elem.substr( elem.indexOf("_",0) + 1 );

var xhr = getXMLHttpRequest();

// var script = "gere_nparam_action.php?env=" + ENVIRONNEMENT;
var scriptphp = "gere_nparam_action.php";
var script = "env=" + ENVIRONNEMENT;
script = script + "&action=EXPORT";
script = script + "&path=" + encodeURIComponent(id);
script = script + "&file=" + "param_export.txt";
script = script + "&seed=" + makeId(10);

// xhr.open("GET", script, false);
// xhr.send(null);
xhr.open("POST",scriptphp, false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(script);
if ( xhr.responseText != '' ) {
alert( xhr.responseText );
}
else {
alert( 'Export effectué.' );
}

}

function depart_import(ev) {
"use strict";
ev.dataTransfer.setData("text/html", ev.target.id);
}


[/javascript]

la page PHP des actions appelées par l'objet Ajax est gere_nparam_action.php
<?php
// -----------------------------------------------------------------------
// Actions sur parametre
// -----------------------------------------------------------------------

require_once("logmsg.class.php");

// les 2 parametres suivants sont obligatoires
if ( ! isset($_POST['env'])  || ! isset($_POST['action']) ) {
	echo 'Erreur dans les parametres recus (0)';
	die();
}


$environnement = strtoupper( $_POST['env'] );
$action = strtoupper( $_POST['action'] );

require_once("nparametre.class.php");
$param = new nParametre($environnement);

switch ( $action ) {

//--------------------------------------------------------------------
case "LISTE":

	if ( ! isset($_POST['path']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}

	$pParent = $_POST['path'];
	$pListe = $param->liste( $pParent );
	echo "\n";
	echo '<td>';
	echo '<table';
	echo ' id="TAB_' . $pParent . '" ';
	echo ' style="vertical-align:top;';
	echo '">';
	echo '<tr>';
	echo '<th>Code parametre</th>';
	echo '<th>Valeur</th>';
	echo '</tr>';
	foreach ($pListe as $clef=>$colonne) {
		// parcourt les param de la branche 'path'
		echo '<tr';
		echo ' id="BRA_' . $colonne['PRM_PATH'] .'"';
		echo '>';
		// cellule 'code'
		echo '<td ';
		echo ' style="vertical-align:top"';
		echo '>';
		echo '<span';
		echo ' draggable="true"';
		echo ' id="CODE_' . $colonne['PRM_PATH'] . '"';
		echo ' ondblclick="javascript:openclose(\'' . $colonne['PRM_PATH'] . '\');"';
		echo ' ondragstart="drag_code(event)"';
		echo ' ondragover="allowDrop(event)"';
		echo ' ondrop="drop_on_code(event)"';
		echo '>';
		echo $colonne['PRM_CODE'];
		echo '</span>';
		echo '&nbsp;';
		// -------- bouton plier/deplier
		echo '<span class="bouton_a_droite">';
		echo '<img';
		echo ' id="OPCL_' . $colonne['PRM_PATH'] . '"';
		echo ' src="caret-right-2x.png"';
		echo ' onclick="javascript:openclose(\'' . $colonne['PRM_PATH'] . '\');"';
		echo ' title="Afficher les param&egrave;tres contenus dans cette branche"';
		echo ' alt=">"';
		echo ' />';
		echo '</span>';
		
		echo '</td>';
		// cellule 'valeur'
		echo '<td style="vertical-align:top">';
		echo '<textarea';
		echo ' id="VAL_'.$colonne['PRM_PATH'].'"';
		$lignes_champs = explode( "\n", $colonne['PRM_VALUE'] );
		if ( count( $lignes_champs ) > 19 )
			$nbrows = 20;
		else
			$nbrows = count( $lignes_champs );
		$max_length = 1;
		foreach ( $lignes_champs as $ligne )
			if ( strlen( $ligne ) > $max_length )
				$max_length = strlen( $ligne );
		if ( $max_length > 200 )
				$nbrows += 2;
		if ( $max_length > 100 )
				$max_length = 100;
		echo ' rows="'. $nbrows .'"';
		echo ' cols="'. $max_length .'"';
		if ( ! isset($_POST['admin']) ) {
			echo ' disabled';
		}
		else {
			echo ' title="Saisissez la nouvelle valeur pour le code: ' . $colonne['PRM_CODE'] . '"';
			echo ' onchange="javascript:maj(\'' . $colonne['PRM_PATH'] . '\');"';
			echo ' onKeydown="javascript:colore_maj(\'VAL_\',\'' . $colonne['PRM_PATH'] . '\');"';
			echo ' onBlur="javascript:decolore_maj(\'VAL_\',\'' . $colonne['PRM_PATH'] . '\');"';
		}
		echo '>';
		echo $colonne['PRM_VALUE'];
		echo '</textarea>';
		// -------- bouton supprimer
		echo '<span class="bouton_a_droite">';
		echo '<img';
		echo ' src="delete-2x.png"';
		echo ' alt="x"';
		if ( ! isset($_POST['admin']) ) {
			echo ' disabled';
		}
		else {
			echo ' onclick="javascript:del(\'' . $colonne['PRM_PATH'] . '\');"';
			echo ' title="Suprimer le code: ' . $colonne['PRM_CODE'] . '"';
		}
		echo ' />';
		echo '</span>';

		echo '<span';
		echo ' id="ERR_'.$colonne['PRM_PATH'].'"';
		echo ' style="display:inline-block; font-size:0.75em;"';
		echo '></span>';
		echo '</td>';
		echo '</tr>';
	}
	echo '<tr>';
	// cellule 'code' a saisir en creation
	echo '<td style="vertical-align:top">';
	echo '<textarea';
	echo ' id="CNEW_' . $pParent . '"';
	echo ' rows="1" cols="6"';
	if ( ! isset($_POST['admin']) ) {
		echo ' disabled';
	}
	else {
		echo ' title="Saisissez ici le code a cr&eacute;er dans ce niveau"';
		echo ' onchange="javascript:newparam(\'' . $pParent . '\');"';
		echo ' onKeydown="javascript:colore_maj(\'CNEW_\',\'' . $pParent . '\');"';
		echo ' onBlur="javascript:decolore_maj(\'CNEW_\',\'' . $pParent . '\');"';
		echo ' ondragover="allowDrop(event)"';
		echo ' ondrop="drop_on_newcode(event)"';
		echo ' placeholder="+"';
	}
	echo '></textarea>';
	echo '</td>';
	// cellule 'valeur' non saisissable en creation
	echo '<td style="vertical-align:top;"';
	echo ' id="VCELL_' . $pParent.'"';
	echo '>';
	echo '<div';
	echo ' id="ENEW_' . $pParent . '"';
	echo ' style="display:inline-block; font-size:0.75em; vertical-align:top;"';
	echo '</div>';
	echo '</td>';
	echo '</tr>';
	echo '</table>';
	echo '<td>';
	
	break;
//------------------
	
	
//--------------------------------------------------------------------
case "MAJ":

	if ( ! isset($_POST['path']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$path = $_POST['path'];
	
	if ( ! isset($_POST['value']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$value = $_POST['value'];
	$param->set($path, $value);
	break;
//------------------
	
	
//--------------------------------------------------------------------
case "NEW":

	if ( ! isset($_POST['path']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$path = $_POST['path'];
	
	if ( ! isset($_POST['code']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$code = $_POST['code'];
	if ( ! $param->exists($code, $path ) ) {
		$param->set($code, null, $path );
	}
	else {
		echo 'Existe d&eacute;j&agrave !';
	}
	break;
//------------------


//--------------------------------------------------------------------
case "DEL":

	if ( ! isset($_POST['path']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$path = $_POST['path'];
	
	$res = $param->delete($path, null, true);
	if ( $res != null ) {
		echo $res;
	}
	break;
//------------------
	
	
//--------------------------------------------------------------------
// controles avant suppression
case "CTRL_DEL":

	if ( ! isset($_POST['path']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$path = $_POST['path'];
	
	$liste = $param->liste($path, true);
	$nbre = count($liste);
	if ( $nbre > 0 ) {
		$niveau_min = 9999;
		$niveau_max = 0;
		foreach ( $liste as $cle=>$valeur ) {
			if ( $liste[$cle]['PRM_LEVEL'] < $niveau_min )
				$niveau_min = intval( $liste[$cle]['PRM_LEVEL'] );
			if ( $liste[$cle]['PRM_LEVEL'] > $niveau_max )
				$niveau_max = intval( $liste[$cle]['PRM_LEVEL'] );
		}
		echo 'Sous ce paramètre, il y a au total ' . $nbre . " sous-paramètre(s) à supprimer";
		if ( ( $niveau_max - $niveau_min ) > 0 )
			echo ", sur " . ( $niveau_max - $niveau_min + 1 ) . " niveaux";
		echo ".";
	}
	break;
//------------------
	
	
//--------------------------------------------------------------------
case "COPY":

	if ( ! isset($_POST['code']) || ! isset($_POST['dest']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$code = $_POST['code'];
	$dest = $_POST['dest'];
	$array_dest = explode( $param->getsep(), $dest );
	
	$liste = $param->liste($code, true );
	foreach ( $liste as $cle=>$valeur ) {
		$chaine = '';
	}
	break;
//------------------


//--------------------------------------------------------------------
case "EXPORT":

//$log = new LogMsg("nparam_action", "export", "start");
	if ( ! isset($_POST['path']) || ! isset($_POST['file']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$path = $_POST['path'];
	$fichier = $_POST['file'];
	
//$log = new LogMsg("nparam_action", "export", "path=", $path);
	$liste = $param->liste($path, true );
	if ( count( $liste ) > 0 ) {
//		$fhd = tmpfile();
//		$fichier = "param_export.txt";
		$fhd = fopen ($fichier, "w");
		fwrite($fhd,"Path\tParent\tCode\tValeur\tLevel\n");
		foreach ( $liste as $cle=>$valeur ) {
			fwrite($fhd, urlencode( $valeur['PRM_PATH'] ) . "\t");
			fwrite($fhd, urlencode( $valeur['PRM_PATH_PARENT'] ) . "\t");
			fwrite($fhd, urlencode( $valeur['PRM_CODE'] ) . "\t");
			fwrite($fhd, urlencode( $valeur['PRM_VALUE'] ) . "\t");
			fwrite($fhd, $valeur['PRM_LEVEL'] . "\n");
//echo urlencode( $valeur['PRM_PATH'] ) . "\t";
//$log = new LogMsg("nparam_action", "export", "prm_path=", $valeur['PRM_PATH']);
//echo urlencode( $valeur['PRM_VALUE'] ) . "\t";
		}
//		fseek($fhd, 0);
//		echo fread($fhd,10000000);
		
		fclose($fhd);
	}
	else {
		echo "Rien a exporter pour " . $path;
	}
//$log = new LogMsg("nparam_action", "export", "fin");
	break;
//------------------


//--------------------------------------------------------------------
case "IMPORT":

	if ( ! isset($_POST['parent']) ) {
		echo 'Erreur dans les parametres recus';
		die();
	}
	$parent = $_POST['parent'];
	
	$fichier = "param_export.txt";
	$lignes = file( $fichier );
	for ( $idx = 1; $idx < count( $lignes ); $idx++ ) {
		$elements = explode( "\t", $lignes[$idx] );
		$param->set( urldecode( $elements[0] ), urldecode( $elements[3] ), $parent);
	}
	break;
//------------------


default:
	echo "Action inconnue:" . $action;
	die();
}

Il y a aussi une feuille de style (c'est pas mon truc alors l'aspect, hein...), 2 petit fichiers .js de functions standard et quelques images.

Eléphanteau du PHP | 19 Messages

25 sept. 2014, 10:18

A) Petite erreur:
dans le 2ème message, il faut lire
La classe de connexion, utilisée dans la ligne:
require_once("cnx_smvts.class.php");
au lieu de :
La classe de connexion, utilisé dans la ligne:
require_once("logmsg.class.php");
B) les lignes
require_once("logmsg.class.php");
Peuvent être supprimées, si vous supprimez toutes les lignes qui commencent par
$log = new LogMsg(...