mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-05 17:18:13 +01:00
Merge pull request #3626 from GPCsolutions/3.8-3607
FIX #3607 Better categories setting and unsetting
This commit is contained in:
@@ -326,25 +326,8 @@ if (empty($reshook))
|
|||||||
|
|
||||||
if ($result >= 0 && ! count($object->errors))
|
if ($result >= 0 && ! count($object->errors))
|
||||||
{
|
{
|
||||||
// Categories association
|
|
||||||
// First we delete all categories association
|
|
||||||
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . 'categorie_member';
|
|
||||||
$sql .= ' WHERE fk_member = ' . $object->id;
|
|
||||||
$resql = $db->query($sql);
|
|
||||||
if (! $resql) dol_print_error($db);
|
|
||||||
|
|
||||||
// Then we add the associated categories
|
|
||||||
$categories = GETPOST('memcats', 'array');
|
$categories = GETPOST('memcats', 'array');
|
||||||
|
$object->setCategories($categories);
|
||||||
if (! empty($categories))
|
|
||||||
{
|
|
||||||
$cat = new Categorie($db);
|
|
||||||
foreach ($categories as $id_category)
|
|
||||||
{
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'member');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logo/Photo save
|
// Logo/Photo save
|
||||||
$dir= $conf->adherent->dir_output . '/' . get_exdir($object->id,2,0,1,$object,'member').'/photos';
|
$dir= $conf->adherent->dir_output . '/' . get_exdir($object->id,2,0,1,$object,'member').'/photos';
|
||||||
@@ -560,15 +543,7 @@ if (empty($reshook))
|
|||||||
{
|
{
|
||||||
// Categories association
|
// Categories association
|
||||||
$memcats = GETPOST('memcats', 'array');
|
$memcats = GETPOST('memcats', 'array');
|
||||||
if (! empty($memcats))
|
$object->setCategories($memcats);
|
||||||
{
|
|
||||||
$cat = new Categorie($db);
|
|
||||||
foreach ($memcats as $id_category)
|
|
||||||
{
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'member');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->commit();
|
$db->commit();
|
||||||
$rowid=$object->id;
|
$rowid=$object->id;
|
||||||
|
|||||||
@@ -1959,6 +1959,49 @@ class Adherent extends CommonObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets object to supplied categories.
|
||||||
|
*
|
||||||
|
* Deletes object from existing categories not supplied.
|
||||||
|
* Adds it to non existing supplied categories.
|
||||||
|
* Existing categories are left untouch.
|
||||||
|
*
|
||||||
|
* @param int[]|int $categories Category or categories IDs
|
||||||
|
*/
|
||||||
|
public function setCategories($categories)
|
||||||
|
{
|
||||||
|
// Handle single category
|
||||||
|
if (!is_array($categories)) {
|
||||||
|
$categories = array($categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current categories
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
|
||||||
|
$c = new Categorie($this->db);
|
||||||
|
$existing = $c->containing($this->id, Categorie::TYPE_MEMBER, 'id');
|
||||||
|
|
||||||
|
// Diff
|
||||||
|
if (is_array($existing)) {
|
||||||
|
$to_del = array_diff($existing, $categories);
|
||||||
|
$to_add = array_diff($categories, $existing);
|
||||||
|
} else {
|
||||||
|
$to_del = array(); // Nothing to delete
|
||||||
|
$to_add = $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process
|
||||||
|
foreach ($to_del as $del) {
|
||||||
|
$c->fetch($del);
|
||||||
|
$c->del_type($this, 'member');
|
||||||
|
}
|
||||||
|
foreach ($to_add as $add) {
|
||||||
|
$c->fetch($add);
|
||||||
|
$c->add_type($this, 'member');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function used to replace a thirdparty id with another one.
|
* Function used to replace a thirdparty id with another one.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1222,7 +1222,7 @@ class Categorie extends CommonObject
|
|||||||
* @param string $type Type of category ('customer', 'supplier', 'contact', 'product', 'member'). Old mode
|
* @param string $type Type of category ('customer', 'supplier', 'contact', 'product', 'member'). Old mode
|
||||||
* (0, 1, 2, ...) is deprecated.
|
* (0, 1, 2, ...) is deprecated.
|
||||||
* @param string $mode 'object'=Get array of fetched category instances, 'label'=Get array of category
|
* @param string $mode 'object'=Get array of fetched category instances, 'label'=Get array of category
|
||||||
* labels
|
* labels, 'id'= Get array of category IDs
|
||||||
*
|
*
|
||||||
* @return mixed Array of category objects or < 0 if KO
|
* @return mixed Array of category objects or < 0 if KO
|
||||||
*/
|
*/
|
||||||
@@ -1239,7 +1239,7 @@ class Categorie extends CommonObject
|
|||||||
$type = $map_type[$type];
|
$type = $map_type[$type];
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = "SELECT ct.fk_categorie, c.label";
|
$sql = "SELECT ct.fk_categorie, c.label, c.rowid";
|
||||||
$sql .= " FROM " . MAIN_DB_PREFIX . "categorie_" . $this->MAP_CAT_TABLE[$type] . " as ct, " . MAIN_DB_PREFIX . "categorie as c";
|
$sql .= " FROM " . MAIN_DB_PREFIX . "categorie_" . $this->MAP_CAT_TABLE[$type] . " as ct, " . MAIN_DB_PREFIX . "categorie as c";
|
||||||
$sql .= " WHERE ct.fk_categorie = c.rowid AND ct.fk_" . $this->MAP_CAT_FK[$type] . " = " . $id . " AND c.type = " . $this->MAP_ID[$type];
|
$sql .= " WHERE ct.fk_categorie = c.rowid AND ct.fk_" . $this->MAP_CAT_FK[$type] . " = " . $id . " AND c.type = " . $this->MAP_ID[$type];
|
||||||
$sql .= " AND c.entity IN (" . getEntity( 'category', 1 ) . ")";
|
$sql .= " AND c.entity IN (" . getEntity( 'category', 1 ) . ")";
|
||||||
@@ -1249,11 +1249,11 @@ class Categorie extends CommonObject
|
|||||||
{
|
{
|
||||||
while ($obj = $this->db->fetch_object($res))
|
while ($obj = $this->db->fetch_object($res))
|
||||||
{
|
{
|
||||||
if ($mode == 'label')
|
if ($mode == 'id') {
|
||||||
{
|
$cats[] = $obj->rowid;
|
||||||
|
} else if ($mode == 'label') {
|
||||||
$cats[] = $obj->label;
|
$cats[] = $obj->label;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$cat = new Categorie($this->db);
|
$cat = new Categorie($this->db);
|
||||||
$cat->fetch($obj->fk_categorie);
|
$cat->fetch($obj->fk_categorie);
|
||||||
$cats[] = $cat;
|
$cats[] = $cat;
|
||||||
|
|||||||
@@ -224,13 +224,7 @@ if (empty($reshook))
|
|||||||
} else {
|
} else {
|
||||||
// Categories association
|
// Categories association
|
||||||
$contcats = GETPOST( 'contcats', 'array' );
|
$contcats = GETPOST( 'contcats', 'array' );
|
||||||
if (!empty( $contcats )) {
|
$object->setCategories($contcats);
|
||||||
$cat = new Categorie( $db );
|
|
||||||
foreach ($contcats as $id_category) {
|
|
||||||
$cat->fetch( $id_category );
|
|
||||||
$cat->add_type( $object, 'contact' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,13 +327,8 @@ if (empty($reshook))
|
|||||||
|
|
||||||
// Then we add the associated categories
|
// Then we add the associated categories
|
||||||
$categories = GETPOST( 'contcats', 'array' );
|
$categories = GETPOST( 'contcats', 'array' );
|
||||||
if (!empty( $categories )) {
|
$object->setCategories($categories);
|
||||||
$cat = new Categorie( $db );
|
|
||||||
foreach ($categories as $id_category) {
|
|
||||||
$cat->fetch( $id_category );
|
|
||||||
$cat->add_type( $object, 'contact' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$object->old_lastname='';
|
$object->old_lastname='';
|
||||||
$object->old_firstname='';
|
$object->old_firstname='';
|
||||||
$action = 'view';
|
$action = 'view';
|
||||||
|
|||||||
@@ -1123,6 +1123,49 @@ class Contact extends CommonObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets object to supplied categories.
|
||||||
|
*
|
||||||
|
* Deletes object from existing categories not supplied.
|
||||||
|
* Adds it to non existing supplied categories.
|
||||||
|
* Existing categories are left untouch.
|
||||||
|
*
|
||||||
|
* @param int[]|int $categories Category or categories IDs
|
||||||
|
*/
|
||||||
|
public function setCategories($categories)
|
||||||
|
{
|
||||||
|
// Handle single category
|
||||||
|
if (!is_array($categories)) {
|
||||||
|
$categories = array($categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current categories
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
|
||||||
|
$c = new Categorie($this->db);
|
||||||
|
$existing = $c->containing($this->id, Categorie::TYPE_CONTACT, 'id');
|
||||||
|
|
||||||
|
// Diff
|
||||||
|
if (is_array($existing)) {
|
||||||
|
$to_del = array_diff($existing, $categories);
|
||||||
|
$to_add = array_diff($categories, $existing);
|
||||||
|
} else {
|
||||||
|
$to_del = array(); // Nothing to delete
|
||||||
|
$to_add = $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process
|
||||||
|
foreach ($to_del as $del) {
|
||||||
|
$c->fetch($del);
|
||||||
|
$c->del_type($this, 'contact');
|
||||||
|
}
|
||||||
|
foreach ($to_add as $add) {
|
||||||
|
$c->fetch($add);
|
||||||
|
$c->add_type($this, 'contact');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function used to replace a thirdparty id with another one.
|
* Function used to replace a thirdparty id with another one.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -284,13 +284,7 @@ if (empty($reshook))
|
|||||||
{
|
{
|
||||||
// Category association
|
// Category association
|
||||||
$categories = GETPOST('categories');
|
$categories = GETPOST('categories');
|
||||||
if(!empty($categories)) {
|
$object->setCategories($categories);
|
||||||
$cat = new Categorie($db);
|
|
||||||
foreach($categories as $id_category) {
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'product');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
|
header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
|
||||||
exit;
|
exit;
|
||||||
@@ -379,21 +373,8 @@ if (empty($reshook))
|
|||||||
if ($object->update($object->id, $user) > 0)
|
if ($object->update($object->id, $user) > 0)
|
||||||
{
|
{
|
||||||
// Category association
|
// Category association
|
||||||
// First we delete all categories association
|
|
||||||
$sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_product";
|
|
||||||
$sql .= " WHERE fk_product = ".$object->id;
|
|
||||||
$db->query($sql);
|
|
||||||
|
|
||||||
// Then we add the associated categories
|
|
||||||
$categories = GETPOST('categories');
|
$categories = GETPOST('categories');
|
||||||
if(!empty($categories)) {
|
$object->setCategories($categories);
|
||||||
$cat = new Categorie($db);
|
|
||||||
|
|
||||||
foreach($categories as $id_category) {
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'product');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$action = 'view';
|
$action = 'view';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3944,6 +3944,49 @@ class Product extends CommonObject
|
|||||||
return $maxpricesupplier;
|
return $maxpricesupplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets object to supplied categories.
|
||||||
|
*
|
||||||
|
* Deletes object from existing categories not supplied.
|
||||||
|
* Adds it to non existing supplied categories.
|
||||||
|
* Existing categories are left untouch.
|
||||||
|
*
|
||||||
|
* @param int[]|int $categories Category or categories IDs
|
||||||
|
*/
|
||||||
|
public function setCategories($categories) {
|
||||||
|
// Handle single category
|
||||||
|
if (! is_array($categories)) {
|
||||||
|
$categories = array($categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current categories
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
|
||||||
|
$c = new Categorie($this->db);
|
||||||
|
$existing = $c->containing($this->id, Categorie::TYPE_PRODUCT, 'id');
|
||||||
|
|
||||||
|
// Diff
|
||||||
|
if (is_array($existing)) {
|
||||||
|
$to_del = array_diff($existing, $categories);
|
||||||
|
$to_add = array_diff($categories, $existing);
|
||||||
|
} else {
|
||||||
|
$to_del = array(); // Nothing to delete
|
||||||
|
$to_add = $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process
|
||||||
|
foreach($to_del as $del) {
|
||||||
|
$c->fetch($del);
|
||||||
|
$c->del_type($this, 'product');
|
||||||
|
}
|
||||||
|
foreach ($to_add as $add) {
|
||||||
|
$c->fetch($add);
|
||||||
|
$c->add_type($this, 'product');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function used to replace a thirdparty id with another one.
|
* Function used to replace a thirdparty id with another one.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -3342,6 +3342,65 @@ class Societe extends CommonObject
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets object to supplied categories.
|
||||||
|
*
|
||||||
|
* Deletes object from existing categories not supplied.
|
||||||
|
* Adds it to non existing supplied categories.
|
||||||
|
* Existing categories are left untouch.
|
||||||
|
*
|
||||||
|
* @param int[]|int $categories Category or categories IDs
|
||||||
|
* @param string $type Category type (customer or supplier)
|
||||||
|
*/
|
||||||
|
public function setCategories($categories, $type)
|
||||||
|
{
|
||||||
|
// Decode type
|
||||||
|
if ($type == 'customer') {
|
||||||
|
$type_id = Categorie::TYPE_CUSTOMER;
|
||||||
|
$type_text = 'customer';
|
||||||
|
} elseif ($type == 'supplier') {
|
||||||
|
$type_id = Categorie::TYPE_SUPPLIER;
|
||||||
|
$type_text = 'supplier';
|
||||||
|
} else {
|
||||||
|
dol_syslog(__METHOD__ . ': Type ' . $type . 'is an unknown company category type. Done nothing.', LOG_ERR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle single category
|
||||||
|
if (!is_array($categories)) {
|
||||||
|
$categories = array($categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current categories
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
|
||||||
|
$c = new Categorie($this->db);
|
||||||
|
$existing = $c->containing($this->id, $type_id, 'id');
|
||||||
|
|
||||||
|
// Diff
|
||||||
|
if (is_array($existing)) {
|
||||||
|
var_dump($existing);
|
||||||
|
var_dump($categories);
|
||||||
|
$to_del = array_diff($existing, $categories);
|
||||||
|
$to_add = array_diff($categories, $existing);
|
||||||
|
} else {
|
||||||
|
$to_del = array(); // Nothing to delete
|
||||||
|
$to_add = $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process
|
||||||
|
foreach ($to_del as $del) {
|
||||||
|
$c->fetch($del);
|
||||||
|
$c->del_type($this, $type_text);
|
||||||
|
}
|
||||||
|
foreach ($to_add as $add) {
|
||||||
|
$c->fetch($add);
|
||||||
|
$c->add_type($this, $type_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function used to replace a thirdparty id with another one.
|
* Function used to replace a thirdparty id with another one.
|
||||||
* It must be used within a transaction to avoid trouble
|
* It must be used within a transaction to avoid trouble
|
||||||
|
|||||||
@@ -415,23 +415,11 @@ if (empty($reshook))
|
|||||||
|
|
||||||
// Customer categories association
|
// Customer categories association
|
||||||
$custcats = GETPOST( 'custcats', 'array' );
|
$custcats = GETPOST( 'custcats', 'array' );
|
||||||
if (!empty( $custcats )) {
|
$object->setCategories($custcats, 'customer');
|
||||||
$cat = new Categorie( $db );
|
|
||||||
foreach ($custcats as $id_category) {
|
|
||||||
$cat->fetch( $id_category );
|
|
||||||
$cat->add_type( $object, 'customer' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Supplier categories association
|
// Supplier categories association
|
||||||
$suppcats = GETPOST('suppcats', 'array');
|
$suppcats = GETPOST('suppcats', 'array');
|
||||||
if (!empty($suppcats)) {
|
$object->setCategories($suppcats, 'supplier');
|
||||||
$cat = new Categorie($db);
|
|
||||||
foreach ($suppcats as $id_category) {
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'supplier');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logo/Photo save
|
// Logo/Photo save
|
||||||
$dir = $conf->societe->multidir_output[$conf->entity]."/".$object->id."/logos/";
|
$dir = $conf->societe->multidir_output[$conf->entity]."/".$object->id."/logos/";
|
||||||
@@ -538,36 +526,12 @@ if (empty($reshook))
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Customer categories association
|
// Customer categories association
|
||||||
// First we delete all categories association
|
|
||||||
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . 'categorie_societe';
|
|
||||||
$sql .= ' WHERE fk_soc = ' . $object->id;
|
|
||||||
$db->query( $sql );
|
|
||||||
|
|
||||||
// Then we add the associated categories
|
|
||||||
$categories = GETPOST( 'custcats', 'array' );
|
$categories = GETPOST( 'custcats', 'array' );
|
||||||
if (!empty( $categories )) {
|
$object->setCategories($categories, 'customer');
|
||||||
$cat = new Categorie( $db );
|
|
||||||
foreach ($categories as $id_category) {
|
|
||||||
$cat->fetch( $id_category );
|
|
||||||
$cat->add_type( $object, 'customer' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Supplier categories association
|
// Supplier categories association
|
||||||
// First we delete all categories association
|
|
||||||
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . 'categorie_fournisseur';
|
|
||||||
$sql .= ' WHERE fk_soc = ' . $object->id;
|
|
||||||
$db->query($sql);
|
|
||||||
|
|
||||||
// Then we add the associated categories
|
|
||||||
$categories = GETPOST('suppcats', 'array');
|
$categories = GETPOST('suppcats', 'array');
|
||||||
if (!empty($categories)) {
|
$object->setCategories($categories, 'supplier');
|
||||||
$cat = new Categorie($db);
|
|
||||||
foreach ($categories as $id_category) {
|
|
||||||
$cat->fetch($id_category);
|
|
||||||
$cat->add_type($object, 'supplier');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logo/Photo save
|
// Logo/Photo save
|
||||||
$dir = $conf->societe->multidir_output[$object->entity]."/".$object->id."/logos";
|
$dir = $conf->societe->multidir_output[$object->entity]."/".$object->id."/logos";
|
||||||
|
|||||||
Reference in New Issue
Block a user