[-] BO : fixed bug #PSCFV-3336

This commit is contained in:
vAugagneur
2012-07-25 15:44:09 +00:00
parent c798d789b7
commit 174d8cf875
2 changed files with 42 additions and 48 deletions
+39 -44
View File
@@ -311,52 +311,47 @@ class CategoryCore extends ObjectModel
$this->clearCache(); $this->clearCache();
/* Get childs categories */ $all_cat = $this->getAllChildren();
$to_delete = array((int)$this->id); $all_cat[] = $this;
$this->recursiveDelete($to_delete, (int)$this->id); foreach ($all_cat as $cat)
$to_delete = array_unique($to_delete);
/* Delete category and its child from database */
$list = count($to_delete) > 1 ? implode(',', array_map('intval', $to_delete)) : (int)$this->id;
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category` WHERE `id_category` IN ('.$list.')');
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_lang` WHERE `id_category` IN ('.$list.')');
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_category` IN ('.$list.')');
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_category` IN ('.$list.')');
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_shop` WHERE `id_category` IN ('.$list.')');
// Delete associated restrictions on cart rules
CartRule::cleanProductRuleIntegrity('categories', $to_delete);
Category::cleanPositions($this->id_parent);
/* Delete category images and its children images */
$tmp_category = new Category();
foreach ($to_delete as $id_category)
{ {
$tmp_category->id = (int)$id_category; parent::delete();
$tmp_category->deleteImage(); if (!$this->hasMultishopEntries())
{
$cat->deleteImage();
$cat->cleanGroups();
$cat->cleanAssoProducts();
// Delete associated restrictions on cart rules
CartRule::cleanProductRuleIntegrity('categories', array($cat->id));
Category::cleanPositions($cat->id_parent);
/* Delete Categories in GroupReduction */
if (GroupReduction::getGroupReductionByCategoryId((int)$cat->id))
GroupReduction::deleteCategory($cat->id);
}
} }
$all_product_asso = array();
$tmp = Db::getInstance()->executeS('SELECT `id_product` FROM `'._DB_PREFIX_.'category_product`');
foreach ($tmp as $val)
$all_product_asso[] = $val;
/* Delete or link products which were not in others categories */ /* Delete or link products which were not in others categories */
$result = Db::getInstance()->executeS(' $fatherless_products = new Collection('Product', Context::getContext()->language->id);
SELECT `id_product` $fatherless_products->where('id_product', 'notin', $all_product_asso);
FROM `'._DB_PREFIX_.'product`
WHERE `id_product` NOT IN (SELECT `id_product` FROM `'._DB_PREFIX_.'category_product`) foreach ($fatherless_products as $poor_product)
');
foreach ($result as $p)
{ {
$product = new Product((int)$p['id_product']); if (Validate::isLoadedObject($poor_product))
if (Validate::isLoadedObject($product))
{ {
if ($this->remove_products || $this->id_parent == 0) if ($this->remove_products || $this->id_parent == 0)
$product->delete(); $poor_product->delete();
else else
{ {
if ($this->disable_products) if ($this->disable_products)
$product->active = 0; $poor_product->active = 0;
$product->addToCategories($this->id_parent); $poor_product->addToCategories($this->id_parent);
$product->save(); $poor_product->save();
} }
} }
} }
@@ -368,18 +363,13 @@ class CategoryCore extends ObjectModel
WHERE `id_category_default` WHERE `id_category_default`
NOT IN (SELECT `id_category` FROM `'._DB_PREFIX_.'category`) NOT IN (SELECT `id_category` FROM `'._DB_PREFIX_.'category`)
'); ');
/* Rebuild the nested tree */ /* Rebuild the nested tree */
if (!isset($this->doNotRegenerateNTree) || !$this->doNotRegenerateNTree) if (!$this->hasMultishopEntries() && (!isset($this->doNotRegenerateNTree) || !$this->doNotRegenerateNTree))
Category::regenerateEntireNtree(); Category::regenerateEntireNtree();
Hook::exec('actionCategoryDelete', array('category' => $this)); Hook::exec('actionCategoryDelete', array('category' => $this));
/* Delete Categories in GroupReduction */
foreach ($to_delete as $category)
if (GroupReduction::getGroupReductionByCategoryId((int)$category))
GroupReduction::deleteCategory($category);
return true; return true;
} }
@@ -1041,6 +1031,11 @@ class CategoryCore extends ObjectModel
{ {
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_category` = '.(int)$this->id); Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_category` = '.(int)$this->id);
} }
public function cleanAssoProducts()
{
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_category` = '.(int)$this->id);
}
public function addGroups($groups) public function addGroups($groups)
{ {
+3 -4
View File
@@ -310,9 +310,9 @@ abstract class ObjectModelCore
else else
{ {
$fields = array($this->id_lang => $this->formatFields(self::FORMAT_LANG, $this->id_lang)); $fields = array($this->id_lang => $this->formatFields(self::FORMAT_LANG, $this->id_lang));
$fields['id_lang'] = $this->id_lang; $fields[$this->id_lang]['id_lang'] = $this->id_lang;
if ($this->id_shop && $is_lang_multishop) if ($this->id_shop && $is_lang_multishop)
$fields['id_shop'] = (int)$this->id_shop; $fields[$this->id_lang]['id_shop'] = (int)$this->id_shop;
} }
return $fields; return $fields;
@@ -577,13 +577,12 @@ abstract class ObjectModelCore
$id_shop_list = Shop::getContextListShopID(); $id_shop_list = Shop::getContextListShopID();
if (count($this->id_shop_list) > 0) if (count($this->id_shop_list) > 0)
$id_shop_list = $this->id_shop_list; $id_shop_list = $this->id_shop_list;
foreach ($id_shop_list as $id_shop) foreach ($id_shop_list as $id_shop)
{ {
$field['id_shop'] = (int)$id_shop; $field['id_shop'] = (int)$id_shop;
$where = pSQL($this->def['primary']).' = '.(int)$this->id $where = pSQL($this->def['primary']).' = '.(int)$this->id
.' AND id_lang = '.(int)$field['id_lang'] .' AND id_lang = '.(int)$field['id_lang']
.' AND id_shop = '.$field['id_shop']; .' AND id_shop = '.(int)$id_shop;
if (Db::getInstance()->getValue('SELECT COUNT(*) FROM '.pSQL(_DB_PREFIX_.$this->def['table']).'_lang WHERE '.$where)) if (Db::getInstance()->getValue('SELECT COUNT(*) FROM '.pSQL(_DB_PREFIX_.$this->def['table']).'_lang WHERE '.$where))
$result &= Db::getInstance()->update($this->def['table'].'_lang', $field, $where); $result &= Db::getInstance()->update($this->def['table'].'_lang', $field, $where);