Ответы:
Первое, что вам нужно сделать, это создать соединение в файле config.xml вашего модуля. Это должно выглядеть примерно так же, как default_setup
у вас /app/etc/local.xml
. Здесь вы можете указать хост в качестве локального хоста, а затем установить другое имя базы данных или вы можете полностью указать другой хост. Я также использовал сокет, до которого тоже работает.
<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>
Теперь после этого вы сможете подключиться к этой базе данных и выполнить следующие запросы:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
Если вы хотите сделать это с помощью модели , то вы можете указать read
, write
и setup
ресурсы следующим образом . Это снова будет сделано внутри resources
узла в вашем config.xml, и вы должны заменить его test
тем, что было установлено в вашей модели.
<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>
Сама модель попытается найти информацию о подключении в функции getConnection
/app/code/core/Mage/Core/Model/Resource.php
. Если вы зарегистрируете $name
переданные данные, вы увидите такие значения, как poll_write
, tag_write
и cms_read
где первая часть соответствует разделу моделей в config.xml, в нашем случае вы увидите test_write
, test_read
или test_setup
. Если он не может найти соединение, соответствующее этому, он будет использовать соединения по умолчанию core_read
, core_write
илиcore_setup
После прочтения всех этих ответов, поиска и тестирования я нашел это решение. Вот мой блог, где я написал решение .
Работа с Magento 1.9 Меня попросили установить несколько соединений для чтения и записи. Magento имеет возможность настроить подключения для чтения и записи в /etc/local.xml. Просто установите использование тега, чтобы Magento знал, какой из них доступен.
<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>
Мы можем определить n соединений в одном и том же конфигурационном файле, как в этом тестовом примере.
<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>
Ограничение состоит в том, что соединения применяются ко всей системе, но моя идея - устанавливать только для определенных ресурсов. В этом случае у меня есть пользовательский модуль отчетов, в котором я хочу только устанавливать соединения для чтения в таблице Order. После переопределения ресурса Order Mage / Sales / Model / Resource / Order.php достаточно сделать 3 обновления
//флаг public $ reportConnection = false; / ** * Просто добавьте соединение, определенное в local.xml 'test_read' * / защищенная функция _construct () { $ this -> _ init ('sales / order', 'entity_id'); $ Это -> _ ресурсо-> GetConnection ( 'test_read'); } / ** * Установите соединение, если установлен флаг * / защищенная функция _getConnection ($ connectionName) { if (isset ($ this -> _ connections [$ connectionName])) { вернуть $ this -> _ connections [$ connectionName]; } if ($ connectionName == 'read' && $ this-> reportConnection) $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ('test_read'); еще { if (! empty ($ this -> _ resourcePrefix)) { $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ( $ this -> _ resourcePrefix. '_'. $ ConnectionName); } еще { $ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName); } } вернуть $ this -> _ connections [$ connectionName]; }
Последний шаг - вызвать коллекцию Order, но используя соединение test_read.
//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
В вашем модуле etc / config.xml добавьте следующий код:
<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>
Чтобы получить данные из таблицы, используя новую базу данных:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>