web-dev-qa-db-ja.com

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

(クエリ文字列として渡されるパラメーターを使用して)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>  
11
Mugunth

推奨されるソリューションは、最初にデータベースにデータを取得し、次にビューに表示することに基づいています。

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

4
Bojan Zivanovic

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

3
Carolyn

もっとエレガントな解決策があると確信していますが、私はこれまでに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時間に自動的に入力される特定のコンテンツタイプが得られました。ビューを使用して、通常のol 'Drupalノード!:)の形式であるため、任意の方法でデータを表示できます。

お役に立てれば!

1
Alex Weber