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_setup
de 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
, write
et les setup
ressources comme suit. Cela se fera à nouveau à l'intérieur du resources
nœud dans votre config.xml et vous devez le remplacer test
par 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, $name
vous verrez des valeurs comme poll_write
, tag_write
et cms_read
où la première partie correspond à la section des modèles dans le config.xml, dans notre cas, vous verrez test_write
, test_read
ou test_setup
. S'il ne trouve pas de connexion correspondant à cela, il utilisera les connexions par défaut core_read
, core_write
oucore_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);
?>