moved documentation from module specification to baseModule

This commit is contained in:
Roland Gruber 2008-02-05 18:40:57 +00:00
parent 018cfb507b
commit d43c7b78c7
1 changed files with 360 additions and 110 deletions

View File

@ -30,12 +30,25 @@ $Id$
*
* @package modules
* @author Roland Gruber
* @see baseModule
*/
/**
* Parent class of all account modules.
* It implements the complete module interface and uses meta-data
* provided by the account modules for its functions.<br>
* <br>
* <b>Location and naming of modules</b><br>
* All LAM modules are placed in lib/modules/ and are named "<class name>.inc".
* E.g. if you create a new module and its class name is "qmail" then the filename would be "qmail.inc".
* The class name of a module must contain only a-z, A-Z, 0-9, -, and _.<br>
* <br>
* You can avoid to override many functions by using {@link get_metaData()}.<br>
* <br>
* All module classes should extend the baseModule class.
*
* @package modules
* @author Roland Gruber
*/
abstract class baseModule {
@ -83,16 +96,20 @@ abstract class baseModule {
/**
* This function fills the $messages variable with output messages from this module.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.
*/
protected function load_Messages() {
}
/**
* Initializes the module after it became part of an accountContainer
* Initializes the module after it became part of an {@link accountContainer}
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.
*
* @param string $base the name of the accountContainer object ($_SESSION[$base])
* @param string $base the name of the {@link accountContainer} object ($_SESSION[$base])
*/
function init($base) {
public function init($base) {
$this->base = $base;
$this->attributes = array();
$this->orig = array();
@ -111,11 +128,16 @@ abstract class baseModule {
/**
* This function loads the LDAP attributes for this module.
* This function loads the LDAP attributes when an account should be loaded.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* By default this method loads the object classes and accounts which are specified in {@link getManagedObjectClasses()}
* and {@link getManagedAttributes()}.
*
* @param array $attributes attribute list
* @param array $attributes array like the array returned by get_ldap_attributes(dn of account) but without count indices
*/
function load_attributes($attributes) {
public function load_attributes($attributes) {
$this->attributes = array();
$this->attributes = array();
// load object classes
@ -346,10 +368,11 @@ abstract class baseModule {
* </li>
*
* </ul>
* <b>Example:</b> return array("is_base" => true);
*
* @return array empty array
* @return array meta data
*/
function get_metaData() {
public function get_metaData() {
return array();
}
@ -358,84 +381,138 @@ abstract class baseModule {
*
* @return string account type
*/
function get_scope() {
public function get_scope() {
return $this->scope;
}
/**
* Returns true if this module fits for the current scope.
*
* Returns true if this module can manage accounts of the current type, otherwise false.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.
*
* @return boolean true if module fits
*
* @see baseModule::get_metaData()
*/
function can_manage() {
public function can_manage() {
if (is_array($this->meta["account_types"]) && in_array($this->scope, $this->meta["account_types"])) return true;
else return false;
}
/**
* Returns true if this module can be used to construct account without additional modules.
* Usually, all modules which manage structural object classes are base modules.
* Returns true if your module is a base module and otherwise false.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* Every account type needs exactly one base module. A base module manages a structural object class.
* E.g. the inetOrgPerson module is a base module since its object class is structural.
*
* @return boolean true if base module (defaults to false if no meta data is provided)
*
* @see baseModule::get_metaData()
*/
function is_base_module() {
public function is_base_module() {
if (isset($this->meta['is_base']) && ($this->meta['is_base'] == true)) return true;
else return false;
}
/**
* returns an LDAP filter for the account lists
* Returns an LDAP filter for the account lists
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* Returns an array('or' => '...', 'and' => '...') that is used to build the LDAP filter. Usually, this is used to filter object classes.
* All "or" filter parts of the base modules are combined with OR and then combined with the "and" parts.<br>
* The resulting LDAP filter will look like this: (&(|(OR1)(OR2)(OR3))(AND1)(AND2)(AND3))<br>
* <br>
* <b>Example:</b> return array('or' => '(objectClass=posixAccount)', 'and' => '(!(uid=*$))')
*
* @return string LDAP filter
*
* @see baseModule::get_metaData()
*/
function get_ldap_filter() {
public function get_ldap_filter() {
if (isset($this->meta['ldap_filter'])) return $this->meta['ldap_filter'];
else return "";
}
/**
* Returns an alias name for the module.
*
* This alias is used in various places instead of the less descriptive class name.
* The alias also has less syntax restrictions and may contain spaces or special characters.
*
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This function returns a more descriptive string than the class name. Alias names are used for the buttons on the account pages and the module selection in the configuration wizard.<br>
* Please take care that your alias name is not too long. It may contain any character but should not include parts that may be interpreted by the browser (e.g. '<' or '>').
* If you use different aliases dependent on the account type please make sure that there is a general alias for unknown types.
*
* @return string alias name
*
* @see baseModule::get_metaData()
*/
function get_alias() {
public function get_alias() {
if (isset($this->meta['alias'])) return $this->meta['alias'];
else return get_class($this);
}
/**
* Returns a list of possible LDAP attributes which can be used to form the RDN.
*
* Returns a hash array containing a list of possible LDAP attributes that can be used to form the RDN (Relative Distinguished Name).
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The returned elements have this form: <attribute> => <priority>
* <br> <attribute> is the name of the LDAP attribute
* <br> <priority> defines the priority of the attribute (can be "low", "normal", "high")
* <br> <priority> defines the priority of the attribute (can be "low", "normal", "high")<br>
* <br>
* <b>Example:</b> return array('uid' => 'normal', 'cn' => 'low')
*
* @return array list of attributes
*
* @see baseModule::get_metaData()
*/
function get_RDNAttributes() {
public function get_RDNAttributes() {
if (isset($this->meta['RDN'])) return $this->meta['RDN'];
else return array();
}
/**
* This function returns a list with all depending and conflicting modules.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The return value is an array with two sub arrays, "depends" and "conflicts".
* All values of the conflict array are string values with module names. All values of the depends
* array are either string values with module names or arrays which include only string values with
* module names.<br>
* If an element of the depends array is itself an array, this means that your module
* depends on one of these modules.<br>
* <br>
* <b>Example:</b> return array("depends" => array("posixAccount", array("qmail", "sendmail")), "conflicts" => array("exim"))
*
* @return array list of dependencies and conflicts
*
* @see baseModule::get_metaData()
*/
function get_dependencies() {
public function get_dependencies() {
if (isset($this->meta['dependencies'])) return $this->meta['dependencies'];
else return array('depends' => array(), 'conflicts' => array());
}
/**
* Returns a list of elements for the account profiles.
* This function defines what attributes will be used in the account profiles and their appearance in the profile editor.
*
* @return profile elements
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The return value is an array that contains meta HTML code.<br>
* The type "fieldset" is not allowed here. The name attributes are used as keywords to load
* and save profiles. We recommend to use the module name as prefix for them
* (e.g. posixAccount_homeDirectory) to avoid naming conflicts.
*
* @return array meta HTML code
*
* @see baseModule::get_metaData()
* @see parseHtml()
*/
function get_profileOptions() {
public function get_profileOptions() {
if (isset($this->meta['profile_options'])) return $this->meta['profile_options'];
else return array();
}
@ -443,10 +520,20 @@ abstract class baseModule {
/**
* Checks input values of account profiles.
*
* @param array $options a hash array (name => value) containing the options
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* $options is an hash array (option name => value) that contains the user input.
* The option values are all arrays containing one or more elements.<br>
* If the input data is invalid the return value is an array that contains arrays
* to build StatusMessages (message type, message head, message text). If no errors occured
* the function returns an empty array.
*
* @param array $options a hash array (name => value) containing the user input
* @return array list of error messages (array(type, title, text)) to generate StatusMessages, if any
*
* @see baseModule::get_metaData()
*/
function check_profileOptions($options) {
public function check_profileOptions($options) {
$messages = array();
if (is_array($this->meta['profile_checks'])) {
$identifiers = array_keys($this->meta['profile_checks']);
@ -523,11 +610,15 @@ abstract class baseModule {
}
/**
* Loads the values of an account profile into internal variables.
* This function loads the values from an account profile to the module's internal data structures.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.
*
* @param array $profile hash array with profile values (identifier => value)
*
* @see baseModule::get_metaData()
*/
function load_profile($profile) {
public function load_profile($profile) {
if (isset($this->meta['profile_mappings'])) {
$identifiers = array_keys($this->meta['profile_mappings']);
for ($i = 0; $i < sizeof($identifiers); $i++) {
@ -539,13 +630,21 @@ abstract class baseModule {
}
/**
* Returns a list of elements for the configuration.
* Returns a list of configuration options.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The type "fieldset" is not allowed here. The name attributes are used as keywords to load and save settings.
* We recommend to use the module name as prefix for them (e.g. posixAccount_homeDirectory) to avoid naming conflicts.
*
* @param array $scopes account types (user, group, host)
* @param array $allScopes list of all modules and active scopes
* @return array configuration elements
* @param array $allScopes list of all active account modules and their scopes (module => array(scopes))
* @return array meta HTML code
*
* @see baseModule::get_metaData()
* @see parseHtml()
*/
function get_configOptions($scopes, $allScopes) {
public function get_configOptions($scopes, $allScopes) {
$return = array();
for ($i = 0; $i < sizeof($scopes); $i++) {
if (isset($this->meta['config_options'][$scopes[$i]])) $return = array_merge($return, $this->meta['config_options'][$scopes[$i]]);
@ -556,12 +655,19 @@ abstract class baseModule {
/**
* Checks input values of module settings.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ('message type', 'message head', 'message text').
* <br>If no errors occured the function returns an empty array.
*
* @param array $scopes list of account types which are used
* @param array $options hash array containing the settings (array('option' => array('value')))
* @param array $options hash array (option name => value) that contains the input. The option values are all arrays containing one or more elements.
* @return array list of error messages
*
* @see baseModule::get_metaData()
*/
function check_configOptions($scopes, $options) {
public function check_configOptions($scopes, $options) {
$messages = array();
$scopes[] = 'all'; // add checks that are independent of scope
for ($s = 0; $s < sizeof($scopes); $s++) {
@ -636,23 +742,13 @@ abstract class baseModule {
return $messages;
}
/**
* Returns an array with all fields available for this account type on the PDF
* output. This method may be overwritten by subclasses or it may be used
* by using entries in the $this->meta['PDF_fields'] array of the specific sub-
* class.
*
* @param string $scope account type
* @return array list of available fields for PDF output
*/
function get_pdfFields() {
return ((isset($this->meta['PDF_fields'])) ? $this->meta['PDF_fields'] : array());
}
/**
* Returns a hashtable with all entries that may be printed out in the PDF.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This method must be overwritten in case that there are non static values
* to be returned. The $this->meta['PDF_entries'] array may be used for static content.<br>
* to be returned. The $this->meta['PDF_fields'] array may be used for static content.<br>
* <br>
* <b>Format of returned hashtable:</b><br>
* <br>
@ -695,26 +791,34 @@ abstract class baseModule {
*
* @see baseModule::get_metaData()
*/
function get_pdf_entries($scope = 'user') {
return ((isset($this->meta['PDF_entries'])) ? $this->meta['PDF_entries'] : array());
public function get_pdfFields() {
return ((isset($this->meta['PDF_fields'])) ? $this->meta['PDF_fields'] : array());
}
/**
* Returns an array containing all input columns for the file upload.
*
* <b>Syntax:</b>
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This funtion returns an array which contains subarrays which represent an upload column.
* <b>Syntax of column arrays:</b>
* <br>
* <br> array(
* <br> string: name, // fixed non-translated name which is used as column name (should be of format: <module name>_<column name>)
* <br> string: description, // short descriptive name
* <br> string: help, // help ID
* <br> string: example, // example value
* <br> string: values, // possible input values (optional)
* <br> string: default, // default value (optional)
* <br> boolean: required // true, if user must set a value for this column
* <br> boolean: unique // true if all values of this column must be different values (optional, default: "false")
* <br> )
*
* @return array column list
*
* @see baseModule::get_metaData()
*/
function get_uploadColumns() {
public function get_uploadColumns() {
if (isset($this->meta['upload_columns'])) return $this->meta['upload_columns'];
else return array();
}
@ -722,28 +826,41 @@ abstract class baseModule {
/**
* Returns a list of module names which must be processed in building the account befor this module.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The named modules may not be active, LAM will check this automatically.
*
* @return array list of module names
*
* @see baseModule::get_metaData()
*/
function get_uploadPreDepends() {
public function get_uploadPreDepends() {
if (isset($this->meta['upload_preDepends'])) return $this->meta['upload_preDepends'];
else return array();
}
/**
* In this function the LDAP account is built up.
* In this function the LDAP accounts are built.
*
* @param array $rawAccounts list of hash arrays (name => value) from user input
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* Returns an array which contains subarrays to generate StatusMessages if any errors occured.
*
* @param array $rawAccounts the user input data, contains one subarray for each account.
* @param array $partialAccounts list of hash arrays (name => value) which are later added to LDAP
* @param array $ids list of IDs for column position (e.g. "posixAccount_uid" => 5)
* @return array list of error messages if any
*/
function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts) {
public function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts) {
// must be implemented in sub modules
return array();
}
/**
* This function returns the help entry array for a specific help id.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The result is an hashtable with the following keys:<br>
* <ul>
* <li><b>Headline (required)</b><br>
@ -764,7 +881,7 @@ abstract class baseModule {
*
* @see baseModule::get_metaData()
*/
function get_help($id) {
public function get_help($id) {
if(isset($this->meta['help'][$id])) {
return $this->meta['help'][$id];
}
@ -778,47 +895,76 @@ abstract class baseModule {
/**
* This function is used to check if this module page can be displayed.
* It returns false if a module depends on data from other modules which was not yet entered.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* Your module might depend on input of other modules. This function determines if the user
* can change to your module page or not. The return value is true if your module accepts
* input, otherwise false.<br>
* This method's return value defaults to true.
*
* @return boolean true, if page can be displayed
*/
function module_ready() {
public function module_ready() {
return true;
}
/**
* This functions is used to check if all settings for this module have been made.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This function tells LAM if it can create/modify the LDAP account. If your module needs any
* additional input then set this to false. The user will be notified that your module needs
* more input.<br>
* This method's return value defaults to true.
*
* @return boolean true, if settings are complete
*/
function module_complete() {
public function module_complete() {
return true;
}
/**
* Controls if the module button the account page is visible and activated.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* <b>Possible return values:</b>
* <ul>
* <li><b>enabled:</b> button is visible and active</li>
* <li><b>disabled:</b> button is visible and deactivated (greyed)</li>
* <li><b>hidden:</b> no button will be shown</li>
* </ul>
*
* @return string status ("enabled", "disabled", "hidden")
*/
function getButtonStatus() {
public function getButtonStatus() {
return "enabled";
}
/**
* This function executes one post upload action.
* This function is responsible to do additional tasks after the account has been created in LDAP (e.g. modifying group memberships, adding Quota etc..).
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This function is called as long as the returned status is 'finished'. Please make sure
* that one function call lasts no longer than 3-4 seconds. Otherwise the upload may fail
* because the time limit is exceeded. You should not make more than one LDAP operation in
* each call.
*
* @param array $data array containing one account in each element
* @param array $ids array(<column_name> => <column number>)
* @param array $failed list of accounts which were not created successfully
* @param array $ids maps the column names to keys for the sub arrays (array(<column_name> => <column number>))
* @param array $failed list of account numbers which could not be successfully uploaded to LDAP
* @param array $temp variable to store temporary data between two post actions
* @return array current status
* <br> array (
* <br> 'status' => 'finished' | 'inProgress'
* <br> 'progress' => 0..100
* <br> 'errors' => array (<array of parameters for StatusMessage>)
* <br> 'status' => 'finished' | 'inProgress' // defines if all operations are complete
* <br> 'progress' => 0..100 // the progress of the operations in percent
* <br> 'errors' => array // list of arrays which are used to generate StatusMessages
* <br> )
*/
function doUploadPostActions($data, $ids, $failed, &$temp) {
public function doUploadPostActions($data, $ids, $failed, &$temp) {
return array(
'status' => 'finished',
'progress' => 100,
@ -828,92 +974,156 @@ abstract class baseModule {
/**
* Returns a list of modifications which have to be made to the LDAP account.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
*
* @return array list of modifications
* <br>This function returns an array with 3 entries:
* <br>array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... )
* <br>DN is the DN to change. It may be possible to change several DNs (e.g. create a new user and add him to some groups via attribute memberUid)
* <br>"add" are attributes which have to be added to LDAP entry
* <br>"remove" are attributes which have to be removed from LDAP entry
* <br>"modify" are attributes which have to been modified in LDAP entry
* <br>DN is the DN to change. It is possible to change several DNs (e.g. create a new user and add him
* to some groups via attribute memberUid)<br>
* <br><b>"add"</b> are attributes which have to be added to the LDAP entry
* <br><b>"remove"</b> are attributes which have to be removed from the LDAP entry
* <br><b>"modify"</b> are attributes which have to be modified in the LDAP entry
* <br><b>"notchanged"</b> are attributes which stay unchanged
* <br>
* <br>This builds the required comands from $this-attributes and $this->orig.
*
* @return array list of modifications
*/
function save_attributes() {
public function save_attributes() {
return $this->getAccountContainer()->save_module_attributes($this->attributes, $this->orig);
}
/**
* Allows the module to run commands before the LDAP entry is changed or created.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* An error message should be printed if the function returns false.
*
* @param boolean $newAccount new account
* @return true, if no problems occured
*/
function preModifyActions($newAccount) {
public function preModifyActions($newAccount) {
return true;
}
/**
* Allows the module to run commands after the LDAP entry is changed or created.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.
*
* @param boolean $newAccount new account
*/
function postModifyActions($newAccount) {
public function postModifyActions($newAccount) {
return;
}
/**
* Allows the module to run commands before the LDAP entry is deleted.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* An error message should be printed if the function returns false.
*
* @return true, if no problems occured
*/
function preDeleteActions() {
public function preDeleteActions() {
return true;
}
/**
* Allows the module to run commands after the LDAP entry is deleted.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.
*/
function postDeleteActions() {
public function postDeleteActions() {
return;
}
/**
* Dummy function for modules which use no special options on account deletion.
* This function returns an array with the same syntax as save_attributes().
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* It allows additional LDAP changes when an account is deleted.
*
* @return List of LDAP operations, same as for save_attributes()
*/
function delete_attributes() {
public function delete_attributes() {
return 0;
}
/**
* Dummy function for modules which do not print extra HTML code on account deletion.
* This function creates meta HTML code which will be displayed when an account should be deleted.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This can be used to interact with the user, e.g. should the home directory be deleted? The output
* of all modules is displayed on a single page.
*
* @return meta HTML code
* @see parseHtml()
*/
function display_html_delete() {
public function display_html_delete() {
return 0;
}
/**
* This function processes user input.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.<br>
* <br>
* It checks the user input and saves changes in the module's data structures.<br>
* <br>
* <b>Example:</b> return array(array('ERROR', 'Invalid input!', 'This is not allowed here.'));
*
* @return array Array which contains status messages. Each entry is an array containing the status message parameters.
*/
public abstract function process_attributes();
/**
* This function creates meta HTML code to display the module page.
*
* Calling this method requires the existence of an enclosing {@link accountContainer}.
*
* @return meta HTML
*
* @see parseHtml()
*/
public abstract function display_html_attributes();
/**
* Returns a list of managed object classes for this module.
* This is used to fix incorrect spelled object class names.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* This is used to fix spelling errors in LDAP-Entries (e.g. if "posixACCOUNT" is read instead of "posixAccount" from LDAP).<br>
* <br>
* <b>Example:</b> return array('posixAccount')
*
* @return array list of object classes
*
* @see baseModule::get_metaData()
*/
function getManagedObjectClasses() {
public function getManagedObjectClasses() {
if (isset($this->meta['objectClasses']) && is_array($this->meta['objectClasses'])) return $this->meta['objectClasses'];
else return array();
}
/**
* Returns a list of aliases for LDAP attributes.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* All alias attributes will be renamed to the given attribute names.
*
* @return array list of aliases (alias name => attribute name)
* @return array list of aliases like array("alias name" => "attribute name")
*
* @see baseModule::get_metaData()
*/
function getLDAPAliases() {
public function getLDAPAliases() {
if (isset($this->meta['LDAPaliases']) && is_array($this->meta['LDAPaliases'])) return $this->meta['LDAPaliases'];
else return array();
}
@ -923,95 +1133,133 @@ abstract class baseModule {
* All attribute names will be renamed to match the given spelling.
*
* @return array list of attributes
*
* @see baseModule::get_metaData()
*/
function getManagedAttributes() {
public function getManagedAttributes() {
if (isset($this->meta['attributes']) && is_array($this->meta['attributes'])) return $this->meta['attributes'];
else return array();
}
/**
* Returns a list of required PHP extensions.
* This function returns a list of PHP extensions (e.g. mhash) which are needed by this module.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.
*
* @return array extensions
*
* @see baseModule::get_metaData()
*/
function getRequiredExtensions() {
public function getRequiredExtensions() {
if (isset($this->meta['extensions']) && is_array($this->meta['extensions'])) return $this->meta['extensions'];
else return array();
}
/**
* Returns a list of possible search attributes for the self service.
* This function returns a list of possible LDAP attributes (e.g. uid, cn, ...) which can be used to search for LDAP objects.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.
*
* @return array attributes
*
* @see baseModule::get_metaData()
*/
function getSelfServiceSearchAttributes() {
public function getSelfServiceSearchAttributes() {
if (isset($this->meta['selfServiceSearchAttributes']) && is_array($this->meta['selfServiceSearchAttributes'])) return $this->meta['selfServiceSearchAttributes'];
else return array();
}
/**
* Returns a list of possible input fields and their descriptions
* Format: array(<field identifier> => <field description>)
* Returns a list of possible input fields and their descriptions.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* <b>Format:</b> array(<field identifier> => <field description>)
*
* @return array fields
*
* @see baseModule::get_metaData()
*/
function getSelfServiceFields() {
public function getSelfServiceFields() {
if (isset($this->meta['selfServiceFieldSettings']) && is_array($this->meta['selfServiceFieldSettings'])) return $this->meta['selfServiceFieldSettings'];
else return array();
}
/**
* Returns the meta HTML code for each input field.
* format: array(<field1> => array(<META HTML>), ...)
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* <b>Format:</b> array(<field1> => array(<META HTML>), ...)<br>
* It is not possible to display help links.
*
* @param array $fields list of active fields
* @param array $attributes attributes of LDAP account (attribute names in lower case)
* @return array meta HTML
*
* @see parseHtml()
*/
function getSelfServiceOptions($fields, $attributes) {
public function getSelfServiceOptions($fields, $attributes) {
// this function must be overwritten by subclasses.
return array();
}
/**
* Checks if all input values are correct and returns the LDAP commands which should be executed.
* Checks if all input values are correct and returns the LDAP attributes which should be changed.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.
*
* @param string $fields input fields
* @param array $attributes LDAP attributes
* @return array messages and LDAP commands (array('messages' => array(), 'add' => array(), 'del' => array(), 'mod' => array()))
* @return array messages and attributes (array('messages' => array(), 'add' => array('mail' => array('test@test.com')), 'del' => array(), 'mod' => array()))
*/
function checkSelfServiceOptions($fields, $attributes) {
public function checkSelfServiceOptions($fields, $attributes) {
$return = array('messages' => array(), 'add' => array(), 'del' => array(), 'mod' => array());
return $return;
}
/**
* Returns a list of self service configuration settings.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* The type "fieldset" is not allowed here. The name attributes are used as keywords to load
* and save settings. We recommend to use the module name as prefix for them
* (e.g. posixAccount_homeDirectory) to avoid naming conflicts.
*
* @return array settings
* @return array meta HTML code
*
* @see baseModule::get_metaData()
* @see parseHtml()
*/
function getSelfServiceSettings() {
public function getSelfServiceSettings() {
if (isset($this->meta['selfServiceSettings']) && is_array($this->meta['selfServiceSettings'])) return $this->meta['selfServiceSettings'];
else return array();
}
/**
* Checks if the self service settings are valid.
*
* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
* <br>
* If the input data is invalid the return value is an array that contains arrays
* to build StatusMessages (message type, message head, message text). If no errors
* occured the function returns an empty array.
*
* @param array $options settings
* @param array $options hash array (option name => value) that contains the input. The option values are all arrays containing one or more elements.
* @return array error messages
*/
function checkSelfServiceSettings($options) {
public function checkSelfServiceSettings($options) {
// needs to be implemented by the subclasses, if needed
return array();
}
/**
* Returns the accountContainer object.
* Returns the {@link accountContainer} object.
*
* @return accountContainer accountContainer object
*
* @see accountContainer
*/
protected function getAccountContainer() {
if (isset($this->base) && isset($_SESSION[$this->base])) {
@ -1046,6 +1294,8 @@ abstract class baseModule {
* The preferred size is 32x32px.
*
* @return unknown
*
* @see baseModule::get_metaData()
*/
public function getIcon() {
if (isset($this->meta['icon'])) {