Wie verbinde ich eine andere Datenbank von Magento?


17

Ist es möglich, von Magento aus eine Verbindung zu einer anderen Datenbank herzustellen und auf Daten zuzugreifen?

Wie kann ich ein Modul für den Zugriff auf eine andere Datenbank erstellen, wenn ich ein Modul erstellen muss? Gibt es ein Tutorial, das dasselbe von Grund auf erzählt? Irgendeine Idee?

Antworten:


18

Als erstes müssen Sie eine Verbindung in der config.xml Ihres Moduls erstellen. Es sollte ähnlich aussehen wie default_setupin Ihrem /app/etc/local.xml. Hier können Sie den Host als localhost angeben und dann einen anderen Datenbanknamen festlegen oder einen anderen Host vollständig angeben. Ich habe auch eine Steckdose benutzt, bevor das auch funktioniert.

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

Danach können Sie eine Verbindung zu dieser Datenbank herstellen und Abfragen wie folgt durchführen:

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

Wenn Sie dies über ein Modell tun wollen , dann können Sie angeben , die read, writeund setupRessourcen wie folgt. Dies wird wieder innerhalb des resourcesKnotens in Ihrer config.xml durchgeführt und Sie sollten das ersetzen, als testwas Ihr Modell eingerichtet wurde.

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

Das Modell selbst versucht, seine Verbindungsinformationen in der Funktion zu finden getConnection /app/code/core/Mage/Core/Model/Resource.php. Wenn Sie das Protokoll $nameübergeben Sie Werte wie sehen werden poll_write, tag_writeund cms_readwo der erste Teil entspricht die Modelle Abschnitt in der config.xml, in unserem Fall würden Sie sehen test_write, test_readoder test_setup. Wenn es keine Verbindung für diese dann wird es die Standardverbindungen verwenden finden können core_read, core_writeodercore_setup


Entschuldigung, es funktioniert nicht für mich.
Bab

Ich verstehe nicht, wo ich diesen Code schreiben soll, wo ich eine Abfrage durchführen soll und was ich in diesem Beispiel ändern soll. Host> etc.
Bab

@bab Möchten Sie eine einzelne Abfrage oder ein Modell erstellen, das mit einer anderen Datenbank funktioniert?
David Manners

Ich mache eine einzelne Abfrage, aber wenn möglich auch über das Modell. Derzeit arbeite ich an einer Umfrageseite. Ich möchte über Magento auf die Datenbank dieser Site zugreifen. Ich habe so viele Artikel gelesen, aber ich habe keine Ahnung, wo ich diesen Code einfügen soll. Wenn möglich, teilen Sie mir bitte mit, welche Änderungen ich an Ihrer Codierung vornehmen kann, um das gewünschte Ergebnis zu erzielen. Danke.
Bab

@bab Das zweite config.xml-Beispiel sollte für das Modell funktionieren. hast du irgendwelche fehler mit dem code bekommen?
David Manners

3

Nachdem ich all diese Antworten gelesen, gesucht und einige Tests durchgeführt hatte, fand ich diese Lösung. Hier ist mein Blog, in dem ich die Lösung geschrieben habe .

Bei der Arbeit mit Magento 1.9 wurde ich gebeten, mehrere Lese- und Schreibverbindungen herzustellen. Magento hat die Möglichkeit, Lese- und Schreibverbindungen in der /etc/local.xml zu konfigurieren. Stellen Sie einfach die Tag-Verwendung ein, um Magento wissen zu lassen, welches verfügbar ist.

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

Wir können in der gleichen Konfigurationsdatei wie in diesem Testbeispiel n Verbindungen definieren

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

Das Limit ist, dass die Verbindungen auf das gesamte System angewendet werden, aber meine Idee ist, nur für bestimmte Ressourcen festzulegen. In diesem Fall habe ich ein benutzerdefiniertes Berichtsmodul, in dem ich nur Leseverbindungen in der Auftragstabelle herstellen möchte. Nach dem Überschreiben der Bestellressource Mage / Sales / Model / Resource / Order.php mache einfach 3 Updates

  1. Machen Sie ein Flag, um zu erfahren, ob es Zeit ist, die Verbindung $ reportConnection zu ändern.
  2. Aktualisieren Sie die Funktion _construct (), um die benutzerdefinierte Verbindung zu erstellen und sie dem Array von Ressourcen hinzuzufügen.
  3. Aktualisieren Sie die Funktion _getConnection (), um zu entscheiden, ob die benutzerdefinierte Verbindung verwendet wird.
//Flagge
public $ reportConnection = false;

/ **
* Fügen Sie einfach die in local.xml 'test_read' definierte Verbindung hinzu
* /
geschützte Funktion _construct () {
    $ this -> _ init ('sales / order', 'entity_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Stellen Sie die Verbindung her, wenn das Flag gesetzt ist
* /
geschützte Funktion _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   return $ this -> _ connections [$ connectionName];
    }

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

Der letzte Schritt besteht darin, eine Auftragssammlung aufzurufen, aber die Verbindung test_read zu verwenden.

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

1

Fügen Sie in Ihrem Modul etc / config.xml folgenden Code hinzu:

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

So rufen Sie Daten mit einer neuen Datenbank aus einer Tabelle ab:

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

    echo "<pre>";
    print_r($results);
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.