diff --git a/lam/lib/modules/inetOrgPerson.inc b/lam/lib/modules/inetOrgPerson.inc index 4c484941..1976af5d 100644 --- a/lam/lib/modules/inetOrgPerson.inc +++ b/lam/lib/modules/inetOrgPerson.inc @@ -41,6 +41,18 @@ class inetOrgPerson extends baseModule implements passwordService { private $cachedManagers = null; /** clear text password */ private $clearTextPassword = null; + /** cache for departments */ + private $departmentCache = null; + /** organization cache */ + private $oCache = null; + /** organizational unit cache */ + private $ouCache = null; + /** title cache */ + private $titleCache = null; + /** employee type cache */ + private $employeeTypeCache = null; + /** business category cache */ + private $businessCategoryCache = null; /** * This function fills the message array. @@ -1355,6 +1367,7 @@ class inetOrgPerson extends baseModule implements passwordService { * @return array HTML meta data */ function display_html_attributes() { + $this->initCache(); $equalWidthElements = array(); $container = new htmlTable(); $fieldContainer = new htmlTable(); @@ -1847,7 +1860,9 @@ class inetOrgPerson extends baseModule implements passwordService { $fieldContainer->addElement($titleLabel); $titleContainer = new htmlGroup(); for ($i = 0; $i < sizeof($titles); $i++) { - $titleContainer->addElement(new htmlInputField('title' . $i, $titles[$i])); + $titleInput = new htmlInputField('title' . $i, $titles[$i]); + $titleInput->enableAutocompletion($this->titleCache); + $titleContainer->addElement($titleInput); $equalWidthElements[] = 'title' . $i; if ($i < (sizeof($titles) - 1)) { $titleContainer->addElement(new htmlOutputText('
', false)); @@ -1876,7 +1891,9 @@ class inetOrgPerson extends baseModule implements passwordService { if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideEmployeeType')) { $employeeType = ''; if (isset($this->attributes['employeeType'][0])) $employeeType = $this->attributes['employeeType'][0]; - $fieldContainer->addElement(new htmlTableExtendedInputField(_('Employee type'), 'employeeType', $employeeType, 'employeeType'), true); + $employeeTypeInput = new htmlTableExtendedInputField(_('Employee type'), 'employeeType', $employeeType, 'employeeType'); + $employeeTypeInput->enableAutocompletion($this->employeeTypeCache); + $fieldContainer->addElement($employeeTypeInput, true); $equalWidthElements[] = 'employeeType'; } if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideBusinessCategory')) { @@ -1892,7 +1909,9 @@ class inetOrgPerson extends baseModule implements passwordService { $fieldContainer->addElement($businessCategoryLabel); $businessCategoryContainer = new htmlGroup(); for ($i = 0; $i < sizeof($businessCategories); $i++) { - $businessCategoryContainer->addElement(new htmlInputField('businessCategory' . $i, $businessCategories[$i])); + $businessCategoryInput = new htmlInputField('businessCategory' . $i, $businessCategories[$i]); + $businessCategoryInput->enableAutocompletion($this->businessCategoryCache); + $businessCategoryContainer->addElement($businessCategoryInput); $equalWidthElements[] = 'businessCategory' . $i; if ($i < (sizeof($businessCategories) - 1)) { $businessCategoryContainer->addElement(new htmlOutputText('
', false)); @@ -1919,7 +1938,9 @@ class inetOrgPerson extends baseModule implements passwordService { $fieldContainer->addElement($departmentNumberLabel); $departmentNumberContainer = new htmlGroup(); for ($i = 0; $i < sizeof($departmentNumbers); $i++) { - $departmentNumberContainer->addElement(new htmlInputField('departmentNumber' . $i, $departmentNumbers[$i])); + $departmentInput = new htmlInputField('departmentNumber' . $i, $departmentNumbers[$i]); + $departmentInput->enableAutocompletion($this->departmentCache); + $departmentNumberContainer->addElement($departmentInput); $equalWidthElements[] = 'departmentNumber' . $i; if ($i < (sizeof($departmentNumbers) - 1)) { $departmentNumberContainer->addElement(new htmlOutputText('
', false)); @@ -1947,7 +1968,9 @@ class inetOrgPerson extends baseModule implements passwordService { $fieldContainer->addElement($ouLabel); $ouContainer = new htmlGroup(); for ($i = 0; $i < sizeof($ous); $i++) { - $ouContainer->addElement(new htmlInputField('ou' . $i, $ous[$i])); + $ouInput = new htmlInputField('ou' . $i, $ous[$i]); + $ouInput->enableAutocompletion($this->ouCache); + $ouContainer->addElement($ouInput); $equalWidthElements[] = 'ou' . $i; if ($i < (sizeof($ous) - 1)) { $ouContainer->addElement(new htmlOutputText('
', false)); @@ -1975,7 +1998,9 @@ class inetOrgPerson extends baseModule implements passwordService { $fieldContainer->addElement($oLabel); $oContainer = new htmlGroup(); for ($i = 0; $i < sizeof($os); $i++) { - $oContainer->addElement(new htmlInputField('o' . $i, $os[$i])); + $oInput = new htmlInputField('o' . $i, $os[$i]); + $oInput->enableAutocompletion($this->oCache); + $oContainer->addElement($oInput); $equalWidthElements[] = 'o' . $i; if ($i < (sizeof($os) - 1)) { $oContainer->addElement(new htmlOutputText('
', false)); @@ -3513,6 +3538,69 @@ class inetOrgPerson extends baseModule implements passwordService { } return $this->cachedManagers; } + + /** + * Loads cached data from LDAP such as departmets etc. + */ + private function initCache() { + if ($this->departmentCache != null) { + return; + } + $attrs = array(); + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideDepartments')) { + $attrs[] = 'departmentNumber'; + } + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideOu')) { + $attrs[] = 'ou'; + } + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideO')) { + $attrs[] = 'o'; + } + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideJobTitle')) { + $attrs[] = 'title'; + } + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideEmployeeType')) { + $attrs[] = 'employeeType'; + } + if (!$this->isBooleanConfigOptionSet('inetOrgPerson_hideBusinessCategory')) { + $attrs[] = 'businessCategory'; + } + $departments = array(); + $ous = array(); + $os = array(); + $titles = array(); + $employeeTypes = array(); + $businessCategories = array(); + if (sizeof($attrs) > 0) { + $result = searchLDAPByFilter('(objectClass=inetOrgPerson)', $attrs, array($this->get_scope())); + foreach ($result as $attributes) { + if (isset($attributes['departmentnumber'])) { + $departments = array_merge($departments, $attributes['departmentnumber']); + } + if (isset($attributes['ou'])) { + $ous = array_merge($ous, $attributes['ou']); + } + if (isset($attributes['o'])) { + $os = array_merge($os, $attributes['o']); + } + if (isset($attributes['title'])) { + $titles = array_merge($titles, $attributes['title']); + } + if (isset($attributes['employeetype'])) { + $employeeTypes = array_merge($employeeTypes, $attributes['employeetype']); + } + if (isset($attributes['businesscategory'])) { + $businessCategories = array_merge($businessCategories, $attributes['businesscategory']); + } + } + } + $this->departmentCache = array_values(array_unique($departments)); + $this->oCache = array_values(array_unique($os)); + $this->ouCache = array_values(array_unique($ous)); + $this->titleCache = array_values(array_unique($titles)); + $this->employeeTypeCache = array_values(array_unique($employeeTypes)); + $this->businessCategoryCache = array_values(array_unique($businessCategories)); + } }