2014-03-04 41 views
1

在舊的v4.x API中,有可能在一個POST請求中使用create or update multiple records,但在新的v10 REST API中,不再記錄這些記錄。有誰知道該怎麼做?或者如果它甚至可能?在SugarCRM中使用v10 REST API創建多條記錄

我嘗試了一些東西,例如將記錄張貼爲JSON數組,但那隻會創建一個空記錄。

[{"name":"Case 2"},{"name":"Case 3"}] 

或者,如果在SugarCRM中有一個用例創建或更新了多個記錄,那也沒關係。我可以輕鬆地使用Fiddler來閱讀它們如何格式化JSON,然後自己使用它。

回答

2

我最近遇到了這個問題,也沒有發現關於這個或者任何可用的API函數的文檔。我個人對此有真正的需求,並發現最好的解決方案是創建一個custom API entry point

這是我爲了完成多個條目提交而編寫的代碼。它不提供任何錯誤處理,並且是爲了滿足我的需求而編寫的,但這應該涵蓋大多數情況。創建這些文件後,必須從管理儀表板「管理員>>修復>>快速修復和重建」中運行快速修復重建。「這是註冊新入口點所必需的。

文件:自定義/客戶/基/ API/SetEntriesApi.php

<?php 

/* 
* Copyright (C) 2014 DirectPay 
* 
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation; either version 2 
* of the License, or (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
*/ 

if (!defined('sugarEntry') || !sugarEntry) 
    die('Not A Valid Entry Point'); 

class SetEntriesApi extends SugarApi { 

    public function registerApiRest() { 
     return array(
      //POST 
      'SetEntries' => array(
       //request type 
       'reqType' => 'POST', 
       //endpoint path 
       'path' => array('record', 'set_entries'), 
       //method to call 
       'method' => 'setEntriesMethod', 
       //short help string to be displayed in the help documentation 
       'shortHelp' => 'Provides functionality to create & update multiple records.', 
       //long help to be displayed in the help documentation 
       'longHelp' => 'custom/clients/base/api/help/SetEntriesApi_help.html', 
      ), 
     ); 
    } 

    public function setEntriesMethod($api, $args) { 
     if (empty($args)) { 
      return false; 
     } 
     $results = array(); 
     foreach ($args as $module => $records) { 
      if (is_array($records)) { 
      foreach ($records as $fieldsArray) { 
        $sugarBean = $this->_processEntry($module, $fieldsArray); 
        $results[$module][] = $sugarBean->id; 
       } 
      } 
     } 
     return $results; 
    } 

    private function _processEntry($module, $fieldsArray) { 
     if (array_key_exists('id', $fieldsArray)) { 
      $sugarBean = BeanFactory::retrieveBean($module, $fieldsArray['id']); 
     } else { 
      $sugarBean = BeanFactory::newBean($module); 
     } 
     if (is_null($sugarBean)) { 
      return null; 
     } 
     foreach ($fieldsArray as $field => $data) { 
      $sugarBean->$field = $data; 
     } 
     $sugarBean->save(); 
     return $sugarBean; 
    } 

} 

?> 

文件:自定義/客戶/基/ API /幫助/ SetEntriesApi_help.html

<h2>Overview</h2> 
<span class="lead"> 
    This is a custom setEntries endpoint. This is used to create or update 
    multiple modules and records with one call. This was originally available in 
    the older versions of the API, but was removed in v10. This is not a ported 
    version from v4.1 and rather a quick recreation of that functionality modified 
    slightly to allow for multiple modules. 
</span> 

<h2>Path Variables</h2> 
<span class="lead"> 
    This endpoint does not accept any path variables. 
</span> 

<h2>Input Parameters</h2> 
<table class="table table-hover"> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Type</th> 
     <th>Description</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td> 
      args 
     </td> 
     <td> 
      Array 
     </td> 
     <td> 
      Data array to pass to the endpoint. 
     </td> 
    </tr> 
    </tbody> 
</table> 

<h2>Result</h2> 
<table class="table table-hover"> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Type</th> 
     <th>Description</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td> 
      results 
     </td> 
     <td> 
      Array 
     </td> 
     <td> 
      Array of modules that contain a nested array of the IDs of the updated records and/or newly created record. 
     </td> 
    </tr> 
    </tbody> 
</table> 

<h3>Output Example</h3> 
<pre class="pre-scrollable"> 
{ 
    "Accounts": [ 
    "92e26a99-9e7a-3dca-9ab0-53c6d6833d5f", 
    "991b8007-a517-0c8b-6b69-53c6d6fd70fb", 
    "9a129144-0f61-e808-00c2-53c6d674bd04", 
    "addc4404-ae4a-c031-586b-53c6d60f70dd" 
    ] 
} 
</pre> 

<h2>Change Log</h2> 
<table class="table table-hover"> 
    <thead> 
    <tr> 
     <th>Version</th> 
     <th>Change</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td> 
      v10 
     </td> 
     <td> 
      Added <code>/record/set_entries</code> POST endpoint. 
     </td> 
    </tr> 
    </tbody> 
</table> 

自定義入口點遍歷多維數組並使用CRUD handling in BeanFactory單獨創建或更新記錄。爲了更新現有記錄,必須將ID與記錄一起傳遞。以下是傳遞給端點的json代碼示例。

JSON代碼:

{ 
    "Contacts": { 
    "id": "9a129144-0f61-e808-00c2-53c6d674bd04", 
    "name": "Contact Name" 
    }, 
    "Accounts": { 
    "name": "Account Name" 
    } 
} 

我希望這有助於!

4

v10 API有一個「批量」端點,允許您一次提交多個API調用。

查看{URL}/REST/V10 /幫助和向下滾動到/散裝瞭解更多詳情

1

@TO_web的反應真的幫了我很多,但傳遞到端點的JSON必須是這個方式:

{"Contacts": 
    [ 
     { 
      "id":"89905d08-5c98-604e-9f49-55d5e670161b", 
      "custom_field":"Testing" 
     } 
    ], 
"Accounts": 
    [ 
     { 
      "name":"Testing" 
     } 
    ] 
}