Skip to content
Snippets Groups Projects
command-api-v3.php 5.01 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Access the CiviCRM API v3.
     *
     * ## EXAMPLES
     *
     *     $ wp civicrm api contact.get id=10
     *     Output here.
     *
     * @since 5.69
     */
    class CLI_Tools_CiviCRM_Command_API_V3 extends CLI_Tools_CiviCRM_Command {
    
      /**
       * Object fields.
       *
       * @var array
       */
      protected $obj_fields = [
        'id',
      ];
    
      /**
       * Access the CiviCRM API v3.
       *
       * ## OPTIONS
       *
       * <args>...
       * : The API query passed as arguments.
       *
       * [--input=<input>]
       * : Specify the input in a particular format.
       * ---
       * default: args
       * options:
       *   - args
       *   - json
       * ---
       *
       * [--timezone=<timezone>]
       * : The CiviCRM timezone string. Defaults to the WordPress `timezone_string` setting.
       *
       * [--format=<format>]
       * : Render output in a particular format. The "table" format can only be used when retrieving a single item.
       * ---
       * default: pretty
       * options:
       *   - pretty
       *   - json
       *   - table
       * ---
       *
       * ## EXAMPLES
       *
       *     $ wp civicrm api contact.get id=10
       *     $ wp civicrm api contact.get id=10 --format=json
       *     $ wp civicrm api group.get id=1 --format=table
       *     $ echo '{"id":10, "api.Email.get": 1}' | wp cv api contact.get --input=json
       *
       * @since 5.69
       *
       * @param array $args The WP-CLI positional arguments.
       * @param array $assoc_args The WP-CLI associative arguments.
       */
      public function __invoke($args, $assoc_args) {
    
        // Grab associative arguments.
        $input_format = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'input', 'args');
        $site_timezone = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'timezone', $this->site_timezone_get());
        $format = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'format', 'pretty');
    
        // Get the Entity and Action from the first positional argument.
        list($entity, $action) = explode('.', $args[0]);
        array_shift($args);
    
        // Parse params.
        $defaults = ['version' => 3];
        switch ($input_format) {
    
          // Input params supplied via args.
          case 'args':
            $params = $defaults;
            foreach ($args as $arg) {
              preg_match('/^([^=]+)=(.*)$/', $arg, $matches);
              $params[$matches[1]] = $matches[2];
            }
            break;
    
          // Input params supplied via json.
          case 'json':
            $json = stream_get_contents(STDIN);
            if (empty($json)) {
              $params = $defaults;
            }
            else {
              $params = array_merge($defaults, json_decode($json, TRUE));
            }
            break;
    
          default:
            WP_CLI::error(sprintf('Unknown format: %s', $input_format));
            break;
    
        }
    
        // Bootstrap CiviCRM.
        $this->bootstrap_civicrm();
    
        // CRM-18062: Configure timezone for CiviCRM.
        $current_timezone = date_default_timezone_get();
        if ($site_timezone) {
          date_default_timezone_set($site_timezone);
          CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
        }
    
        // Now call the CiviCRM API.
        $result = civicrm_api($entity, $action, $params);
    
        // Restore timezone.
        if ($current_timezone) {
          date_default_timezone_set($current_timezone);
        }
    
        switch ($format) {
    
          // Pretty-print output (default).
          case 'pretty':
            WP_CLI::log(print_r($result, TRUE));
            break;
    
          // Display output as json.
          case 'json':
            WP_CLI::log(json_encode($result));
            break;
    
          // Display output as table.
          case 'table':
            $assoc_args['format'] = $format;
            if (count($result['values']) === 1) {
              $item = array_pop($result['values']);
              $assoc_args['fields'] = array_keys($item);
              $formatter = $this->formatter_get($assoc_args);
              $formatter->display_item($item);
            }
            else {
    
              // Give up and log usual output.
              WP_CLI::log(print_r($result, TRUE));
    
              // phpcs:disable
    
              /*
              // Testing whether we can do this. It's hard, but kinda works.
              $fields_query = civicrm_api3($entity, 'getfields', [
                'api_action' => $action,
              ]);;
              $fields = array_keys($fields_query['values']);
              //WP_CLI::log(print_r($fields, TRUE));
    
              //WP_CLI::log(print_r($result['values'], TRUE));
              $assoc_args['fields'] = $fields;
              //WP_CLI::log(print_r($assoc_args['fields'], TRUE));
    
              // Cast items as objects.
              array_walk($result['values'], function( &$item ) use ( $fields ) {
                foreach ($fields as $field) {
                  // Make sure the array has all keys.
                  if (!array_key_exists($field, $item)) {
                    $item[$field] = '';
                  }
                }
                $item = (object) $item;
              });
              //WP_CLI::log(print_r($result['values'], TRUE));
    
              $formatter = $this->formatter_get($assoc_args);
              //WP_CLI::log(print_r($formatter, TRUE));
    
              $formatter->display_items($result['values']);
              */
    
              // phpcs:enable
    
            }
            break;
    
          default:
            WP_CLI::error(sprintf('Unknown format: %s', $format));
    
        }
    
      }
    
    }