modernize config validation hooks a bit to allow to use static methods of namespaced classes

This commit is contained in:
Ralf Becker 2021-02-26 12:15:42 +02:00
parent adddf68135
commit f5b1e5a096
2 changed files with 22 additions and 13 deletions

View File

@ -331,7 +331,7 @@ class admin_account
$msg = '';
if(count($content['account_id']) == 1)
{
self::_deferred_delete($content['account_id'][0], $content['new_owner'], $content['delete_apps'], $content['admin_cmd']);
self::_deferred_delete($account_id, $content['new_owner'], $content['delete_apps'], $content['admin_cmd']);
if ($content['contact_id'])
{
Framework::refresh_opener($msg, 'addressbook', $content['contact_id'], 'delete');
@ -356,7 +356,7 @@ class admin_account
// Get a count of entries owned by the user
if(count($content['account_id']) == 1)
{
$_counts = $GLOBALS['egw']->accounts->get_account_entry_counts($content['account_id'][0]);
$_counts = $GLOBALS['egw']->accounts->get_account_entry_counts($content['account_id']);
}
else
{

View File

@ -144,7 +144,13 @@ class admin_config
$this->remove_anon_images(array_diff((array)$c->config_data['login_background_file'], (array)$_content['newsettings']['login_background_file']));
}
/* Load hook file with functions to validate each config (one/none/all) */
// "config_validate" hook returns a non-empty string with an error-message (everything else is treated as no error)
// The hook can additional set $GLOBALS['egw_info']['server']['found_validation_hook'] with individual validation-functions:
// a) regular function names matching the config-name or "final_validation" as values or
// b) same key as config-value for a callable eg. $GLOBALS['egw_info']['server']['found_validation_hook'][<name>]='<class-name>::<name>'
// The validation-function can return a non-empty string with an error (or deprecated set $GLOBALS['config_error']).
// Function signature: ?string function(mixed $value, Api\Config $c) ($c can be used to modify the value to save: $c->config_data[$name]=$val)
// Please note: only b) can be implemented in the file of a namespaced class
$errors = Api\Hooks::single(array(
'location' => 'config_validate',
)+(array)$_content['newsettings'], $appname);
@ -155,12 +161,14 @@ class admin_config
if ($config)
{
$c->config_data[$key] = $config;
if (in_array($key, (array)$GLOBALS['egw_info']['server']['found_validation_hook'], true) && function_exists($key))
if (in_array($key, (array)$GLOBALS['egw_info']['server']['found_validation_hook'], true) &&
function_exists($func=$key) ||
isset($GLOBALS['egw_info']['server']['found_validation_hook'][$key]) &&
is_callable($func=$GLOBALS['egw_info']['server']['found_validation_hook'][$key]))
{
call_user_func($key, $config, $c);
if($GLOBALS['config_error'])
if (is_string($err=$func($config, $c)) || ($err=$GLOBALS['config_error']))
{
$errors .= lang($GLOBALS['config_error']) . "\n";
$errors .= lang($err) . "\n";
$GLOBALS['config_error'] = False;
}
}
@ -171,17 +179,18 @@ class admin_config
unset($c->config_data[$key]);
}
}
if(in_array('final_validation', (array)$GLOBALS['egw_info']['server']['found_validation_hook']) &&
function_exists('final_validation'))
if (in_array('final_validation', (array)$GLOBALS['egw_info']['server']['found_validation_hook']) &&
function_exists($func='final_validation') ||
isset($GLOBALS['egw_info']['server']['found_validation_hook']['final_validation']) &&
is_callable($func=$GLOBALS['egw_info']['server']['found_validation_hook']['final_validation']))
{
final_validation($_content['newsettings']);
if($GLOBALS['config_error'])
if (is_string($err=$func($_content['newsettings'])) || ($err=$GLOBALS['config_error']))
{
$errors .= lang($GLOBALS['config_error']) . "\n";
$errors .= lang($err) . "\n";
$GLOBALS['config_error'] = False;
}
unset($GLOBALS['egw_info']['server']['found_validation_hook']);
}
unset($GLOBALS['egw_info']['server']['found_validation_hook']);
// do not allow to save config, if there are errors
if (!$errors)