web-dev-qa-db-ja.com

外部APIからのビューによるデータの表示

私は2つのdbを作成しました。1つはDrupal 8で、もう1つは外部、つまり非SQL(CouchDB)です。このDBを管理するために、さまざまなエンドポイント(URL)を持つAPIを作成しました。 GET/POSTメソッドで軸を調整します。正しいリクエストの後、APIからJSONで応答を取得します。

たとえば、ユーザー、コンテンツ(ノード)などを作成するとき、いくつかの情報をmy Drupalデータベースに保存し、いくつかの情報をAPI dbに保存します(コンテンツを作成するフォームを変更してhook_form_BASE_FORM_ID_alterを使用して、外部DBにコンテンツを作成します)。

私の質問は、2つのデータベースからの情報を組み合わせて、ビューからデータを表示する方法ですか?

2

もう少し詳細を投稿できるかもしれませんが、私が理解しているところによると、ノードごとの追加情報を外部データベースに保存しています。そのデータベースと通信するためのAPIシステムをすでに開発しているため、Drupalからそのデータベースに直接クエリを発行する必要はありません。その場合、これを進める1つの方法は以下。

エンティティをレンダリングする表示モードを使用するようにビューを構成します。ノードの前処理関数で、APIリクエストを発行し、2番目のデータベースから追​​加データをフェッチします。データを準備し、テンプレートで使用できるようにします。

/**                                                                                                                                                                                                                                          
 * Implements hook_preprocess_node(&$variables).                                                                                                                                                                                         
 */
function MY_THEME_preprocess_node(&$variables) {
  // Issue API request.
  // Process JSON response.
  $variables['additional_field'] = $request_result;
}

次に、そのエンティティ(ノード)と表示モードのテンプレートをオーバーライドして、追加のフィールドをレンダリングできます。

表示モードをレンダリングする代わりにビューでフィールド表示を使用する必要がある場合は、外部APIからデータをフェッチするカスタムフィールドハンドラーを開発する必要があります。サポートが必要な場合はお知らせください。

別の方法としては、Viewsフックを使用して、プロセスの初期に同様の方法でデータを準備することですが、そのアプローチにはあまり利点がありません。つまり、単一のAPIリクエストですべての結果のすべてのデータをフェッチする機能がない場合。これは、ノードごとに1つずつ、複数のリクエストを発行しないようにするのに最も効率的です。これがケースであるかどうか、それについてサポートが必要かどうかをお知らせください。

1
krystalcode

APIからのデータを表示するだけの場合は、ビュー内で特別なことを行う必要はありません。ユーザーのレンダリングされたエンティティを特定の表示モードで表示することを選択するだけです。

enter image description here

その表示モードの前処理関数では、APIをヒットして、必要な追加データをロードできます。前処理関数内でロードされたデータはキャッシュする必要があるため、後続のページのロード時にAPIにヒットしないようにする必要があります。

function mymodule_preprocess_user(&$variables) {
  /** @var $account \Drupal\user\UserInterface */
  $account = $variables['elements']['#user'];

  // custom code to hit the 3rd party API
2
oknate

Views Database ConnectorExternal Entities と組み合わせて Search API とビューを統合するためのモジュール、または Web Service Data のようなモジュールがあります。 -それはビューの統合です。 Remote Entity API はまだdrupal 8.に移植されていません。参照: 別のデータベースのDrupalエンティティ

カスタムコーディングのアイデアは次のとおりです: Views Query Backend またはSearch API(または独自の検索APIバックエンドを作成-多分 solr を介して)

いずれにせよ、キャッシングについて考えてください。サイトへのすべてのリクエストでAPIへのリクエストを行うのは非常にコストがかかるためです。

1
rémy

最初の警告。データベース間でクエリを実行することは困難です。ビューはデフォルトでSQLクエリを実行します。両方のデータを結合する必要があるクエリは、2つのカスタムクエリとPHPでのマージです。これはビューがあなたを助けるものではありません。

これを支援する多くのアプローチがあります。 JSONデータソースを構築し、AngularJSを使用してデータを表示することで、この問題に取り組みます。

2x SQLソース。 2つのSQLデータソースは drupal 7 のようにマッピングできます。クエリインターフェイスを使用して、データをマッサージします。 JSONとして返します。

質問はデータベーステーブルをビューにマップする回答につながり、これを行うためのツールがあります。別のデータベースからビューの「体験」が得られるとは思いません。

1
Interlated