web-dev-qa-db-ja.com

既存のファイルを上書きせずに、services 3を使用して新しいファイルをノードにPUTするにはどうすればよいですか?

サービス3を使用して、ファイルを追加しても問題なく動作しています

endpoint/file
{"uid":"1","filesize":"99999","filename":"whatever.bin","file":"BASE64_ENCODED_DATA"}

また、そのファイルを使用してノードを追加するには、

endpoint/node
{"title":"testrest1","type":"dl","field_dl_file":{"und":[{"fid":582}]},"uid":"1","language":"und"}

しかし、どうすれば新しいファイルをノードに追加できますか? PUTを行うとき

endpoint/node/999 
{"field_dl_file":{"und":[{"fid":999}]},"uid":1,"language":"und"}

既存のファイルを上書きするだけです。 POSTを試行すると、大量のエラーが発生します。

5
7wonders

バックグラウンド

サービスはノードフォームでdrupal_execute()を使用して更新をノードに保存しますが、更新を既存のデータと完全にマージすることはありません。

更新によってフィールドがまったく設定されない場合、そこにあるものは上書きされないため、ある意味ではその場合にデータをマージします。たとえば、この例では、更新で「タイトル」を設定しないため、そのフィールドは上書きされません。

ただし、フィールドを設定すると、以前にあったものが上書きされます。したがって、あなたの例では、「field_dl_file」を設定しているので、以前にあったものを現在設定したもので上書きします。ご覧のとおり、これにより既存のファイルが上書きされます。

解決

おそらく最良の解決策(そしてサービスチームが意図したものだと思います)は、スクリプトに「field_dl_file」の以前の値をロードすることです(RESTインターフェイスへの呼び出しを介して)、次に、新しい値と古い値の両方で更新を呼び出します。つまり、古いデータをクライアント側の新しいデータとマージします(REST =インターフェース)。

別の可能な解決策は、「field_dl_file」フィールドをnode_resource.inc内の既存の値(365行程度)と手動でマージすることです。私はサービスチームがこれを意図していなかったと思い、モジュールを直接変更する必要があるので(そこにフックがないため)、実際にはお勧めできません。ただし、クライアント側スクリプトで必要な作業が容易になるため、実装によってはメリットになる場合があります。

:Drupal 6コードを参照しましたが、Drupal 7にも当てはまると確信していますが、サービス3は私の知る限り変更されていません)。

4