come collegare un altro database da Magento


17

È possibile connettersi a un altro database da Magento e accedere ai dati?

Se devo creare un modulo, come posso creare un modulo per accedere a un altro database? Esiste un tutorial che racconta lo stesso da zero? Qualche idea?

Risposte:


18

La prima cosa che devi fare è creare una connessione in config.xml del tuo modulo. Dovrebbe apparire simile al default_setuptuo /app/etc/local.xml. Qui è possibile specificare l'host come localhost e quindi impostare un nome db diverso oppure è possibile specificare un host diverso completamente. Ho anche usato un socket prima del quale funziona anche.

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

Ora dopo questo sarai in grado di connetterti a questo database ed eseguire le query come segue:

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

Se si vuole fare questo attraverso un modello di allora è possibile specificare la read, writee setuple risorse nel modo seguente. Ciò verrà eseguito nuovamente all'interno del resourcesnodo in config.xml e dovresti sostituirlo testcon quello del tuo modello.

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

Il modello stesso tenterà di trovare le informazioni di connessione nella funzione getConnection /app/code/core/Mage/Core/Model/Resource.php. Se si accede al $namepassato in vedrete valori come poll_write, tag_writee cms_readdove la prima parte riconosce la sezione modelli in config.xml, nel nostro caso si vedrebbe test_write, test_reado test_setup. Se non riesce a trovare una connessione che soddisfa questa allora sarà utilizzare i collegamenti di default core_read, core_writeocore_setup


scusa, non funziona per me.
bab

Non capisco dove scrivere questo codice, dove eseguire la query e cosa inseguire in questo. Ad esempio se digito <host><![CDATA[localhost[[> </host> o <host> localhost </ host> ecc.
bab

@bab vuoi creare una singola query o un modello che funziona con un altro database?
David Manners,

Sto facendo una singola query ma, se possibile, anche attraverso il modello. Attualmente sto lavorando a un sito di sondaggi. Voglio accedere al databse di questo sito tramite magento. Ho letto tanti articoli per lo stesso ma non ho idea di dove inserire questo codice. Se possibile, per favore, dimmi quali modifiche posso fare nella tua codifica per ottenere il risultato desiderato. Grazie.
bab

@bab il secondo esempio di config.xml dovrebbe funzionare per il modello. hai riscontrato errori con il codice?
David Manners,

3

Dopo aver letto tutte queste risposte, cercato e fatto alcuni test ho trovato questa soluzione. Ecco il mio blog in cui ho scritto la soluzione .

Lavorando con Magento 1.9 mi è stato chiesto di effettuare più connessioni di lettura e scrittura. Magento ha la possibilità di configurare connessioni di lettura e scrittura in /etc/local.xml. Basta impostare il tag use per far sapere a Magento quale è disponibile.

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

Possiamo definire n connessioni nello stesso file di configurazione come in questo esempio di test

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

Il limite è che le connessioni vengono applicate all'intero sistema ma la mia idea è quella di impostare solo per determinate risorse. In questo caso, ho un modulo di report personalizzato in cui desidero solo effettuare connessioni di lettura nella tabella degli ordini. Dopo aver sostituito la risorsa Ordine Mago / Vendite / Modello / Risorsa / Ordine.php Basta apportare 3 aggiornamenti

  1. Crea un flag per sapere se è il momento di cambiare la connessione $ reportConnection.
  2. Aggiorna la funzione _construct () per creare la connessione personalizzata e aggiungerla all'array di risorse.
  3. Aggiorna la funzione _getConnection () per decidere se utilizzare la connessione personalizzata.
//bandiera
public $ reportConnection = false;

/ **
* Basta aggiungere la connessione definita in local.xml 'test_read'
* /
funzione protetta _construct () {
    $ this -> _ init ('sales / order', 'entity_id');
    $ This -> _ risorse-> getConnection ( 'test_read');
}

/ **
* Effettuare la connessione se la bandiera è impostata
* /
funzione protetta _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   restituisce $ this -> _ connections [$ connectionName];
    }

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

L'ultimo passaggio consiste nel chiamare una raccolta ordini ma utilizzando la connessione 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

Nel tuo modulo etc / config.xml aggiungi il seguente codice:

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

Per ottenere dati dalla tabella utilizzando il nuovo database:

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

    echo "<pre>";
    print_r($results);
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.