Il y a beaucoup de discussions ici et ailleurs sur l'utilisation de bases de données externes dans Drupal. Ce que j'ai compris à partir de cela est:
- La meilleure façon de travailler avec des données dans une table de base de données est d'utiliser le module Vues. J'ai installé cela et j'ai commencé à l'utiliser et j'ai trouvé que c'était génial pour travailler avec une table que j'avais ajoutée à la base de données du site.
- Le moyen simple de faire fonctionner Views avec une table qui n'a pas été créée par Drupal est avec le module Data. Ce module traite toute table de la base de données du site qui n'est pas utilisée par Drupal comme une "table orpheline" et lui permet d'être "adoptée" en cliquant sur un bouton.
- Le module "Table Wizard" fournit apparemment un moyen de le faire avec des tables qui ne sont pas dans la base de données du site. Mais ce module n'est pas disponible pour Drupal 7.
- Le fichier "settings.php", dans la section "Paramètres de base de données", contient une documentation détaillée sur la façon de définir des bases de données supplémentaires avec lesquelles le site peut travailler. Mais lorsqu'une base de données est définie de cette manière, ses tables n'apparaissent pas dans la liste des tables orphelines du module Données.
La modification que j'ai apportée à la définition de la base de données dans le fichier "settings.php" de l'un de mes sites est:
$databases = array (
'default' => array ('default' => array (
'database' => 'db_local',
'username' => 'db_local',
'password' => '_________',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
), ),
'extra' => array ('default' => array (
'database' => 'db__extra',
'username' => 'db_admin',
'password' => '_________,
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
), ), );
J'ai une table que je souhaite utiliser dans plusieurs sites dans mon installation multisite. Cela signifie que je dois avoir la table dans une base de données accessible à chaque site. Selon la lecture que j'ai faite, mes options pour le faire sont les suivantes:
- Mieux, si c'est possible: découvrez qu'il existe un moyen pour que le module de données reconnaisse les tables dans la base de données supplémentaire définie dans "settings.php", afin qu'il puisse les adopter.
- Utilisez des préfixes de table pour permettre à tous les sites d'utiliser une seule base de données.
- Le module « Forena Reports » semblait faire exactement ce dont j'avais besoin, mais quand je l'ai installé, je n'ai pas pu le faire fonctionner. J'ai envoyé le problème 2475645 et je ne peux pas faire grand-chose à moins qu'il n'y ait une solution à ce problème.
- Ecrivez mon propre module pour donner à Views l'accès à la base de données supplémentaire définie dans "settings.php".
- Installez Drupal 6 avec l'assistant de table et utilisez-le pour obtenir des vues pour voir ma table externe, puis prenez en quelque sorte le résultat de cela et mettez-le dans Drupal 7. (Cela a été suggéré dans certains articles.)
- Suivez la procédure dans https://drupal.stackexchange.com/a/3321/45991 , qui commence par l'installation d'un correctif et semble également nécessiter la création de mon propre module.
- J'ai également examiné les modules Feeds, Feeds SQL, Views XML Backend et Migrate, mais aucun ne dit qu'ils peuvent connecter une base de données externe à Views. Suis-je en train de manquer quelque chose? L'un d'eux est-il la bonne solution?
L'option 2 n'est pas pratique car elle entraînerait une énorme base de données avec des centaines de tables qui seraient très difficiles à gérer. J'ai fait de grands progrès dans le démarrage de Drupal, mais je ne me sens pas à la hauteur de 4, 5 ou 6. Y a-t-il une possibilité que quelque chose comme l'option 1 fonctionne? Ou existe-t-il un autre moyen de faire fonctionner Views avec une table en dehors de la base de données du site sans pouvoir écrire mon propre module?
Deux détails supplémentaires: La première table avec laquelle je dois travailler est assez grande, plus de 6 000 lignes et environ 20 colonnes. Il n'y a aucune intention de donner aux visiteurs du site l'accès à la base de données, sauf pour les informations qui en sont tirées pour le contenu de la page.
Merci de votre aide.
J'ai fait cela avec succès de deux manières différentes:
Utilisez une vue SQL pour créer une table virtuelle
db_local
qui fait référence à la table correspondante dansdb__extra
. La requête à créer qui ressemblerait à ceci:USE db_local; CREATE VIEW some_table AS SELECT * FROM db__extra.some_table;
Vous pouvez ensuite vous référer à cette vue SQL comme s'il s'agissait d'une table native dans votre base de données Drupal, et vous n'avez même pas besoin d'ajouter la base de données externe dans settings.php. Notez que cela peut ne pas être compatible avec le module de données (voir https://www.drupal.org/node/1973806 ), mais vous devriez pouvoir décrire la vue SQL au module Drupal Views en implémentant
hook_views_data()
et arrêter d'utiliser le module de données .Voici une autre possibilité: utilisez des préfixes de table sélectifs pour inciter Drupal à réécrire {some_table} dans db__extra.some_table. Ce n'est pas la même chose que de préfixer vos tables Drupal.
Votre
$databases
réglage ressemblerait à ceci:$databases = array ( 'default' => array ('default' => array ( 'database' => 'db_local', 'username' => 'db_local', 'password' => '_________', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => array( 'some_table' => 'db__extra.', ), )) );
Encore une fois, je ne sais pas si cela est compatible avec le module de données, car je ne l'utilise pas. Mais cela devrait fonctionner avec Views si vous vous implémentez
hook_views_data()
.la source