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?

bab
fonte

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

David Manners
fonte
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();
abelbm
fonte
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);
?>
Prince Patel
fonte