Comment mettre une base de données externe à la disposition de Views?

8

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:

  1. 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.
  2. Utilisez des préfixes de table pour permettre à tous les sites d'utiliser une seule base de données.
  3. 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.
  4. Ecrivez mon propre module pour donner à Views l'accès à la base de données supplémentaire définie dans "settings.php".
  5. 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.)
  6. 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.
  7. 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.

NewSites
la source

Réponses:

2

Je pense que le module Forena fait exactement ce dont vous avez besoin . Votre problème d'installation n'est qu'une demande d'assistance, je pense, pas quelque chose qui nécessite une "correction". Après avoir résolu ce problème, vous aurez même le choix d'utiliser oui ou non l'intégration de ses vues également.

Le problème Forena que vous avez créé est très bien documenté (excellent travail!). Mais nulle part cela ne dit quoi que ce soit sur les autorisations que vous avez accordées (ce qui me fait croire que vous pourriez manquer certaines des autorisations requises). Voici donc une tentative pour y remédier:

  • Pouvez-vous expliquer brièvement laquelle des autorisations liées à Forena (requises) vous avez accordées?

  • Les autorisations Forena requises sont expliquées dans le Guide d'installation fourni avec Forena ? Pour info: voici une citation (en partie):

    Forena permet une grande granularité en ce qui concerne le rapport des autorisations associées, en utilisant les fonctionnalités d'administration standard de Drupal pour accorder des autorisations aux rôles. La liste des autorisations Drupal liées à Forena qui peuvent être accordées peut être un peu écrasante au début. Parce qu'il y a 3 entrées pour chaque source de données définie, et vanilla Forena est déjà livré avec 3 sources de données.

    Pour récupérer ce guide sur votre propre site, accédez simplement à /reports/help.setup

Ces autorisations d'accès aux "données" sont à l'origine refusées. C'est par conception, car Forena est également assez sensible à tout ce qui concerne l'octroi de l'accès aux données via Forena. Ce que vous ne voudriez pas, c'est qu'en installant et en configurant simplement Forena (sans les autorisations d'administrateur), vous pouvez l'utiliser comme solution de contournement pour accéder aux données sécurisées.

Notez également qu'en dehors des autorisations au niveau d'une source de données entière, vous avez la possibilité d'affiner davantage les autorisations requises pour des blocs de données spécifiques (= requêtes SQL personnalisées). Pour ce faire, spécifiez simplement ces autorisations (Drupal) requises dans l'instruction SQL (les détails de la syntaxe sont inclus dans les guides Forena). Un cas d'utilisation typique pour cela est de sécuriser l'accès aux colonnes contenant des données sensibles.

Divulgation: Je suis co- gestionnaire de ce module,
j'espère que cela ne viole pas la politique du site en matière d'autopromotion .

Pierre.Vriens
la source
Merci pour ça. Je n'ai pas remarqué lors de ma première installation que cinq autorisations n'étaient accordées à personne. Je les ai maintenant accordés à l'administrateur (c'est-à-dire moi). Le document d'installation ne précise pas pourquoi ces autorisations sont initialement refusées et s'il existe une raison de ne pas les accorder à l'administrateur. Cependant, j'ai maintenant ces sources de données, donc cela a résolu ce problème. Y a-t-il une raison pour laquelle vous avez répondu ici plutôt que dans le numéro que j'ai soumis?
NewSites
Super de lire les progrès! Cela compense en quelque sorte le "downvote" de ma réponse ... FYI: J'ai également répondu via la file d'attente des problèmes maintenant. Alors maintenant que "ceci a résolu le problème", cela signifie-t-il que vous considérez en effet Forena comme "la" réponse à votre question (ce qui n'était pas encore le cas dans la puce n ° 3 du PO)? Pour info: je vais essayer de mettre à jour ma réponse ici pour expliquer brièvement "pourquoi ces autorisations sont à l'origine refusées", ce qui est une bonne question supplémentaire!
Pierre.Vriens
Ce n'est pas moi qui ai rejeté votre réponse. J'ai maintenant accepté la vôtre comme <u> la </u> réponse et l'ai votée (ce qui malheureusement ne la ramène à zéro).
NewSites
Hm, je ne pensais pas que @NewSites avait downvoté, en fait j'ai appris à vivre avec des downvotes. Personnellement, je n'aime pas le vote négatif en général, et j'ignore aucun d'entre eux où il n'y a aucun commentaire pour les expliquer d'une manière ou d'une autre. Mais bien sûr, «voter» et «accepter» est grandement apprécié. Et bien sûr, sachant qu'il y a encore un autre utilisateur Drupal qui semble avoir découvert Forena maintenant, c'est parti! Assurez-vous de classer (support?) Les problèmes le cas échéant (pour voir également le support au travail ...).
Pierre.Vriens
2

J'ai fait cela avec succès de deux manières différentes:

Utilisez une vue SQL pour créer une table virtuelle db_localqui fait référence à la table correspondante dans db__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 $databasesré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().

Les Lim
la source
Vous dites dans les deux méthodes que j'ai besoin d'implémenter <code> hook_views_data () </code>. Cela ne nécessite-t-il pas d'écrire un module? Dans tous les cas, j'ai essayé la définition de la base de données dans votre deuxième méthode. Cela n'a pas fait apparaître la table dans "db_extra" dans la liste des tables orphelines du module Data. Dans votre première méthode, où dois-je placer la requête que vous avez suggérée (sinon dans un module personnalisé)?
NewSites du
Si vous créez une vue SQL, vous devez exécuter la requête CREATE VIEW une fois directement dans MySQL. Il n'a pas besoin d'être réexécuté.
Les Lim
Je suis désolé, je ne comprends toujours pas. Où voulez-vous que je lance cette requête? Dans phpMyAdmin? Cela me donnera-t-il quelque chose que je pourrai utiliser dans Views? J'ai recherché "SQL view" sur Drupal.org et j'ai obtenu drupal.org/project/sql_views , qui n'a pas de téléchargement de production et dont la doc sur drupal.org/node/2458947 dit que j'ai besoin d'implémenter un hook (ce que je suppose signifie écrire un module) pour informer le module Views de ma vue SQL. Il semble donc que ce que vous proposez nécessite d'écrire un module (auquel je ne me sens tout simplement pas prêt), et sinon, je ne comprends tout simplement pas ce que vous me dites de faire.
NewSites