cómo conectar otra base de datos de magento

17

¿Es posible conectarse a otra base de datos desde Magento y acceder a los datos?

Si necesito crear un módulo, ¿cómo puedo crear un módulo para acceder a otra base de datos? ¿Hay algún tutorial que cuente lo mismo desde cero? ¿Alguna idea?

bab
fuente

Respuestas:

18

Lo primero que debe hacer es crear una conexión en config.xml de su módulo. Debería ser similar al default_setupde tu /app/etc/local.xml. Aquí puede especificar que el host sea localhost y luego establecer un dbname diferente o puede especificar un host diferente por completo. También he usado un socket antes que también funciona.

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

Ahora, después de esto, podrá conectarse a esta base de datos y realizar consultas de la siguiente manera:

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

Si desea hacerlo a través de un modelo a continuación, se puede especificar el read, writey setuplos recursos de la siguiente manera. Esto se hará nuevamente dentro del resourcesnodo en su config.xml y debe reemplazarlo testcon la configuración de su modelo.

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

El modelo mismo intentará encontrar su información de conexión en la función getConnection /app/code/core/Mage/Core/Model/Resource.php. Si registra el $namepasado, verá valores como poll_write, tag_writey cms_readdonde la primera parte coincide con la sección de modelos en config.xml, en nuestro caso vería test_write, test_reado test_setup. Si no puede encontrar una conexión que coincida con esto, utilizará las conexiones predeterminadas core_read, core_writeocore_setup

David modales
fuente
lo siento, no me funciona.
bab
No entiendo dónde escribir este código, dónde realizar la consulta y qué cambiar en esto, por ejemplo, si escribo <host><![CDATA[localhostfont>font>> </host> o <host> localhost </ anfitrión> etc.
bab
@bab ¿quieres hacer una sola consulta o un modelo que funcione con otra base de datos?
David Manners
Estoy haciendo una sola consulta pero si es posible a través del modelo también. En realidad estoy trabajando en un sitio de encuestas. Quiero acceder a la base de datos de este sitio a través de magento. Leí muchos artículos para el mismo, pero no tengo idea de dónde poner este código. Si es posible, dígame qué cambios puedo hacer en su codificación para obtener el resultado deseado. Gracias.
bab
@bab el segundo ejemplo config.xml debería funcionar para el modelo. ¿Recibiste algún error con el código?
David Manners
3

Después de leer todas estas respuestas, buscar y hacer algunas pruebas, encontré esta solución. Aquí está mi blog donde escribí la solución .

Trabajando con Magento 1.9 se me pidió que hiciera múltiples conexiones de lectura y escritura. Magento tiene la posibilidad de configurar conexiones de lectura y escritura en /etc/local.xml. Simplemente configure el uso de la etiqueta para que Magento sepa cuál 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>

Podemos definir n conexiones en el mismo archivo de configuración como este ejemplo de prueba

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

El límite es que las conexiones se aplican a todo el sistema, pero mi idea es establecer solo ciertos recursos. En este caso, tengo un módulo de informe personalizado donde solo quiero hacer conexiones de lectura en la tabla de pedidos. Después de anular el recurso de pedido Mage / Sales / Model / Resource / Order.php Simplemente haga 3 actualizaciones

  1. Haga una marca para saber si es hora de cambiar la conexión $ reportConnection.
  2. Actualice la función _construct () para crear la conexión personalizada y agregarla a la matriz de recursos.
  3. Actualice la función _getConnection () para decidir si usa la conexión personalizada.
//bandera
public $ reportConnection = false;

/ **
* Simplemente agregue la conexión definida en el local.xml 'test_read'
* /
función protegida _construct () {
    $ this -> _ init ('ventas / pedido', 'entidad_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Haga la conexión si la bandera está configurada
* /
función protegida _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   devuelve $ this -> _ connections [$ connectionName];
    }

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

El último paso es hacer que se llame una colección de pedidos pero utilizando la conexión 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
fuente
1

En su módulo etc / config.xml agregue el siguiente código:

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

Para obtener datos de la tabla usando una nueva base de datos:

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

    echo "<pre>";
    print_r($results);
?>
Príncipe Patel
fuente