web-dev-qa-db-ja.com

サービスでProfile2フィールドを公開する方法は?

サービスを介してユーザーのProfile2フィールドをCRUDするための良い解決策はありますか?これはServices Entity APIで実行できると思いますが、より直接的な統合があるのでしょうか。

Services Entity API を使用して、entity_profile2リソース。プロファイルのインデックスをロードできます。プロファイルにインデックスを付ける機能を無効にする必要がありますが、ユーザーは自分のプロファイルを取得できます。

ドキュメントから、このURLはuid = 296のプロファイルを持つユーザーを見つけることができるはずです。

api/entity_profile2.json?parameters[uid]=296

しかし、結果は空のページです。

2
Joe Beuckman

私はpidを使用する必要があることに気づきました:/api/entity_profile2?parameters[pid]=1

1
Daniel Holm

これをまだ探している人のために、私はこれを機能させるために、indexオプションを有効にし(単に取得するだけでなく)、entity_profile2の下に(番号を含まない)エイリアスを作成する必要がありました。

0
Jeff Dugan

上記の答えはどちらもうまくいきませんでした。クエリパラメータを追加するかどうかに関係なくapi/entity_profile2.jsonを押すと、プロファイルのインデックスが取得されます。このインデックスはオフになっているため、404 "リソースが見つかりません"エラーを返します。他のすべてのサービスと同様に、IDを使用して取得ルートにアクセスする必要がありますが、最初にプロファイルIDを取得する必要があります。 GET api/entity_profile2/1.jsonとします。1はユーザーIDではなくプロファイルIDです。

もちろん、インデックスを取得してuidに基づいてフィルタリングすることは可能ですが、これは最良のRESTyオプションではなく、少し複雑なようです。また、大きな問題は、たとえばapi/user/1.jsonを押したときに、関連するprofile2プロファイルIDを含め、ユーザーフィールドに関する詳細が提供されないことです。

最善の方法は、カスタムモジュールのサービスコールの後処理にフックして、それにprofile2データを追加することでした。ユーザーオブジェクトにプロファイルIDだけを追加してから、上記のようにentity_profileサービスを使用するか、エンティティ全体をユーザーオブジェクトに追加するだけで、services_entityを気にする必要もありません。次のようにコーディングします。

function mymodule_services_request_postprocess_alter($controller, $args, &$results) {
  if (isset($results->uid) && $results->uid > 0) {
    $profile2 = profile2_load_by_user($results);
    if ($profile2) {
      $results->profile2 = array_values(profile2_load_by_user($results));
    }
  }
}

... api/user/1.jsonを取得すると、このような結果になります

{
  "uid": "1",
  "name": "admin",
  "mail": "[email protected]",
  "theme": "",
  "signature": "",
  "signature_format": null,
  "created": "1441810121",
  "access": "1450698782",
  "login": "1450695398",
  "status": "1",
  "timezone": "UTC",
  "language": "",
  "picture": "0",
  "init": "[email protected]",
  "data": false,
  "uuid": "82919e2f-e431-44e6-b4b1-8d13c5555c94",
  "roles": {
    "2": "authenticated user"
  },
  "profile2": [
    {
      "pid": "1",
      "type": "main",
      "label": "Main profile",
      "uid": "1",
      "created": "1450696479",
      "changed": "1450696479",
      "field_first_name": {
        "und": [
          {
            "value": "Matt",
            "format": null,
            "safe_value": "Matt"
          }
        ]
      },
      "field_last_name": {
        "und": [
          {
            "value": "Fletcher",
            "format": null,
            "safe_value": "Fletcher"
          }
        ]
      }
    }
  ]
}

フォーマットの仕方はもちろんあなた次第です。物事を行う方法はたくさんあります。しかし、これは私にとって最も簡単な方法であり、他の解決策ほど多くのREST呼び出しを必要としません:)

0
Matt Fletcher