support for multiple managers

This commit is contained in:
Roland Gruber 2011-12-20 20:40:51 +00:00
parent 7bfe5296ae
commit 4868529b5a
1 changed files with 132 additions and 26 deletions

View File

@ -351,7 +351,7 @@ class inetOrgPerson extends baseModule implements passwordService {
$return['upload_columns'][] = array(
'name' => 'inetOrgPerson_manager',
'description' => _('Manager'),
'help' => 'manager',
'help' => 'managerList',
'example' => _('uid=smiller,ou=People,dc=company,dc=com')
);
}
@ -621,6 +621,10 @@ class inetOrgPerson extends baseModule implements passwordService {
"Headline" => _("Manager"),
"Text" => _("This is the LDAP DN of the user's manager. Use this property to represent hierarchies in your company.")
),
'managerList' => array (
"Headline" => _("Manager"),
"Text" => _("This is the LDAP DN of the user's manager. Use this property to represent hierarchies in your company.") . ' ' . _("Multiple values are separated by semicolon.")
),
'street' => array (
"Headline" => _("Street"),
"Text" => _("The street name of the user's address.") . ' ' . _("Multiple values are separated by semicolon.")
@ -989,14 +993,6 @@ class inetOrgPerson extends baseModule implements passwordService {
}
}
}
if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideManager')) {
if ($_POST['manager'] != '-') {
$this->attributes['manager'][0] = $_POST['manager'];
}
else {
unset($this->attributes['manager'][0]);
}
}
if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideEmployeeNumber')) {
$this->attributes['employeeNumber'][0] = $_POST['employeeNumber'];
}
@ -1295,19 +1291,25 @@ class inetOrgPerson extends baseModule implements passwordService {
if (isset($this->attributes['o'][0])) $o = implode('; ', $this->attributes['o']);
$fieldContainer->addElement(new htmlTableExtendedInputField(_('Organisation'), 'o', $o, 'o'), true);
}
// manager
if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideManager')) {
$optionsSelected = array();
$fieldContainer->addElement(new htmlOutputText(_('Manager')));
$fieldContainer->addElement(new htmlAccountPageButton(get_class($this), 'manager', 'change', _("Change")));
$fieldContainer->addElement(new htmlHelpLink('manager'), true);
if (isset($this->attributes['manager'][0])) {
$optionsSelected[] = $this->attributes['manager'][0];
$managerList = array();
for ($i = 0; $i < sizeof($this->attributes['manager']); $i++) {
$managerList[] = $this->attributes['manager'][$i];
}
usort($managerList, 'compareDN');
$managers = new htmlTable();
$managers->colspan = 2;
for ($i = 0; $i < sizeof($managerList); $i++) {
$managers->addElement(new htmlOutputText(getAbstractDN($managerList[$i])), true);
}
$fieldContainer->addElement(new htmlOutputText(''));
$fieldContainer->addElement($managers, true);
}
else {
$optionsSelected[] = '-';
}
$managerElement = new htmlTableExtendedSelect('manager', $this->getManagers(), $optionsSelected, _('Manager'), 'manager');
$managerElement->setHasDescriptiveElements(true);
$managerElement->setRightToLeftTextDirection(true);
$managerElement->setSortElements(false);
$fieldContainer->addElement($managerElement, true);
}
// password buttons
if (!in_array('posixAccount', $modules) && checkIfWriteAccessIsAllowed() && isset($this->attributes['userPassword'][0])) {
@ -1379,6 +1381,108 @@ class inetOrgPerson extends baseModule implements passwordService {
return $container;
}
/**
* This function will create the meta HTML code to show a page to change the manager attribute.
*
* @return htmlElement HTML meta data
*/
function display_html_manager() {
$return = new htmlTable();
if (!isset($this->attributes['manager'])) {
$this->attributes['manager'] = array();
}
// show list of possible new managers
if (isset($_POST['form_subpage_' . get_class($this) . '_manager_select'])) {
$options = array();
$filter = get_ldap_filter('user');
$entries = searchLDAPByFilter($filter, array('dn'), array('user'));
for ($i = 0; $i < sizeof($entries); $i++) {
$entries[$i] = $entries[$i]['dn'];
}
// sort by DN
usort($entries, 'compareDN');
for ($i = 0; $i < sizeof($entries); $i++) {
if (!isset($this->attributes['manager']) || !in_array($entries[$i], $this->attributes['manager'])) {
$options[getAbstractDN($entries[$i])] = $entries[$i];
}
}
$size = 20;
if (sizeof($options) < 20) $size = sizeof($options);
$managerSelect = new htmlSelect('manager', $options, array(), $size);
$managerSelect->setHasDescriptiveElements(true);
$managerSelect->setMultiSelect(true);
$managerSelect->setRightToLeftTextDirection(true);
$managerSelect->setSortElements(false);
$managerSelect->setTransformSingleSelect(false);
$return->addElement($managerSelect, true);
$buttonTable = new htmlTable();
$buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'manager', 'addManagers', _('Add')));
$buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'manager', 'cancel', _('Cancel')));
$return->addElement($buttonTable);
return $return;
}
// show existing managers
$managerTemp = array();
if (isset($this->attributes['manager'])) {
$managerTemp = $this->attributes['manager'];
}
// sort by DN
usort($managerTemp, 'compareDN');
$managers = array();
for ($i = 0; $i < sizeof($managerTemp); $i++) {
$managers[getAbstractDN($managerTemp[$i])] = $managerTemp[$i];
}
$size = 20;
if (sizeof($this->attributes['manager']) < 20) {
$size = sizeof($this->attributes['manager']);
}
if (sizeof($managers) > 0) {
$managerSelect = new htmlSelect('manager', $managers, array(), $size);
$managerSelect->setHasDescriptiveElements(true);
$managerSelect->setMultiSelect(true);
$managerSelect->setRightToLeftTextDirection(true);
$managerSelect->setSortElements(false);
$managerSelect->setTransformSingleSelect(false);
$return->addElement($managerSelect, true);
$removeButton = new htmlAccountPageButton(get_class($this), 'manager', 'remove', _('Remove selected entries'));
$removeButton->colspan = 3;
$return->addElement($removeButton, true);
$return->addElement(new htmlOutputText('&nbsp;', false), true);
}
$return->addElement(new htmlOutputText('&nbsp;', false), true);
$buttonTable = new htmlTable();
$buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'manager', 'select', _('Add entries')));
$buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'managerBack', _('Back')));
$return->addElement($buttonTable);
return $return;
}
/**
* Processes user input of the manager page.
* It checks if all input values are correct and updates the associated LDAP attributes.
*
* @return array list of info/error messages
*/
function process_manager() {
$return = array();
if (isset($_POST['form_subpage_' . get_class($this) . '_manager_remove']) && isset($_POST['manager'])) {
$managers = array_flip($this->attributes['manager']);
for ($i = 0; $i < sizeof($_POST['manager']); $i++) {
if (isset($managers[$_POST['manager'][$i]])) {
unset($managers[$_POST['manager'][$i]]);
}
}
$this->attributes['manager'] = array_values(array_flip($managers));
}
elseif (isset($_POST['form_subpage_' . get_class($this) . '_manager_addManagers']) && isset($_POST['manager'])) {
for ($i = 0; $i < sizeof($_POST['manager']); $i++) {
$this->attributes['manager'][] = $_POST['manager'][$i];
$this->attributes['manager'] = array_unique($this->attributes['manager']);
}
}
return $return;
}
/**
* Returns the PDF entries for this module.
*
@ -1744,13 +1848,15 @@ class inetOrgPerson extends baseModule implements passwordService {
}
// manager
if ($rawAccounts[$i][$ids['inetOrgPerson_manager']] != "") {
if (get_preg($rawAccounts[$i][$ids['inetOrgPerson_manager']], 'dn')) {
$partialAccounts[$i]['manager'] = $rawAccounts[$i][$ids['inetOrgPerson_manager']];
}
else {
$errMsg = $this->messages['manager'][0];
array_push($errMsg, array($i));
$errors[] = $errMsg;
$managerList = preg_split('/;[ ]*/', $rawAccounts[$i][$ids['inetOrgPerson_manager']]);
$partialAccounts[$i]['manager'] = $managerList;
for ($x = 0; $x < sizeof($managerList); $x++) {
if (!get_preg($managerList[$x], 'dn')) {
$errMsg = $this->messages['manager'][0];
array_push($errMsg, array($i));
$errors[] = $errMsg;
break;
}
}
}
// street