New: Member module use generic extrafields feature.

This commit is contained in:
Laurent Destailleur 2011-06-19 12:04:24 +00:00
parent 52a6b11297
commit cb263d64f2
15 changed files with 55 additions and 28 deletions

View File

@ -422,11 +422,11 @@ class Adherent extends CommonObject
if (sizeof($this->array_options) > 0) if (sizeof($this->array_options) > 0)
{ {
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."adherent_options WHERE fk_member = ".$this->id; $sql_del = "DELETE FROM ".MAIN_DB_PREFIX."adherent_extrafields WHERE fk_member = ".$this->id;
dol_syslog("Adherent::update sql=".$sql_del); dol_syslog("Adherent::update sql=".$sql_del);
$this->db->query($sql_del); $this->db->query($sql_del);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent_options (fk_member"; $sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent_extrafields (fk_member";
foreach($this->array_options as $key => $value) foreach($this->array_options as $key => $value)
{ {
// Add field of attribut // Add field of attribut
@ -642,7 +642,7 @@ class Adherent extends CommonObject
$this->db->begin(); $this->db->begin();
// Suppression options // Suppression options
$sql = "DELETE FROM ".MAIN_DB_PREFIX."adherent_options WHERE fk_member = ".$rowid; $sql = "DELETE FROM ".MAIN_DB_PREFIX."adherent_extrafields WHERE fk_member = ".$rowid;
dol_syslog("Adherent::delete sql=".$sql); dol_syslog("Adherent::delete sql=".$sql);
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
@ -1109,7 +1109,7 @@ class Adherent extends CommonObject
$sql.= ", ".$name; $sql.= ", ".$name;
} }
$sql.= " FROM ".MAIN_DB_PREFIX."adherent_options"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_extrafields";
$sql.= " WHERE fk_member=".$rowid; $sql.= " WHERE fk_member=".$rowid;
dol_syslog("Adherent::fetch_optionals sql=".$sql, LOG_DEBUG); dol_syslog("Adherent::fetch_optionals sql=".$sql, LOG_DEBUG);

View File

@ -75,7 +75,7 @@ class AdherentOptions
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname)) if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{ {
$field_desc = array('type'=>$type, 'value'=>$length); $field_desc = array('type'=>$type, 'value'=>$length);
$result=$this->db->DDLAddField(MAIN_DB_PREFIX.'adherent_options', $attrname, $field_desc); $result=$this->db->DDLAddField(MAIN_DB_PREFIX.'adherent_extrafields', $attrname, $field_desc);
if ($result > 0) if ($result > 0)
{ {
return 1; return 1;
@ -99,9 +99,10 @@ class AdherentOptions
* @param type Type of attribute ('int', 'text', 'varchar', 'date', 'datehour') * @param type Type of attribute ('int', 'text', 'varchar', 'date', 'datehour')
* @param pos Position of attribute * @param pos Position of attribute
* @param size Size/length of attribute * @param size Size/length of attribute
* @param elementtype Element type ('member', 'product', ...)
* @return int <=0 if KO, >0 if OK * @return int <=0 if KO, >0 if OK
*/ */
function create_label($attrname,$label='',$type='',$pos=0,$size=0) function create_label($attrname,$label='',$type='',$pos=0,$size=0, $elementtype='member')
{ {
global $conf; global $conf;
@ -111,13 +112,14 @@ class AdherentOptions
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname)) if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{ {
$sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent_options_label(name, label, type, pos, size, entity)"; $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(name, label, type, pos, size, entity, elementtype)";
$sql.= " VALUES('".$attrname."',"; $sql.= " VALUES('".$attrname."',";
$sql.= " '".$this->db->escape($label)."',"; $sql.= " '".$this->db->escape($label)."',";
$sql.= " '".$type."',"; $sql.= " '".$type."',";
$sql.= " '".$pos."',"; $sql.= " '".$pos."',";
$sql.= " '".$size."',"; $sql.= " '".$size."',";
$sql.= " ".$conf->entity; $sql.= " ".$conf->entity;
$sql.= ", '".$elementtype."'";
$sql.=')'; $sql.=')';
dol_syslog("AdherentOptions::create_label sql=".$sql); dol_syslog("AdherentOptions::create_label sql=".$sql);
@ -142,7 +144,7 @@ class AdherentOptions
{ {
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname)) if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{ {
$result=$this->db->DDLDropField(MAIN_DB_PREFIX."adherent_options",$attrname); $result=$this->db->DDLDropField(MAIN_DB_PREFIX."adherent_extrafields",$attrname);
if ($result < 0) if ($result < 0)
{ {
$this->error=$this->db->lasterror(); $this->error=$this->db->lasterror();
@ -170,7 +172,7 @@ class AdherentOptions
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname)) if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{ {
$sql = "DELETE FROM ".MAIN_DB_PREFIX."adherent_options_label"; $sql = "DELETE FROM ".MAIN_DB_PREFIX."extrafields";
$sql.= " WHERE name = '$attrname'"; $sql.= " WHERE name = '$attrname'";
$sql.= " AND entity = ".$conf->entity; $sql.= " AND entity = ".$conf->entity;
@ -205,7 +207,7 @@ class AdherentOptions
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname)) if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{ {
$field_desc = array('type'=>$type, 'value'=>$length); $field_desc = array('type'=>$type, 'value'=>$length);
$result=$this->db->DDLUpdateField(MAIN_DB_PREFIX.'adherent_options', $attrname, $field_desc); $result=$this->db->DDLUpdateField(MAIN_DB_PREFIX.'extrafields', $attrname, $field_desc);
if ($result > 0) if ($result > 0)
{ {
return 1; return 1;
@ -229,8 +231,9 @@ class AdherentOptions
* @param label nom du label * @param label nom du label
* @param type type * @param type type
* @param size size * @param size size
* @param elementtype Element type ('member', 'product', ...)
*/ */
function update_label($attrname,$label,$type,$size) function update_label($attrname,$label,$type,$size,$elementtype='member')
{ {
global $conf; global $conf;
dol_syslog("AdherentOptions::update_label $attrname,$label,$type,$size"); dol_syslog("AdherentOptions::update_label $attrname,$label,$type,$size");
@ -239,13 +242,14 @@ class AdherentOptions
{ {
$this->db->begin(); $this->db->begin();
$sql_del = "DELETE FROM ".MAIN_DB_PREFIX."adherent_options_label"; $sql_del = "DELETE FROM ".MAIN_DB_PREFIX."extrafields";
$sql_del.= " WHERE name = '".$attrname."'"; $sql_del.= " WHERE name = '".$attrname."'";
$sql_del.= " AND entity = ".$conf->entity; $sql_del.= " AND entity = ".$conf->entity;
$sql_del.= " AND elementtype = '".$elementtype."'";
dol_syslog("AdherentOptions::update_label sql=".$sql_del); dol_syslog("AdherentOptions::update_label sql=".$sql_del);
$resql1=$this->db->query($sql_del); $resql1=$this->db->query($sql_del);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent_options_label("; $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(";
$sql.= " name,"; // This is code $sql.= " name,"; // This is code
$sql.= " entity,"; $sql.= " entity,";
$sql.= " label,"; $sql.= " label,";
@ -256,9 +260,9 @@ class AdherentOptions
$sql.= " ".$conf->entity.","; $sql.= " ".$conf->entity.",";
$sql.= " '".$this->db->escape($label)."',"; $sql.= " '".$this->db->escape($label)."',";
$sql.= " '".$type."',"; $sql.= " '".$type."',";
$sql.= " '".$size."'"; $sql.= " '".$size."',";
$sql.= " '".$elementtype."'";
$sql.= ")"; $sql.= ")";
//$sql = "REPLACE INTO ".MAIN_DB_PREFIX."adherent_options_label SET name='$attrname',label='$escaped_label'";
dol_syslog("AdherentOptions::update_label sql=".$sql); dol_syslog("AdherentOptions::update_label sql=".$sql);
$resql2=$this->db->query($sql); $resql2=$this->db->query($sql);
@ -294,15 +298,16 @@ class AdherentOptions
/** /**
* \brief Load array this->attribute_label * \brief Load array this->attribute_label
*/ */
function fetch_name_optionals_label() function fetch_name_optionals_label($elementtype='member')
{ {
global $conf; global $conf;
$array_name_label=array(); $array_name_label=array();
$sql = "SELECT name,label,type,size"; $sql = "SELECT rowid,name,label,type,size,elementtype";
$sql.= " FROM ".MAIN_DB_PREFIX."adherent_options_label"; $sql.= " FROM ".MAIN_DB_PREFIX."extrafields";
$sql.= " WHERE entity = ".$conf->entity; $sql.= " WHERE entity = ".$conf->entity;
if ($elementtype) $sql.= " AND elementtype = '".$elementtype."'";
$sql.= " ORDER BY pos"; $sql.= " ORDER BY pos";
dol_syslog("Adherent_options::fetch_name_optionals_label sql=".$sql); dol_syslog("Adherent_options::fetch_name_optionals_label sql=".$sql);
@ -318,6 +323,7 @@ class AdherentOptions
$this->attribute_type[$tab->name]=$tab->type; $this->attribute_type[$tab->name]=$tab->type;
$this->attribute_label[$tab->name]=$tab->label; $this->attribute_label[$tab->name]=$tab->label;
$this->attribute_size[$tab->name]=$tab->size; $this->attribute_size[$tab->name]=$tab->size;
$this->attribute_elementtype[$tab->name]=$tab->elementtype;
} }
} }
return $array_name_label; return $array_name_label;

View File

@ -251,13 +251,12 @@ if ($_REQUEST["action"] == 'update' && ! $_POST["cancel"] && $user->rights->adhe
$adh->statut = $_POST["statut"]; $adh->statut = $_POST["statut"];
$adh->public = $_POST["public"]; $adh->public = $_POST["public"];
// Get extra fields
foreach($_POST as $key => $value) foreach($_POST as $key => $value)
{ {
if (preg_match("/^options_/",$key)) if (preg_match("/^options_/",$key))
{ {
//escape values from POST, at least with $db->escape, to avoid obvious SQL injections $adh->array_options[$key]=$_POST[$key];
//(array_options is directly input in the DB in adherent.class.php::update())
$adh->array_options[$key]=$db->escape($_POST[$key]);
} }
} }
@ -392,6 +391,17 @@ if ($_POST["action"] == 'add' && $user->rights->adherent->creer)
$adh->fk_soc = $socid; $adh->fk_soc = $socid;
$adh->public = $public; $adh->public = $public;
// Get extra fields
foreach($_POST as $key => $value)
{
if (preg_match("/^options_/",$key))
{
//escape values from POST, at least with $db->escape, to avoid obvious SQL injections
//(array_options is directly input in the DB in adherent.class.php::update())
$adh->array_options[$key]=$_POST[$key];
}
}
// Check parameters // Check parameters
if (empty($morphy) || $morphy == "-1") { if (empty($morphy) || $morphy == "-1") {
$error++; $error++;

View File

@ -189,8 +189,8 @@ class modAdherent extends DolibarrModules
$this->export_permission[$r]=array(array("adherent","export")); $this->export_permission[$r]=array(array("adherent","export"));
$this->export_fields_array[$r]=array('a.rowid'=>'Id','a.civilite'=>"UserTitle",'a.nom'=>"Lastname",'a.prenom'=>"Firstname",'a.login'=>"Login",'a.morphy'=>'MorPhy','a.societe'=>'Company','a.adresse'=>"Address",'a.cp'=>"Zip",'a.ville'=>"Town",'a.pays'=>"Country",'a.phone'=>"PhonePro",'a.phone_perso'=>"PhonePerso",'a.phone_mobile'=>"PhoneMobile",'a.email'=>"Email",'a.naiss'=>"Birthday",'a.statut'=>"Status",'a.photo'=>"Photo",'a.note'=>"Note",'a.datec'=>'DateCreation','a.datevalid'=>'DateValidation','a.tms'=>'DateLastModification','a.datefin'=>'DateEndSubscription','ta.rowid'=>'MemberTypeId','ta.libelle'=>'MemberTypeLabel','c.rowid'=>'SubscriptionId','c.dateadh'=>'DateSubscription','c.cotisation'=>'Amount'); $this->export_fields_array[$r]=array('a.rowid'=>'Id','a.civilite'=>"UserTitle",'a.nom'=>"Lastname",'a.prenom'=>"Firstname",'a.login'=>"Login",'a.morphy'=>'MorPhy','a.societe'=>'Company','a.adresse'=>"Address",'a.cp'=>"Zip",'a.ville'=>"Town",'a.pays'=>"Country",'a.phone'=>"PhonePro",'a.phone_perso'=>"PhonePerso",'a.phone_mobile'=>"PhoneMobile",'a.email'=>"Email",'a.naiss'=>"Birthday",'a.statut'=>"Status",'a.photo'=>"Photo",'a.note'=>"Note",'a.datec'=>'DateCreation','a.datevalid'=>'DateValidation','a.tms'=>'DateLastModification','a.datefin'=>'DateEndSubscription','ta.rowid'=>'MemberTypeId','ta.libelle'=>'MemberTypeLabel','c.rowid'=>'SubscriptionId','c.dateadh'=>'DateSubscription','c.cotisation'=>'Amount');
$this->export_entities_array[$r]=array('a.rowid'=>'member','a.civilite'=>"member",'a.nom'=>"member",'a.prenom'=>"member",'a.login'=>"member",'a.morphy'=>'member','a.societe'=>'member','a.adresse'=>"member",'a.cp'=>"member",'a.ville'=>"member",'a.pays'=>"member",'a.phone'=>"member",'a.phone_perso'=>"member",'a.phone_mobile'=>"member",'a.email'=>"member",'a.naiss'=>"member",'a.statut'=>"member",'a.photo'=>"member",'a.note'=>"member",'a.datec'=>'member','a.datevalid'=>'member','a.tms'=>'member','a.datefin'=>'member','ta.rowid'=>'member_type','ta.libelle'=>'member_type','c.rowid'=>'subscription','c.dateadh'=>'subscription','c.cotisation'=>'subscription'); $this->export_entities_array[$r]=array('a.rowid'=>'member','a.civilite'=>"member",'a.nom'=>"member",'a.prenom'=>"member",'a.login'=>"member",'a.morphy'=>'member','a.societe'=>'member','a.adresse'=>"member",'a.cp'=>"member",'a.ville'=>"member",'a.pays'=>"member",'a.phone'=>"member",'a.phone_perso'=>"member",'a.phone_mobile'=>"member",'a.email'=>"member",'a.naiss'=>"member",'a.statut'=>"member",'a.photo'=>"member",'a.note'=>"member",'a.datec'=>'member','a.datevalid'=>'member','a.tms'=>'member','a.datefin'=>'member','ta.rowid'=>'member_type','ta.libelle'=>'member_type','c.rowid'=>'subscription','c.dateadh'=>'subscription','c.cotisation'=>'subscription');
// On complete avec champs options // TODO Use generic method
$sql='SELECT name, label FROM '.MAIN_DB_PREFIX.'adherent_options_label'; $sql="SELECT name, label FROM ".MAIN_DB_PREFIX."extrafields AND elementtype = 'member'";
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
while ($obj=$this->db->fetch_object($resql)) while ($obj=$this->db->fetch_object($resql))
{ {
@ -202,7 +202,7 @@ class modAdherent extends DolibarrModules
// Fin complement // Fin complement
$this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_start[$r]='SELECT DISTINCT ';
$this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'adherent_type as ta, '.MAIN_DB_PREFIX.'adherent as a)'; $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'adherent_type as ta, '.MAIN_DB_PREFIX.'adherent as a)';
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'adherent_options as ao ON a.rowid = ao.fk_member'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'adherent_extrafields as ao ON a.rowid = ao.fk_member';
$this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'cotisation as c ON c.fk_adherent = a.rowid'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'cotisation as c ON c.fk_adherent = a.rowid';
$this->export_sql_end[$r] .=' WHERE a.fk_adherent_type = ta.rowid'; $this->export_sql_end[$r] .=' WHERE a.fk_adherent_type = ta.rowid';

View File

@ -392,3 +392,13 @@ create table llx_product_extrafields
) ENGINE=innodb; ) ENGINE=innodb;
alter table llx_adherent_options_label drop index uk_adherent_options_label_name;
alter table llx_adherent_options_label rename to llx_extrafields;
ALTER TABLE llx_extrafields ADD COLUMN elementtype varchar(64) NOT NULL DEFAULT 'member' AFTER entity;
ALTER TABLE llx_extrafields ADD UNIQUE INDEX uk_extrafields_name (name, entity, elementtype);
ALTER TABLE llx_adherent_options rename to llx_adherent_extrafields;
-- drop tables renamed into llx_advanced_extra_xxx
drop table llx_extra_fields_options;
drop table llx_extra_fields_values;
drop table llx_extra_fields;

View File

@ -21,4 +21,4 @@
-- =================================================================== -- ===================================================================
ALTER TABLE llx_adherent_options ADD INDEX idx_adherent_options (fk_member); ALTER TABLE llx_adherent_extrafields ADD INDEX idx_adherent_extrafields (fk_member);

View File

@ -20,7 +20,7 @@
-- $Id$ -- $Id$
-- =================================================================== -- ===================================================================
create table llx_adherent_options create table llx_adherent_extrafields
( (
rowid integer AUTO_INCREMENT PRIMARY KEY, rowid integer AUTO_INCREMENT PRIMARY KEY,
tms timestamp, tms timestamp,

View File

@ -19,4 +19,4 @@
-- =================================================================== -- ===================================================================
ALTER TABLE llx_adherent_options_label ADD UNIQUE INDEX uk_adherent_options_label_name (name, entity); ALTER TABLE llx_extrafields ADD UNIQUE INDEX uk_extrafields_name (name, entity, elementtype);

View File

@ -20,11 +20,12 @@
-- $Id$ -- $Id$
-- =================================================================== -- ===================================================================
create table llx_adherent_options_label create table llx_extrafields
( (
rowid integer AUTO_INCREMENT PRIMARY KEY, rowid integer AUTO_INCREMENT PRIMARY KEY,
name varchar(64) NOT NULL, -- nom de l'attribut name varchar(64) NOT NULL, -- nom de l'attribut
entity integer DEFAULT 1 NOT NULL, -- multi company id entity integer DEFAULT 1 NOT NULL, -- multi company id
elementtype varchar(64) NOT NULL DEFAULT 'member',
tms timestamp, tms timestamp,
label varchar(255) NOT NULL, -- label correspondant a l'attribut label varchar(255) NOT NULL, -- label correspondant a l'attribut
type varchar(8), type varchar(8),