Làm thế nào để kết nối cơ sở dữ liệu khác từ magento


17

Có thể kết nối với cơ sở dữ liệu khác từ Magento và truy cập dữ liệu không?

Nếu tôi cần tạo một mô-đun, làm thế nào tôi có thể tạo một mô-đun để truy cập cơ sở dữ liệu khác? Có hướng dẫn nào nói về điều tương tự từ đầu không? Bất kỳ ý tưởng?

Câu trả lời:


18

Điều đầu tiên bạn cần làm là tạo một kết nối trong tệp config.xml của mô-đun. Nó sẽ trông tương tự như default_setuptrong của bạn /app/etc/local.xml. Tại đây, bạn có thể chỉ định máy chủ là localhost và sau đó đặt một dbname khác hoặc bạn có thể chỉ định hoàn toàn một máy chủ khác. Tôi cũng đã sử dụng một ổ cắm trước đó cũng hoạt động.

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

Bây giờ sau này, bạn sẽ có thể kết nối với cơ sở dữ liệu này một truy vấn thực hiện như sau:

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

Nếu bạn muốn làm điều này thông qua một mô hình sau đó bạn có thể xác định read, writesetupcác nguồn tài nguyên như sau. Điều này một lần nữa sẽ được thực hiện bên trong resourcesnút trong tệp config.xml của bạn và bạn nên thay thế testbằng mô hình của bạn đã được thiết lập là.

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

Bản thân mô hình sẽ cố gắng tìm thông tin kết nối của nó trong hàm getConnection /app/code/core/Mage/Core/Model/Resource.php. Nếu bạn đăng nhập các $namethông qua trong bạn sẽ thấy giá trị như poll_write, tag_writecms_readnơi phần đầu tiên phù hợp với phần mô hình trong config.xml, trong trường hợp của chúng tôi bạn sẽ thấy test_write, test_readhoặc test_setup. Nếu nó không thể tìm thấy một kết nối phù hợp với điều này thì nó sẽ sử dụng các kết nối mặc định core_read, core_writehoặccore_setup


xin lỗi, nó không làm việc cho tôi
bab

Tôi không hiểu nơi để viết mã này, nơi thực hiện truy vấn và những gì cần trò chuyện trong phần này. Ví dụ: khi tôi nhập <host> <! [CDATA [localhost]]> </ host> hoặc <host> localhost </ máy chủ> vv
bab 18/11/13

@bab bạn có muốn tạo một truy vấn duy nhất hoặc một mô hình hoạt động với cơ sở dữ liệu khác không?
Phong tục David

Tôi đang thực hiện một truy vấn duy nhất nhưng nếu có thể thông qua mô hình. Thực tế tôi đang làm việc trên một trang khảo sát. Tôi muốn truy cập databse của trang web này thông qua magento. Tôi đã đọc rất nhiều bài viết cho cùng nhưng tôi không biết nên đặt mã này ở đâu. Nếu có thể xin vui lòng cho tôi biết những thay đổi tôi có thể thực hiện trong mã hóa của mình để có kết quả mong muốn. Xin cảm ơn.
bab

@bab ví dụ cấu hình thứ hai sẽ hoạt động cho mô hình. bạn có nhận được bất kỳ lỗi nào với mã không?
David Manners

3

Sau khi đọc tất cả các câu trả lời, tìm kiếm và thực hiện một số thử nghiệm tôi tìm thấy giải pháp này. Đây là blog của tôi, nơi tôi đã viết giải pháp .

Làm việc với Magento 1.9 Tôi được yêu cầu tạo nhiều kết nối đọc và viết. Magento có khả năng định cấu hình các kết nối đọc và ghi trong /etc/local.xml. Chỉ cần đặt thẻ sử dụng để cho Magento biết cái nào có sẵn.

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

Chúng ta có thể định nghĩa n kết nối trong cùng một tệp cấu hình như ví dụ thử nghiệm này

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

Giới hạn là các kết nối được áp dụng cho toàn hệ thống nhưng ý tưởng của tôi là chỉ đặt cho một số tài nguyên nhất định. Trong trường hợp này, tôi có một mô-đun báo cáo tùy chỉnh nơi tôi chỉ muốn thực hiện các kết nối đọc trong bảng Đơn hàng. Sau khi ghi đè Tài nguyên đơn hàng Mage / Bán hàng / Mô hình / Tài nguyên / Đơn hàng.php Chỉ cần thực hiện 3 cập nhật

  1. Tạo cờ để biết liệu đã đến lúc thay đổi kết nối $ reportConnection.
  2. Cập nhật hàm _construct () để tạo kết nối tùy chỉnh và thêm nó vào mảng tài nguyên.
  3. Cập nhật hàm _getConnection () để quyết định xem có sử dụng kết nối tùy chỉnh không.
// cờ
công khai $ báo cáo kết nối = sai;

/ **
* Chỉ cần thêm kết nối được xác định trong tệp 'test_read' cục bộ
* /
hàm được bảo vệ _construct () {
    $ this -> _ init ('doanh số / đơn hàng', 'entity_id');
    $ this -> _ resource-> getConnection ('test_read');
}

/ **
* Tạo kết nối nếu cờ được đặt
* /
chức năng được bảo vệ _getConnection ($ ConnectionName) {
 if (isset ($ this -> _ links [$ ConnectionName])) {
   trả về $ this -> _ links [$ ConnectionName];
    }

   if ($ ConnectionName == 'read' && $ this-> reportConnection)
        $ this -> _ links [$ ConnectionName] = $ this -> _ resource-> getConnection ('test_read');
   khác {
   if (! trống ($ this -> _ resourcePrefix)) {
      $ this -> _ links [$ ConnectionName] = $ this -> _ resource-> getConnection (
      $ này -> _ resourcePrefix. '_'. $ ConnectionName);
  } khác {
   $ this -> _ links [$ ConnectionName] = $ this -> _ resource-> getConnection ($ ConnectionName);
  }
   }
   trả về $ this -> _ links [$ ConnectionName];
}

Bước cuối cùng là thực hiện cuộc gọi một bộ sưu tập Đơn hàng nhưng sử dụng kết nối 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

Trong mô-đun của bạn, v.v. / config.xml, thêm đoạn mã sau:

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

Để lấy dữ liệu từ bảng bằng cơ sở dữ liệu mới:

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

    echo "<pre>";
    print_r($results);
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.