array(), 'message_erreur'=>array(), 'erreurs'=>array());
/**
* Arbre
* @var Array
*/
var $_arbre = array();
/**
* version du depot
* @var int
*/
var $version = 2;
/**
* Stockage interne dans les attributs de la classe
*
* @param Array $params
*/
function cfg_depot_metapack($params=array())
{
foreach ($params as $o=>$v) {
$this->$o = $v;
}
}
/**
* charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici)
*
* @param boolean $lire
* @return boolean
*/
function charger($lire = false){
if ($lire && !isset($GLOBALS['meta'][$this->param['nom']]))
return false;
$this->_base = is_array($c = $GLOBALS['meta'][$this->param['nom']]) ? $c : @unserialize($c);
$this->_arbre = array();
$this->_ici = &$this->_base;
$this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']);
$this->_ici = &$this->monte_arbre($this->_ici, isset($this->param['cfg_id']) ? $this->param['cfg_id'] : '');
return true;
}
/**
* recuperer les valeurs.
*
* @return Array
*/
function lire()
{
if (!$this->charger(true)){
return array(true, null); // pas de chargement = pas de valeur encore enregistrees
}
$ici = &$this->_ici;
// utile ??
if (isset($this->param['cfg_id'])) {
$cles = explode('/', $this->param['cfg_id']);
foreach ($this->champs_id as $i => $name) {
$ici[$name] = $cles[$i];
}
}
// s'il y a des champs demandes, les retourner... sinon, retourner la base
// (cas de lire_config('metapack::nom') tout court)
if (count($this->champs)){
$val = array();
foreach ($this->champs as $name => $def) {
$val[$name] = $ici[$name];
}
$ici = $val;
}
return array(true, $ici);
}
/**
* ecrit une meta pour tous les champs
*
* @return Array
*/
function ecrire()
{
// si pas de champs : on ecrit directement (ecrire_meta(metapack::nom,$val))...
if (!$this->champs){
ecrire_meta($this->param['nom'], serialize($this->val));
if (defined('_COMPAT_CFG_192')) ecrire_metas();
return array(true, $this->val);
}
if (!$this->charger()){
return array(false, $this->val);
}
$ici = &$this->_ici;
foreach ($this->champs as $name => $def) {
if (isset($def['id'])) continue;
$ici[$name] = $this->val[$name];
}
ecrire_meta($this->param['nom'], serialize($this->_base));
if (defined('_COMPAT_CFG_192')) ecrire_metas();
return array(true, $ici);
}
/**
* supprime chaque enregistrement de meta pour chaque champ
*
* @return Array
*/
function effacer(){
// si pas de champs : on supprime directement (effacer_meta(metapack::nom))...
if (!$this->champs){
effacer_meta($this->param['nom']);
if (defined('_COMPAT_CFG_192')) ecrire_metas();
return array(true, array());
}
if (!$this->charger()){
return array(false, $this->val);
}
$ici = &$this->_ici;
// supprimer les champs
foreach ($this->champs as $name => $def) {
if (isset($def['id'])) continue;
unset($ici[$name]);
}
// supprimer les dossiers vides
for ($i = count($this->_arbre); $i--; ) {
if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) {
break;
}
unset($this->_arbre[$i][0][$this->_arbre[$i][1]]);
}
if (!$this->_base) {
effacer_meta($this->param['nom']);
} else {
ecrire_meta($this->param['nom'], serialize($this->_base));
}
if (defined('_COMPAT_CFG_192')) ecrire_metas();
return array(true, array());
}
/**
* charger les arguments de lire_config(metapack::nom/casier/champ)
* il se peut qu'il n'y ait pas de champs si : lire_config(metapack::nom);
*
* @param string $args # $args = 'nom'; ici
* @return boolean
*/
function charger_args($args){
$args = explode('/',$args);
$this->param['nom'] = array_shift($args);
if ($champ = array_pop($args)) {
$this->champs = array($champ=>true);
}
$this->param['casier'] = implode('/',$args);
return true;
}
/**
* se positionner dans le tableau arborescent
*
* @param &Array $base
* @param string $chemin
* @return &Array
*/
function & monte_arbre(&$base, $chemin){
if (!$chemin) {
return $base;
}
if (!is_array($chemin)) {
$chemin = explode('/', $chemin);
}
if (!is_array($base)) {
$base = array();
}
foreach ($chemin as $dossier) {
if (!isset($base[$dossier])) {
$base[$dossier] = array();
}
$this->_arbre[] = array(&$base, $dossier);
$base = &$base[$dossier];
}
return $base;
}
}
?>