サービスを介してユーザーのProfile2フィールドをCRUDするための良い解決策はありますか?これはServices Entity APIで実行できると思いますが、より直接的な統合があるのでしょうか。
Services Entity API を使用して、entity_profile2
リソース。プロファイルのインデックスをロードできます。プロファイルにインデックスを付ける機能を無効にする必要がありますが、ユーザーは自分のプロファイルを取得できます。
ドキュメントから、このURLはuid = 296のプロファイルを持つユーザーを見つけることができるはずです。
api/entity_profile2.json?parameters[uid]=296
しかし、結果は空のページです。
私はpidを使用する必要があることに気づきました:/api/entity_profile2?parameters[pid]=1
これをまだ探している人のために、私はこれを機能させるために、indexオプションを有効にし(単に取得するだけでなく)、entity_profile2の下に(番号を含まない)エイリアスを作成する必要がありました。
上記の答えはどちらもうまくいきませんでした。クエリパラメータを追加するかどうかに関係なく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呼び出しを必要としません:)