// Changed the way the multistore associations are loaded, far from perfect, but still better and overridable
This commit is contained in:
@@ -1305,10 +1305,10 @@ abstract class AdminTabCore
|
|||||||
$whereShop = Shop::addSqlRestriction($this->shopShareDatas, 'a', $this->shopLinkType);
|
$whereShop = Shop::addSqlRestriction($this->shopShareDatas, 'a', $this->shopLinkType);
|
||||||
}
|
}
|
||||||
|
|
||||||
$assos = Shop::getAssoTables();
|
$asso = Shop::getAssoTable($this->table);
|
||||||
if (isset($assos[$this->table]) && $assos[$this->table]['type'] == 'shop')
|
if ($asso !== false && $assos['type'] == 'shop')
|
||||||
{
|
{
|
||||||
$filterKey = $assos[$this->table]['type'];
|
$filterKey = $asso['type'];
|
||||||
$idenfierShop = Shop::getContextListShopID();
|
$idenfierShop = Shop::getContextListShopID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -467,16 +467,15 @@ abstract class ObjectModelCore
|
|||||||
if (!$result)
|
if (!$result)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
$assos = Shop::getAssoTables();
|
|
||||||
|
|
||||||
// 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']))
|
||||||
{
|
{
|
||||||
$fields = $this->getFieldsLang();
|
$fields = $this->getFieldsLang();
|
||||||
|
|
||||||
// @todo : try to do something better than this
|
|
||||||
$shops = Shop::getCompleteListOfShopsID();
|
|
||||||
if ($fields && is_array($fields))
|
if ($fields && is_array($fields))
|
||||||
|
{
|
||||||
|
$shops = Shop::getCompleteListOfShopsID();
|
||||||
|
$asso = Shop::getAssoTable($this->def['table'].'_lang');
|
||||||
foreach ($fields as $field)
|
foreach ($fields as $field)
|
||||||
{
|
{
|
||||||
foreach (array_keys($field) as $key)
|
foreach (array_keys($field) as $key)
|
||||||
@@ -484,7 +483,7 @@ abstract class ObjectModelCore
|
|||||||
throw new PrestaShopException('key '.$key.' is not table or identifier, ');
|
throw new PrestaShopException('key '.$key.' is not table or identifier, ');
|
||||||
$field[$this->def['primary']] = (int)$this->id;
|
$field[$this->def['primary']] = (int)$this->id;
|
||||||
|
|
||||||
if (isset($assos[$this->def['table'].'_lang']) && $assos[$this->def['table'].'_lang']['type'] == 'fk_shop')
|
if ($asso !== false && $asso['type'] == 'fk_shop')
|
||||||
{
|
{
|
||||||
foreach ($shops as $id_shop)
|
foreach ($shops as $id_shop)
|
||||||
{
|
{
|
||||||
@@ -495,6 +494,7 @@ abstract class ObjectModelCore
|
|||||||
else
|
else
|
||||||
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
|
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @hook actionObject*AddAfter
|
// @hook actionObject*AddAfter
|
||||||
@@ -1004,11 +1004,10 @@ abstract class ObjectModelCore
|
|||||||
|
|
||||||
public function getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit)
|
public function getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit)
|
||||||
{
|
{
|
||||||
$assoc = Shop::getAssoTables();
|
$assoc = Shop::getAssoTable($this->def['table']);
|
||||||
|
if ($assoc !== false)
|
||||||
if (array_key_exists($this->def['table'], $assoc))
|
|
||||||
{
|
{
|
||||||
$multi_shop_join = ' LEFT JOIN `'._DB_PREFIX_.bqSQL($this->def['table']).'_'.bqSQL($assoc[$this->def['table']]['type']).'`
|
$multi_shop_join = ' LEFT JOIN `'._DB_PREFIX_.bqSQL($this->def['table']).'_'.bqSQL($assoc['type']).'`
|
||||||
AS multi_shop_'.bqSQL($this->def['table']).'
|
AS multi_shop_'.bqSQL($this->def['table']).'
|
||||||
ON (main.'.bqSQL($this->def['primary']).' = multi_shop_'.bqSQL($this->def['table']).'.'.bqSQL($this->def['primary']).')';
|
ON (main.'.bqSQL($this->def['primary']).' = multi_shop_'.bqSQL($this->def['table']).'.'.bqSQL($this->def['primary']).')';
|
||||||
$class_name = WebserviceRequest::$ws_current_classname;
|
$class_name = WebserviceRequest::$ws_current_classname;
|
||||||
|
|||||||
+67
-40
@@ -85,44 +85,8 @@ class ShopCore extends ObjectModel
|
|||||||
/** @var array List of shops cached */
|
/** @var array List of shops cached */
|
||||||
protected static $shops;
|
protected static $shops;
|
||||||
|
|
||||||
public static $asso_tables = array(
|
protected static $asso_tables = array();
|
||||||
'carrier' => array('type' => 'shop'),
|
protected static $initialized = false;
|
||||||
'carrier_lang' => array('type' => 'fk_shop'),
|
|
||||||
'category' => array('type' => 'shop'),
|
|
||||||
'category_lang' => array('type' => 'fk_shop'),
|
|
||||||
'cms' => array('type' => 'shop'),
|
|
||||||
'contact' => array('type' => 'shop'),
|
|
||||||
'country' => array('type' => 'shop'),
|
|
||||||
'currency' => array('type' => 'shop'),
|
|
||||||
'employee' => array('type' => 'shop'),
|
|
||||||
'hook_module' => array('type' => 'fk_shop'),
|
|
||||||
'hook_module_exceptions' => array('type' => 'fk_shop', 'primary' => 'id_hook_module_exceptions'),
|
|
||||||
'image' => array('type' => 'shop'),
|
|
||||||
'lang' => array('type' => 'shop'),
|
|
||||||
'meta_lang' => array('type' => 'fk_shop'),
|
|
||||||
'module' => array('type' => 'shop'),
|
|
||||||
'module_currency' => array('type' => 'fk_shop'),
|
|
||||||
'module_country' => array('type' => 'fk_shop'),
|
|
||||||
'module_group' => array('type' => 'fk_shop'),
|
|
||||||
'product' => array('type' => 'shop'),
|
|
||||||
'product_attribute' => array('type' => 'shop'),
|
|
||||||
'product_lang' => array('type' => 'fk_shop'),
|
|
||||||
'referrer' => array('type' => 'shop'),
|
|
||||||
'scene' => array('type' => 'shop'),
|
|
||||||
'store' => array('type' => 'shop'),
|
|
||||||
'webservice_account' => array('type' => 'shop'),
|
|
||||||
'warehouse' => array('type' => 'shop'),
|
|
||||||
'stock_available' => array('type' => 'fk_shop'),
|
|
||||||
'carrier_tax_rules_group_shop' => array('type' => 'fk_shop'),
|
|
||||||
'attribute' => array('type' => 'shop'),
|
|
||||||
'feature' => array('type' => 'shop'),
|
|
||||||
'group' => array('type' => 'shop'),
|
|
||||||
'attribute_group' => array('type' => 'shop'),
|
|
||||||
'tax_rules_group' => array('type' => 'shop'),
|
|
||||||
'zone' => array('type' => 'shop'),
|
|
||||||
'manufacturer' => array('type' => 'shop'),
|
|
||||||
'supplier' => array('type' => 'shop'),
|
|
||||||
);
|
|
||||||
|
|
||||||
protected $webserviceParameters = array(
|
protected $webserviceParameters = array(
|
||||||
'fields' => array(
|
'fields' => array(
|
||||||
@@ -167,6 +131,53 @@ class ShopCore extends ObjectModel
|
|||||||
if ($this->id)
|
if ($this->id)
|
||||||
$this->setUrl();
|
$this->setUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize an array with all the multistore associations in the database
|
||||||
|
* You can override this method in order to add a new association
|
||||||
|
*/
|
||||||
|
protected static function init()
|
||||||
|
{
|
||||||
|
Shop::$asso_tables = array(
|
||||||
|
'carrier' => array('type' => 'shop'),
|
||||||
|
'carrier_lang' => array('type' => 'fk_shop'),
|
||||||
|
'category' => array('type' => 'shop'),
|
||||||
|
'category_lang' => array('type' => 'fk_shop'),
|
||||||
|
'cms' => array('type' => 'shop'),
|
||||||
|
'contact' => array('type' => 'shop'),
|
||||||
|
'country' => array('type' => 'shop'),
|
||||||
|
'currency' => array('type' => 'shop'),
|
||||||
|
'employee' => array('type' => 'shop'),
|
||||||
|
'hook_module' => array('type' => 'fk_shop'),
|
||||||
|
'hook_module_exceptions' => array('type' => 'fk_shop', 'primary' => 'id_hook_module_exceptions'),
|
||||||
|
'image' => array('type' => 'shop'),
|
||||||
|
'lang' => array('type' => 'shop'),
|
||||||
|
'meta_lang' => array('type' => 'fk_shop'),
|
||||||
|
'module' => array('type' => 'shop'),
|
||||||
|
'module_currency' => array('type' => 'fk_shop'),
|
||||||
|
'module_country' => array('type' => 'fk_shop'),
|
||||||
|
'module_group' => array('type' => 'fk_shop'),
|
||||||
|
'product' => array('type' => 'shop'),
|
||||||
|
'product_attribute' => array('type' => 'shop'),
|
||||||
|
'product_lang' => array('type' => 'fk_shop'),
|
||||||
|
'referrer' => array('type' => 'shop'),
|
||||||
|
'scene' => array('type' => 'shop'),
|
||||||
|
'store' => array('type' => 'shop'),
|
||||||
|
'webservice_account' => array('type' => 'shop'),
|
||||||
|
'warehouse' => array('type' => 'shop'),
|
||||||
|
'stock_available' => array('type' => 'fk_shop'),
|
||||||
|
'carrier_tax_rules_group_shop' => array('type' => 'fk_shop'),
|
||||||
|
'attribute' => array('type' => 'shop'),
|
||||||
|
'feature' => array('type' => 'shop'),
|
||||||
|
'group' => array('type' => 'shop'),
|
||||||
|
'attribute_group' => array('type' => 'shop'),
|
||||||
|
'tax_rules_group' => array('type' => 'shop'),
|
||||||
|
'zone' => array('type' => 'shop'),
|
||||||
|
'manufacturer' => array('type' => 'shop'),
|
||||||
|
'supplier' => array('type' => 'shop'),
|
||||||
|
);
|
||||||
|
Shop::$initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
public function setUrl()
|
public function setUrl()
|
||||||
{
|
{
|
||||||
@@ -480,6 +491,18 @@ class ShopCore extends ObjectModel
|
|||||||
return $this->id == Configuration::get('PS_SHOP_DEFAULT');
|
return $this->id == Configuration::get('PS_SHOP_DEFAULT');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the associated table if available
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getAssoTable($table)
|
||||||
|
{
|
||||||
|
if (!Shop::$initialized)
|
||||||
|
Shop::init();
|
||||||
|
return (isset(Shop::$asso_tables[$table]) ? Shop::$asso_tables[$table] : false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get list of associated tables to shop
|
* Get list of associated tables to shop
|
||||||
*
|
*
|
||||||
@@ -487,6 +510,8 @@ class ShopCore extends ObjectModel
|
|||||||
*/
|
*/
|
||||||
public static function getAssoTables()
|
public static function getAssoTables()
|
||||||
{
|
{
|
||||||
|
if (!Shop::$initialized)
|
||||||
|
Shop::init();
|
||||||
return Shop::$asso_tables;
|
return Shop::$asso_tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,6 +523,8 @@ class ShopCore extends ObjectModel
|
|||||||
*/
|
*/
|
||||||
public static function isTableAssociated($table)
|
public static function isTableAssociated($table)
|
||||||
{
|
{
|
||||||
|
if (!Shop::$initialized)
|
||||||
|
Shop::init();
|
||||||
return isset(Shop::$asso_tables[$table]) && Shop::$asso_tables[$table]['type'] == 'shop';
|
return isset(Shop::$asso_tables[$table]) && Shop::$asso_tables[$table]['type'] == 'shop';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -854,8 +881,8 @@ class ShopCore extends ObjectModel
|
|||||||
if (strpos($table, '.') !== false)
|
if (strpos($table, '.') !== false)
|
||||||
list($table_alias, $table) = explode('.', $table);
|
list($table_alias, $table) = explode('.', $table);
|
||||||
|
|
||||||
$asso_tables = Shop::getAssoTables();
|
$asso_table = Shop::getAssoTable($table);
|
||||||
if (!isset($asso_tables[$table]) || $asso_tables[$table]['type'] != 'shop')
|
if ($asso_table === false || $asso_table['type'] != 'shop')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$sql = (($inner_join) ? ' INNER' : ' LEFT').' JOIN '._DB_PREFIX_.$table.'_shop '.$table_alias.'
|
$sql = (($inner_join) ? ' INNER' : ' LEFT').' JOIN '._DB_PREFIX_.$table.'_shop '.$table_alias.'
|
||||||
|
|||||||
@@ -1213,11 +1213,11 @@ class WebserviceRequestCore
|
|||||||
$this->fieldsToDisplay = 'full';
|
$this->fieldsToDisplay = 'full';
|
||||||
|
|
||||||
// Check if Object is accessible for this/those id_shop
|
// Check if Object is accessible for this/those id_shop
|
||||||
$assoc = Shop::getAssoTables();
|
$assoc = Shop::getAssoTable($this->resourceConfiguration['retrieveData']['table']);
|
||||||
if (array_key_exists($this->resourceConfiguration['retrieveData']['table'] ,$assoc))
|
if ($assoc !== false)
|
||||||
{
|
{
|
||||||
$sql = 'SELECT 1
|
$sql = 'SELECT 1
|
||||||
FROM '.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table'].'_'.$assoc[$this->resourceConfiguration['retrieveData']['table']]['type']).' ';
|
FROM '.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table'].'_'.$assoc['type']).' ';
|
||||||
foreach (self::$shopIDs as $id_shop)
|
foreach (self::$shopIDs as $id_shop)
|
||||||
$OR[] = ' id_shop = '.(int)$id_shop.' ';
|
$OR[] = ' id_shop = '.(int)$id_shop.' ';
|
||||||
$check = ' WHERE ('.implode('OR', $OR).') AND '.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).' = '.(int)$this->urlSegment[1];
|
$check = ' WHERE ('.implode('OR', $OR).') AND '.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).' = '.(int)$this->urlSegment[1];
|
||||||
@@ -1513,11 +1513,11 @@ class WebserviceRequestCore
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$assoc = Shop::getAssoTables();
|
$assoc = Shop::getAssoTable($this->resourceConfiguration['retrieveData']['table']);
|
||||||
if (array_key_exists($this->resourceConfiguration['retrieveData']['table'] ,$assoc))
|
if ($assoc !== false)
|
||||||
{
|
{
|
||||||
// PUT nor POST is destructive, no deletion
|
// PUT nor POST is destructive, no deletion
|
||||||
$sql = 'INSERT IGNORE INTO `'.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table'].'_'.$assoc[$this->resourceConfiguration['retrieveData']['table']]['type']).'` (id_shop, '.pSQL($this->resourceConfiguration['fields']['id']['sqlId']).') VALUES ';
|
$sql = 'INSERT IGNORE INTO `'.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table'].'_'.$assoc['type']).'` (id_shop, '.pSQL($this->resourceConfiguration['fields']['id']['sqlId']).') VALUES ';
|
||||||
foreach (self::$shopIDs as $id)
|
foreach (self::$shopIDs as $id)
|
||||||
{
|
{
|
||||||
$sql .= '('.(int)$id.','.(int)$object->id.')';
|
$sql .= '('.(int)$id.','.(int)$object->id.')';
|
||||||
|
|||||||
@@ -468,8 +468,8 @@ class InstallXmlLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store INSERT queries for _shop associations
|
// Store INSERT queries for _shop associations
|
||||||
$asso_shop = Shop::getAssoTables();
|
$entity_asso = Shop::getAssoTable($entity);
|
||||||
if (isset($asso_shop[$entity]) && $asso_shop[$entity]['type'] == 'shop')
|
if ($entity_asso !== false && $entity_asso['type'] == 'shop')
|
||||||
$this->delayed_inserts[$entity.'_shop'][] = array(
|
$this->delayed_inserts[$entity.'_shop'][] = array(
|
||||||
'id_shop' => 1,
|
'id_shop' => 1,
|
||||||
'id_'.$entity => $entity_id,
|
'id_'.$entity => $entity_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user