cara menghubungkan database lain dari Magento

17

Apakah mungkin untuk terhubung ke database lain dari Magento dan mengakses data?

Jika saya perlu membuat modul, bagaimana saya bisa membuat modul untuk mengakses database lain? Apakah ada tutorial yang menceritakan hal yang sama dari awal? Ada ide?

bab
sumber

Jawaban:

18

Hal pertama yang perlu Anda lakukan adalah membuat koneksi di config.xml modul Anda. Seharusnya terlihat mirip dengan default_setupdi Anda /app/etc/local.xml. Di sini Anda dapat menentukan host menjadi localhost dan kemudian mengatur dbname yang berbeda atau Anda dapat menentukan host yang berbeda sepenuhnya. Saya juga menggunakan soket yang sebelumnya juga berfungsi.

<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>

Sekarang setelah ini, Anda akan dapat terhubung ke database ini dan melakukan kueri sebagai berikut:

$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results    = $connection->query('SELECT * FROM table');

Jika Anda ingin melakukan ini melalui model maka Anda dapat menentukan read, writedan setupsumber daya sebagai berikut. Ini lagi akan dilakukan di dalam resourcesnode di config.xml Anda dan Anda harus mengganti testdengan model yang telah Anda setup.

<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>

Model itu sendiri akan mencoba menemukan informasi koneksi dalam fungsinya getConnection /app/code/core/Mage/Core/Model/Resource.php. Jika Anda login yang $namedilewati Anda akan melihat nilai-nilai seperti poll_write, tag_writedan di cms_readmana bagian pertama cocok dengan bagian model di config.xml, dalam kasus kami Anda akan melihat test_write, test_readatau test_setup. Jika tidak dapat menemukan koneksi yang cocok dengan ini maka itu akan menggunakan koneksi default core_read, core_writeataucore_setup

David Manners
sumber
maaf, itu tidak berhasil untuk saya.
bab
Saya tidak mengerti di mana harus menulis kode ini, di mana harus melakukan query dan apa yang harus dilakukan dalam hal ini. Sebagai contoh apakah saya mengetikkan <host><![CDATA[localhost[[> </host> atau <host> localhost </ host> dll
bab
@ bak apakah Anda ingin membuat permintaan tunggal atau model yang berfungsi dengan database lain?
David Manners
Saya membuat permintaan tunggal tetapi jika memungkinkan melalui model juga. Sebenarnya saya bekerja di situs survei. saya ingin mengakses databse situs ini melalui magento.I membaca begitu banyak artikel untuk hal yang sama tetapi saya tidak tahu di mana harus meletakkan kode ini. Jika mungkin tolong beri tahu saya perubahan apa yang dapat saya lakukan dalam pengkodean Anda untuk mendapatkan hasil yang diinginkan. Terima kasih.
bab
@ ambil contoh config.xml kedua harus bekerja untuk model. apakah Anda mendapatkan kesalahan dengan kode?
David Manners
3

Setelah membaca semua jawaban ini, mencari dan membuat beberapa tes saya menemukan solusi ini. Ini blog saya tempat saya menulis solusinya .

Bekerja dengan Magento 1.9 Saya diminta untuk membuat beberapa koneksi baca dan tulis. Magento memiliki kemungkinan untuk mengonfigurasi koneksi baca dan tulis di /etc/local.xml. Cukup atur penggunaan tag untuk memberi tahu Magento mana yang tersedia.

<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>

Kita dapat mendefinisikan n koneksi dalam file konfigurasi yang sama seperti contoh pengujian ini

<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>

Batasnya adalah bahwa koneksi diterapkan ke seluruh sistem tetapi ide saya adalah hanya mengatur sumber daya tertentu. Dalam hal ini saya memiliki modul laporan khusus di mana saya hanya ingin membuat koneksi baca di tabel pesanan. Setelah mengganti Mage sumber daya Order / Penjualan / Model / Sumber Daya / Order.php Cukup buat 3 pembaruan

  1. Buat tanda untuk mengetahui jika saatnya mengubah koneksi $ reportConnection.
  2. Perbarui fungsi _construct () untuk membuat koneksi khusus dan menambahkannya ke array sumber daya.
  3. Perbarui fungsi _getConnection () untuk memutuskan apakah menggunakan koneksi khusus.
//bendera
public $ reportConnection = false;

/ **
* Cukup tambahkan koneksi yang ditentukan dalam local.xml 'test_read'
* /
fungsi terproteksi _construct () {
    $ this -> _ init ('penjualan / pesanan', 'entity_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Buat koneksi jika bendera diatur
* /
fungsi terproteksi _getConnection ($ connectionName) {
 if (isset ($ this -> _ koneksi [$ connectionName])) {
   return $ this -> _ koneksi [$ connectionName];
    }

   if ($ connectionName == 'read' && $ this-> reportConnection)
        $ this -> _ koneksi [$ connectionName] = $ this -> _ resources-> getConnection ('test_read');
   lain{
   if (! empty ($ this -> _ resourcePrefix)) {
      $ this -> _ koneksi [$ connectionName] = $ this -> _ resources-> getConnection (
      $ this -> _ resourcePrefix. '_'. $ connectionName);
  } lain {
   $ this -> _ koneksi [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName);
  }
   }
   return $ this -> _ koneksi [$ connectionName];
}

Langkah terakhir adalah membuat panggilan koleksi pesanan tetapi menggunakan koneksi test_read.

//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
abelbm
sumber
1

Dalam modul Anda, etc / config.xml tambahkan kode berikut:

<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>

Untuk mendapatkan data dari tabel menggunakan database baru:

<?php 
    $resource   = Mage::getSingleton('core/resource');
    $conn       = $resource->getConnection('modulename_read');
    $results    = $conn->fetchAll('SELECT * FROM tablename');

    echo "<pre>";
    print_r($results);
?>
Pangeran Patel
sumber