Magento'dan başka bir veritabanı nasıl bağlanır


17

Magento'dan başka bir veritabanına bağlanmak ve verilere erişmek mümkün müdür?

Bir modül oluşturmam gerekirse, başka bir veritabanına erişmek için nasıl modül oluşturabilirim? Sıfırdan aynı şeyi anlatan herhangi bir öğretici var mı? Herhangi bir fikir?

Yanıtlar:


18

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


üzgünüm, benim için çalışmıyor.
bab

Bu kodu nereye yazacağımı, nerede sorgulama yapacağımı ve neyi değiştireceğimi anlamıyorum. Örneğin, <host><![CDATA[localhost Genişletilmişamadı> </host> veya <host> localhost </ ana bilgisayar> vb.
bab

@bab Tek bir sorgu veya başka bir veritabanıyla çalışan bir model mi yapmak istiyorsunuz?
David Manners

Tek bir sorgu yapıyorum ama mümkünse model yoluyla da.Aslında bir anket sitesinde çalışıyorum. Bu sitenin veritabanına magento aracılığıyla erişmek istiyorum.Aynı için birçok makale okudum ama bu kodu nereye koyacağımı bilmiyorum. Mümkünse lütfen istediğiniz sonucu almak için kodunuzda hangi değişiklikleri yapabileceğimi söyleyin.
bab

@bab ikinci config.xml örneğinin model için çalışması gerekir. kodla ilgili herhangi bir hata aldınız mı?
David Manners

3

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

  1. $ ReportConnection bağlantısını değiştirme zamanını öğrenmek için bir bayrak oluşturun.
  2. Özel bağlantı oluşturmak ve bunu kaynak dizisine eklemek için _construct () işlevini güncelleyin.
  3. Özel bağlantı kullanıp kullanmayacağınıza karar vermek için _getConnection () işlevini güncelleyin.
// 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();

1

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);
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.