як підключити іншу базу даних від magento


17

Чи можливо підключитися до іншої бази даних від Magento та отримати доступ до даних?

Якщо мені потрібно створити модуль, як я можу створити модуль для доступу до іншої бази даних? Чи є підручник, який розповідає про те саме з нуля? Будь-яка ідея?

Відповіді:


18

Перше, що вам потрібно зробити, це створити з'єднання в 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


вибачте, це не працює для мене.
баб

Я не розумію, куди писати цей код, де виконувати запит і що робити в цьому. Для прикладу я вводя <host><! снимкиCDATA evidencelocalhostSenseSense> </host> або <host> localhost </ хост> тощо
bab

@bab Ви хочете зробити один запит або модель, яка працює з іншою базою даних?
Девід Маннерс

Я роблю один запит, але, якщо можливо, також через модель. Фактично я працюю на сайті опитування. Я хочу отримати доступ до бази даних цього веб-сайту через magento.Я читав стільки статей за один і той же, але я поняття не маю, куди поставити цей код. Якщо можливо, будь ласка, скажіть мені, які зміни я можу внести у ваше кодування, щоб отримати бажаний результат. Дякую.
баб

@bab другий приклад config.xml повинен працювати для моделі. ви мали помилки з кодом?
Девід Маннерс

3

Прочитавши всі ці відповіді, шукаючи і зробивши якийсь тест, я знайшов це рішення. Ось мій блог, де я написав рішення .

Працюючи з 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 оновлення

  1. Складіть прапор, щоб знати, чи настав час змінити з'єднання $ reportConnection.
  2. Оновіть функцію _construct (), щоб створити спеціальне з'єднання та додати його до масиву ресурсів.
  3. Оновіть функцію _getConnection (), щоб вирішити, чи використовувати користувацьке з'єднання.
// прапор
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();

1

У свій модуль 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);
?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.