Відповіді:
Перше, що вам потрібно зробити, це створити з'єднання в config.xml вашого модуля. Це має виглядати аналогічно default_setup
вашому /app/etc/local.xml
. Тут ви можете вказати хост як localhost, а потім встановити інше dbname або ви можете повністю вказати інший хост. Я також використовував розетку, перед якою також працює.
<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>
Межа полягає в тому, що підключення застосовуються до всієї системи, але моя ідея полягає у встановленні лише для певних ресурсів. У цьому випадку у мене є спеціальний модуль звітів, у якому я хочу лише зробити з'єднання для читання у таблиці Порядок. Після відміни ресурсу замовлення Mage / Sales / Model / Resource / Order.php Просто зробіть 3 оновлення
// прапор public $ reportConnection = помилково; / ** * Просто додайте з'єднання, визначене у local.xml 'test_read' * / захищена функція _construct () { $ this -> _ init ("продаж / замовлення", "сутність_id"); $ this -> _ ресурси-> getConnection ('test_read'); } / ** * З'єднайте, якщо встановлено прапор * / захищена функція _getConnection ($ connectionName) { if (isset ($ this -> _ з'єднання [$ connectionName])) { повернути $ this -> _ з'єднання [$ connectionName]; } if ($ connectionName == 'read' && $ this-> reportConnection) $ this -> _ з'єднання [$ connectionName] = $ this -> _ ресурси-> getConnection ('test_read'); ще { if (! empty ($ this -> _ resourcePrefix)) { $ this -> _ з'єднання [$ connectionName] = $ this -> _ ресурси-> getConnection ( $ this -> _ resourcePrefix. '_'. $ connectionName); } else { $ this -> _ з'єднання [$ connectionName] = $ this -> _ ресурси-> getConnection ($ connectionName); } } повернути $ this -> _ з'єднання [$ connectionName]; }
Останнім кроком є здійснення виклику колекції замовлень, але за допомогою з'єднання 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);
?>