// Fix multishop management in ObjectModel

This commit is contained in:
rMalie
2012-05-21 15:29:28 +00:00
parent b8405ff4c4
commit 361765b35a
+19 -10
View File
@@ -135,8 +135,6 @@ abstract class ObjectModelCore
*/ */
protected $update_fields = null; protected $update_fields = null;
public $insert_missing_shop = true;
/** /**
* Returns object validation rules (fields validity) * Returns object validation rules (fields validity)
* *
@@ -259,8 +257,8 @@ abstract class ObjectModelCore
$this->validateFields(); $this->validateFields();
$fields = $this->formatFields(self::FORMAT_COMMON); $fields = $this->formatFields(self::FORMAT_COMMON);
// For retro compatibility, get common fields for default shop // For retro compatibility
if (!empty($this->def['multishop']) && $this->id_shop == Configuration::get('PS_SHOP_DEFAULT')) if (!empty($this->def['multishop']))
$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
@@ -386,6 +384,9 @@ abstract class ObjectModelCore
return (float)$value; return (float)$value;
case self::TYPE_DATE : case self::TYPE_DATE :
if (!$value)
return '0000-00-00';
if ($with_quotes) if ($with_quotes)
return '\''.pSQL($value).'\''; return '\''.pSQL($value).'\'';
return pSQL($value); return pSQL($value);
@@ -547,7 +548,15 @@ abstract class ObjectModelCore
{ {
$fields['id_shop'] = (int)$id_shop; $fields['id_shop'] = (int)$id_shop;
$all_fields['id_shop'] = (int)$id_shop; $all_fields['id_shop'] = (int)$id_shop;
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values, true, Db::REPLACE); $where = $this->def['primary'].' = '.(int)$this->id.' AND id_shop = '.(int)$id_shop;
// A little explanation of what we do here : we want to create multishop entry when update is called, but
// only if we are in a shop context (if we are in all context, we just want to update entries that alread exists)
$shop_exists = Db::getInstance()->getValue('SELECT '.$this->def['primary'].' FROM '._DB_PREFIX_.$this->def['table'].'_shop WHERE '.$where);
if ($shop_exists)
$result &= Db::getInstance()->update($this->def['table'].'_shop', $fields, $where, 0, $null_values);
else if (Shop::getContext() == Shop::CONTEXT_SHOP)
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $all_fields, $null_values);
} }
} }
@@ -577,7 +586,10 @@ abstract class ObjectModelCore
.' AND id_lang = '.(int)$field['id_lang'] .' AND id_lang = '.(int)$field['id_lang']
.' AND id_shop = '.$field['id_shop']; .' AND id_shop = '.$field['id_shop'];
$result &= Db::getInstance()->update($this->def['table'].'_lang', $field, $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);
else
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
} }
} }
// If this table is not linked to multishop system ... // If this table is not linked to multishop system ...
@@ -678,7 +690,6 @@ abstract class ObjectModelCore
$this->active = !(int)$this->active; $this->active = !(int)$this->active;
// Change status to active/inactive // Change status to active/inactive
$this->insert_missing_shop = false;
return $this->update(false); return $this->update(false);
} }
@@ -1172,7 +1183,6 @@ abstract class ObjectModelCore
{ {
$def = ObjectModel::getDefinition($classname); $def = ObjectModel::getDefinition($classname);
$update_data = array(); $update_data = array();
$is_default_shop = Context::getContext()->shop->id == Configuration::get('PS_SHOP_DEFAULT');
foreach ($data as $field => $value) foreach ($data as $field => $value)
{ {
if (!isset($def['fields'][$field])) if (!isset($def['fields'][$field]))
@@ -1180,8 +1190,7 @@ abstract class ObjectModelCore
if (!empty($def['fields'][$field]['shop'])) if (!empty($def['fields'][$field]['shop']))
{ {
if ($is_default_shop) $update_data[] = "a.$field = '$value'";
$update_data[] = "a.$field = '$value'";
$update_data[] = "{$def['table']}_shop.$field = '$value'"; $update_data[] = "{$def['table']}_shop.$field = '$value'";
} }
else else