Odpowiedzi:
Pierwszą rzeczą, którą musisz zrobić, to utworzyć połączenie w pliku config.xml modułu. Powinien wyglądać podobnie do default_setup
twojego /app/etc/local.xml
. W tym miejscu możesz określić hosta jako hosta lokalnego, a następnie ustawić inną nazwę dbname lub możesz całkowicie określić innego hosta. Użyłem również gniazda, przed którym również działa.
<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>
Teraz po tym będziesz mógł połączyć się z tą bazą danych i wykonać zapytania w następujący sposób:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
Jeśli chcesz to zrobić za pośrednictwem modelu to można określić read
, write
a setup
zasoby w sposób następujący. Zostanie to ponownie wykonane wewnątrz resources
węzła w pliku config.xml i powinieneś zastąpić test
to, co twój model został skonfigurowany jako.
<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>
Sam model spróbuje znaleźć informacje o połączeniu w funkcji getConnection
/app/code/core/Mage/Core/Model/Resource.php
. Jeśli zalogujesz $name
przekazany widać wartości jak poll_write
, tag_write
i cms_read
gdzie pierwsza część pasuje do modeli w sekcji config.xml, w naszym przypadku byłoby widać test_write
, test_read
albo test_setup
. Jeśli nie można znaleźć połączenia dopasowanie to wtedy będzie korzystać z połączenia domyślne core_read
, core_write
lubcore_setup
Po przeczytaniu wszystkich odpowiedzi, przeszukaniu i wykonaniu testu znalazłem to rozwiązanie. Oto mój blog, na którym napisałem rozwiązanie .
Pracując z Magento 1.9 zostałem poproszony o wykonanie wielu połączeń odczytu i zapisu. Magento ma możliwość konfiguracji połączeń do odczytu i zapisu w pliku /etc/local.xml. Wystarczy ustawić użycie tagu, aby Magento wiedział, który jest dostępny.
<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>
Możemy zdefiniować n połączeń w tym samym pliku konfiguracyjnym, jak w tym przykładzie testowym
<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>
Ograniczeniem jest to, że połączenia są stosowane do całego systemu, ale moim pomysłem jest ustawienie tylko dla niektórych zasobów. W tym przypadku mam niestandardowy moduł raportu, w którym chcę tylko nawiązywać połączenia odczytu w tabeli Zamówienia. Po przesłonięciu Magazynu Zasób Mag / Sprzedaż / Model / Zasób / Order.php Po prostu dokonaj 3 aktualizacji
//flaga public $ reportConnection = false; / ** * Po prostu dodaj połączenie zdefiniowane w pliku local.xml „test_read” * / funkcja chroniona _construct () { $ this -> _ init ('sprzedaż / zamówienie', 'podmiot_id'); $ this -> _ resources-> getConnection ('test_read'); } / ** * Nawiąż połączenie, jeśli flaga jest ustawiona * / funkcja chroniona _getConnection ($ connectionName) { if (isset ($ this -> _ połączenia [$ connectionName])) { zwróć $ this -> _ połączenia [$ connectionName]; } if ($ connectionName == 'czytaj' && $ this-> reportConnection) $ this -> _ connection [$ connectionName] = $ this -> _ resources-> getConnection ('test_read'); jeszcze{ if (! empty ($ this -> _ resourcePrefix)) { $ this -> _ połączeń [$ connectionName] = $ this -> _ resources-> getConnection ( $ this -> _ resourcePrefix. „_”. $ connectionName); } else { $ this -> _ połączenia [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName); } } zwróć $ this -> _ połączenia [$ connectionName]; }
Ostatnim krokiem jest wywołanie kolekcji zamówień, ale przy użyciu połączenia test_read.
//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
W swoim module etc / config.xml dodaj następujący kod:
<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>
Aby uzyskać dane z tabeli przy użyciu nowej bazy danych:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>