Qual: Amélioration du code pour isoler les méthodes d'insertion des permissions, boites et constantes,

This commit is contained in:
Laurent Destailleur 2005-04-09 15:52:07 +00:00
parent 65b44101d2
commit 3c6dff12ec

View File

@ -24,362 +24,478 @@
* *
*/ */
/** \file htdocs/includes/modules/DolibarrModules.class.php /**
\file htdocs/includes/modules/DolibarrModules.class.php
\brief Fichier de description et activation des modules Dolibarr \brief Fichier de description et activation des modules Dolibarr
*/ */
/** \class DolibarrModules /**
\class DolibarrModules
\brief Classe mère des classes de description et activation des modules Dolibarr \brief Classe mère des classes de description et activation des modules Dolibarr
*/ */
class DolibarrModules class DolibarrModules
{ {
var $db; // Handler d'accès aux base var $db; // Handler d'accès aux bases
var $boxes; // Tableau des boites
var $const; // Tableau des constantes var $boxes; // Tableau des boites
var $const; // Tableau des constantes
var $rights; // Tableau des droits
/** \brief Constructeur
* \param DB handler d'accès base var $dbversion;
*/
function DolibarrModules($DB)
{
$this->db = $DB ;
$this->dbversion = "-";
}
function _dbactive() /**
{ * \brief Constructeur
$err = 0; * \param DB handler d'accès base
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."dolibarr_modules WHERE numero=".$this->numero.";"; */
$this->db->query($sql_del); function DolibarrModules($DB)
{
$this->db = $DB ;
$this->dbversion = "-";
}
$sql ="INSERT INTO ".MAIN_DB_PREFIX."dolibarr_modules (numero,active,active_date,active_version)";
$sql .= " VALUES (";
$sql .= $this->numero.",1,now(),'".$this->version."')";
$this->db->query($sql); /**
} * \brief Fonction d'activation. Insère en base les constantes et boites du module
* \param array_sql tableau de requete sql a exécuter à l'activation
* \return int 1 si ok, 0 si erreur
*/
function _init($array_sql)
{
global $langs;
function _dbunactive() // Insère une entrée dans llx_dolibarr_modules
{ $err+=$this->_dbactive();
$err = 0;
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."dolibarr_modules WHERE numero=".$this->numero.";"; // Insère la constante d'activation module
$this->db->query($sql_del); $err+=$this->_active();
}
// Insère les boites dans llx_boxes_def
/** \brief Fonction d'activation. Insère en base les constantes et boites du module $err+=$this->insert_boxes();
* \param array_sql tableau de requete sql a exécuter à l'activation
*/ // Insère les constantes associées au module dans llx_const
function _init($array_sql) $err+=$this->insert_const();
{
global $langs; // Insère les permissions associées au module actif dans llx_rights_def
$err+=$this->insert_permissions();
// Créé les répertoires
if (is_array($this->dirs))
{
foreach ($this->dirs as $key => $value)
{
$dir = $value;
if ($dir && ! file_exists($dir))
{
umask(0);
if (! @mkdir($dir, 0755))
{
$this->error = $langs->trans("ErrorCanNotCreateDir",$dir);
dolibarr_syslog("DolibarrModules::_init error");
}
}
}
}
// Exécute les requetes sql complémentaires
for ($i = 0 ; $i < sizeof($array_sql) ; $i++)
{
if (! $this->db->query($array_sql[$i]))
{
$err++;
}
}
// Renvoi valeur de retour
if ($err > 0) return 0;
return 1;
}
/** \brief Fonction de désactivation. Supprime de la base les constantes et boites du module
* \param array_sql tableau de requete sql a exécuter à la désactivation
* \return int 1 si ok, 0 si erreur
*/
function _remove($array_sql)
{
$err = 0;
// Supprime entrée des modules
$err+=$this->_dbunactive();
// Supprime la constante d'activation du module
$err+=$this->_unactive();
// Supprime les droits de la liste des droits disponibles
$err+=$this->delete_permissions();
// Supprime les boites de la liste des boites disponibles
$err+=$this->delete_boxes();
// Exécute les requetes sql complémentaires
for ($i = 0 ; $i < sizeof($array_sql) ; $i++)
{
if (!$this->db->query($array_sql[$i]))
{
$err++;
}
}
// Renvoi valeur de retour
if ($err > 0) return 0;
return 1;
}
/**
\brief Retourne le nom traduit du module si la traduction existe dans admin.lang,
sinon le nom défini par défaut dans le module.
\return string Nom du module traduit
*/
function getName()
{
global $langs;
$langs->load("admin");
if ($langs->trans("Module".$this->numero."Name") != ("Module".$this->numero."Name"))
{
// Si traduction du nom du module existe
return $langs->trans("Module".$this->numero."Name");
}
else
{
// Si traduction du nom du module n'existe pas, on prend définition en dur dans module
return $this->name;
}
}
/**
\brief Retourne la description traduite du module si la traduction existe dans admin.lang,
sinon la description définie par défaut dans le module.
\return string Nom du module traduit
*/
function getDesc()
{
global $langs;
$langs->load("admin");
if ($langs->trans("Module".$this->numero."Desc") != ("Module".$this->numero."Desc"))
{
// Si traduction de la description du module existe
return $langs->trans("Module".$this->numero."Desc");
}
else
{
// Si traduction de la description du module n'existe pas, on prend définition en dur dans module
return $this->description;
}
}
/**
\brief Retourne la version du module.
Pour les modules à l'état 'experimental', retourne la traduction de 'experimental'
Pour les modules 'dolibarr', retourne la version de Dolibarr
Pour les autres modules, retourne la version du module
\return string Nom du module traduit
*/
function getVersion()
{
global $langs;
$langs->load("admin");
if ($this->version == 'experimental') return $langs->trans("Experimental");
elseif ($this->version == 'dolibarr') return DOL_VERSION;
elseif ($this->version) return $this->version;
else return $langs->trans("Unknown");
}
/**
\brief Retourne la version en base du module.
\return string Nom du module traduit
*/
function getDbVersion()
{
$sql ="SELECT active_version FROM ".MAIN_DB_PREFIX."dolibarr_modules";
$sql .= " WHERE numero=".$this->numero." AND active = 1";
$resql = $this->db->query($sql);
if ($resql)
{
$num = $this->db->num_rows($resql);
if ($num > 0)
{
$row = $this->db->fetch_row($resql);
$this->dbversion = $row[0];
}
$this->db->free($resql);
}
return $this->dbversion;
}
/**
\brief Insère ligne module
\return int Nombre d'erreurs (0 si ok)
*/
function _dbactive()
{
$err = 0;
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."dolibarr_modules WHERE numero=".$this->numero.";";
$this->db->query($sql_del);
$sql ="INSERT INTO ".MAIN_DB_PREFIX."dolibarr_modules (numero,active,active_date,active_version)";
$sql .= " VALUES (";
$sql .= $this->numero.",1,now(),'".$this->version."')";
$this->db->query($sql);
return $err;
}
/**
\brief Supprime ligne module
\return int Nombre d'erreurs (0 si ok)
*/
function _dbunactive()
{
$err = 0;
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."dolibarr_modules WHERE numero=".$this->numero.";";
$this->db->query($sql_del);
return $err;
}
$this->_dbactive();
// Insère les constantes /**
$err = 0; \brief Insère constante d'activation module
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."const WHERE name = '".$this->const_name."';"; \return int Nombre d'erreurs (0 si ok)
$this->db->query($sql_del); */
function _active()
$sql ="INSERT INTO ".MAIN_DB_PREFIX."const (name,value,visible) VALUES {
$err = 0;
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."const WHERE name = '".$this->const_name."';";
$this->db->query($sql_del);
$sql ="INSERT INTO ".MAIN_DB_PREFIX."const (name,value,visible) VALUES
('".$this->const_name."','1',0);"; ('".$this->const_name."','1',0);";
if (!$this->db->query($sql)) if (!$this->db->query($sql))
{ {
$err++; $err++;
} }
return $err;
}
// Insère les boxes dans llx_boxes_def
foreach ($this->boxes as $key => $value) /**
{ \brief Supprime constante d'activation module
$titre = $this->boxes[$key][0]; \return int Nombre d'erreurs (0 si ok)
$file = $this->boxes[$key][1]; */
function _unactive()
$sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."boxes_def WHERE name ='".$titre."'"; {
$err = 0;
$result=$this->db->query($sql);
if ($result) $sql_del = "DELETE FROM ".MAIN_DB_PREFIX."const WHERE name = '".$this->const_name."';";
{ $this->db->query($sql_del);
$row = $this->db->fetch_row($result);
if ($row[0] == 0) return $err;
{ }
$sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes_def (name, file) VALUES ('".$titre."','".$file."')";
if (! $this->db->query($sql))
{ /**
$err++; \brief Insère les boites associées au module dans llx_boxes_def
} \return int Nombre d'erreurs (0 si ok)
} */
} function insert_boxes()
else {
{ $err=0;
$err++;
} foreach ($this->boxes as $key => $value)
{
$titre = $this->boxes[$key][0];
$file = $this->boxes[$key][1];
$sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."boxes_def WHERE name ='".$titre."'";
$result=$this->db->query($sql);
if ($result)
{
$row = $this->db->fetch_row($result);
if ($row[0] == 0)
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes_def (name, file) VALUES ('".$titre."','".$file."')";
if (! $this->db->query($sql))
{
$err++;
}
}
}
else
{
$err++;
}
}
return $err;
}
/**
\brief Supprime les boites
\return int Nombre d'erreurs (0 si ok)
*/
function delete_boxes()
{
$err=0;
foreach ($this->boxes as $key => $value)
{
$titre = $this->boxes[$key][0];
$file = $this->boxes[$key][1];
$sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes_def WHERE file = '".$file."'";
if (! $this->db->query($sql) )
{
$err++;
}
} }
// Définit les constantes associées return $err;
foreach ($this->const as $key => $value) }
{
$name = $this->const[$key][0]; /**
$type = $this->const[$key][1]; \brief Insère les constantes associées au module dans llx_const
$val = $this->const[$key][2]; \return int Nombre d'erreurs (0 si ok)
$note = $this->const[$key][3]; */
$visible= $this->const[$key][4]; function insert_const()
{
$sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."const WHERE name ='".$name."'"; $err=0;
$result=$this->db->query($sql); foreach ($this->const as $key => $value)
if ($result) {
{ $name = $this->const[$key][0];
$row = $this->db->fetch_row($result); $type = $this->const[$key][1];
$val = $this->const[$key][2];
if ($row[0] == 0) $note = $this->const[$key][3];
{ $visible= $this->const[$key][4];
if (! $visible) $visible='0';
if (strlen($note)) $sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."const WHERE name ='".$name."'";
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,value,note,visible) VALUES ('$name','$type','$val','$note','$visible');"; $result=$this->db->query($sql);
} if ($result)
elseif (strlen($val)) {
{ $row = $this->db->fetch_row($result);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,value,visible) VALUES ('$name','$type','$val','$visible');";
} if ($row[0] == 0)
else {
{ if (! $visible) $visible='0';
$sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,visible) VALUES ('$name','$type','$visible');"; if (strlen($note))
} {
$sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,value,note,visible) VALUES ('$name','$type','$val','$note','$visible');";
if (! $this->db->query($sql) ) }
{ elseif (strlen($val))
$err++; {
} $sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,value,visible) VALUES ('$name','$type','$val','$visible');";
} }
} else
else {
{ $sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name,type,visible) VALUES ('$name','$type','$visible');";
$err++; }
}
} if (! $this->db->query($sql) )
{
$err++;
}
}
}
else
{
$err++;
}
}
return $err;
}
// Définit les permissions associées au module actif /**
if (is_array($this->rights)) \brief Insère les permissions associées au module dans llx_rights_def
{ \return int Nombre d'erreurs (0 si ok)
foreach ($this->rights as $key => $value) */
{ function insert_permissions()
$r_id = $this->rights[$key][0]; {
$r_desc = $this->rights[$key][1]; $err=0;
$r_type = $this->rights[$key][2];
$r_def = $this->rights[$key][3];
$r_perms = $this->rights[$key][4];
$r_subperms = $this->rights[$key][5];
$r_modul = $this->rights_class;
if (strlen($r_perms) ) foreach ($this->rights as $key => $value)
{ {
if (strlen($r_subperms) ) $r_id = $this->rights[$key][0];
{ $r_desc = $this->rights[$key][1];
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def "; $r_type = $this->rights[$key][2];
$sql .= " (id, libelle, module, type, bydefault, perms, subperms)"; $r_def = $this->rights[$key][3];
$sql .= " VALUES "; $r_perms = $this->rights[$key][4];
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."','".$r_subperms."');"; $r_subperms = $this->rights[$key][5];
} $r_modul = $this->rights_class;
else
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def ";
$sql .= " (id, libelle, module, type, bydefault, perms)";
$sql .= " VALUES ";
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."');";
}
}
else
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def ";
$sql .= " (id, libelle, module, type, bydefault)";
$sql .= " VALUES ";
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.");";
}
$this->db->query($sql); if (strlen($r_perms) )
} {
} if (strlen($r_subperms) )
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def ";
$sql .= " (id, libelle, module, type, bydefault, perms, subperms)";
$sql .= " VALUES ";
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."','".$r_subperms."');";
}
else
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def ";
$sql .= " (id, libelle, module, type, bydefault, perms)";
$sql .= " VALUES ";
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."');";
}
}
else
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def ";
$sql .= " (id, libelle, module, type, bydefault)";
$sql .= " VALUES ";
$sql .= "(".$r_id.",'".addslashes($r_desc)."','".$r_modul."','".$r_type."',".$r_def.");";
}
// Créé les répertoires $this->db->query($sql);
if (is_array($this->dirs)) }
{
foreach ($this->dirs as $key => $value)
{
$dir = $value;
if ($dir && ! file_exists($dir))
{
umask(0);
if (! @mkdir($dir, 0755))
{
$this->error = $langs->trans("ErrorCanNotCreateDir",$dir);
dolibarr_syslog("DolibarrModules::_init error");
} return $err;
} }
}
}
// Exécute les requetes sql complémentaires
for ($i = 0 ; $i < sizeof($array_sql) ; $i++)
{
if (! $this->db->query($array_sql[$i]))
{
$err++;
}
}
if ($err > 0)
{
return 0;
}
else
{
return 1;
}
}
/** \brief Fonction de désactivation. Supprime de la base les constantes et boites du module /**
* \param array_sql tableau de requete sql a exécuter à la désactivation \brief Supprime les permissions
* \return int 0 si erreur, 1 si ok \return int Nombre d'erreurs (0 si ok)
*/ */
function _remove($array_sql) function delete_permissions()
{ {
$err = 0; $err=0;
$sql = "DELETE FROM ".MAIN_DB_PREFIX."rights_def WHERE module = '".$this->rights_class."';";
if (!$this->db->query($sql))
{
$err++;
}
$this->_dbunactive(); return $err;
}
// Supprime la constante d'activation du module
$sql = "DELETE FROM ".MAIN_DB_PREFIX."const WHERE name = '".$this->const_name."'";
if (!$this->db->query($sql))
{
$err++;
}
// Supprime les droits de la liste des droits disponibles
$sql = "DELETE FROM ".MAIN_DB_PREFIX."rights_def WHERE module = '".$this->rights_class."';";
if (!$this->db->query($sql))
{
$err++;
}
// Supprime les boites de la liste des boites disponibles
foreach ($this->boxes as $key => $value)
{
$titre = $this->boxes[$key][0];
$file = $this->boxes[$key][1];
$sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes_def WHERE file = '".$file."'";
if (! $this->db->query($sql) )
{
$err++;
}
}
// Exécute les requets sql complémentaires
for ($i = 0 ; $i < sizeof($array_sql) ; $i++)
{
if (!$this->db->query($array_sql[$i]))
{
$err++;
}
}
if ($err > 0)
{
return 0;
}
else
{
return 1;
}
}
/** \brief Retourne le nom traduit du module si la traduction existe dans admin.lang,
* sinon le nom défini par défaut dans le module.
* \return string Nom du module traduit
*/
function getName()
{
global $langs;
$langs->load("admin");
if ($langs->trans("Module".$this->numero."Name") != ("Module".$this->numero."Name"))
{
// Si traduction du nom du module existe
return $langs->trans("Module".$this->numero."Name");
}
else
{
// Si traduction du nom du module n'existe pas, on prend définition en dur dans module
return $this->name;
}
}
/** \brief Retourne la description traduite du module si la traduction existe dans admin.lang,
* sinon la description définie par défaut dans le module.
* \return string Nom du module traduit
*/
function getDesc()
{
global $langs;
$langs->load("admin");
if ($langs->trans("Module".$this->numero."Desc") != ("Module".$this->numero."Desc"))
{
// Si traduction de la description du module existe
return $langs->trans("Module".$this->numero."Desc");
}
else
{
// Si traduction de la description du module n'existe pas, on prend définition en dur dans module
return $this->description;
}
}
/** \brief Retourne la version du module.
* Pour les modules à l'état 'experimental', retourne la traduction de 'experimental'
* Pour les modules 'dolibarr', retourne la version de Dolibarr
* Pour les autres modules, retourne la version du module
* \return string Nom du module traduit
*/
function getVersion()
{
global $langs;
$langs->load("admin");
if ($this->version == 'experimental') return $langs->trans("Experimental");
elseif ($this->version == 'dolibarr') return DOL_VERSION;
elseif ($this->version) return $this->version;
else return $langs->trans("Unknown");
}
function getDbVersion()
{
$sql ="SELECT active_version FROM ".MAIN_DB_PREFIX."dolibarr_modules";
$sql .= " WHERE numero=".$this->numero." AND active = 1";
$resql = $this->db->query($sql);
if ($resql)
{
$num = $this->db->num_rows($resql);
if ($num > 0)
{
$row = $this->db->fetch_row($resql);
$this->dbversion = $row[0];
}
$this->db->free($resql);
}
return $this->dbversion;
}
} }
?> ?>