//fixed multishop CRUD bug

This commit is contained in:
vAugagneur
2012-07-24 16:45:52 +00:00
parent 4bf31460a8
commit 07b11f2d72
9 changed files with 137 additions and 141 deletions
+6 -20
View File
@@ -73,33 +73,19 @@ class AttributeCore extends ObjectModel
public function delete()
{
$result = Db::getInstance()->executeS('
SELECT `id_product_attribute`
FROM `'._DB_PREFIX_.'product_attribute_combination`
WHERE `'.$this->def['primary'].'` = '.(int)$this->id
);
if ($result === false)
return false;
$combination_ids = array();
if (Db::getInstance()->numRows())
if (!$this->hasMultishopEntries())
{
foreach ($result as $row)
$combination_ids[] = (int)$row['id_product_attribute'];
$combinations = new Collection('Combination');
$combinations->where('id_product', '=', $this->id);
$combinations->where($this->def['primary'], '=', $this->id);
foreach ($combinations as $combination)
$combination->delete();
}
// Delete associated restrictions on cart rules
CartRule::cleanProductRuleIntegrity('attributes', $this->id);
/* Reinitializing position */
$this->cleanPositions((int)$this->id_attribute_group);
/* Reinitializing position */
$this->cleanPositions((int)$this->id_attribute_group);
}
$return = parent::delete();
if ($return)
Hook::exec('actionAttributeDelete', array('id_attribute' => $this->id));
@@ -357,4 +343,4 @@ class AttributeCore extends ObjectModel
return (is_numeric($position)) ? $position : -1;
}
}
}
+30 -27
View File
@@ -110,33 +110,36 @@ class AttributeGroupCore extends ObjectModel
public function delete()
{
/* Select children in order to find linked combinations */
$attribute_ids = Db::getInstance()->executeS('
SELECT `id_attribute`
FROM `'._DB_PREFIX_.'attribute`
WHERE `id_attribute_group` = '.(int)$this->id
);
if ($attribute_ids === false)
return false;
/* Removing attributes to the found combinations */
$to_remove = array();
foreach ($attribute_ids as $attribute)
$to_remove[] = (int)$attribute['id_attribute'];
if (!empty($to_remove) && Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'product_attribute_combination`
WHERE `id_attribute`
IN ('.implode(', ', $to_remove).')') === false)
return false;
/* Remove combinations if they do not possess attributes anymore */
if (!AttributeGroup::cleanDeadCombinations())
return false;
/* Also delete related attributes */
if (Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'attribute_lang`
WHERE `id_attribute`
IN (SELECT id_attribute FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id.')') === false ||
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id) === false)
return false;
if (!$this->hasMultishopEntries())
{
/* Select children in order to find linked combinations */
$attribute_ids = Db::getInstance()->executeS('
SELECT `id_attribute`
FROM `'._DB_PREFIX_.'attribute`
WHERE `id_attribute_group` = '.(int)$this->id
);
if ($attribute_ids === false)
return false;
/* Removing attributes to the found combinations */
$to_remove = array();
foreach ($attribute_ids as $attribute)
$to_remove[] = (int)$attribute['id_attribute'];
if (!empty($to_remove) && Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'product_attribute_combination`
WHERE `id_attribute`
IN ('.implode(', ', $to_remove).')') === false)
return false;
/* Remove combinations if they do not possess attributes anymore */
if (!AttributeGroup::cleanDeadCombinations())
return false;
/* Also delete related attributes */
if (Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'attribute_lang`
WHERE `id_attribute`
IN (SELECT id_attribute FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id.')') === false ||
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id) === false)
return false;
}
$return = parent::delete();
if ($return)
Hook::exec('actionAttributeGroupDelete', array('id_attribute_group' => $this->id));
-1
View File
@@ -63,7 +63,6 @@ class CombinationCore extends ObjectModel
public static $definition = array(
'table' => 'product_attribute',
'primary' => 'id_product_attribute',
'multishop_specific' => true,
'fields' => array(
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'location' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 64),
+57 -51
View File
@@ -465,64 +465,70 @@ class LanguageCore extends ObjectModel
public function delete()
{
if (empty($this->iso_code))
$this->iso_code = Language::getIsoById($this->id);
// Database translations deletion
$result = Db::getInstance()->executeS('SHOW TABLES FROM `'._DB_NAME_.'`');
foreach ($result as $row)
if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]))
if (!Db::getInstance()->execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)$this->id))
return false;
// Delete tags
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'tag WHERE id_lang = '.(int)$this->id);
// Delete search words
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'search_word WHERE id_lang = '.(int)$this->id);
// Files deletion
foreach (Language::getFilesList($this->iso_code, _THEME_NAME_, false, false, false, true, true) as $key => $file)
if (file_exists($key))
unlink($key);
$modList = scandir(_PS_MODULE_DIR_);
foreach ($modList as $mod)
if (!$this->hasMultishopEntries())
{
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code);
$files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/');
if (count($files) <= 2)
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/');
if (file_exists(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php'))
if (empty($this->iso_code))
$this->iso_code = Language::getIsoById($this->id);
// Database translations deletion
$result = Db::getInstance()->executeS('SHOW TABLES FROM `'._DB_NAME_.'`');
foreach ($result as $row)
if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]))
if (!Db::getInstance()->execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)$this->id))
return false;
// Delete tags
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'tag WHERE id_lang = '.(int)$this->id);
// Delete search words
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'search_word WHERE id_lang = '.(int)$this->id);
// Files deletion
foreach (Language::getFilesList($this->iso_code, _THEME_NAME_, false, false, false, true, true) as $key => $file)
if (file_exists($key))
unlink($key);
$modList = scandir(_PS_MODULE_DIR_);
foreach ($modList as $mod)
{
unlink(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php');
$files = @scandir(_PS_MODULE_DIR_.$mod);
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code);
$files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/');
if (count($files) <= 2)
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod);
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/');
if (file_exists(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php'))
{
unlink(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php');
$files = @scandir(_PS_MODULE_DIR_.$mod);
if (count($files) <= 2)
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod);
}
}
if (file_exists(_PS_MAIL_DIR_.$this->iso_code))
Language::recurseDeleteDir(_PS_MAIL_DIR_.$this->iso_code);
if (file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code))
Language::recurseDeleteDir(_PS_TRANSLATIONS_DIR_.$this->iso_code);
}
if (file_exists(_PS_MAIL_DIR_.$this->iso_code))
Language::recurseDeleteDir(_PS_MAIL_DIR_.$this->iso_code);
if (file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code))
Language::recurseDeleteDir(_PS_TRANSLATIONS_DIR_.$this->iso_code);
if (!parent::delete())
return false;
// delete images
$files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg');
$tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_);
foreach ($tos as $to)
foreach ($files_copy as $file)
{
$name = str_replace('/en', ''.$this->iso_code, $file);
if (file_exists($to.$name))
unlink($to.$name);
if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'))
unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg');
}
if (!$this->hasMultishopEntries())
{
// delete images
$files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg');
$tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_);
foreach ($tos as $to)
foreach ($files_copy as $file)
{
$name = str_replace('/en', ''.$this->iso_code, $file);
if (file_exists($to.$name))
unlink($to.$name);
if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'))
unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg');
}
}
return Tools::generateHtaccess();
}
+32 -35
View File
@@ -200,7 +200,7 @@ abstract class ObjectModelCore
}
// Get shop informations
if (!empty($this->def['multishop_specific']))
if (Shop::isTableAssociated($this->def['table']))
$sql->leftJoin($this->def['table'].'_shop', 'c', 'a.'.$this->def['primary'].' = c.'.$this->def['primary'].' AND c.id_shop = '.(int)$this->id_shop);
Cache::store($cache_id, Db::getInstance()->getRow($sql));
@@ -258,7 +258,7 @@ abstract class ObjectModelCore
$fields = $this->formatFields(self::FORMAT_COMMON);
// For retro compatibility
if (!empty($this->def['multishop_specific']))
if (Shop::isTableAssociated($this->def['table']))
$fields = array_merge($fields, $this->getFieldsShop());
// Ensure that we get something to insert
@@ -446,14 +446,14 @@ abstract class ObjectModelCore
$this->id = Db::getInstance()->Insert_ID();
// Database insertion for multishop fields related to the object
if (!empty($this->def['multishop_specific']))
if (Shop::isTableAssociated($this->def['table']))
{
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
$id_shop_list = Shop::getContextListShopID();
if (count($this->id_shop_list) > 0)
$id_shop_list = $this->id_shop_list;
$id_shop_list = $this->id_shop_list;
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
foreach ($id_shop_list as $id_shop)
{
@@ -461,13 +461,10 @@ abstract class ObjectModelCore
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values);
}
}
else if (!Shop::isFeatureActive() && Shop::isTableAssociated($this->def['table']))
$result &= $this->associateTo(Context::getContext()->shop->id);
if (!$result)
return false;
// Database insertion for multilingual fields related to the object
if (!empty($this->def['multilang']))
{
@@ -527,7 +524,7 @@ abstract class ObjectModelCore
return false;
// Database insertion for multishop fields related to the object
if (!empty($this->def['multishop_specific']))
if (Shop::isTableAssociated($this->def['table']))
{
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
@@ -628,9 +625,8 @@ abstract class ObjectModelCore
$this->clearCache();
$result = true;
// Remove association to multishop table
if (!empty($this->def['multishop_specific']))
if (Shop::isTableAssociated($this->def['table']))
{
$id_shop_list = Shop::getContextListShopID();
if (count($this->id_shop_list))
@@ -638,11 +634,9 @@ abstract class ObjectModelCore
$result &= Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id.' AND id_shop IN ('.implode(', ', $id_shop_list).')');
}
else if (Shop::isTableAssociated($this->def['table']))
$result &= Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id);
// Database deletion
$has_multishop_entries = !empty($this->def['multishop_specific']) ? $this->hasMultishopEntries() : false;
$has_multishop_entries = $this->hasMultishopEntries();
if ($result && !$has_multishop_entries)
$result &= Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
@@ -1154,7 +1148,7 @@ abstract class ObjectModelCore
*/
public function hasMultishopEntries()
{
if (empty($this->def['multishop_specific']))
if (!Shop::isTableAssociated($this->def['table']))
return false;
return (bool)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.$this->def['table'].'_shop` WHERE `'.$this->def['primary'].'` = '.(int)$this->id);
@@ -1162,7 +1156,7 @@ abstract class ObjectModelCore
public function isMultishop()
{
return !empty($this->def['multishop_specific']) || !empty($this->def['multilang_shop']);
return Shop::isTableAssociated($this->def['table']) || !empty($this->def['multilang_shop']);
}
public function isLangMultishop()
@@ -1214,26 +1208,29 @@ abstract class ObjectModelCore
{
if (!$this->id)
return false;
/* Deleting object images and thumbnails (cache) */
if ($this->image_dir)
if (!$this->hasMultishopEntries())
{
if (file_exists($this->image_dir.$this->id.'.'.$this->image_format)
&& !unlink($this->image_dir.$this->id.'.'.$this->image_format))
/* Deleting object images and thumbnails (cache) */
if ($this->image_dir)
{
if (file_exists($this->image_dir.$this->id.'.'.$this->image_format)
&& !unlink($this->image_dir.$this->id.'.'.$this->image_format))
return false;
}
if (file_exists(_PS_TMP_IMG_DIR_.$this->def['table'].'_'.$this->id.'.'.$this->image_format)
&& !unlink(_PS_TMP_IMG_DIR_.$this->def['table'].'_'.$this->id.'.'.$this->image_format))
return false;
if (file_exists(_PS_TMP_IMG_DIR_.$this->def['table'].'_mini_'.$this->id.'.'.$this->image_format)
&& !unlink(_PS_TMP_IMG_DIR_.$this->def['table'].'_mini_'.$this->id.'.'.$this->image_format))
return false;
$types = ImageType::getImagesTypes();
foreach ($types as $image_type)
if (file_exists($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format)
&& !unlink($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format))
return false;
}
if (file_exists(_PS_TMP_IMG_DIR_.$this->def['table'].'_'.$this->id.'.'.$this->image_format)
&& !unlink(_PS_TMP_IMG_DIR_.$this->def['table'].'_'.$this->id.'.'.$this->image_format))
return false;
if (file_exists(_PS_TMP_IMG_DIR_.$this->def['table'].'_mini_'.$this->id.'.'.$this->image_format)
&& !unlink(_PS_TMP_IMG_DIR_.$this->def['table'].'_mini_'.$this->id.'.'.$this->image_format))
return false;
$types = ImageType::getImagesTypes();
foreach ($types as $image_type)
if (file_exists($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format)
&& !unlink($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format))
return false;
return true;
}
-1
View File
@@ -235,7 +235,6 @@ class ProductCore extends ObjectModel
'primary' => 'id_product',
'multilang' => true,
'multilang_shop' => true,
'multishop_specific' => true,
'fields' => array(
// Classic fields
'id_manufacturer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
-4
View File
@@ -2382,10 +2382,6 @@ class AdminControllerCore extends Controller
if (!Shop::isFeatureActive())
return;
$def = ObjectModel::getDefinition($this->className);
if (!empty($def['multishop_specific']))
return;
if (!Shop::isTableAssociated($this->table))
return;
@@ -1461,7 +1461,13 @@ class AdminProductsControllerCore extends AdminController
Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_product));
}
}
protected function updateAssoShop($id_object)
{
//override AdminController::updateAssoShop() specifically for products because shop association is set with the context in ObjectModel
return;
}
public function processAdd()
{
$this->checkProduct();
+5 -1
View File
@@ -474,14 +474,18 @@ class AdminShopControllerCore extends AdminController
'tax_rules_group' => $this->l('Tax rules groups'),
'supplier' => $this->l('Suppliers'),
'referrer' => $this->l('Referrers'),
'zone' => $this->l('Zones'),
'cart_rule' => $this->l('Cart rules'),
);
// Hook for duplication of shop data
$modules_list = Hook::getHookModuleExecList('actionShopDataDuplication');
if (is_array($modules_list) && count($modules_list) > 0)
foreach ($modules_list as $m)
$import_data['Module'.ucfirst($m['module'])] = Module::getModuleName($m['module']);
asort($import_data);
if (!$this->object->id)
$this->fields_import_form = array(
'radio' => array(