' . t('Servers') . '';
if (!empty($servers)) {
$output .= '
';
foreach ($servers as $module) {
$info = module_invoke($module, 'server_info');
$name = $info['#name'];
$path = 'services/' . $info['#path'];
$output .= '- ' . l($name . ' - /' . $path, $path) . '
';
}
$output .= '
';
}
else {
$output .= '' . t('You must enable at least one server module to be able to connect remotely. Visit the modules page to enable server modules.', array('@url' => url('admin/build/modules'))) . '
';
}
$output .= '' . t('Services') . '
';
// group namespaces
$services = array();
foreach ($methods as $method) {
$namespace = drupal_substr($method['#method'], 0, strrpos($method['#method'], '.'));
$services[$namespace][] = $method;
}
if (count($services)) {
foreach ($services as $namespace => $methods) {
$output .= '' . $namespace . '
';
$output .= '';
foreach ($methods as $method) {
$output .= '- ' . l($method['#method'], 'admin/build/services/browse/' . $method['#method']) . '
';
}
$output .= '
';
}
}
else {
$output .= t('No services have been enabled.');
}
return $output;
}
function services_admin_browse_method($method) {
global $_services_admin_browse_test_submit_result;
$output = '';
$output .= '' . $method['#method'] . '
';
$output .= '' . $method['#help'] . '
';
// List arguments.
$output .= '' . t('Arguments') . ' (' . count($method['#args']) . ')
';
$output .= '';
$count = 0;
foreach ($method['#args'] as $arg) {
$count++;
$output .= '- ' . $arg['#type'] . '' .
$arg['#name'] . ' (' . (($arg['#optional']) ? t('optional') : t('required')) . ')
';
$output .= '- ' . $arg['#description'] . '
';
}
$output .= '
';
// Allow testing of methods
$output .= '' . t('Call method') . '
';
// @TODO this is a hack we should be trying to return a structure array if it is possible - this is just to fix existing behaviour
$output .= drupal_render(drupal_get_form('services_admin_browse_test'));
// Display results
if ($_services_admin_browse_test_submit_result) {
$output .= '';
$output .= '
' . t('Result') . '
';
$output .= '' . $_services_admin_browse_test_submit_result . '
';
$output .= '';
}
return $output;
}
function services_admin_browse_test() {
$form = array();
$method = services_method_get(arg(4));
$form['arg'] = array('#tree' => TRUE);
$form['format'] = array('#tree' => TRUE);
foreach ($method['#args'] as $key => $arg) {
$form['name'][$key] = array(
'#value' => $arg['#name']
);
$form['optional'][$key] = array(
'#value' => ($arg['#optional']) ? t('optional') : t('required')
);
if (isset($arg['#size']) && $arg['#size'] == 'big') {
$form['arg'][$key] = array(
'#type' => 'textarea'
);
}
else {
$form['arg'][$key] = array(
'#type' => 'textfield'
);
}
$format_opt = array();
switch ($arg['#type']) {
case 'array':
$format_opt['cdel'] = t('Comma delimited');
case 'struct':
$format_opt['json'] = t('JSON');
$format_opt['sphp'] = t('Serialized PHP');
break;
}
if (!empty($format_opt)) {
$form['format'][$key] = array(
'#type' => 'select',
'#options' => $format_opt,
);
}
else {
$form['format'][$key] = array(
'#type' => 'value',
'#value' => '',
);
}
}
services_auth_invoke('alter_browse_form', $form, $method);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Call method')
);
$form['#redirect'] = FALSE;
return $form;
}
function services_admin_browse_test_submit($form, $form_state) {
global $_services_admin_browse_test_submit_result;
$method = services_method_get(arg(4));
$args = services_admin_browse_test_unserialize_args($form_state['values']['arg'], $form_state['values']['format']);
// Allow the authorization module to handle submitted values.
services_auth_invoke('alter_browse_form_submit', $method, $args);
$result = services_method_call($method['#method'], $args, TRUE);
$_services_admin_browse_test_submit_result = '' . htmlspecialchars(print_r($result, TRUE)) . '
';
}
function services_admin_browse_test_unserialize_args($values, $formats) {
$method = services_method_get(arg(4));
$noskip = FALSE;
// Convert args
for ($c = count($method['#args']) - 1; $c >= 0; $c--) {
$arg = $method['#args'][$c];
$value = $values[$c];
// Remove empty values from end of array
// Once we find a value, we can no longer skip
if (!is_numeric($value) && empty($value) && !$noskip) {
continue;
}
$noskip = TRUE;
switch ($formats[$c]) {
case 'cdel';
if (empty($value)) {
$return[$c] = NULL;
}
else {
$return[$c] = split(',', $value);
}
break;
case 'json':
if (empty($value)) {
$return[$c] = NULL;
}
else {
$return[$c] = json_decode($value, $arg['#type'] === 'array');
}
break;
case 'sphp':
if (empty($value)) {
$return[$c] = NULL;
}
else {
$return[$c] = unserialize($value);
}
break;
default :
$return[$c] = $value;
}
}
if ($return) ksort($return);
return $return;
}
function theme_services_admin_browse_test($form) {
$output = '';
$output .= drupal_render($form['test']);
$header = array(t('Name'), t('Required'), t('Value'), t('Format'));
$rows = array();
foreach (element_children($form['name']) as $key => $type) {
$row = array();
if (isset($form['arg'][$key]['#title'])) {
$row[] = $form['arg'][$key]['#title'];
unset($form['arg'][$key]['#title']);
unset($form['name'][$key]);
}
else {
$row[] = drupal_render($form['name'][$key]);
}
$row[] = drupal_render($form['optional'][$key]);
$row[] = drupal_render($form['arg'][$key]);
$row[] = drupal_render($form['format'][$key]);
$rows[] = $row;
}
$output .= theme('table', $header, $rows);
$output .= drupal_render($form['submit']);
$output .= drupal_render($form);
return $output;
}
/*
* Callback for admin page
*/
function services_admin_settings() {
$auth_modules = module_implements('authentication_info');
// Add security options.
if (!empty($auth_modules)) {
$auth_options = array('' => t('-- Select a authorization module'));
foreach ($auth_modules as $module) {
$info = services_auth_info(NULL, $module);
$auth_options[$info['#description']][$module] = $info['#title'];
}
$form['security'] = array(
'#title' => t('Security'),
'#type' => 'fieldset',
'#description' => t('Changing security settings will require you to adjust all method calls. This will affect all applications using site services.'),
);
$form['security']['auth_module'] = array(
'#type' => 'select',
'#title' => t('Authorization module'),
'#options' => $auth_options,
'#required' => FALSE,
'#default_value' => variable_get('services_auth_module', ''),
'#ajax' => array(
'callback' => '_services_ahah_security_options',
'path' => 'admin/services/ahah/security-options',
'wrapper' => 'security-module-options',
),
);
// Placeholder for the auth module options
// also used as wrapper for ahah.
$form['security']['options'] = array(
'#prefix' => '',
'#suffix' => '
',
);
// Get the configuration form for the authorization module
$settings = services_auth_invoke('security_settings');
if (is_array($settings)) {
$form['security']['options']['settings'] = $settings;
}
}
else { // Warn if no authorization module has been installed.
drupal_set_message(t('No authorization modules have been installed'), 'warning');
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save settings'),
);
return $form;
}
function services_admin_settings_validate($form, $form_state) {
// Invoke custom validation for the auth module
if (!empty($form_state['values']['auth_module'])) {
services_auth_invoke_custom($form_state['values']['auth_module'],
'security_settings_validate', $form_state);
}
}
function services_admin_settings_submit($form, $form_state) {
// Update the services oauth module variable *if needed*.
$old_auth = variable_get('services_auth_module', '');
$new_auth = $form_state['values']['auth_module'];
if ($old_auth != $new_auth) {
variable_set('services_auth_module', $new_auth);
// Rebuild menu so that security-related menu items can be conditionally created.
menu_rebuild();
drupal_set_message(t('Changed authentication method'));
}
else {
drupal_set_message(t('Updated authentication settings'));
}
// Allow the authorization module to handle submitted values.
services_auth_invoke('security_settings_submit', $form_state);
// Clear the services cache so that methods and resources are updated according to auth settings
cache_clear_all('services:', 'cache', TRUE);
}
/**
* Callback for the security configuration form ahah.
*/
function _services_ahah_security_options($form, &$form_state) {
if (!empty($_POST['auth_module'])) {
$settings = services_auth_invoke_custom($_POST['auth_module'], 'security_settings');
}
$settings['security']['options']['#prefix'] = '';
$settings['security']['options']['#sufix'] = '
';
return drupal_render($settings);
}