//fixed multishop CRUD bug

git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@16555 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
vAugagneur
2012-07-24 16:45:52 +00:00
parent acb7dd35ed
commit 7eec6c7294
9 changed files with 137 additions and 141 deletions
+6 -20
View File
@@ -73,33 +73,19 @@ class AttributeCore extends ObjectModel
public function delete() public function delete()
{ {
$result = Db::getInstance()->executeS(' if (!$this->hasMultishopEntries())
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())
{ {
foreach ($result as $row)
$combination_ids[] = (int)$row['id_product_attribute'];
$combinations = new Collection('Combination'); $combinations = new Collection('Combination');
$combinations->where('id_product', '=', $this->id); $combinations->where($this->def['primary'], '=', $this->id);
foreach ($combinations as $combination) foreach ($combinations as $combination)
$combination->delete(); $combination->delete();
}
// Delete associated restrictions on cart rules // Delete associated restrictions on cart rules
CartRule::cleanProductRuleIntegrity('attributes', $this->id); CartRule::cleanProductRuleIntegrity('attributes', $this->id);
/* Reinitializing position */ /* Reinitializing position */
$this->cleanPositions((int)$this->id_attribute_group); $this->cleanPositions((int)$this->id_attribute_group);
}
$return = parent::delete(); $return = parent::delete();
if ($return) if ($return)
Hook::exec('actionAttributeDelete', array('id_attribute' => $this->id)); Hook::exec('actionAttributeDelete', array('id_attribute' => $this->id));
@@ -357,4 +343,4 @@ class AttributeCore extends ObjectModel
return (is_numeric($position)) ? $position : -1; return (is_numeric($position)) ? $position : -1;
} }
} }
+30 -27
View File
@@ -110,33 +110,36 @@ class AttributeGroupCore extends ObjectModel
public function delete() public function delete()
{ {
/* Select children in order to find linked combinations */ if (!$this->hasMultishopEntries())
$attribute_ids = Db::getInstance()->executeS(' {
SELECT `id_attribute` /* Select children in order to find linked combinations */
FROM `'._DB_PREFIX_.'attribute` $attribute_ids = Db::getInstance()->executeS('
WHERE `id_attribute_group` = '.(int)$this->id SELECT `id_attribute`
); FROM `'._DB_PREFIX_.'attribute`
if ($attribute_ids === false) WHERE `id_attribute_group` = '.(int)$this->id
return false; );
/* Removing attributes to the found combinations */ if ($attribute_ids === false)
$to_remove = array(); return false;
foreach ($attribute_ids as $attribute) /* Removing attributes to the found combinations */
$to_remove[] = (int)$attribute['id_attribute']; $to_remove = array();
if (!empty($to_remove) && Db::getInstance()->execute(' foreach ($attribute_ids as $attribute)
DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` $to_remove[] = (int)$attribute['id_attribute'];
WHERE `id_attribute` if (!empty($to_remove) && Db::getInstance()->execute('
IN ('.implode(', ', $to_remove).')') === false) DELETE FROM `'._DB_PREFIX_.'product_attribute_combination`
return false; WHERE `id_attribute`
/* Remove combinations if they do not possess attributes anymore */ IN ('.implode(', ', $to_remove).')') === false)
if (!AttributeGroup::cleanDeadCombinations()) return false;
return false; /* Remove combinations if they do not possess attributes anymore */
/* Also delete related attributes */ if (!AttributeGroup::cleanDeadCombinations())
if (Db::getInstance()->execute(' return false;
DELETE FROM `'._DB_PREFIX_.'attribute_lang` /* Also delete related attributes */
WHERE `id_attribute` if (Db::getInstance()->execute('
IN (SELECT id_attribute FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id.')') === false || DELETE FROM `'._DB_PREFIX_.'attribute_lang`
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id) === false) WHERE `id_attribute`
return false; 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(); $return = parent::delete();
if ($return) if ($return)
Hook::exec('actionAttributeGroupDelete', array('id_attribute_group' => $this->id)); Hook::exec('actionAttributeGroupDelete', array('id_attribute_group' => $this->id));
-1
View File
@@ -63,7 +63,6 @@ class CombinationCore extends ObjectModel
public static $definition = array( public static $definition = array(
'table' => 'product_attribute', 'table' => 'product_attribute',
'primary' => 'id_product_attribute', 'primary' => 'id_product_attribute',
'multishop_specific' => true,
'fields' => array( 'fields' => array(
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'location' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 64), '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() public function delete()
{ {
if (empty($this->iso_code)) if (!$this->hasMultishopEntries())
$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)
{ {
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code); if (empty($this->iso_code))
$files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/'); $this->iso_code = Language::getIsoById($this->id);
if (count($files) <= 2)
Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'); // Database translations deletion
$result = Db::getInstance()->executeS('SHOW TABLES FROM `'._DB_NAME_.'`');
if (file_exists(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php')) 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'); Language::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code);
$files = @scandir(_PS_MODULE_DIR_.$mod); $files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/');
if (count($files) <= 2) 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()) if (!parent::delete())
return false; return false;
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'); // delete images
$tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_); $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');
foreach ($tos as $to) $tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_);
foreach ($files_copy as $file) foreach ($tos as $to)
{ foreach ($files_copy as $file)
$name = str_replace('/en', ''.$this->iso_code, $file); {
$name = str_replace('/en', ''.$this->iso_code, $file);
if (file_exists($to.$name))
unlink($to.$name); if (file_exists($to.$name))
if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg')) unlink($to.$name);
unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'); if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'))
} unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg');
}
}
return Tools::generateHtaccess(); return Tools::generateHtaccess();
} }
+32 -35
View File
@@ -200,7 +200,7 @@ abstract class ObjectModelCore
} }
// Get shop informations // 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); $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)); Cache::store($cache_id, Db::getInstance()->getRow($sql));
@@ -258,7 +258,7 @@ abstract class ObjectModelCore
$fields = $this->formatFields(self::FORMAT_COMMON); $fields = $this->formatFields(self::FORMAT_COMMON);
// For retro compatibility // For retro compatibility
if (!empty($this->def['multishop_specific'])) if (Shop::isTableAssociated($this->def['table']))
$fields = array_merge($fields, $this->getFieldsShop()); $fields = array_merge($fields, $this->getFieldsShop());
// Ensure that we get something to insert // Ensure that we get something to insert
@@ -446,14 +446,14 @@ abstract class ObjectModelCore
$this->id = Db::getInstance()->Insert_ID(); $this->id = Db::getInstance()->Insert_ID();
// Database insertion for multishop fields related to the object // 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(); $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;
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
foreach ($id_shop_list as $id_shop) 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); $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) if (!$result)
return false; return false;
// Database insertion for multilingual fields related to the object // Database insertion for multilingual fields related to the object
if (!empty($this->def['multilang'])) if (!empty($this->def['multilang']))
{ {
@@ -527,7 +524,7 @@ abstract class ObjectModelCore
return false; return false;
// Database insertion for multishop fields related to the object // 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->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id; $fields[$this->def['primary']] = (int)$this->id;
@@ -628,9 +625,8 @@ abstract class ObjectModelCore
$this->clearCache(); $this->clearCache();
$result = true; $result = true;
// Remove association to multishop table // Remove association to multishop table
if (!empty($this->def['multishop_specific'])) if (Shop::isTableAssociated($this->def['table']))
{ {
$id_shop_list = Shop::getContextListShopID(); $id_shop_list = Shop::getContextListShopID();
if (count($this->id_shop_list)) 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).')'); $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 // Database deletion
$has_multishop_entries = !empty($this->def['multishop_specific']) ? $this->hasMultishopEntries() : false; $has_multishop_entries = $this->hasMultishopEntries();
if ($result && !$has_multishop_entries) if ($result && !$has_multishop_entries)
$result &= Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id); $result &= Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
@@ -1154,7 +1148,7 @@ abstract class ObjectModelCore
*/ */
public function hasMultishopEntries() public function hasMultishopEntries()
{ {
if (empty($this->def['multishop_specific'])) if (!Shop::isTableAssociated($this->def['table']))
return false; return false;
return (bool)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.$this->def['table'].'_shop` WHERE `'.$this->def['primary'].'` = '.(int)$this->id); 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() 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() public function isLangMultishop()
@@ -1214,26 +1208,29 @@ abstract class ObjectModelCore
{ {
if (!$this->id) if (!$this->id)
return false; return false;
/* Deleting object images and thumbnails (cache) */ if (!$this->hasMultishopEntries())
if ($this->image_dir)
{ {
if (file_exists($this->image_dir.$this->id.'.'.$this->image_format) /* Deleting object images and thumbnails (cache) */
&& !unlink($this->image_dir.$this->id.'.'.$this->image_format)) 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; 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; return true;
} }
-1
View File
@@ -235,7 +235,6 @@ class ProductCore extends ObjectModel
'primary' => 'id_product', 'primary' => 'id_product',
'multilang' => true, 'multilang' => true,
'multilang_shop' => true, 'multilang_shop' => true,
'multishop_specific' => true,
'fields' => array( 'fields' => array(
// Classic fields // Classic fields
'id_manufacturer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_manufacturer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
-4
View File
@@ -2382,10 +2382,6 @@ class AdminControllerCore extends Controller
if (!Shop::isFeatureActive()) if (!Shop::isFeatureActive())
return; return;
$def = ObjectModel::getDefinition($this->className);
if (!empty($def['multishop_specific']))
return;
if (!Shop::isTableAssociated($this->table)) if (!Shop::isTableAssociated($this->table))
return; return;
@@ -1461,7 +1461,13 @@ class AdminProductsControllerCore extends AdminController
Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_product)); 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() public function processAdd()
{ {
$this->checkProduct(); $this->checkProduct();
+5 -1
View File
@@ -474,14 +474,18 @@ class AdminShopControllerCore extends AdminController
'tax_rules_group' => $this->l('Tax rules groups'), 'tax_rules_group' => $this->l('Tax rules groups'),
'supplier' => $this->l('Suppliers'), 'supplier' => $this->l('Suppliers'),
'referrer' => $this->l('Referrers'), 'referrer' => $this->l('Referrers'),
'zone' => $this->l('Zones'),
'cart_rule' => $this->l('Cart rules'),
); );
// Hook for duplication of shop data // Hook for duplication of shop data
$modules_list = Hook::getHookModuleExecList('actionShopDataDuplication'); $modules_list = Hook::getHookModuleExecList('actionShopDataDuplication');
if (is_array($modules_list) && count($modules_list) > 0) if (is_array($modules_list) && count($modules_list) > 0)
foreach ($modules_list as $m) foreach ($modules_list as $m)
$import_data['Module'.ucfirst($m['module'])] = Module::getModuleName($m['module']); $import_data['Module'.ucfirst($m['module'])] = Module::getModuleName($m['module']);
asort($import_data);
if (!$this->object->id) if (!$this->object->id)
$this->fields_import_form = array( $this->fields_import_form = array(
'radio' => array( 'radio' => array(