como conectar outro banco de dados do magento


17

É possível conectar-se a outro banco de dados do Magento e acessar dados?

Se eu precisar criar um módulo, como posso criar um módulo para acessar outro banco de dados? Existe algum tutorial que fale sobre o mesmo a partir do zero? Qualquer ideia?

Respostas:


18

A primeira coisa que você precisa fazer é criar uma conexão no config.xml do seu módulo. Deve ser semelhante ao do default_setupseu /app/etc/local.xml. Aqui você pode especificar o host como host local e, em seguida, definir um nome de db diferente ou pode especificar um host diferente completamente. Eu também usei um soquete antes do qual também 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>

Agora, depois disso, você poderá conectar-se a este banco de dados e realizar consultas da seguinte maneira:

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

Se você quiser fazer isso através de um modelo, em seguida, você pode especificar o read, writee setuprecursos como segue. Isso será feito novamente dentro do resourcesnó no seu config.xml e você deverá substituir testpelo que seu modelo foi configurado.

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

O próprio modelo tentará encontrar suas informações de conexão na função getConnection /app/code/core/Mage/Core/Model/Resource.php. Se você fizer o login $name, verá valores como poll_write, tag_writee cms_readonde a primeira parte corresponde à seção de modelos no config.xml, no nosso caso, você verá test_write, test_readou test_setup. Se não puder encontrar uma conexão combinar este, em seguida, ele usará as conexões padrão core_read, core_writeoucore_setup


desculpe, isso não funciona para mim.
— bab

Eu não entendo onde escrever esse código, onde executar a consulta e o que alterar nisto. host> etc.
— bab

@bab você quer fazer uma única consulta ou modelo que funcione com outro banco de dados?
— precisa

Estou fazendo uma única consulta, mas se possível através do modelo também. Na verdade, estou trabalhando em um site de pesquisa. Eu quero acessar o banco de dados deste site através do magento. Eu li muitos artigos para o mesmo, mas não tenho idéia de onde colocar esse código.
— bab

@bab, o segundo exemplo config.xml deve funcionar para o modelo. você recebeu algum erro com o código?
— David Manners

3

Depois de ler todas essas respostas, pesquisando e fazendo alguns testes, encontrei esta solução. Aqui está o meu blog onde escrevi a solução .

Trabalhando com o Magento 1.9, fui solicitado a fazer várias conexões de leitura e gravação. O Magento tem a possibilidade de configurar conexões de leitura e gravação no /etc/local.xml. Basta definir o uso da tag para que o Magento saiba qual está disponível.

<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 conexões no mesmo arquivo de configuração como este exemplo de teste

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

O limite é que as conexões sejam aplicadas a todo o sistema, mas minha ideia é definir apenas para determinados recursos. Nesse caso, eu tenho um módulo de relatório personalizado, no qual só quero fazer conexões de leitura na tabela Pedido. Após substituir o recurso Pedido Mage / Sales / Model / Resource / Order.php Basta fazer 3 atualizações

  1. Faça um sinalizador para saber se é hora de alterar a conexão $ reportConnection.
  2. Atualize a função _construct () para criar a conexão personalizada e adicione-a à matriz de recursos.
  3. Atualize a função _getConnection () para decidir se usa a conexão personalizada.
//bandeira
public $ reportConnection = false;

/ **
* Basta adicionar a conexão definida no local.xml 'test_read'
* /
função protegida _construct () {
    $ this -> _ init ('venda / pedido', 'entity_id');
    $ this -> _ resources-> getConnection ('test_read');
}

/ **
* Faça a conexão se o sinalizador estiver definido
* /
função protegida _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   retorne $ this -> _ connections [$ connectionName];
    }

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

O último passo é fazer uma coleção de pedidos chamar, mas usando a conexão 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

No seu módulo etc / config.xml, adicione o seguinte 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 obter dados da tabela usando o novo banco de dados:

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

    echo "<pre>";
    print_r($results);
?>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.