2016-11-22 8 views
0

xmlレスポンスで条件を設定できますか?そこ0,1,2,3のような数値である、データベース内のステータスフィールドであり、我々はフィールドが存在しない場合Cakephp 3.0 REST APIはAPIレスポンスの条件を追加します

0 for => Complete 
2 for => Cancelled 
2 for => Return 
5 for => Refund. 

がどのように我々は、XML応答に新しいフィールドを追加することができます下のようにそれを見せたいのようにデータベースに?

答えて

0

Cakephp 3.0でSalesテーブルから売上レポートを取得しているとします。残りのAPIを使用します。 あなたは、カスタマイズ、名前変更、

以下のREST APIのURLが

コントローラで
https://example.com/api/index.json?fromdate_utc=2016-10-03&todate_utc=2016-10-03 

そしてfunctino以下のようなものは、以下のようなものになりますようにあなたがそれを行うことができますのREST APIの応答でいくつかのフィールドを追加したい場合: -

public function index($fromdate = null, $todate = null) 
    { 
     //set date range for 
     if(!empty($_GET['fromdate_utc']) && !empty($_GET['todate_utc'])){ 
      // if from amd to date are same add +1 day in to date to get result 
      $to_date = date('Y-m-d', strtotime($_GET['todate_utc'] . ' +1 day')); 
      $dateRage = array('Sales.SalesDate >= ' => $_GET['fromdate_utc'], 'Sales.SalesDate <=' => $to_date); 
     }else{ 
      $dateRage = array();      
     } 

     $conditions = array(
      'and' => array($dateRage), 
     ); 

     //$this->Auth->allow(); 
     $sales = $this->Sales->find('all', array(
         'conditions' => $conditions 
        )) 
        ->select(['SalesNo', 'SalesDate', 'TotalValue', 'TotalDiscount', 'NetTotal', 'PaymentMode', 'Status']) 
        ->where(['StoreId' => '8','Status !=' => '2','Status !=' => '4'])->andWhere(['Status !=' => 1])->andWhere(['Status !=' => 4]); 
        //->limit(3); 
     $salesResponse = array(); 
     //echo '<br/>Count no of output => '.$sales->count(); 
     if($sales->count() >0){ 
      foreach($sales as $key=>$salesData){ 
       //re generate the array as per your requirements 
       $salesResponse[$key]['SalesNo']   = $salesData->SalesNo; 
       $salesResponse[$key]['SalesDate'] = $salesData->SalesDate; 
       $salesResponse[$key]['TotalValue']  = $salesData->TotalValue; 
       $salesResponse[$key]['TotalDiscount'] = $salesData->TotalDiscount; 
       $salesResponse[$key]['NetTotal']  = $salesData->NetTotal; 
       $salesResponse[$key]['SaleTax']   = 0; // add new fields that does not exist in database 
       $salesResponse[$key]['PaymentMode']  = $salesData->PaymentMode; 
       // change the status from numeric to character and pass it to response 
       if($salesData->Status == 5){ 
        $salesResponse[$key]['Status']  = 'Refund'; 
       }elseif($salesData->Status == 3){ 
        $salesResponse[$key]['Status']  = 'Return'; 
       }elseif($salesData->Status == 2){ 
        $salesResponse[$key]['Status']  = 'Cancelled'; 
       }elseif($salesData->Status == 0){ 
        $salesResponse[$key]['Status']  = 'Complete'; 
       } 
      } 
     }else{ 
      $salesResponse = array('Error ! sorry not found any record.'); 
     } 

     $this->set([ 
      'sales' => $salesResponse, 
      '_serialize' => ['sales'] 
     ]); 
    } 
0

あなたがXMLで状態のため、わずかに異なる名前を持つ大丈夫ている場合は、例えば、と呼ばれる仮想フィールド、STATUS_TEXTを作成することができます。あなたのSaleエンティティクラスにprotected function _getStatusTextを追加して、ステータス整数に基づいて目的のテキストを返し、protected $_virtual = ['status_text'];をSaleクラスに追加すると、XMLにステータステキストが表示されます。

+0

Gregも同じことですが、Salesクラス内でステータステキストを返す保護された関数を作成できます。上記の私は別の関数を作成しません。私は同じ関数で条件を追加するだけです。そのもうまく動作します。 – kantsverma

+0

解決策は正常に動作するはずです。新しいフィールドをテーブルに追加するたびに更新する必要があるため、ちょっと壊れやすいように見えます。 –

+0

Gregもちろん、テーブルに新しいフィールドを追加する場合は、そのフィールドをコントローラとモデルに追加する必要があります。私はその罰金を望む、モデル内のフィールドだけでなく、コントローラに追加することなく、テーブルに新しいフィールドを追加する他のソリューションはありますか? – kantsverma

関連する問題