Skip to content
Snippets Groups Projects
hook_civicrm_apiWrappers.md 2.83 KiB
Newer Older
  • Learn to ignore specific revisions
  • ## Summary
    
    This hook allows you to add, override, or remove methods to be called before and after API calls — and to modify either the parameters or the result of the call.
    
    !!! caution ""
        Use caution when overriding or removing methods.
    
    
        hook_civicrm_apiWrappers(&$wrappers, $apiRequest)
    
    ## Parameters
    
    - API_Wrapper[] $wrappers - an array of objects which implement the [`API_Wrapper`](#wrapper-class) interface.
    
    - array $apiRequest - contains keys 'entity', 'action', and params; see [APIv3 Usage](/api/v3/usage.md).
    
    
    ## Returns
    
    - Void
    
    ## Wrapper class
    
    The `API_Wrapper` interface specifies two methods:
    
     * `fromApiInput($apiRequest)`  - Allows for modifcation of API parameters before the request is executed.
       Should return a (possibly modified) $apiRequest array.
    
     * `toApiOutput($apiRequest, $result)` - Allows for modification of the result before it is returned.
       Should return a (possibly modified) $result array.
    
    These methods will be called for every API call unless the `hook_civicrm_apiWrappers()` implementation
    conditionally registers the object. One way to optimize this is to check for the API Entity in
    `hook_civicrm_apiWrappers()` and to check for the API action in the wrapper methods.
    
    ## Example
    
    In the file where hooks are implemented, e.g., `path/to/myextension/myextension.php`:
    
    
      * Implements hook_civicrm_apiWrappers().
    
      */
    function myextension_civicrm_apiWrappers(&$wrappers, $apiRequest) {
    
      // The APIWrapper is conditionally registered so that it runs only when appropriate
    
      if ($apiRequest['entity'] == 'Contact' && $apiRequest['action'] == 'create') {
    
        $wrappers[] = new CRM_Myextension_APIWrappers_Contact();
    
    Since we named the wrapper class `CRM_Myextension_APIWrappers_Contact`, the following code is placed in
    `path/to/myextension/CRM/Myextension/APIWrappers/Contact.php` to take advantage of CiviCRM's PHP autoloader:
    
        class CRM_Myextension_APIWrappers_Contact implements API_Wrapper {
    
    
           * Conditionally changes contact_type parameter for the API request.
    
           */
          public function fromApiInput($apiRequest) {
            if ('Invalid' == CRM_Utils_Array::value('contact_type', $apiRequest['params'])) {
              $apiRequest['params']['contact_type'] = 'Individual';
            }
            return $apiRequest;
          }
    
          /**
    
           * Munges the result before returning it to the caller.
    
           */
          public function toApiOutput($apiRequest, $result) {
            if (isset($result['id'], $result['values'][$result['id']]['display_name'])) {
              $result['values'][$result['id']]['display_name_munged'] = 'MUNGE! ' . $result['values'][$result['id']]['display_name'];
              unset($result['values'][$result['id']]['display_name']);
            }
            return $result;
          }
    
    ginkgomzd's avatar
    ginkgomzd committed
        }