From 0975918cc65f8530cd799b7e1f93ea0bdf873dda Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Mon, 8 Oct 2012 19:27:02 +0200 Subject: [PATCH] Fix: [task #146] Remove table llx_categorie_association Conflicts: htdocs/install/mysql/migration/3.2.0-3.3.0.sql --- htdocs/categories/class/categorie.class.php | 325 +++++------------- htdocs/categories/edit.php | 18 +- htdocs/categories/fiche.php | 6 +- htdocs/categories/index.php | 26 +- htdocs/core/class/html.form.class.php | 8 +- .../install/mysql/migration/3.2.0-3.3.0.sql | 10 +- .../mysql/tables/llx_categorie.key.sql | 7 +- htdocs/install/mysql/tables/llx_categorie.sql | 30 +- .../tables/llx_categorie_association.key.sql | 26 -- .../tables/llx_categorie_association.sql | 24 -- htdocs/install/upgrade2.php | 105 ++++++ 11 files changed, 235 insertions(+), 350 deletions(-) delete mode 100644 htdocs/install/mysql/tables/llx_categorie_association.key.sql delete mode 100644 htdocs/install/mysql/tables/llx_categorie_association.sql diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index abf85d69cde..a2f4a7b0e50 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -40,15 +40,13 @@ class Categorie public $table_element='category'; var $id; - var $id_mere; + var $fk_parent; var $label; var $description; var $socid; var $type; // 0=Product, 1=Supplier, 2=Customer/Prospect, 3=Member - var $parentId; var $cats=array(); // Tableau en memoire des categories - var $motherof = array(); // Tableau des correspondances id_fille -> id_mere /** @@ -69,7 +67,7 @@ class Categorie */ function fetch($id) { - $sql = "SELECT rowid, entity, label, description, fk_soc, visible, type"; + $sql = "SELECT rowid, fk_parent, entity, label, description, fk_soc, visible, type"; $sql.= " FROM ".MAIN_DB_PREFIX."categorie"; $sql.= " WHERE rowid = ".$id; @@ -80,6 +78,7 @@ class Categorie $res = $this->db->fetch_array($resql); $this->id = $res['rowid']; + $this->fk_parent = $res['fk_parent']; $this->label = $res['label']; $this->description = $res['description']; $this->socid = $res['fk_soc']; @@ -88,25 +87,8 @@ class Categorie $this->entity = $res['entity']; $this->db->free($resql); - } - else - { - dol_print_error($this->db); - return -1; - } - $sql = "SELECT fk_categorie_mere"; - $sql.= " FROM ".MAIN_DB_PREFIX."categorie_association"; - $sql.= " WHERE fk_categorie_fille = ".$id; - - dol_syslog("Categorie::fetch sql=".$sql); - $resql = $this->db->query($sql); - if ($resql) - { - $res = $this->db->fetch_array($resql); - $this->id_mere = $res['fk_categorie_mere']; - $this->parentId = $res['fk_categorie_mere'] ? $res['fk_categorie_mere'] : 0; - return $this->id; + return 1; } else { @@ -133,7 +115,7 @@ class Categorie // Clean parameters if (empty($this->visible)) $this->visible=0; - $this->parentId = ($this->id_mere) != "" ? intval($this->id_mere) : 0; + $this->fk_parent = ($this->fk_parent != "" ? intval($this->fk_parent) : 0); if ($this->already_exists()) { @@ -146,7 +128,7 @@ class Categorie $this->db->begin(); dol_syslog(get_class($this).'::create sql='.$sql); - $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie (label, description,"; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie (fk_parent, label, description,"; if (! empty($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)) { $sql.= "fk_soc,"; @@ -154,15 +136,13 @@ class Categorie $sql.= " visible,"; $sql.= " type,"; $sql.= " entity"; - //$sql.= ", fk_parent_id"; $sql.= ")"; - $sql.= " VALUES ('".$this->db->escape($this->label)."', '".$this->db->escape($this->description)."',"; + $sql.= " VALUES (".$this->fk_parent.",'".$this->db->escape($this->label)."', '".$this->db->escape($this->description)."',"; if (! empty($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)) { $sql.= ($this->socid != -1 ? $this->socid : 'null').","; } $sql.= "'".$this->visible."',".$this->type.",".$conf->entity; - //$sql.= ",".$this->parentId; $sql.= ")"; dol_syslog(get_class($this).'::create sql='.$sql); @@ -174,15 +154,6 @@ class Categorie if ($id > 0) { $this->id = $id; - if($this->id_mere != "") - { - if($this->add_fille() < 0) - { - $this->error=$langs->trans("ImpossibleAssociateCategory"); - $this->db->rollback(); - return -3; - } - } // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; @@ -226,8 +197,8 @@ class Categorie // Clean parameters $this->label=trim($this->label); $this->description=trim($this->description); - $this->parentId = ($this->id_mere) != "" ? intval($this->id_mere) : 0; - $this->visible = ($this->visible) != "" ? intval($this->visible) : 0; + $this->fk_parent = ($this->fk_parent != "" ? intval($this->fk_parent) : 0); + $this->visible = ($this->visible != "" ? intval($this->visible) : 0); if ($this->already_exists()) { @@ -238,34 +209,9 @@ class Categorie $this->db->begin(); - $sql = 'DELETE FROM '.MAIN_DB_PREFIX.'categorie_association'; - $sql.= ' WHERE fk_categorie_fille = '.$this->id; - - dol_syslog("Categorie::update sql=".$sql); - if (! $this->db->query($sql)) - { - $this->db->rollback(); - dol_print_error($this->db); - return -1; - } - - if($this->id_mere !="" && $this->id_mere!=$this->id) - { - $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'categorie_association(fk_categorie_mere,fk_categorie_fille)'; - $sql.= ' VALUES ('.$this->id_mere.', '.$this->id.')'; - - dol_syslog("Categorie::update sql=".$sql); - if (! $this->db->query($sql)) - { - $this->db->rollback(); - dol_print_error($this->db); - return -1; - } - } - $sql = "UPDATE ".MAIN_DB_PREFIX."categorie"; $sql.= " SET label = '".$this->db->escape($this->label)."'"; - if ($this->description) + if (! empty($this->description)) { $sql .= ", description = '".$this->db->escape($this->description)."'"; } @@ -274,7 +220,7 @@ class Categorie $sql .= ", fk_soc = ".($this->socid != -1 ? $this->socid : 'null'); } $sql .= ", visible = '".$this->visible."'"; - //$sql .= ", fk_parent_id = ".$this->parentId; + $sql .= ", fk_parent = ".$this->fk_parent; $sql .= " WHERE rowid = ".$this->id; dol_syslog("Categorie::update sql=".$sql); @@ -360,20 +306,6 @@ class Categorie } } - // Link childs to parent - if (! $error) - { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_association"; - $sql .= " WHERE fk_categorie_mere = ".$this->id; - $sql .= " OR fk_categorie_fille = ".$this->id; - if (!$this->db->query($sql)) - { - $this->error=$this->db->lasterror(); - dol_syslog("Error sql=".$sql." ".$this->error, LOG_ERR); - $error++; - } - } - // Delete category if (! $error) { @@ -408,58 +340,6 @@ class Categorie } } - - /** - * Ajout d'une sous-categorie - * - * @return int 1 : OK - * -2 : $fille est deja dans la famille de $this - * -3 : categorie ($this ou $fille) invalide - */ - function add_fille() - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie_association (fk_categorie_mere, fk_categorie_fille)"; - $sql.= " VALUES (".$this->id_mere.", ".$this->id.")"; - - if ($this->db->query($sql)) - { - return 1; - } - else - { - dol_print_error($this->db); - return -1; - } - } - - /** - * Suppression d'une sous-categorie (seulement "desassociation") - * - * @param Category $fille Objet category - * @return int 1 : OK - * -3 : categorie ($this ou $fille) invalide - */ - function del_fille($fille) - { - if (!$this->check() || !$fille->check()) - { - return -3; - } - - $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_association"; - $sql .= " WHERE fk_categorie_mere = ".$this->id." and fk_categorie_fille = ".$fille->id; - - if ($this->db->query($sql)) - { - return 1; - } - else - { - $this->error=$this->db->error().' sql='.$sql; - return -1; - } - } - /** * Link an object to the category * @@ -540,9 +420,9 @@ class Categorie $sql = "SELECT c.fk_".$field; $sql.= " FROM ".MAIN_DB_PREFIX."categorie_".$category_table." as c"; $sql.= ", ".MAIN_DB_PREFIX.$object_table." as o"; - $sql.= " WHERE c.fk_categorie = ".$this->id; + $sql.= " WHERE o.entity IN (".getEntity($field, 1).")"; + $sql.= " AND c.fk_categorie = ".$this->id; $sql.= " AND c.fk_".$field." = o.rowid"; - $sql.= " AND o.entity IN (".getEntity($field, 1).")"; dol_syslog(get_class($this)."::get_type sql=".$sql); $resql = $this->db->query($sql); @@ -572,8 +452,8 @@ class Categorie */ function get_filles() { - $sql = "SELECT fk_categorie_fille FROM ".MAIN_DB_PREFIX."categorie_association "; - $sql .= "WHERE fk_categorie_mere = ".$this->id; + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie"; + $sql.= " WHERE fk_parent = ".$this->id; $res = $this->db->query($sql); @@ -583,7 +463,7 @@ class Categorie while ($rec = $this->db->fetch_array($res)) { $cat = new Categorie($this->db); - $cat->fetch($rec['fk_categorie_fille']); + $cat->fetch($rec['rowid']); $cats[] = $cat; } return $cats; @@ -601,6 +481,7 @@ class Categorie * * @param int $cate Category id * @return string Description + * @deprecated function not used ? */ function get_desc($cate) { @@ -616,13 +497,14 @@ class Categorie /** * La categorie $fille est-elle une fille de cette categorie ? * - * @param Category $fille Object category + * @param Category $child Object category * @return void + * @deprecated function not used ? */ - function is_fille($fille) + function is_fille($child) { - $sql = "SELECT count(fk_categorie_fille) FROM ".MAIN_DB_PREFIX."categorie_association "; - $sql .= "WHERE fk_categorie_mere = ".$this->id." AND fk_categorie_fille = ".$fille->id; + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie"; + $sql.= " WHERE fk_parent = ".$this->id." AND rowid = ".$child->id; $res = $this->db->query($sql); $n = $this->db->fetch_array($res); @@ -649,37 +531,11 @@ class Categorie { $this->cats = array(); - // Charge tableau des meres - $sql = "SELECT ca.fk_categorie_mere as id_mere, ca.fk_categorie_fille as id_fille"; - $sql.= " FROM ".MAIN_DB_PREFIX."categorie_association ca"; - $sql.= ", ".MAIN_DB_PREFIX."categorie as c"; - $sql.= " WHERE ca.fk_categorie_mere = c.rowid"; - $sql.= " AND c.entity IN (".getEntity('category',1).")"; - - // Load array this->motherof - dol_syslog("Categorie::get_full_arbo build motherof array sql=".$sql, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) - { - while ($obj=$this->db->fetch_object($resql)) - { - $this->motherof[$obj->id_fille]=$obj->id_mere; - } - } - else - { - dol_print_error($this->db); - return -1; - } - // Init $this->cats array - $sql = "SELECT DISTINCT c.rowid, c.label as label, ca.fk_categorie_fille as rowid_fille"; // Distinct reduce pb with old tables with duplicates + $sql = "SELECT DISTINCT c.rowid, c.label, c.description, c.fk_parent"; // Distinct reduce pb with old tables with duplicates $sql.= " FROM ".MAIN_DB_PREFIX."categorie as c"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_association as ca"; - $sql.= " ON c.rowid = ca.fk_categorie_mere"; - $sql.= " WHERE c.type = ".$type; - $sql.= " AND c.entity IN (".getEntity('category',1).")"; - $sql.= " ORDER BY c.label, c.rowid"; + $sql.= " WHERE c.entity IN (".getEntity('category',1).")"; + $sql.= " AND c.type = ".$type; dol_syslog("Categorie::get_full_arbo get category list sql=".$sql, LOG_DEBUG); $resql = $this->db->query($sql); @@ -688,16 +544,12 @@ class Categorie $i=0; while ($obj = $this->db->fetch_object($resql)) { + $this->cats[$obj->rowid]['rowid'] = $obj->rowid; $this->cats[$obj->rowid]['id'] = $obj->rowid; - if (isset($this->motherof[$obj->rowid])) $this->cats[$obj->rowid]['id_mere'] = $this->motherof[$obj->rowid]; + $this->cats[$obj->rowid]['fk_parent'] = $obj->fk_parent; $this->cats[$obj->rowid]['label'] = $obj->label; - - if ($obj->rowid_fille) - { - $this->cats[$obj->rowid]['id_children'][]=$obj->rowid_fille; - } + $this->cats[$obj->rowid]['description'] = $obj->description; $i++; - } } else @@ -710,7 +562,6 @@ class Categorie dol_syslog("Categorie::get_full_arbo call to build_path_from_id_categ", LOG_DEBUG); foreach($this->cats as $key => $val) { - if (isset($this->motherof[$key])) continue; $this->build_path_from_id_categ($key,0); // Process a branch from the root category key (this category has no parent) } @@ -761,21 +612,22 @@ class Categorie //} // Define fullpath and fulllabel - if (isset($this->cats[$id_categ]['id_mere'])) + if (! empty($this->cats[$id_categ]['fk_parent'])) { - $this->cats[$id_categ]['fullpath'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fullpath']; - $this->cats[$id_categ]['fullpath'].='_'.$id_categ; - $this->cats[$id_categ]['fulllabel'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fulllabel']; - $this->cats[$id_categ]['fulllabel'].=' >> '.$this->cats[$id_categ]['label']; + $this->cats[$id_categ]['fullpath'] = $this->cats[$this->cats[$id_categ]['fk_parent']]['fullpath']; + $this->cats[$id_categ]['fullpath'].= '_'.$id_categ; + $this->cats[$id_categ]['fulllabel'] = $this->cats[$this->cats[$id_categ]['fk_parent']]['fulllabel']; + $this->cats[$id_categ]['fulllabel'].= ' >> '.$this->cats[$id_categ]['label']; } else { - $this->cats[$id_categ]['fullpath']='_'.$id_categ; - $this->cats[$id_categ]['fulllabel']=$this->cats[$id_categ]['label']; + $this->cats[$id_categ]['fullpath'] = '_'.$id_categ; + $this->cats[$id_categ]['fulllabel'] = $this->cats[$id_categ]['label']; } // We count number of _ to have level $this->cats[$id_categ]['level']=dol_strlen(preg_replace('/[^_]/i','',$this->cats[$id_categ]['fullpath'])); + /* // Process all childs on several levels of this category $protection++; if ($protection > 10) return; // On ne traite pas plus de 10 niveaux de profondeurs @@ -791,6 +643,7 @@ class Categorie $this->build_path_from_id_categ($idchild,$protection); } + */ return; } @@ -807,8 +660,8 @@ class Categorie { print 'id: '.$this->cats[$key]['id']; print ' label: '.$this->cats[$key]['label']; - print ' mother: '.$this->cats[$key]['id_mere']; - print ' children: '.(is_array($this->cats[$key]['id_children'])?join(',',$this->cats[$key]['id_children']):''); + print ' mother: '.$this->cats[$key]['fk_parent']; + //print ' children: '.(is_array($this->cats[$key]['id_children'])?join(',',$this->cats[$key]['id_children']):''); print ' fullpath: '.$this->cats[$key]['fullpath']; print ' fulllabel: '.$this->cats[$key]['fulllabel']; print "
\n"; @@ -819,12 +672,18 @@ class Categorie /** * Retourne toutes les categories * + * @param int Type of category + * @param boolean Just parent categories if true * @return array Tableau d'objet Categorie */ - function get_all_categories () + function get_all_categories($type=null, $parent=false) { $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie"; $sql.= " WHERE entity IN (".getEntity('category',1).")"; + if (! is_null($type)) + $sql.= " AND type = ".$type; + if ($parent) + $sql.= " AND fk_parent = 0"; $res = $this->db->query($sql); if ($res) @@ -834,7 +693,7 @@ class Categorie { $cat = new Categorie($this->db); $cat->fetch($rec['rowid']); - $cats[$record['rowid']] = $cat; + $cats[$rec['rowid']] = $cat; } return $cats; } @@ -849,6 +708,7 @@ class Categorie * Retourne le nombre total de categories * * @return int Nombre de categories + * @deprecated function not used ? */ function get_nb_categories() { @@ -870,37 +730,21 @@ class Categorie /** * Check if no category with same label already exists for this cat's parent or root and for this cat's type - * TODO For the moment, the unique key is on the type, label, entity. We must remove table llx_categorie_association - * to replace with a field fk_parent. This will allow to extend unique key with the level. * * @return boolean 1 if already exist, 0 otherwise, -1 if error */ function already_exists() { - if($this->id_mere != "") // mother_id defined - { - /* We have to select any rowid from llx_categorie which category's mother and label - * are equals to those of the calling category - */ - $sql = "SELECT c.rowid"; - $sql.= " FROM ".MAIN_DB_PREFIX."categorie as c "; - $sql.= " JOIN ".MAIN_DB_PREFIX."categorie_association as ca"; - $sql.= " ON c.rowid=ca.fk_categorie_fille"; - $sql.= " WHERE ca.fk_categorie_mere=".$this->id_mere; - $sql.= " AND c.label='".$this->db->escape($this->label)."'"; - $sql.= " AND c.entity IN (".getEntity('category',1).")"; - } - else // mother_id undefined (so it's root) - { - /* We have to select any rowid from llx_categorie that is not at root level - */ - $sql = "SELECT c.rowid"; - $sql.= " FROM ".MAIN_DB_PREFIX."categorie as c "; - $sql.= " WHERE c.type=".$this->type; - $sql.= " AND c.label='".$this->db->escape($this->label)."'"; - $sql.= " AND c.entity IN (".getEntity('category',1).")"; - $sql.= " AND c.rowid NOT IN (SELECT ca.fk_categorie_fille FROM ".MAIN_DB_PREFIX."categorie_association as ca)"; - } + /* We have to select any rowid from llx_categorie which category's mother and label + * are equals to those of the calling category + */ + $sql = "SELECT c.rowid"; + $sql.= " FROM ".MAIN_DB_PREFIX."categorie as c "; + $sql.= " WHERE c.entity IN (".getEntity('category',1).")"; + $sql.= " AND c.type = ".$this->type; + $sql.= " AND c.fk_parent = ".$this->fk_parent; + $sql.= " AND c.label = '".$this->db->escape($this->label)."'"; + dol_syslog(get_class($this)."::already_exists sql=".$sql, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) @@ -933,30 +777,12 @@ class Categorie /** * Retourne les categories de premier niveau (qui ne sont pas filles) * + * @param int Type of category * @return void */ - function get_main_categories() + function get_main_categories($type=null) { - $allcats = $this->get_all_categories(); - $maincats = array (); - $filles = array (); - - $sql = "SELECT fk_categorie_fille FROM ".MAIN_DB_PREFIX."categorie_association"; - $res = $this->db->query($sql); - while ($res = $this->db->fetch_array($res)) - { - $filles[] = $res['fk_categorie_fille']; - } - - foreach ($allcats as $cat) - { - if (! in_array($cat->id, $filles)) - { - $maincats[] = $cat; - } - } - - return $maincats; + return $this->get_all_categories($type, true); } /** @@ -967,7 +793,7 @@ class Categorie * @param string $url Url * @return void */ - function print_all_ways ($sep = " >> ", $url='') + function print_all_ways($sep = " >> ", $url='') { $ways = array (); @@ -998,10 +824,11 @@ class Categorie * @param int $id Id of category * @param string $type Type of category * @return void + * @deprecated function not used ? */ function get_primary_way($id, $type="") { - $primary_way = Array("taille"=>-1,"chemin"=>Array()); + $primary_way = array("taille" => -1, "chemin" => array()); $meres = $this->containing($id,$type); foreach ($meres as $mere) { @@ -1026,10 +853,11 @@ class Categorie * @param string $url Url * @param string $type Type * @return void + * @deprecated function not used ? */ function print_primary_way($id, $sep= " >> ", $url="", $type="") { - $primary_way = Array(); + $primary_way = array(); $way = $this->get_primary_way($id,$type); $w = array(); foreach ($way as $cat) @@ -1054,10 +882,10 @@ class Categorie */ function get_meres() { - $meres = array(); + $parents = array(); - $sql = "SELECT fk_categorie_mere FROM ".MAIN_DB_PREFIX."categorie_association "; - $sql .= "WHERE fk_categorie_fille = ".$this->id; + $sql = "SELECT fk_parent FROM ".MAIN_DB_PREFIX."categorie"; + $sql.= " WHERE rowid = ".$this->id; $res = $this->db->query($sql); @@ -1065,11 +893,14 @@ class Categorie { while ($rec = $this->db->fetch_array($res)) { - $cat = new Categorie($this->db); - $cat->fetch($rec['fk_categorie_mere']); - $meres[] = $cat; + if ($rec['fk_parent'] > 0) + { + $cat = new Categorie($this->db); + $cat->fetch($rec['fk_parent']); + $parents[] = $cat; + } } - return $meres; + return $parents; } else { @@ -1084,7 +915,7 @@ class Categorie * * @return void */ - function get_all_ways () + function get_all_ways() { $ways = array(); @@ -1398,7 +1229,7 @@ class Categorie // Initialise parametres $this->id=0; - $this->id_mere=0; + $this->fk_parent=0; $this->label = 'SPECIMEN'; $this->specimen=1; $this->description = 'This is a description'; diff --git a/htdocs/categories/edit.php b/htdocs/categories/edit.php index cec7444503e..1ec9a15a465 100644 --- a/htdocs/categories/edit.php +++ b/htdocs/categories/edit.php @@ -38,7 +38,7 @@ $socid=GETPOST('socid','int'); $nom=GETPOST('nom'); $description=GETPOST('description'); $visible=GETPOST('visible'); -$catMere=GETPOST('catMere'); +$parent=GETPOST('parent'); if ($id == "") { @@ -66,20 +66,20 @@ if ($action == 'update' && $user->rights->categorie->creer) $categorie->socid = ($socid ? $socid : 'null'); $categorie->visible = $visible; - if ($catMere != "-1") - $categorie->id_mere = $catMere; + if ($parent != "-1") + $categorie->fk_parent = $parent; else - $categorie->id_mere = ""; + $categorie->fk_parent = ""; - if (! $categorie->label) + if (empty($categorie->label)) { - $_GET["action"] = 'create'; + $action = 'create'; $mesg = $langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")); } - if (! $categorie->description) + if (empty($categorie->description)) { - $_GET["action"] = 'create'; + $action = 'create'; $mesg = $langs->trans("ErrorFieldRequired",$langs->transnoentities("Description")); } if (empty($categorie->error)) @@ -149,7 +149,7 @@ print ''; // Parent category print ''.$langs->trans("In").''; -print $form->select_all_categories($type,$object->id_mere,'catMere',64,$object->id); +print $form->select_all_categories($type,$object->fk_parent,'parent',64,$object->id); print ''; print ''; diff --git a/htdocs/categories/fiche.php b/htdocs/categories/fiche.php index 987ad62e7bf..52ebf83d956 100644 --- a/htdocs/categories/fiche.php +++ b/htdocs/categories/fiche.php @@ -45,7 +45,7 @@ $socid=GETPOST('socid','int'); $nom=GETPOST('nom'); $description=GETPOST('description'); $visible=GETPOST('visible'); -$catMere=GETPOST('catMere'); +$parent=GETPOST('parent'); if ($origin) { @@ -113,7 +113,7 @@ if ($action == 'add' && $user->rights->categorie->creer) $object->visible = $visible; $object->type = $type; - if ($catMere != "-1") $object->id_mere = $catMere; + if ($parent != "-1") $object->fk_parent = $parent; if (! $object->label) { @@ -222,7 +222,7 @@ if ($user->rights->categorie->creer) // Parent category print ''.$langs->trans("AddIn").''; - print $form->select_all_categories($type,$catorigin); + print $form->select_all_categories($type, $catorigin); print ''; print ''; diff --git a/htdocs/categories/index.php b/htdocs/categories/index.php index b316673cdd9..0f0915d7dd2 100644 --- a/htdocs/categories/index.php +++ b/htdocs/categories/index.php @@ -154,13 +154,16 @@ print ''; // Define fullpathselected ( _x_y_z ) of $section parameter $fullpathselected=''; -foreach($fulltree as $key => $val) +if (! empty($section)) { - //print $val['id']."-".$section."
"; - if ($val['id'] == $section) + foreach($fulltree as $key => $val) { - $fullpathselected=$val['fullpath']; - break; + //print $val['id']."-".$section."
"; + if ($val['id'] == $section) + { + $fullpathselected=$val['fullpath']; + break; + } } } //print "fullpathselected=".$fullpathselected."
"; @@ -169,7 +172,7 @@ foreach($fulltree as $key => $val) $expandedsectionarray=array(); if (isset($_SESSION['dol_catexpandedsectionarray'.$type])) $expandedsectionarray=explode(',',$_SESSION['dol_catexpandedsectionarray'.$type]); -if ($section && $_GET['sectionexpand'] == 'true') +if (! empty($section) && $_GET['sectionexpand'] == 'true') { // We add all sections that are parent of opened section $pathtosection=explode('_',$fullpathselected); @@ -182,7 +185,7 @@ if ($section && $_GET['sectionexpand'] == 'true') } $_SESSION['dol_catexpandedsectionarray'.$type]=join(',',$expandedsectionarray); } -if ($section && $_GET['sectionexpand'] == 'false') +if (! empty($section) && $_GET['sectionexpand'] == 'false') { // We removed all expanded sections that are child of the closed section $oldexpandedsectionarray=$expandedsectionarray; @@ -207,10 +210,7 @@ foreach($fulltree as $key => $val) $showline=0; // If directory is son of expanded directory, we show line - if (isset($val['id_mere']) && in_array($val['id_mere'],$expandedsectionarray)) $showline=4; - // If directory is brother of selected directory, we show line - // FIXME $ecmdirstatic not exist or not instantiate ? - //elseif (isset($val['id_mere']) && $val['id'] != $section && $val['id_mere'] == $ecmdirstatic->motherof[$section]) $showline=3; + if (isset($val['fk_parent']) && in_array($val['fk_parent'],$expandedsectionarray)) $showline=4; // If directory is parent of selected directory or is selected directory, we show line elseif (preg_match('/'.$val['fullpath'].'_/i',$fullpathselected.'_')) $showline=2; // If we are level one we show line @@ -239,8 +239,6 @@ foreach($fulltree as $key => $val) print ''; //print $val['fullpath']."(".$showline.")"; $n='2'; - // FIXME $b not define ? - //if ($b == 0 || ! in_array($val['id'],$expandedsectionarray)) $n='3'; if (! in_array($val['id'],$expandedsectionarray)) $n='3'; if (! in_array($val['id'],$expandedsectionarray)) $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/plustop'.$n.'.gif','',1); else $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop'.$n.'.gif','',1); @@ -269,7 +267,7 @@ foreach($fulltree as $key => $val) // Description print ''; - print dol_trunc($categstatic->get_desc($val['id']),48); + print dol_trunc($val['description'],48); print ''; // Link to category card diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index c2b58027c6c..fa53b19a2fb 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2133,22 +2133,20 @@ class Form * * @param int $type Type de categories (0=product, 1=supplier, 2=customer, 3=member) * @param string $selected Id of category preselected - * @param string $select_name HTML field name + * @param string $htmlname HTML field name * @param int $maxlength Maximum length for labels * @param int $excludeafterid Exclude all categories after this leaf in category tree. * @return void */ - function select_all_categories($type, $selected='', $select_name="", $maxlength=64, $excludeafterid=0) + function select_all_categories($type, $selected='', $htmlname="parent", $maxlength=64, $excludeafterid=0) { global $langs; $langs->load("categories"); - if ($select_name=="") $select_name="catMere"; - $cat = new Categorie($this->db); $cate_arbo = $cat->get_full_arbo($type,$excludeafterid); - $output = ''; if (is_array($cate_arbo)) { if (! count($cate_arbo)) $output.= ''; diff --git a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql index 4e7ca041820..a1ae84484c2 100755 --- a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql +++ b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql @@ -764,4 +764,12 @@ ALTER TABLE llx_user ADD COLUMN job varchar(128) AFTER firstname; ALTER TABLE llx_commande_fournisseurdet ADD COLUMN import_key varchar(14) AFTER info_bits; ALTER TABLE llx_entrepot ADD COLUMN import_key varchar(14) AFTER fk_user_author; ALTER TABLE llx_product_fournisseur_price ADD COLUMN import_key varchar(14) AFTER fk_user; -ALTER TABLE llx_product_stock ADD COLUMN import_key varchar(14) AFTER pmp; \ No newline at end of file +ALTER TABLE llx_product_stock ADD COLUMN import_key varchar(14) AFTER pmp; + +-- [ task #146 ] Remove table llx_categorie_association +ALTER TABLE llx_categorie DROP INDEX uk_categorie_ref; +ALTER TABLE llx_categorie ADD COLUMN fk_parent integer DEFAULT 0 NOT NULL AFTER rowid; +ALTER TABLE llx_categorie MODIFY COLUMN label varchar(255) NOT NULL; +ALTER TABLE llx_categorie ADD UNIQUE INDEX uk_categorie_ref (entity, fk_parent, label, type); +ALTER TABLE llx_categorie ADD INDEX idx_categorie_type (type); +ALTER TABLE llx_categorie ADD INDEX idx_categorie_label (label); diff --git a/htdocs/install/mysql/tables/llx_categorie.key.sql b/htdocs/install/mysql/tables/llx_categorie.key.sql index d6884ecdcc6..421997c8818 100644 --- a/htdocs/install/mysql/tables/llx_categorie.key.sql +++ b/htdocs/install/mysql/tables/llx_categorie.key.sql @@ -1,6 +1,6 @@ -- ============================================================================ --- Copyright (C) 2007-2009 Laurent Destailleur --- Copyright (C) 2009 Regis Houssin +-- Copyright (C) 2007-2009 Laurent Destailleur +-- Copyright (C) 2009-2012 Regis Houssin -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -17,6 +17,7 @@ -- -- ============================================================================ -ALTER TABLE llx_categorie ADD UNIQUE INDEX uk_categorie_ref (label,type,entity); +ALTER TABLE llx_categorie ADD UNIQUE INDEX uk_categorie_ref (entity, fk_parent, label, type); ALTER TABLE llx_categorie ADD INDEX idx_categorie_type (type); +ALTER TABLE llx_categorie ADD INDEX idx_categorie_label (label); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_categorie.sql b/htdocs/install/mysql/tables/llx_categorie.sql index f9b1a2afef0..c44b592e3db 100644 --- a/htdocs/install/mysql/tables/llx_categorie.sql +++ b/htdocs/install/mysql/tables/llx_categorie.sql @@ -1,7 +1,7 @@ -- ============================================================================ --- Copyright (C) 2005 Brice Davoleau --- Copyright (C) 2005 Matthieu Valleton --- Copyright (C) 2005-2009 Regis Houssin +-- Copyright (C) 2005 Brice Davoleau +-- Copyright (C) 2005 Matthieu Valleton +-- Copyright (C) 2005-2012 Regis Houssin -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -21,13 +21,15 @@ create table llx_categorie ( rowid integer AUTO_INCREMENT PRIMARY KEY, - label varchar(255), -- category name - type tinyint DEFAULT 1 NOT NULL, -- category type (product, supplier, customer) - entity integer DEFAULT 1 NOT NULL, -- multi company id - description text, -- description of the category - fk_soc integer DEFAULT NULL, -- attribution of the category has a company (for product only) - visible tinyint DEFAULT 1 NOT NULL, -- determine if the products are visible or not - import_key varchar(14) -- Import key + entity integer DEFAULT 1 NOT NULL, -- multi company id + fk_parent integer DEFAULT 0 NOT NULL, + label varchar(255) NOT NULL, -- category name + type tinyint DEFAULT 1 NOT NULL, -- category type (product, supplier, customer) + description text, -- description of the category + fk_soc integer DEFAULT NULL, -- attribution of the category has a company (for product only) + visible tinyint DEFAULT 1 NOT NULL, -- determine if the products are visible or not + import_key varchar(14) -- Import key + )ENGINE=innodb; -- @@ -37,11 +39,3 @@ create table llx_categorie -- 1 : supplier -- 2 : customer -- - --- --- List of codes for the field entity --- --- 1 : first company category type --- 2 : second company category type --- 3 : etc... --- \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_categorie_association.key.sql b/htdocs/install/mysql/tables/llx_categorie_association.key.sql deleted file mode 100644 index 8e102e1af81..00000000000 --- a/htdocs/install/mysql/tables/llx_categorie_association.key.sql +++ /dev/null @@ -1,26 +0,0 @@ --- ============================================================================ --- Copyright (C) 2005 Brice Davoleau --- Copyright (C) 2005 Matthieu Valleton --- Copyright (C) 2005 Laurent Destailleur --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program. If not, see . --- --- ============================================================================ - - -ALTER TABLE llx_categorie_association ADD UNIQUE INDEX uk_categorie_association (fk_categorie_mere, fk_categorie_fille); -ALTER TABLE llx_categorie_association ADD UNIQUE INDEX uk_categorie_association_fk_categorie_fille (fk_categorie_fille); - -ALTER TABLE llx_categorie_association ADD CONSTRAINT fk_categorie_asso_fk_categorie_mere FOREIGN KEY (fk_categorie_mere) REFERENCES llx_categorie (rowid); -ALTER TABLE llx_categorie_association ADD CONSTRAINT fk_categorie_asso_fk_categorie_fille FOREIGN KEY (fk_categorie_fille) REFERENCES llx_categorie (rowid); diff --git a/htdocs/install/mysql/tables/llx_categorie_association.sql b/htdocs/install/mysql/tables/llx_categorie_association.sql deleted file mode 100644 index cd12fd76230..00000000000 --- a/htdocs/install/mysql/tables/llx_categorie_association.sql +++ /dev/null @@ -1,24 +0,0 @@ --- ============================================================================ --- Copyright (C) 2005 Brice Davoleau --- Copyright (C) 2005 Matthieu Valleton --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program. If not, see . --- --- ============================================================================ - -create table llx_categorie_association -( - fk_categorie_mere integer NOT NULL, - fk_categorie_fille integer NOT NULL -)ENGINE=innodb; diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index c5eb33de6d4..a26900abba9 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -319,6 +319,19 @@ if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action'))) migrate_reload_menu($db,$langs,$conf,$versionto); } + // Script for VX (X<3.3) -> V3.3 + $afterversionarray=explode('.','3.2.9'); + $beforeversionarray=explode('.','3.3.9'); + if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0) + { + migrate_categorie_association($db,$langs,$conf); + + // Reload modules + migrate_reload_modules($db,$langs,$conf); + + // Reload menus + migrate_reload_menu($db,$langs,$conf,$versionto); + } print '
'.$langs->trans("MigrationFinished").''; @@ -3352,6 +3365,98 @@ function migrate_mode_reglement($db,$langs,$conf) print ''; } +/** + * Migrate categorie association + * + * @param DoliDB $db Database handler + * @param Translate $langs Object langs + * @param Conf $conf Object conf + * @return void + */ +function migrate_categorie_association($db,$langs,$conf) +{ + print ''; + + print '
'; + print ''.$langs->trans('MigrationCategorieAssociation')."
\n"; + + $error = 0; + + if ($db->DDLInfoTable(MAIN_DB_PREFIX."categorie_association")) + { + dolibarr_install_syslog("upgrade2::migrate_categorie_association"); + + $db->begin(); + + $sqlSelect = "SELECT fk_categorie_mere, fk_categorie_fille"; + $sqlSelect.= " FROM ".MAIN_DB_PREFIX."categorie_association"; + + $resql = $db->query($sqlSelect); + if ($resql) + { + $i = 0; + $num = $db->num_rows($resql); + + if ($num) + { + while ($i < $num) + { + $obj = $db->fetch_object($resql); + + $sqlUpdate = "UPDATE ".MAIN_DB_PREFIX."categorie SET "; + $sqlUpdate.= "fk_parent = ".$obj->fk_categorie_mere; + $sqlUpdate.= " WHERE rowid = ".$obj->fk_categorie_fille; + + $result=$db->query($sqlUpdate); + if (! $result) + { + $error++; + dol_print_error($db); + } + print ". "; + $i++; + } + } + else + { + print $langs->trans('AlreadyDone')."
\n"; + } + + if (! $error) + { + // TODO DROP table in the next release + /* + $sqlDrop = "DROP TABLE ".MAIN_DB_PREFIX."categorie_association"; + if ($db->query($sqlDrop)) + { + $db->commit(); + } + else + { + $db->rollback(); + } + */ + + $db->commit(); + } + else + { + $db->rollback(); + } + } + else + { + dol_print_error($db); + $db->rollback(); + } + } + else + { + print $langs->trans('AlreadyDone')."
\n"; + } + + print ''; +} /** * Migration directory