Risposte:
La prima cosa che devi fare è creare una connessione in config.xml del tuo modulo. Dovrebbe apparire simile al default_setup
tuo /app/etc/local.xml
. Qui è possibile specificare l'host come localhost e quindi impostare un nome db diverso oppure è possibile specificare un host diverso completamente. Ho anche usato un socket prima del quale funziona anche.
<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>
Ora dopo questo sarai in grado di connetterti a questo database ed eseguire le query come segue:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
Se si vuole fare questo attraverso un modello di allora è possibile specificare la read
, write
e setup
le risorse nel modo seguente. Ciò verrà eseguito nuovamente all'interno del resources
nodo in config.xml e dovresti sostituirlo test
con quello del tuo modello.
<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>
Il modello stesso tenterà di trovare le informazioni di connessione nella funzione getConnection
/app/code/core/Mage/Core/Model/Resource.php
. Se si accede al $name
passato in vedrete valori come poll_write
, tag_write
e cms_read
dove la prima parte riconosce la sezione modelli in config.xml, nel nostro caso si vedrebbe test_write
, test_read
o test_setup
. Se non riesce a trovare una connessione che soddisfa questa allora sarà utilizzare i collegamenti di default core_read
, core_write
ocore_setup
Dopo aver letto tutte queste risposte, cercato e fatto alcuni test ho trovato questa soluzione. Ecco il mio blog in cui ho scritto la soluzione .
Lavorando con Magento 1.9 mi è stato chiesto di effettuare più connessioni di lettura e scrittura. Magento ha la possibilità di configurare connessioni di lettura e scrittura in /etc/local.xml. Basta impostare il tag use per far sapere a Magento quale è disponibile.
<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>
Possiamo definire n connessioni nello stesso file di configurazione come in questo esempio di 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>
Il limite è che le connessioni vengono applicate all'intero sistema ma la mia idea è quella di impostare solo per determinate risorse. In questo caso, ho un modulo di report personalizzato in cui desidero solo effettuare connessioni di lettura nella tabella degli ordini. Dopo aver sostituito la risorsa Ordine Mago / Vendite / Modello / Risorsa / Ordine.php Basta apportare 3 aggiornamenti
//bandiera public $ reportConnection = false; / ** * Basta aggiungere la connessione definita in local.xml 'test_read' * / funzione protetta _construct () { $ this -> _ init ('sales / order', 'entity_id'); $ This -> _ risorse-> getConnection ( 'test_read'); } / ** * Effettuare la connessione se la bandiera è impostata * / funzione protetta _getConnection ($ connectionName) { if (isset ($ this -> _ connections [$ connectionName])) { restituisce $ this -> _ connections [$ connectionName]; } if ($ connectionName == 'read' && $ this-> reportConnection) $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ('test_read'); altro{ if (! empty ($ this -> _ resourcePrefix)) { $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ( $ this -> _ resourcePrefix. '_'. $ ConnectionName); } altro { $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName); } } restituisce $ this -> _ connections [$ connectionName]; }
L'ultimo passaggio consiste nel chiamare una raccolta ordini ma utilizzando la connessione test_read.
//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
Nel tuo modulo etc / config.xml aggiungi il seguente codice:
<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>
Per ottenere dati dalla tabella utilizzando il nuovo database:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>