外部Webサービスを利用して結果をビューに表示する方法はありますか?


11

(クエリ文字列として渡されるパラメーターを使用して)HTTP呼び出しを使用してアクセスできる外部Webサービスがあり、XML形式で結果を返します。

Drupalを使用して(必要なパラメーターを使用して)そのWebサービスにアクセスし、ビューを使用して結果を表示したいと思います。

これらはサンプルクエリであり、使用しているWebサービスから取得した結果です。

クエリ:http://localhost/query.php?cy = in&q = abcd&cat = 22
結果:

<?xml version="1.0"?>
<results>
<Jobs>
    <Job ID="111">
        <Title>Test one</Title>
        <Summary>Test one summary</Summary>
        <DateUpdated Date="2011-04-04 18:03:00">4/4/2011</DateUpdated>
        <Location>
            <Country>India</Country>
            <City>Delhi</City>
        </Location>
        <CompanyName>Test Company</CompanyName>
    </Job>
    <Job ID="222">
        <Title>Test two</Title>
        <Summary>Test two summary</Summary>
        <DateUpdated Date="2011-04-04 18:03:00">4/4/2011</DateUpdated>
        <Location>
            <Country>India</Country>
            <City>Chennai</City>
        </Location>
        <CompanyName>Test company</CompanyName>
    </Job>
</Jobs> 
</results>  

回答:


4

推奨される解決策は、最初にデータをデータベースに取り込み、次にビューに表示することに基づいています。

別の方法は、カスタムクエリバックエンドを使用して、ビューから直接サービスにクエリを実行することです。チェックアウトhttp://drupal.org/node/958270あなたがあなた自身を記述するための例として使用できるカスタムバックエンドへのリンク(それは多くの作業ではありません)


もちろん、最初にデータをデータベースに取り込むことの利点は、単純さだけではなく、データをキャッシュすることでもあります。ローカルデータストアのクエリは、常に外部サービスよりも高速です。
Alex Weber

ただし、drupal.org / node / 958270ではViews3.0を使用しています。ビュー3.0を使用せず、データをdbに保存する必要がない方法はありますか?Webサービスをリアルタイムで使用し、ページにデータを表示するだけです。

もちろん、それは言うまでもありません。
Bojan Zivanovic 2011

すべての新機能は、ビュー3であるので、非常に近い終末期の第2のビューをである
ボヤンZivanovic

@Alex:外部Webサービスでビュー3を使用しても、結果をキャッシュできます。
s.Daniel 2013

3

フィードのモジュールは、コンテンツに引き、ノードにそれを回すことができます。フィードXPathパーサーを使用すると、xmlファイルを解析してタグをフィールドにマップできます。次に、ビューを使用してコンテンツを通常どおり表示できます。


1

もっとエレガントな解決策があると確信していますが、私はこれをTwitterフィードで過去に実行したことがあり、うまく機能します。これが私の見解です。

  • 結果を保存するコンテンツタイプを作成し、必要に応じて、使用するコンテンツと一致するフィールドを設定します
  • hook_cron()を実装し、定期的にWebサービスを使用して結果をノードとして保存するモジュールを作成します

2番目のステップは、プログラムでノードインスタンスを作成することで実現できます。

$node = new stdClass();
$node->title = 'title';
$node->my_custom_field['und'][0]['value'] = 'my custom value';
// fill all your other fields
node_save($node);
  • プログラムでノードを作成するときに重複を回避する最良の方法は、Webサービスの結果のID(またはタイムスタンプなど)をデータベースの最新のエントリと比較することです。
SELECT fdfpi.field_picture_id_value FROM field_data_field_picture_id fdfpi INNER JOIN node n ON fdfpi.entity_id = n.nid AND fdfpi.entity_type = 'node' WHERE n.type = 'picture' ORDER BY n.created DESC LIMIT 1

上記の例は少しわかりにくいかもしれませんが、実際にはそうではありません。カスタムフィールド "picture_id"を持つコンテンツタイプ "picture"を作成しました。そのタイプの最後に作成されたノードのIDを取得する手動の方法です。

  • これで、cron時間に自動的に入力される特定のコンテンツタイプが得られました...利益!ビューを使用すると、通常のDrupalノードの形式でデータを好きなように表示できます。:)

お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.