365 lines
9.1 KiB
PHP
365 lines
9.1 KiB
PHP
<?php
|
|
/**
|
|
* InfoLog - Custom fields
|
|
*
|
|
* @link http://www.egroupware.org
|
|
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
|
* @package infolog
|
|
* @copyright (c) 2003-16 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
* @version $Id$
|
|
*/
|
|
|
|
use EGroupware\Api;
|
|
use EGroupware\Api\Etemplate;
|
|
|
|
/**
|
|
* Administration of custom fields, type and status
|
|
*/
|
|
class infolog_customfields extends admin_customfields
|
|
{
|
|
public $appname = 'infolog';
|
|
/**
|
|
* Instance of the infolog BO class
|
|
*
|
|
* @var infolog_bo
|
|
*/
|
|
var $bo;
|
|
/**
|
|
* instance of the config class for infolog
|
|
*
|
|
* @var Api\Config
|
|
*/
|
|
var $config_data;
|
|
/**
|
|
* Group owners for certain types read from the infolog config
|
|
*
|
|
* @var array
|
|
*/
|
|
var $group_owners;
|
|
|
|
function __construct( )
|
|
{
|
|
parent::__construct('infolog');
|
|
|
|
$this->bo = new infolog_bo();
|
|
$this->tmpl = new Etemplate();
|
|
$this->content_types = &$this->bo->enums['type'];
|
|
$this->status = &$this->bo->status;
|
|
$this->config_data = Api\Config::read('infolog');
|
|
$this->fields = &$this->bo->customfields;
|
|
$this->group_owners =& $this->bo->group_owners;
|
|
|
|
Api\Translation::add_app('infolog');
|
|
}
|
|
|
|
|
|
/**
|
|
* Hook from parent class so we can interfere and add owner & status
|
|
*/
|
|
protected function app_index(&$content, &$sel_options, &$readonlys, &$preserve)
|
|
{
|
|
unset($sel_options); // not used, but required by function signature
|
|
|
|
$n = 0;
|
|
foreach($this->status[$this->content_type] as $name => $label)
|
|
{
|
|
$content['content_type_options']['status'][++$n] = array(
|
|
'name' => $name,
|
|
'label' => $label,
|
|
'disabled' => False
|
|
);
|
|
$preserve['content_type_options']['status'][$n]['old_name'] = $name;
|
|
if (isset($this->bo->stock_status[$this->content_type][$name]))
|
|
{
|
|
$readonlys['content_type_options']['status']["delete[$name]"] =
|
|
$readonlys['content_type_options']['status'][$n.'[name]'] = True;
|
|
}
|
|
$readonlys['content_type_options']['status']["create$name"] = True;
|
|
}
|
|
$content['content_type_options']['status'][++$n] = array(
|
|
'name' => '',
|
|
'label' => '',
|
|
'disabled' => False
|
|
);
|
|
$content['content_type_options']['status']['default'] = $this->status['defaults'][$this->content_type];
|
|
$content['content_type_options']['group_owner'] = $this->group_owners[$this->content_type];
|
|
$readonlys['content_types']['delete'] = isset($this->bo->stock_enums['type'][$this->content_type]);
|
|
}
|
|
|
|
function update_fields(&$content)
|
|
{
|
|
$fields = &$content['fields'];
|
|
|
|
$create = $fields['create'];
|
|
unset($fields['create']);
|
|
|
|
if (!empty($fields['delete']))
|
|
{
|
|
$delete = key($fields['delete']);
|
|
unset($fields['delete']);
|
|
}
|
|
|
|
foreach($fields as $field)
|
|
{
|
|
$name = trim($field['name']);
|
|
$old_name = $field['old_name'];
|
|
|
|
if (!empty($delete) && $delete == $old_name)
|
|
{
|
|
unset($this->fields[$old_name]);
|
|
continue;
|
|
}
|
|
if (isset($field['name']) && empty($name) && ($create || !empty($old_name))) // empty name not allowed
|
|
{
|
|
$content['error_msg'] = lang('Name must not be empty !!!');
|
|
}
|
|
if (isset($field['old_name']))
|
|
{
|
|
if (!empty($name) && $old_name != $name) // renamed
|
|
{
|
|
unset($this->fields[$old_name]);
|
|
}
|
|
elseif (empty($name))
|
|
{
|
|
$name = $old_name;
|
|
}
|
|
}
|
|
elseif (empty($name)) // new item and empty ==> ignore it
|
|
{
|
|
continue;
|
|
}
|
|
$values = array();
|
|
if (!empty($field['values']))
|
|
{
|
|
foreach(explode("\n",$field['values']) as $line)
|
|
{
|
|
list($var2,$value) = explode('=',trim($line),2);
|
|
$var = trim($var2);
|
|
$values[$var] = empty($value) ? $var : $value;
|
|
}
|
|
}
|
|
$this->fields[$name] = array(
|
|
'type2' => $field['type2'],
|
|
'type' => $field['type'],
|
|
'label' => empty($field['label']) ? $name : $field['label'],
|
|
'help' => $field['help'],
|
|
'values'=> $values,
|
|
'len' => $field['len'],
|
|
'rows' => (int)$field['rows'],
|
|
'order' => (int)$field['order'],
|
|
'needed' => $field['needed'],
|
|
);
|
|
}
|
|
if (!function_exists('sort_by_order'))
|
|
{
|
|
function sort_by_order($arr1,$arr2)
|
|
{
|
|
return $arr1['order'] - $arr2['order'];
|
|
}
|
|
}
|
|
uasort($this->fields,sort_by_order);
|
|
|
|
$n = 0;
|
|
foreach(array_keys($this->fields) as $name)
|
|
{
|
|
$this->fields[$name]['order'] = ($n += 10);
|
|
}
|
|
}
|
|
|
|
function update_status(&$content)
|
|
{
|
|
$typ = $this->content_type;
|
|
$status = &$content['content_type_options']['status'];
|
|
|
|
$default = $status['default'];
|
|
unset($status['default']);
|
|
|
|
$create = $status['create'];
|
|
unset($status['create']);
|
|
|
|
if (!empty($status['delete']))
|
|
{
|
|
$delete = key($status['delete']);
|
|
unset($status['delete']);
|
|
}
|
|
|
|
foreach($status as $stat)
|
|
{
|
|
$name = trim($stat['name']);
|
|
$old_name = $stat['old_name'];
|
|
|
|
if (!empty($delete) && $delete == $old_name)
|
|
{
|
|
unset($this->status[$typ][$old_name]);
|
|
continue;
|
|
}
|
|
if (isset($stat['name']) && empty($name) && ($create || !empty($old_name))) // empty name not allowed
|
|
{
|
|
$content['error_msg'] = lang('Name must not be empty !!!');
|
|
}
|
|
if (isset($stat['old_name']))
|
|
{
|
|
if (!empty($name) && $old_name != $name) // renamed
|
|
{
|
|
unset($this->status[$typ][$old_name]);
|
|
|
|
if ($default == $old_name)
|
|
{
|
|
$default = $name;
|
|
}
|
|
}
|
|
elseif (empty($name))
|
|
{
|
|
$name = $old_name;
|
|
}
|
|
}
|
|
elseif (empty($name)) // new item and empty ==> ignore it
|
|
{
|
|
continue;
|
|
}
|
|
$this->status[$typ][$name] = empty($stat['label']) ? $name : $stat['label'];
|
|
}
|
|
$this->status['defaults'][$typ] = empty($default) ? $name : $default;
|
|
if (!isset($this->status[$typ][$this->status['defaults'][$typ]]))
|
|
{
|
|
$this->status['defaults'][$typ] = @key($this->status[$typ]);
|
|
}
|
|
}
|
|
|
|
function update(&$content)
|
|
{
|
|
$old = array(
|
|
'status' => $this->status,
|
|
'group_owners' => $this->group_owners
|
|
);
|
|
$this->update_status($content);
|
|
|
|
if ($content['content_type_options']['group_owner'])
|
|
{
|
|
$this->group_owners[$this->content_type] = $content['content_type_options']['group_owner'];
|
|
}
|
|
else
|
|
{
|
|
unset($this->group_owners[$this->content_type]);
|
|
}
|
|
$changed = array();
|
|
foreach($old as $key => $value)
|
|
{
|
|
if($this->$key != $value)
|
|
{
|
|
// NB: Statuses are monolithic - we can't record just the one type
|
|
// that was changed, or we loose the other types. All status must
|
|
// be recorded.
|
|
$changed[$key] = $this->$key;
|
|
}
|
|
else
|
|
{
|
|
unset($old[$key]);
|
|
}
|
|
}
|
|
if($changed)
|
|
{
|
|
$cmd = new admin_cmd_config('infolog',$changed, $old);
|
|
$cmd->run();
|
|
}
|
|
}
|
|
|
|
function delete(&$content)
|
|
{
|
|
if (isset($this->bo->stock_enums['type'][$content['type2']]))
|
|
{
|
|
$content['error_msg'] .= lang("You can't delete one of the stock types !!!");
|
|
return;
|
|
}
|
|
unset($this->content_types[$content['type2']]);
|
|
unset($this->status[$content['type2']]);
|
|
unset($this->status['defaults'][$content['type2']]);
|
|
unset($this->group_owners[$content['type2']]);
|
|
$content['type2'] = key($this->content_types ?? []);
|
|
|
|
// save changes to repository
|
|
$this->save_repository();
|
|
}
|
|
|
|
function create_content_type(&$content)
|
|
{
|
|
$new_name = trim($content['content_types']['name']);
|
|
if (empty($new_name))
|
|
{
|
|
$this->tmpl->set_validation_error('content_types[name]',lang('You have to enter a name, to create a new type!'));
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
foreach($this->content_types as $name)
|
|
{
|
|
if($name == $new_name)
|
|
{
|
|
$this->tmpl->set_validation_error('content_types[name]',lang("type '%1' already exists !!!",$new_name));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
$this->content_types[$new_name] = $new_name;
|
|
$this->status[$new_name] = array(
|
|
'ongoing' => 'ongoing',
|
|
'done' => 'done'
|
|
);
|
|
$this->status['defaults'][$new_name] = 'ongoing';
|
|
|
|
// save changes to repository
|
|
$this->save_repository();
|
|
return $new_name;
|
|
}
|
|
|
|
function save_repository()
|
|
{
|
|
// save changes to repository
|
|
Api\Config::save_value('types',$this->content_types,'infolog');
|
|
//echo '<p>'.__METHOD__.'() \$this->status=<pre style="text-aling: left;">'; print_r($this->status); echo "</pre>\n";
|
|
Api\Config::save_value('status',$this->status,'infolog');
|
|
//echo '<p>'.__METHOD__.'() \$this->fields=<pre style="text-aling: left;">'; print_r($this->fields); echo "</pre>\n";
|
|
Api\Storage\Customfields::save('infolog', $this->fields);
|
|
Api\Config::save_value('group_owners',$this->group_owners,'infolog');
|
|
}
|
|
|
|
/**
|
|
* Change account_ids in group_owners configuration hook called from admin_cmd_change_account_id
|
|
*
|
|
* @param array $changes
|
|
* @return int number of changed account_ids
|
|
*/
|
|
public static function change_account_ids(array $changes)
|
|
{
|
|
unset($changes['location']); // no change, but the hook name
|
|
$changed = 0;
|
|
|
|
// migrate staff account_ids
|
|
$config = Api\Config::read('infolog');
|
|
$old = $config['group_owners'];
|
|
if (!empty($config['group_owners']))
|
|
{
|
|
foreach($config['group_owners'] as &$account_id)
|
|
{
|
|
if (isset($changes[$account_id]))
|
|
{
|
|
$account_id = $changes[$account_id];
|
|
$changed++;
|
|
$needs_save = true;
|
|
}
|
|
}
|
|
if ($needs_save)
|
|
{
|
|
$cmd = new admin_cmd_config('infolog',
|
|
array('group_owners' => $config['group_owners']),
|
|
array('group_owners' => $old)
|
|
);
|
|
$cmd->run();
|
|
}
|
|
}
|
|
|
|
return $changed;
|
|
}
|
|
}
|