Solution trouvée… jusqu’au prochain problème…!
(Il s’agissait de ta première suggestion RadicalDingos)
Dans ma config j’ai déclaré une connexion à une autre base de donnée :
'components' => array(
//Base de donnée principale
'db' => array(
'connectionString' => 'mysql:host=' . HOST . ';dbname=' . BASE,
'username' => USER,
'password' => PASS,
'charset' => 'utf8'
),
//Base de donnée d'un magasin spécifique
'dbsecond' => array(
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=' . HOST . ';dbname=' . BASE.'%s',
'autoConnect' => false,
'username' => USER,
'password' => PASS,
'charset' => 'utf8'
)
),
//Permet de réattribuer un nouveau magasin sans REGEX
'params' => array(
'ConnectionString' => 'mysql:host=' . HOST . ';dbname=' . STORE.'%s',
);
Je peux moduler ma connexion à la base de donnée secondaire en fonction du magasin, avec sprintf :
$dbsecond = Yii::app()->dbsecond;
$dbsecond->active = false;
$dbsecond->connectionString = sprintf(Yii::app()->params['ConnectionString'], $store);
$dbsecond->active = true;
Et pour tous les modèles communs à toutes les bases de données des magasins, j’ai crée une classe dans components qui étend la classe GxActiveRecord :
abstract class StoreGxActiveRecord extends GxActiveRecord {
public static $dbsecond;
public function getDbConnection()
{
if (self::$dbsecond!==null)
return self::$dbsecond;
else
{
self::$dbsecond=Yii::app()->dbsecond;
if (self::$dbsecond instanceof CDbConnection)
return self::$dbsecond;
else
throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
}
}
}
et chaque modèle étend cette nouvelle classe.
abstract class BaseProduct extends StoreGxActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
...}
Du coup, plus de variable de sessions =) et toutes mes classes ont été allégées !!