Réponses:
La première chose que vous devez faire est de créer une connexion dans le config.xml de votre module. Il devrait ressembler à celui default_setupde votre /app/etc/local.xml. Ici, vous pouvez spécifier l'hôte comme localhost, puis définir un autre nom de base de données ou vous pouvez spécifier un hôte différent complètement. J'ai également utilisé une prise avant qui fonctionne également.
<resources>
<new_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[db_name]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</new_db>
</resources>
Maintenant, après cela, vous pourrez vous connecter à cette base de données et effectuer des requêtes comme suit:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
Si vous voulez le faire via un modèle , vous pouvez spécifier le read, writeet les setupressources comme suit. Cela se fera à nouveau à l'intérieur du resourcesnœud dans votre config.xml et vous devez le remplacer testpar ce que votre modèle a été configuré.
<resources>
<new_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[db_name]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</new_db>
<test_write>
<connection>
<use>new_db</use>
</connection>
</test_write>
<test_read>
<connection>
<use>new_db</use>
</connection>
</test_read>
<test_setup>
<connection>
<use>new_db</use>
</connection>
</test_setup>
</resources>
<models>
<test>
<class>My_Test_Model</class>
<resourceModel>test_resource</resourceModel>
</test>
<test_resource>
<class>My_Test_Model_Resource</class>
<entities>
<test>
<table>test</table>
</test>
</entities>
</test_resource>
</models>
Le modèle lui-même essaiera de trouver ses informations de connexion dans la fonction getConnection /app/code/core/Mage/Core/Model/Resource.php. Si vous vous connectez, $namevous verrez des valeurs comme poll_write, tag_writeet cms_readoù la première partie correspond à la section des modèles dans le config.xml, dans notre cas, vous verrez test_write, test_readou test_setup. S'il ne trouve pas de connexion correspondant à cela, il utilisera les connexions par défaut core_read, core_writeoucore_setup
Après avoir lu toutes ces réponses, recherché et fait quelques tests, j'ai trouvé cette solution. Voici mon blog où j'ai écrit la solution .
En travaillant avec Magento 1.9, on m'a demandé de faire plusieurs connexions en lecture et en écriture. Magento a la possibilité de configurer les connexions de lecture et d'écriture dans /etc/local.xml. Il vous suffit de définir l'utilisation du tag pour que Magento sache lequel est disponible.
<default_setup>
<connection>
<!-- LOCALHOST -->
<host>localhost</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</connection>
</default_setup>
<default_read>
<connection>
<use/>
<!-- ANOTHER SERVER -->
<host>other_server</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</use></connection>
</default_read>
<default_write>
<connection>
<use/>
<!-- LOCALHOST -->
<host>localhost</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</use></connection>
</default_write>
Nous pouvons définir n connexions dans le même fichier de configuration comme cet exemple de test
<test_read>
<connection>
<!-- TEST SERVER -->
<host>test_server</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</connection>
</test_read>
La limite est que les connexions sont appliquées à l'ensemble du système mais mon idée est de ne définir que pour certaines ressources. Dans ce cas, j'ai un module de rapport personnalisé où je veux uniquement établir des connexions de lecture dans la table Order. Après avoir remplacé la ressource Order Mage / Sales / Model / Resource / Order.php Il suffit de faire 3 mises à jour
//drapeau
public $ reportConnection = false;
/ **
* Ajoutez simplement la connexion définie dans le fichier local.xml 'test_read'
* /
fonction protégée _construct () {
$ this -> _ init ('sales / order', 'entity_id');
$ this -> _ resources-> getConnection ('test_read');
}
/ **
* Établissez la connexion si le drapeau est défini
* /
fonction protégée _getConnection ($ connectionName) {
if (isset ($ this -> _ connections [$ connectionName])) {
return $ this -> _ connections [$ connectionName];
}
if ($ connectionName == 'read' && $ this-> reportConnection)
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ('test_read');
autre{
if (! empty ($ this -> _ resourcePrefix)) {
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection (
$ this -> _ resourcePrefix. '_'. $ connectionName);
} autre {
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName);
}
}
return $ this -> _ connections [$ connectionName];
}
La dernière étape consiste à appeler une collection Order mais en utilisant la connexion test_read.
//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
Dans votre module etc / config.xml ajoutez le code suivant:
<global>
<resources>
<modulename_write>
<connection>
<use>modulename_database</use>
</connection>
</modulename_write>
<modulename_read>
<connection>
<use>modulename_database</use>
</connection>
</modulename_read>
<modulename_setup>
<connection>
<use>core_setup</use>
</connection>
</modulename_setup>
<modulename_database>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[tablename]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</modulename_database>
</resources>
</global>
Pour obtenir des données d'une table à l'aide d'une nouvelle base de données:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>