2016-05-04 26 views
0

私はDrupal サービスservices_entityモジュールを使用してWebサービスを構築しています。事は、あなたが持っているだろうファイルを表示したいすべての時間であるDrupalサービス - ファイルリソース参照の代わりに直接ファイルURL

array (
    resource: file, 
    id: xx, 
    uri: /entity_file/xx.json 
) 

:ような問題は、ファイルがフィールドなどを使用してエンティティに装着された場合には、サービスのエンドポイントがリソース参照としてファイルを表示するということです埋め込むことができるファイルの直接URLを(得るためにidでファイルの実体の詳細を取得、

  • まず、取得したファイルの実体URI
  • 第二:2つの以上の要求を作るためにアプリケーションまたはsrc = "xx" imgタグとして使用されます。

質問は、追加のリクエストをせずにファイルURLを直接取得する方法です。だから、好適な応答は次のようになります。

array (
    resource: file, 
    id: xx, 
    uri: /entity_file/xx.json, 
    url: http://.../sites/.../files/foo/bar/b-reft.jpg 
) 

私は時間を探したが、答えを見つけることができませんでしたので、私は、私は私が見つけた解決策を共有するだろうと思いました。私はそれが多くを助けると信じています(また、services_entityモジュールのための複雑なインデックスクエリパラメータのサポートのために私のモジュールを共有することもできます)。データはServicesEntityResourceControllerによって返されるので

答えて

0

、リソースコントローラに

を宣言し、私はhook_services_entity_resource_info()を使用して独自のリソースコントローラを宣言することを決定しました。

/** 
* Implements hook_entity_resource_info() 
*/ 
function c11n_services_entity_resource_info() { 

    $output = array(); 

    $output['c11n'] = array (
     'title' => 'Clean Entity Processor - Customized', 
     'description' => 'An entity wrapper based on the "Clean Entity Wrapper" wrapper with certain fixes and improvements.', 
     'class' => 'ServicesEntityResourceControllerC11n', 
    ); 

    return $output; 

} 

コントローラクラスをこの後

を宣言し、Iは、コントローラクラス宣言:

ServicesEntityResourceControllerC11n extends ServicesEntityResourceControllerClean 

オーバーライドget_resource_reference()メソッド

最終タッチ(トルク決勝)は、ファイルのURLを追加することです。親クラスの出力に取り組み、ファイルのURLを追加することにしました。実際のデータはServicesEntityResourceController :: get_resource_reference()メソッドによって返されます。だから、私はこれのようにそれを打ち倒し、それが完了しました。

protected function get_resource_reference($resource, $id) { 

    $output = parent::get_resource_reference($resource, $id); 

    switch ($resource): 
     case 'file': 
      $file = file_load($id); 
      if ($file) 
       $output['url'] = file_create_url($file->uri); 
      break; 
     case 'taxonomy_term': 
      // Do something for taxonomy terms 
      break; 
    endswitch; 

    return $output; 

} 

問題を解決します。しかし、私はそれが最良の解決策であると主張していませんが、解決策を持たない方が良いことはありません。

代替ソリューション

あなたはentity_fileリソースを変更し、targeted_actionという名前ダウンロードまたは埋め込みを追加することができます。コールバックでは、ファイルのMIMEタイプのヘッダーを送信してから、fpasthru()またはecho file_get_contents()を使用してファイルのコンテンツをレンダリングします。

関連する問題