comment connecter une autre base de données depuis magento

17

Est-il possible de se connecter à une autre base de données depuis Magento et d'accéder aux données?

Si je dois créer un module, comment puis-je créer un module pour accéder à une autre base de données? Existe-t-il un tutoriel qui raconte la même chose à partir de zéro? Une idée?

bab
la source

Réponses:

18

La première chose que vous devez faire est de créer une connexion dans le config.xml de votre module. Il devrait ressembler à celui default_setupde votre /app/etc/local.xml. Ici, vous pouvez spécifier l'hôte comme localhost, puis définir un autre nom de base de données ou vous pouvez spécifier un hôte différent complètement. J'ai également utilisé une prise avant qui fonctionne également.

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

Maintenant, après cela, vous pourrez vous connecter à cette base de données et effectuer des requêtes comme suit:

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

Si vous voulez le faire via un modèle , vous pouvez spécifier le read, writeet les setupressources comme suit. Cela se fera à nouveau à l'intérieur du resourcesnœud dans votre config.xml et vous devez le remplacer testpar ce que votre modèle a été configuré.

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

Le modèle lui-même essaiera de trouver ses informations de connexion dans la fonction getConnection /app/code/core/Mage/Core/Model/Resource.php. Si vous vous connectez, $namevous verrez des valeurs comme poll_write, tag_writeet cms_readoù la première partie correspond à la section des modèles dans le config.xml, dans notre cas, vous verrez test_write, test_readou test_setup. S'il ne trouve pas de connexion correspondant à cela, il utilisera les connexions par défaut core_read, core_writeoucore_setup

David Manners
la source
désolé, ça ne marche pas pour moi.
bab
Je ne comprends pas où écrire ce code, où effectuer la requête et quoi changer dans ce cas. Par exemple, si je tape <host><!!CDATA[localhost 4,0 / 10> </host> ou <host> localhost </ hôte> etc.
bab
@bab voulez-vous faire une seule requête ou un modèle qui fonctionne avec une autre base de données?
David Manners
Je fais une seule requête mais si possible via le modèle aussi. En fait je travaille sur un site d'enquête. je veux accéder à la base de données de ce site via magento.J'ai lu tellement d'articles pour le même mais je n'ai aucune idée où mettre ce code .Si possible, dites-moi quels changements je peux apporter à votre codage pour obtenir le résultat souhaité.Merci.
bab
@bab le deuxième exemple config.xml devrait fonctionner pour le modèle. avez-vous eu des erreurs avec le code?
David Manners du
3

Après avoir lu toutes ces réponses, recherché et fait quelques tests, j'ai trouvé cette solution. Voici mon blog où j'ai écrit la solution .

En travaillant avec Magento 1.9, on m'a demandé de faire plusieurs connexions en lecture et en écriture. Magento a la possibilité de configurer les connexions de lecture et d'écriture dans /etc/local.xml. Il vous suffit de définir l'utilisation du tag pour que Magento sache lequel est disponible.

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

Nous pouvons définir n connexions dans le même fichier de configuration comme cet exemple de 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>

La limite est que les connexions sont appliquées à l'ensemble du système mais mon idée est de ne définir que pour certaines ressources. Dans ce cas, j'ai un module de rapport personnalisé où je veux uniquement établir des connexions de lecture dans la table Order. Après avoir remplacé la ressource Order Mage / Sales / Model / Resource / Order.php Il suffit de faire 3 mises à jour

  1. Créez un indicateur pour savoir s'il est temps de changer la connexion $ reportConnection.
  2. Mettez à jour la fonction _construct () pour créer la connexion personnalisée et l'ajouter au tableau de ressources.
  3. Mettez à jour la fonction _getConnection () pour décider si utiliser la connexion personnalisée.
//drapeau
public $ reportConnection = false;

/ **
* Ajoutez simplement la connexion définie dans le fichier local.xml 'test_read'
* /
fonction protégée _construct () {
    $ this -> _ init ('sales / order', 'entity_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Établissez la connexion si le drapeau est défini
* /
fonction protégée _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   return $ this -> _ connections [$ connectionName];
    }

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

La dernière étape consiste à appeler une collection Order mais en utilisant la connexion 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
la source
1

Dans votre module etc / config.xml ajoutez le code suivant:

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

Pour obtenir des données d'une table à l'aide d'une nouvelle base de données:

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

    echo "<pre>";
    print_r($results);
?>
Prince Patel
la source