<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>Module HowTo - Self service</title> <link rel="stylesheet" type="text/css" href="style/layout.css"> <link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico"></head><body> <div style="text-align: center;"> <h1>Module HowTo - Self service<br> </h1> <div style="text-align: left;"><br> Self service is a LAM Pro feature. It allows your users to manage their own data (e.g. telephone numbers).<br> <br> </div> <div style="text-align: left;">First you need to implement the function <span style="font-weight: bold;">getSelfServiceFields()</span> or use <span style="font-weight: bold;">meta['selfServiceFieldSettings']</span>. Each field has an ID and a descriptive name that will be displayed on the self service page.<br> Your input fields may also be defined as read-only in the self service profile editor. If your fields supports read-only then use canSelfServiceFieldBeReadOnly() or <span style="font-weight: bold;">meta['selfServiceReadOnlyFields']</span>.<br> <br> <span style="font-weight: bold; text-decoration: underline;">Example:</span><br style="font-weight: bold; text-decoration: underline;"> <br> The <span style="font-style: italic;">inetOrgPerson</span> module provides lots of possible input fields for the self service.<br> <br> <table style="width: 100%; text-align: left;" class="mod-code" border="0" cellpadding="2" cellspacing="2"> <tbody> <tr> <td style="vertical-align: top;"> /**<br> * Returns meta data that is interpreted by parent class<br> *<br> * @return array array with meta data<br> */<br> <span style="font-weight: bold;"> function</span> get_metaData() {<br> $return = array();<br> $return['selfServiceFieldSettings'] = array('firstName' => _('First name'), 'lastName' => _('Last name'),<br> 'mail' => _('Email address'), 'telephoneNumber' => _('Telephone number'), 'mobile' => _('Mobile number'),<br> 'faxNumber' => _('Fax number'), 'street' => _('Street'), 'postalAddress' => _('Postal address'), 'registeredAddress' => _('Registered address'),<br> 'postalCode' => _('Postal code'), 'postOfficeBox' => _('Post office box'), 'jpegPhoto' => _('Photo'),<br> 'homePhone' => _('Home telephone number'), 'roomNumber' => _('Room number'), 'carLicense' => _('Car license'),<br> 'location' => _('Location'), 'state' => _('State'), 'officeName' => _('Office name'), 'businessCategory' => _('Business category'),<br> 'departmentNumber' => _('Department'), 'initials' => _('Initials'), 'title' => _('Job title'), 'labeledURI' => _('Web site'),<br> 'userCertificate' => _('User certificates'));<br> // possible self service read-only fields<br> $return['selfServiceReadOnlyFields'] = array('firstName', 'lastName', 'mail', 'telephoneNumber', 'mobile', 'faxNumber', 'street',<br> 'postalAddress', 'registeredAddress', 'postalCode', 'postOfficeBox', 'jpegPhoto', 'homePhone', 'roomNumber', 'carLicense',<br> 'location', 'state', 'officeName', 'businessCategory', 'departmentNumber', 'initials', 'title', 'labeledURI', 'userCertificate');<br> [...]<br> </td> </tr> </tbody> </table> <br> <br> In very rare cases you need to specify self service search attributes. These are used to identify the user inside LDAP. Common examples are "uid" or "mail".<br> <br> <span style="font-weight: bold; text-decoration: underline;">Example:</span><br style="font-weight: bold; text-decoration: underline;"> <br> The <span style="font-style: italic;">inetOrgPerson</span> module specifies several search attributes.<br> <br> <table style="width: 100%; text-align: left;" class="mod-code" border="0" cellpadding="2" cellspacing="2"> <tbody> <tr> <td style="vertical-align: top;"> /**<br> * Returns meta data that is interpreted by parent class<br> *<br> * @return array array with meta data<br> */<br> <span style="font-weight: bold;"> function</span> get_metaData() {<br> $return = array();<br> // self service search attributes<br> $return['selfServiceSearchAttributes'] = array('uid', 'mail', 'cn', 'surname', 'givenName', 'employeeNumber');<br> [...]<br> </td> </tr> </tbody> </table> <br> <br> The HTML code for the user page is generated with the function <span style="font-weight: bold;">getSelfServiceOptions()</span>. It returns one table row for each input field.<br> Please note that some fields may be defined as read-only ($readOnlyFields). If $passwordChangeOnly is set then no input fields other than the bind password should be displayed (you will not get any attribute values).<br> <br> <span style="font-weight: bold; text-decoration: underline;">Example:</span><br style="font-weight: bold; text-decoration: underline;"> <br> The <span style="font-style: italic;">windowsUser</span> module uses the addSimpleSelfServiceTextField() function from baseModule to print the text field. You may also build the table row yourself if the input field is more complex.<br> <br> <table style="width: 100%; text-align: left;" class="mod-code" border="0" cellpadding="2" cellspacing="2"> <tbody> <tr> <td style="vertical-align: top;"> /**<br> * Returns the meta HTML code for each input field.<br> * format: array(<field1> => array(<META HTML>), ...)<br> * It is not possible to display help links.<br> *<br> * @param array $fields list of active fields<br> * @param array $attributes attributes of LDAP account<br> * @param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable<br> * @param array $readOnlyFields list of read-only fields<br> * @return array list of meta HTML elements (field name => htmlTableRow)<br> */<br> function getSelfServiceOptions($fields, $attributes, $passwordChangeOnly, $readOnlyFields) {<br> $return = array();<br> if ($passwordChangeOnly) {<br> return $return; // only password fields as long no LDAP content can be read<br> }<br> $this->addSimpleSelfServiceTextField($return, 'physicalDeliveryOfficeName', _('Office name'), $fields, $attributes, $readOnlyFields);<br> [...]<br> </td> </tr> </tbody> </table> <br> <br> Of course, the user input should also be validated before making any LDAP changes. This is done in <span style="font-weight: bold;">checkSelfServiceOptions()</span>.<br> The return value includes any error messages to display and also all LDAP operations.<br> Please note that some fields may be defined as read-only ($readOnlyFields). If $passwordChangeOnly is set then no input fields other than the bind password should be displayed (you will not get any attribute values).<br> <br> <span style="font-weight: bold; text-decoration: underline;">Example:</span><br style="font-weight: bold; text-decoration: underline;"> <br> The <span style="font-style: italic;">inetOrgPerson</span> module has a field for the user's first name.<br> <br> <table style="width: 100%; text-align: left;" class="mod-code" border="0" cellpadding="2" cellspacing="2"> <tbody> <tr> <td style="vertical-align: top;"> /**<br> * Checks if all input values are correct and returns the LDAP attributes which should be changed.<br> * <br>Return values:<br> * <br>messages: array of parameters to create status messages<br> * <br>add: array of attributes to add<br> * <br>del: array of attributes to remove<br> * <br>mod: array of attributes to modify<br> * <br>info: array of values with informational value (e.g. to be used later by pre/postModify actions)<br> * <br> * Calling this method does not require the existence of an enclosing {@link accountContainer}.<br> *<br> * @param string $fields input fields<br> * @param array $attributes LDAP attributes<br> * @param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable<br> * @param array $readOnlyFields list of read-only fields<br> * @return array messages and attributes (array('messages' => array(), 'add' => array('mail' => array('test@test.com')), 'del' => array(), 'mod' => array(), 'info' => array()))<br> */<br> function checkSelfServiceOptions($fields, $attributes, $passwordChangeOnly, $readOnlyFields) {<br> $return = array('messages' => array(), 'add' => array(), 'del' => array(), 'mod' => array(), 'info' => array());<br> if ($passwordChangeOnly) {<br> return $return; // skip processing if only a password change is done<br> }<br> $attributeNames = array(); // list of attributes which should be checked for modification<br> $attributesNew = $attributes;<br> // first name<br> if (in_array('firstName', $fields) && !in_array('firstName', $readOnlyFields)) {<br> $attributeNames[] = 'givenName';<br> if (isset($_POST['inetOrgPerson_firstName']) && ($_POST['inetOrgPerson_firstName'] != '')) {<br> if (!get_preg($_POST['inetOrgPerson_firstName'], 'realname')) $return['messages'][] = $this->messages['givenName'][0];<br> else $attributesNew['givenName'][0] = $_POST['inetOrgPerson_firstName'];<br> }<br> elseif (isset($attributes['givenName'])) unset($attributesNew['givenName']);<br> }<br> [...]<br> </td></tr></tbody> </table> <br> <br> The self service also supports configuration settings for each module. See <span style="font-weight: bold;">getSelfServiceSettings() </span>or <span style="font-weight: bold;">meta['selfServiceSettings'] </span>to specify the options.<br> You can validate the input with <span style="font-weight: bold;">checkSelfServiceSettings()</span>.<br> Self service configuration settings are displayed on a separate tab in the self service profile editor.<br> <br> <span style="font-weight: bold;"></span> <h2><span style="font-weight: bold;"></span></h2> </div> </div> </body></html>