-
Kevin Cristiano authoredKevin Cristiano authored
command-api-v3.php 5.01 KiB
<?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));
}
}
}