J'ai fait 2 db, l'un est de Drupal 8 et un autre est externe, c'est-à-dire non SQL (CouchDB) et pour gérer cette base de données, j'ai créé une API avec différents points d'extrémité (URL) que je peux les axe par les méthodes GET/POST. Après une requête correcte, je reçois une réponse en JSON de mon API.
Lorsque je crée par exemple un utilisateur, du contenu (nœud) ou autre chose, j'enregistre des informations dans ma base de données Drupal et quelques informations dans ma base de données API (j'ai modifié les formulaires qui créent du contenu par hook_form_BASE_FORM_ID_alter et de cette façon je crée du contenu dans ma base de données externe).
Ma question est de savoir comment afficher des données à partir d'une vue, en combinant les informations de deux bases de données?
Vous pouvez peut-être publier plus de détails, mais d'après ce que je comprends, vous stockez des informations supplémentaires par nœud sur une base de données externe. Vous avez déjà développé un système API pour communiquer avec cette base de données, vous n'avez donc pas vraiment besoin d'émettre de requêtes depuis Drupal directement vers cette base de données. Dans ce cas, une façon de procéder serait de le suivant.
Configurez les vues pour utiliser un mode d'affichage pour rendre votre entité. Sur votre fonction de prétraitement de noeud, émettez la demande d'API et récupérez les données supplémentaires de la 2e base de données. Préparez les données et mettez-les à la disposition du modèle.
/**
* Implements hook_preprocess_node(&$variables).
*/
function MY_THEME_preprocess_node(&$variables) {
// Issue API request.
// Process JSON response.
$variables['additional_field'] = $request_result;
}
Vous pouvez ensuite remplacer le modèle pour cette entité (nœud) et le mode d'affichage pour rendre vos champs supplémentaires.
Si vous avez besoin de vues pour utiliser l'affichage des champs au lieu de rendre un mode d'affichage, vous devrez développer un gestionnaire de champs personnalisé qui récupère les données de l'API externe. Faites-nous savoir si vous avez besoin d'aide à ce sujet.
Une alternative serait d'utiliser des crochets Views pour préparer les données d'une manière similaire plus tôt dans le processus, mais il n'y a pas vraiment d'avantage avec cette approche. Autrement dit, sauf si vous avez la possibilité de récupérer toutes les données pour tous les résultats dans une seule demande d'API. Ce serait le plus efficace pour ne pas émettre plusieurs demandes, une par résultat de nœud. Faites-nous savoir si tel est le cas et si vous avez besoin d'aide pour cela.
Si tout ce que vous avez à faire est d'afficher les données de l'API, vous n'avez rien à faire de spécial dans les vues. Sélectionnez simplement que vous souhaitez afficher les entités rendues de vos utilisateurs avec un mode d'affichage spécifique.
Dans la fonction de prétraitement pour ce mode d'affichage, vous pouvez accéder à l'API et charger les données supplémentaires dont vous avez besoin. Les données chargées dans une fonction de prétraitement doivent être mises en cache, de sorte qu'elles ne doivent pas atteindre l'API lors des chargements de page suivants.
function mymodule_preprocess_user(&$variables) {
/** @var $account \Drupal\user\UserInterface */
$account = $variables['elements']['#user'];
// custom code to hit the 3rd party API
Il existe des modules tels que Views Database Connector , External Entities en combinaison avec Search API pour l'intégration des vues ou Web Service Data - ne sais pas à propos de son intégration des vues. API d'entité distante n'est pas encore porté sur drupal 8. Voir: entité Drupal de base de données différente
Les idées pour le codage personnalisé sont: Vues Query Backend ou API de recherche (ou écrire votre propre backend api de recherche - Peut-être via solr )
Dans les deux cas, pensez à la mise en cache. Faire une demande à votre API dans chaque demande à votre site est très coûteux.
Première mise en garde. Il est difficile d'interroger les bases de données. Les vues par défaut effectuent des requêtes SQL. Tout type de requête qui nécessite la fusion des données des deux est de 2 requêtes personnalisées et une fusion en PHP. Ce n'est pas quelque chose que les vues vont vous aider.
Il existe de nombreuses approches qui vous aideront à cet égard. Je m'y attaquerais en créant des sources de données JSON et en utilisant AngularJS pour présenter les données.
2x sources sql. 2 sources de données sql peuvent être mappées selon drupal 7 . Utilisez les interfaces de requête et massez les données. Revenez en JSON.
La question conduit à des réponses qui mappent les tables de base de données aux vues, et il existe des outils pour ce faire. Je ne pense pas que vous obtiendrez une "expérience" des vues à partir de bases de données distinctes.