Gestion de paramètres arborescente : classe + GUI

Eléphanteau du PHP | 19 Messages

24 Sep 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 Sep 2014, 15:26, édité 1 fois.

Eléphanteau du PHP | 19 Messages

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

[sql]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");

[/sql]

Vous pouvez ignorer la partie intégrité, ça fonctionnera quand même. Exemple, au plus simple:

[sql]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)
)
[/sql]

Les colonnes de type 'text' peuvent être remplacées par du varchar(500) ou plus.
Dernière édition par wolflarsen le 24 Sep 2014, 15:07, édité 1 fois.

Eléphanteau du PHP | 19 Messages

24 Sep 2014, 15:06

La classe principale: nParametre

[php]<?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

[/php]

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]<?php
defined('SMVTS_OK') or die('Acc&egrave;s refus&eacute;');
$prefix = 'pgsql';
$server = 'localhost';
$port = '5432';
$dbname = 'mabaseamoi';
$user = 'postgres';
$passw = 'mon_mdp';
[/php]

La classe de connexion, utilisé dans la ligne:
require_once("logmsg.class.php");

[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;
}

}[/php]

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 Sep 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]<?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>
[/php]

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]<?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();
}

[/php]

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 Sep 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
[php]require_once("logmsg.class.php");[/php]
Peuvent être supprimées, si vous supprimez toutes les lignes qui commencent par [php]$log = new LogMsg(...[/php]