jak podłączyć inną bazę danych z Magento

17

Czy można połączyć się z inną bazą danych z Magento i uzyskać dostęp do danych?

Jeśli muszę utworzyć moduł, jak mogę utworzyć moduł, aby uzyskać dostęp do innej bazy danych? Czy jest jakiś samouczek, który mówi o tym samym od zera? Dowolny pomysł?

bab
źródło

Odpowiedzi:

18

Pierwszą rzeczą, którą musisz zrobić, to utworzyć połączenie w pliku config.xml modułu. Powinien wyglądać podobnie do default_setuptwojego /app/etc/local.xml. W tym miejscu możesz określić hosta jako hosta lokalnego, a następnie ustawić inną nazwę dbname lub możesz całkowicie określić innego hosta. Użyłem również gniazda, przed którym również działa.

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

Teraz po tym będziesz mógł połączyć się z tą bazą danych i wykonać zapytania w następujący sposób:

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

Jeśli chcesz to zrobić za pośrednictwem modelu to można określić read, writea setupzasoby w sposób następujący. Zostanie to ponownie wykonane wewnątrz resourceswęzła w pliku config.xml i powinieneś zastąpić testto, co twój model został skonfigurowany jako.

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

Sam model spróbuje znaleźć informacje o połączeniu w funkcji getConnection /app/code/core/Mage/Core/Model/Resource.php. Jeśli zalogujesz $nameprzekazany widać wartości jak poll_write, tag_writei cms_readgdzie pierwsza część pasuje do modeli w sekcji config.xml, w naszym przypadku byłoby widać test_write, test_readalbo test_setup. Jeśli nie można znaleźć połączenia dopasowanie to wtedy będzie korzystać z połączenia domyślne core_read, core_writelubcore_setup

David Manners
źródło
przepraszam, to nie działa dla mnie.
bab
Nie rozumiem, gdzie napisać ten kod, gdzie wykonać kwerendę i co w tym zrobić. Na przykład piszę <host><![CDATA[localhost]]> </host> lub <host> localhost </ host> itp.
bab
@bab chcesz zrobić pojedyncze zapytanie lub model współpracujący z inną bazą danych?
David Manners,
Zadaję jedno zapytanie, ale jeśli to możliwe, również przez model. Właściwie pracuję na stronie z ankietami. Chcę uzyskać dostęp do bazy danych tej witryny za pośrednictwem Magento. Przeczytałem tak wiele artykułów dla tego samego, ale nie mam pojęcia, gdzie umieścić ten kod. Jeśli to możliwe, proszę powiedz mi, jakie zmiany mogę wprowadzić w twoim kodzie, aby uzyskać pożądany rezultat. Dzięki.
bab
@bab drugi przykład pliku config.xml powinien działać dla modelu. dostałeś jakieś błędy w kodzie?
David Manners,
3

Po przeczytaniu wszystkich odpowiedzi, przeszukaniu i wykonaniu testu znalazłem to rozwiązanie. Oto mój blog, na którym napisałem rozwiązanie .

Pracując z Magento 1.9 zostałem poproszony o wykonanie wielu połączeń odczytu i zapisu. Magento ma możliwość konfiguracji połączeń do odczytu i zapisu w pliku /etc/local.xml. Wystarczy ustawić użycie tagu, aby Magento wiedział, który jest dostępny.

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

Możemy zdefiniować n połączeń w tym samym pliku konfiguracyjnym, jak w tym przykładzie testowym

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

Ograniczeniem jest to, że połączenia są stosowane do całego systemu, ale moim pomysłem jest ustawienie tylko dla niektórych zasobów. W tym przypadku mam niestandardowy moduł raportu, w którym chcę tylko nawiązywać połączenia odczytu w tabeli Zamówienia. Po przesłonięciu Magazynu Zasób Mag / Sprzedaż / Model / Zasób / Order.php Po prostu dokonaj 3 aktualizacji

  1. Zrób flagę, aby wiedzieć, czy nadszedł czas, aby zmienić połączenie $ reportConnection.
  2. Zaktualizuj funkcję _construct (), aby utworzyć niestandardowe połączenie i dodać je do tablicy zasobów.
  3. Zaktualizuj funkcję _getConnection (), aby zdecydować, czy użyć niestandardowego połączenia.
//flaga
public $ reportConnection = false;

/ **
* Po prostu dodaj połączenie zdefiniowane w pliku local.xml „test_read”
* /
funkcja chroniona _construct () {
    $ this -> _ init ('sprzedaż / zamówienie', 'podmiot_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Nawiąż połączenie, jeśli flaga jest ustawiona
* /
funkcja chroniona _getConnection ($ connectionName) {
 if (isset ($ this -> _ połączenia [$ connectionName])) {
   zwróć $ this -> _ połączenia [$ connectionName];
    }

   if ($ connectionName == 'czytaj' && $ this-> reportConnection)
        $ this -> _ connection [$ connectionName] = $ this -> _ resources-> getConnection ('test_read');
   jeszcze{
   if (! empty ($ this -> _ resourcePrefix)) {
      $ this -> _ połączeń [$ connectionName] = $ this -> _ resources-> getConnection (
      $ this -> _ resourcePrefix. „_”. $ connectionName);
  } else {
   $ this -> _ połączenia [$ connectionName] = $ this -> _ resources-> getConnection ($ connectionName);
  }
   }
   zwróć $ this -> _ połączenia [$ connectionName];
}

Ostatnim krokiem jest wywołanie kolekcji zamówień, ale przy użyciu połączenia 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
źródło
1

W swoim module etc / config.xml dodaj następujący kod:

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

Aby uzyskać dane z tabeli przy użyciu nowej bazy danych:

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

    echo "<pre>";
    print_r($results);
?>
Książę Patel
źródło