Yanıtlar:
Yapmanız gereken ilk şey, modülünüzün config.xml dosyasında bir bağlantı oluşturmaktır. Bu gibi görünmelidir default_setupGözlerinde farklı /app/etc/local.xml. Burada ana makineyi localhost olarak belirtebilir ve sonra farklı bir dbname ayarlayabilir veya tamamen farklı bir ana bilgisayar belirtebilirsiniz. Daha önce de çalışan bir soket kullandım.
<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>
Şimdi bundan sonra bu veritabanına aşağıdaki gibi bir sorgu gerçekleştirmek mümkün olacak:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
Bunu bir model aracılığıyla yapmak istiyorsanız read, writeve setupkaynaklarını aşağıdaki gibi belirleyebilirsiniz . Bu, resourcesconfig.xml dosyasındaki düğümün içinde tekrar yapılacaktır ve testmodelinizin ayarlandığı ile değiştirmelisiniz .
<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>
Modelin kendisi fonksiyonda bağlantı bilgilerini bulmaya çalışacaktır getConnection /app/code/core/Mage/Core/Model/Resource.php. Eğer giriş yaparsanız $nameaşağıdaki gibi değerleri göreceksiniz geçirilen poll_write, tag_writeve cms_readilk bölümü config.xml'de modeller bölümünü maçları nerede, bizim durumumuzda göreceğiniz test_write, test_readya test_setup. Bununla eşleşen bir bağlantı bulamazsa, varsayılan bağlantıları kullanır core_read,core_write ya dacore_setup
Tüm bu cevapları okuduktan sonra, arama ve bazı testler yaparak bu çözümü buldum. İşte çözümü yazdığım blogum .
Magento 1.9 ile çalışma Birden çok okuma ve yazma bağlantısı yapmam istendi. Magento, /etc/local.xml dosyasında okuma ve yazma bağlantılarını yapılandırma olanağına sahiptir. Magento'ya hangisinin kullanılabilir olduğunu bildirmek için etiket kullanımını ayarlayı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>
Bu test örneği gibi aynı yapılandırma dosyasında n bağlantı tanımlayabiliriz
<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>
Sınır, bağlantıların tüm sisteme uygulanmasıdır, ancak benim fikrim sadece belirli kaynaklar için ayarlamaktır. Bu durumda, yalnızca Sipariş tablosunda okuma bağlantıları yapmak istediğim özel bir rapor modülüm var. Sipariş kaynağını geçersiz kıldıktan sonra Mage / Sales / Model / Resource / Order.php Sadece 3 güncelleme yapın
// bayrak
public $ reportConnection = yanlış;
/ **
* Sadece local.xml 'test_read' içinde tanımlanan bağlantıyı ekleyin
* /
korumalı işlev _construct () {
$ this -> _ init ('satış / sipariş', 'entity_id');
$ this -> _ kaynaklarıyla> getConnection ( 'test_read');
}
/ **
* Bayrak ayarlanmışsa bağlantıyı kurun
* /
korumalı işlev _getConnection ($ connectionName) {
if (isset ($ this -> _ connections [$ connectionName]))) {
$ this -> _ connections döndürür [$ connectionName];
}
if ($ connectionName == 'oku' && $ this-> reportConnection)
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ('test_read');
Başka{
if (! empty ($ this -> _ resourcePrefix)) {
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection (
$ this -> _ resourcePrefix. '_'. $ ConnectionName);
} Başka {
$ this -> _ connections [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName);
}
}
$ this -> _ connections döndürür [$ connectionName];
}
Son adım, bir test koleksiyonu oluşturmak, ancak test_read bağlantısını kullanmaktır.
//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 modülünüze aşağıdaki kodu ekleyin:
<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>
Yeni veritabanı kullanarak tablodan veri almak için:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>