Handling Parent-Child Table Relationship Using Generated Code

You can create database application with parent-child table relationship using code generator. You can do for unlimited relationship with cascading update and delete.

Here are steps to do:

  • Generate the code for each table both for list and maintenance using process type of gencode_dblist1 and gencode_dbmaint1.

  • You need to modify the configuration file (xml) of maintenance application of the parent. You need to add callback to the action function, and child table processing. To do this, you just copy the code from the child configuration.

  • You need to modify template file (html) by add new holder for child.

  • You need to modify child template file (html) to show only what you need.

  • You need to modify the configuration file (xml) of maintenance application of the child. You need to configure control to return action to manitenance application of the parent.


Now all is ready. No code changes. You can do all of above in no more than 10 minutes.

Add New Capability To Ant

You can add new capability to Queen, Worker, and Kannel. You need to have queenProcess application (engine) for new Queen capability. You need to have workerProcess application (engine) for new Worker capability. You need to have kannelHandler application (engine) for new Kannel capability.

Mention above is the minimum requirement for adding new capability. Using this you will be provided a text editor to create related manifest to instantiate process/ handler.

If you want to have customized manifest maintenance you need to create a template and an engine for this task and languages as needed.

Below are web interface to add new capability for Queen, Worker, and Kannel.

Queen capability:


Worker capability:


Kannel capability:

Process Capabilities Transfer Between Ants

You can transfer Process Capabilities between Queens using web interface. You can push Process Capabilities of a Queen to another Queen to be owned by another Queen.

You can transfer Process Capabilities between Workers using web interface. You can push Process Capabilities of a Worker to another Worker to be owned by another Worker.

You can transfer Kannel Capabilities between Kannels using web interface. You can push Kannel Capabilities of a Kannel to another Kannel to be owned by another Kannel.

Queen Capability:


Worker Capability:


Kannel Capability:


Write to which owner capabilities will be transferred and then click Go. Capabilities are now owned by to which push owner.

Extending System User Preferences

You can extend default user preferences to add additional preferences. You even not need to change the php code, you just create a class that extend user preferences class and included that file in configuration file.

Here is default preferences:


You can extend to like below:




<?php
/**
*
* Copyright (c) 2009, Stevanus DH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* Neither the name of the CIISONLINE. nor the names of its contributors may
* be used to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*/

class Extension_Preferences extends CIISONLINE_Preferences_Extension{

static function ValidateChange() {
return '';
}

static function DoChange() {
/*-------------------------------
* Load all form fields into variables
*------------------------------- */
$pPKuser_id = GetParam('PK_user_id');
$pPKaccount_id = GetParam('PK_account_id');
/* the value should be: user, users group, or role */
$flduser_type = GetParam('user_typeid');

/* the value should be: any registered approval path */
$fldreqapprovalpath1 = GetParam('reqapprovalpath1');
$fldaccptapprovalpath1 = GetParam('accptapprovalpath1');
$fldreqapprovalpath2 = GetParam('reqapprovalpath2');
$fldaccptapprovalpath2 = GetParam('accptapprovalpath2');
$fldreqapprovalpath3 = GetParam('reqapprovalpath3');
$fldaccptapprovalpath3 = GetParam('accptapprovalpath3');
$fldreqapprovalpath4 = GetParam('reqapprovalpath4');
$fldaccptapprovalpath4 = GetParam('accptapprovalpath4');
$fldreqapprovalpath5 = GetParam('reqapprovalpath5');
$fldaccptapprovalpath5 = GetParam('accptapprovalpath5');

/* if email notification is sent to the sender. the value should be: true or false*/
$fldownemailnotif = getCheckBoxValue(GetParam('OwnEm'), '1', '0', 'Number');
/* if email notification is sent on changing user form. the value should be: true or false*/
$fldnotifyformchange = getCheckBoxValue(GetParam('NotifMyFormChEm'), '1', '0', 'Number');
/* number of items display on a page*/
$fldnum_items_perpage = GetParam('num_items_perpage');

/* escalation information */
$fldescalate_approval_toid = '';
$fldescalate_approval_to = GetParam('escalate_approval_to');
$fldescalate_approval_info = GetParam('escalate_approval_info');

if ($fldescalate_approval_to!='') {
$fldescalate_approval_toid = AccountIDFromUserSelectionMode($fldescalate_approval_to);
if ((string)$fldescalate_approval_toid==(string)$pPKuser_id) $fldescalate_approval_toid = '';
}

$sUserID = GetCurrentUserConfig('UserID');

if ((string)GetCurrentPageConfig('sPageErrorMessage') == '') {
/*numbers forms */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumFormsPerPageDefPage'), $fldnum_items_perpage);
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumFormsPerPageSharedPage'), $fldnum_items_perpage);
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumFormsPerPageCtrPage'), $fldnum_items_perpage);
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumFormsPerPageApprPage'), $fldnum_items_perpage);
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumFormsPerPageListPage'), $fldnum_items_perpage);
/*own email */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigSendOwnSubmittedForm'), $fldownemailnotif);
/*notify form change */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigEmailMyFormChange'), $fldnotifyformchange);
/*fldreqapprovalpath1 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath1'), $fldreqapprovalpath1);
/*fldaccptapprovalpath1 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath1'), $fldaccptapprovalpath1);
/*fldreqapprovalpath2*/
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath2'), $fldreqapprovalpath2);
/*fldaccptapprovalpath2 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath2'), $fldaccptapprovalpath2);
/*fldreqapprovalpath3 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath3'), $fldreqapprovalpath3);
/*fldaccptapprovalpath3*/
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath3'), $fldaccptapprovalpath3);
/*fldreqapprovalpath4 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath4'), $fldreqapprovalpath4);
/*fldaccptapprovalpath4 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath4'), $fldaccptapprovalpath4);
/*fldreqapprovalpath5 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath5'), $fldreqapprovalpath5);
/*fldaccptapprovalpath5 */
SetUserConfigBy ($sUserID, $pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath5'), $fldaccptapprovalpath5);

$sFormApplEscalTbColPrefix = GetTableConfig('sFormApplEscalTbColPrefix');
$sFormApplEscalTbNm = GetTableConfig('sFormApplEscalTbNm');

/* check if this assigned people delegate to other, if any you asiggned to this delegated people*/
if ((int)DLookup($sFormApplEscalTbNm,
' count(*) as n ',
$sFormApplEscalTbColPrefix.'02='.ToSQL($pPKuser_id,'Text')
.' and '.$sFormApplEscalTbColPrefix.'04<='.ToSQL(GetSystemDateTimeValue(),'Date')
.' and ('.$sFormApplEscalTbColPrefix.'05>='.ToSQL(GetSystemDateTimeValue(),'Date')
.' or '.$sFormApplEscalTbColPrefix.'05 is null)')>0) {

$sSQL = 'update '.$sFormApplEscalTbNm.' set '
.$sFormApplEscalTbColPrefix.'0B='.ToSQL(GetTimestamp(), 'Number').','
.$sFormApplEscalTbColPrefix.'05='.ToSQL(GetSystemDateTimeValue(), 'Date').','
.$sFormApplEscalTbColPrefix.'08='.ToSQL(GetSystemDateTimeValue(), 'Date').','
.$sFormApplEscalTbColPrefix.'10='.ToSQL($sUserID,'Text')
.' where '.$sFormApplEscalTbColPrefix.'02='.ToSQL($pPKuser_id,'Text')
.' and '.$sFormApplEscalTbColPrefix.'04<='.ToSQL(GetSystemDateTimeValue(),'Date')
.' and ('.$sFormApplEscalTbColPrefix.'05>='.ToSQL(GetSystemDateTimeValue(),'Date')
.' or '.$sFormApplEscalTbColPrefix.'05 is null)';

ExecuteSQL2 ($sSQL);
}

if ($fldescalate_approval_toid!='') {
$sSQL = 'insert into '.$sFormApplEscalTbNm.' ('
.$sFormApplEscalTbColPrefix.'0A,'
.$sFormApplEscalTbColPrefix.'01,'
.$sFormApplEscalTbColPrefix.'02,'
.$sFormApplEscalTbColPrefix.'03,'
.$sFormApplEscalTbColPrefix.'04,'
.$sFormApplEscalTbColPrefix.'05,'
.$sFormApplEscalTbColPrefix.'06,'
.$sFormApplEscalTbColPrefix.'07,'
.$sFormApplEscalTbColPrefix.'09) '
.'values ('
.ToSQL(GetTimestamp(),'Number').','
.ToSQL(GUID(),'Text').','
.ToSQL($pPKuser_id, 'Text').','
.ToSQL($fldescalate_approval_toid, 'Text').','
.ToSQL(GetSystemDateTimeValue(), 'Date').','
.'NULL,'
.ToSQL($fldescalate_approval_info,'Text').','
.ToSQL(GetSystemDateTimeValue(), 'Date').','
.ToSQL($sUserID,'Text').')';

ExecuteSQL2 ($sSQL);
}
}
}

static function Preferences_Show() {
/*-------------------------------
* Preferences Show begin
*------------------------------- */

$sAction = GetCurrentPageConfig('sAction');
$sForm = GetCurrentPageConfig('sForm');

$pPKaccount_id = '';
$flduser_localusercode = '';
/* the value should be: user, users group, or role */
$flduser_type = '';

/* number of items display on a page*/
$fldnum_items_perpage = '';

/* the value should be: any registered approval path */
$fldreqapprovalpath1 = '';
$fldaccptapprovalpath1 = '';
$fldreqapprovalpath2 = '';
$fldaccptapprovalpath2 = '';
$fldreqapprovalpath3 = '';
$fldaccptapprovalpath3 = '';
$fldreqapprovalpath4 = '';
$fldaccptapprovalpath4 = '';
$fldreqapprovalpath5 = '';
$fldaccptapprovalpath5 = '';

/* if email notification is sent to the sender. the value should be: true or false*/
$fldownemailnotif = '';
/* if email notification is sent on changing user form. the value should be: true or false*/
$fldnotifyformchange = '';

/* escalation information */
$fldescalate_approval_to = '';
$fldescalate_approval_info = '';

$bUpdateMode = false;

$pPKuser_id = GetParam('PK_user_id');

if ((string)$pPKuser_id!='') {
$bUpdateMode = UserExists($pPKuser_id);
}

$sPageErrorMessage = GetCurrentPageConfig('sPageErrorMessage');

if ($bUpdateMode) {
if ($sPageErrorMessage=='') {
$sUserTbNm = GetTableConfig('sUserTbNm');
$sUserTbColPrefix = GetTableConfig('sUserTbColPrefix');

$sSQL = 'select a.'.$sUserTbColPrefix.'01 as a_userid, '
.'a.'.$sUserTbColPrefix.'02 as a_login, '
.'a.'.$sUserTbColPrefix.'13 as a_usertype'
.' from '.$sUserTbNm.' a '
.' where a.'.$sUserTbColPrefix.'20='.ToSQL(GetSystemConfig('sLocalUserCode'),GetLocalUserCodeSqlValueType())
.' and a.'.$sUserTbColPrefix.'01='.ToSQL($pPKuser_id,'Text');

OpenRS ($rs, $sSQL);

$flduser_type = GetValue($rs, 'a_usertype');
$pPKaccount_id = GetValue($rs, 'a_login');
$fldlogin = GetLogin($pPKaccount_id);

$rs->Close();
unset ($rs);

/*own email notification */
$fldownemailnotif = GetUserConfigWithDefault($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigSendOwnSubmittedForm'),0);
/*notify form change */
$fldnotifyformchange = GetUserConfigWithDefault($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigEmailMyFormChange'),0);
/*forms per page */
$fldnum_items_perpage = GetUserConfigWithDefault($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigNumItemsPerPageListPage'),0);

$fldreqapprovalpath1 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath1'));
$fldaccptapprovalpath1 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath1'));
$fldreqapprovalpath2 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath2'));
$fldaccptapprovalpath2 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath2'));
$fldreqapprovalpath3 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath3'));
$fldaccptapprovalpath3 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath3'));
$fldreqapprovalpath4 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath4'));
$fldaccptapprovalpath4 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath4'));
$fldreqapprovalpath5 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigRequestApprovalPath5'));
$fldaccptapprovalpath5 = GetUserConfig($pPKaccount_id, GetUserConfigPreferenceConst('iUserConfigAcceptanceApprovalPath5'));

$fldescalate_approval_toid = $pPKuser_id;

$sFormApplEscalTbColPrefix = GetTableConfig('sFormApplEscalTbColPrefix');
$sFormApplEscalTbNm = GetTableConfig('sFormApplEscalTbNm');
/* check if this assigned people delegate to other, if any you asiggned to this escalated people */
while ((int)DLookup($sFormApplEscalTbNm,' count(*) as n ',$sFormApplEscalTbColPrefix.'02='.ToSQL($fldescalate_approval_toid,'Text').' and '.$sFormApplEscalTbColPrefix.'04<='.ToSQL(GetSystemDateTimeValue(),'Date').' and ('.$sFormApplEscalTbColPrefix.'05>='.ToSQL(GetSystemDateTimeValue(),'Date').' or '.$sFormApplEscalTbColPrefix.'05 is null)')>0) {
$fldescalate_approval_info = DLookup($sFormApplEscalTbNm,$sFormApplEscalTbColPrefix.'06',$sFormApplEscalTbColPrefix.'02='.ToSQL($fldescalate_approval_toid,'Text').' and '.$sFormApplEscalTbColPrefix.'04<='.ToSQL(GetSystemDateTimeValue(),'Date').' and ('.$sFormApplEscalTbColPrefix.'05>='.ToSQL(GetSystemDateTimeValue(),'Date').' or '.$sFormApplEscalTbColPrefix.'05 is null)');
$fldescalate_approval_toid = DLookup($sFormApplEscalTbNm,$sFormApplEscalTbColPrefix.'03',$sFormApplEscalTbColPrefix.'02='.ToSQL($fldescalate_approval_toid,'Text').' and '.$sFormApplEscalTbColPrefix.'04<='.ToSQL(GetSystemDateTimeValue(),'Date').' and ('.$sFormApplEscalTbColPrefix.'05>='.ToSQL(GetSystemDateTimeValue(),'Date').' or '.$sFormApplEscalTbColPrefix.'05 is null)');
break;
}

$fldescalate_approval_to = '';
if (strtolower((string)$fldescalate_approval_toid)!=strtolower((string)$pPKaccount_id)) {
if ((string)$fldescalate_approval_toid!='') {
$fldescalate_approval_to = UserFromUserSelectionMode($fldescalate_approval_toid);
}
}
}
}

/*-------------------------------
* Load primary key and form parameters
*------------------------------- */
$sPageErrorMessage = GetCurrentPageConfig('sPageErrorMessage');

if ($sPageErrorMessage == '') {
} else {
$pPKaccount_id = GetParam('PK_account_id');
$flduser_localusercode = GetParam('user_localusercode');
$flduser_type = GetParam('user_typeid');

$fldnum_items_perpage = GetParam('num_items_perpage');

$fldreqapprovalpath1 = GetParam('reqapprovalpath1');
$fldaccptapprovalpath1 = GetParam('accptapprovalpath1');
$fldreqapprovalpath2 = GetParam('reqapprovalpath2');
$fldaccptapprovalpath2 = GetParam('accptapprovalpath2');
$fldreqapprovalpath3 = GetParam('reqapprovalpath3');
$fldaccptapprovalpath3 = GetParam('accptapprovalpath3');
$fldreqapprovalpath4 = GetParam('reqapprovalpath4');
$fldaccptapprovalpath4 = GetParam('accptapprovalpath4');
$fldreqapprovalpath5 = GetParam('reqapprovalpath5');
$fldaccptapprovalpath5 = GetParam('accptapprovalpath5');

$fldownemailnotif = getCheckBoxValue(GetParam('OwnEm'), '1', '0', 'Number');
$fldnotifyformchange = getCheckBoxValue(GetParam('NotifMyFormChEm'), '1', '0', 'Number');

$fldescalate_approval_to = GetParam('escalate_approval_to');
$fldescalate_approval_info = GetParam('escalate_approval_info');
}

/*-------------------------------
* Load all form fields
*------------------------------- */

/*-------------------------------
* Preferences Open Event begin
* Preferences Open Event end
*------------------------------- */

SetVar ('SendOwnSubmittedFormCaption', ToHTML(GetTextLanguage('sPreferencesSendOwnSubmittedFormCaptionTitle')));
SetVar ('NotifyMyFormChangeEmail', ToHTML(GetTextLanguage('sPreferencesNotifyMyFormChangeEmailTitle')));

SetVar ('RequestApprovalPath1Caption', ToHTML(GetTextLanguage('sPreferencesRequestApprovalPath1CaptionTitle')));
SetVar ('AcceptanceApprovalPath1Caption', ToHTML(GetTextLanguage('sPreferencesAcceptanceApprovalPath1CaptionTitle')));
SetVar ('RequestApprovalPath2Caption', ToHTML(GetTextLanguage('sPreferencesRequestApprovalPath2CaptionTitle')));
SetVar ('AcceptanceApprovalPath2Caption', ToHTML(GetTextLanguage('sPreferencesAcceptanceApprovalPath2CaptionTitle')));
SetVar ('RequestApprovalPath3Caption', ToHTML(GetTextLanguage('sPreferencesRequestApprovalPath3CaptionTitle')));
SetVar ('AcceptanceApprovalPath3Caption', ToHTML(GetTextLanguage('sPreferencesAcceptanceApprovalPath3CaptionTitle')));
SetVar ('RequestApprovalPath4Caption', ToHTML(GetTextLanguage('sPreferencesRequestApprovalPath4CaptionTitle')));
SetVar ('AcceptanceApprovalPath4Caption', ToHTML(GetTextLanguage('sPreferencesAcceptanceApprovalPath4CaptionTitle')));
SetVar ('RequestApprovalPath5Caption', ToHTML(GetTextLanguage('sPreferencesRequestApprovalPath5CaptionTitle')));
SetVar ('AcceptanceApprovalPath5Caption', ToHTML(GetTextLanguage('sPreferencesAcceptanceApprovalPath5CaptionTitle')));

SetVar ('ApprovalTitle', GetTextLanguage('sPreferencesApprovalTitle'));
SetVar ('EscalateApprovalToColumn', GetTextLanguage('sPreferencesEscalateApprovalToColumnTitle'));
SetVar ('EscalateApprovalInfoColumn', GetTextLanguage('sPreferencesEscalateApprovalInfoColumnTitle'));

SetVar ('AddNewMembersOfidButton', ToHTML(GetTextLanguage('sPreferencesAddNewMembersOfidButtonTitle')));
SetVar ('ClearMembersOfidButton', ToHTML(GetTextLanguage('sPreferencesClearMembersOfidButtonTitle')));
SetVar ('AddNewMembersidButton', ToHTML(GetTextLanguage('sPreferencesAddNewMembersidButtonTitle')));
SetVar ('ClearMembersidButton', ToHTML(GetTextLanguage('sPreferencesClearMembersidButtonTitle')));
SetVar ('PermissionButton', ToHTML(GetTextLanguage('sPreferencesPermissionButtonTitle')));
SetVar ('UpdateButton', ToHTML(GetTextLanguage('sPreferencesUpdateButtonTitle')));
SetVar ('CancelButton', ToHTML(GetTextLanguage('sPreferencesCancelButtonTitle')));
SetVar ('BrowseUsersButton', ToHTML(GetTextLanguage('sPreferencesBrowseUsersButtonTitle')));

/*-------------------------------
* Load all fields into variables from recordset or input parameters
*------------------------------- */

/*-------------------------------
* Preferences Show Event begin
* Preferences Show Event end
*------------------------------- */

/*-------------------------------
* Show form field
*------------------------------- */

SetVarIf ('OwnEmChecked', 'checked',((string)$fldownemailnotif == '1'));
SetVarIf ('NotifMyFormChEmhecked', 'checked',((string)$fldnotifyformchange == '1'));

SetVar ('reqapprovalpath1', ToHTML($fldreqapprovalpath1));
SetVar ('accptapprovalpath1', ToHTML($fldaccptapprovalpath1));
SetVar ('reqapprovalpath2', ToHTML($fldreqapprovalpath2));
SetVar ('accptapprovalpath2', ToHTML($fldaccptapprovalpath2));
SetVar ('reqapprovalpath3', ToHTML($fldreqapprovalpath3));
SetVar ('accptapprovalpath3', ToHTML($fldaccptapprovalpath3));
SetVar ('reqapprovalpath4', ToHTML($fldreqapprovalpath4));
SetVar ('accptapprovalpath4', ToHTML($fldaccptapprovalpath4));
SetVar ('reqapprovalpath5', ToHTML($fldreqapprovalpath5));
SetVar ('accptapprovalpath5', ToHTML($fldaccptapprovalpath5));

SetVar ('escalate_approval_to',$fldescalate_approval_to);
SetVar ('escalate_approval_info',$fldescalate_approval_info);

/*-------------------------------
* Preferences Close Event begin
* Preferences Close Event end
*------------------------------- */

/*-------------------------------
* Preferences Show end
*------------------------------- */
}
}
?>

How to extend user session variable?

You can extend user session variable (=preference) of application by creating class that extend 'CIISONLINE_UserSession' class. Prefix your class name with '0' (zero) and must has suffix with '.class.php' Place your new class under /System/Session/User.

You must register this session variable to the system as shown in the first statement of the example below.

Here is '0BackgroundImage.class.php' user session file for your example:


<?php

CIISONLINE_System::RegisterUserSession("BackgroundImage");

class BackgroundImage extends CIISONLINE_UserSession {

static function GetCode() {
}

static function GetDefault() {
return GetSystemConfig("sBackgroundPageFileName");
}

static function SetToDefault($valid=false) {
self::SetValue(self::GetDefault(),$valid);
}

static function SetValue($Value,$valid=false) {
SetSessionValue ("BackgroundImage_CurrentUser", $Value);
if ($valid) {
self::MakeValid();
}
}

static function GetValue() {
if (!GetSessionValue("Is__BackgroundImage_CurrentUser__Valid")) {
SetSessionValue ("BackgroundImage_CurrentUser",
(string)(GetUserConfigWithDefault(GetSessionValue("AccessAsUserID_CurrentUser"),
GetUserConfigPreferenceConst("iUserConfigBackgroundFile"), self::GetDefault())));
SetSessionValue ("Is__BackgroundImage_CurrentUser__Valid", true);
}
return GetSessionValue("BackgroundImage_CurrentUser");
}

static function Invalidate() {
SetSessionValue ("Is__BackgroundImage_CurrentUser__Valid", false);
}

static function MakeValid() {
SetSessionValue ("Is__BackgroundImage_CurrentUser__Valid", true);
}

static function IsValid() {
return GetSessionValue("Is__BackgroundImage_CurrentUser__Valid");
}
}


?>



You will access the value of user session variable like below:

$var = GetCurrentUserConfig('BackgroundImage');

You can set current session like below:

SetCurrentUserConfig('BackgroundImage','<\<a value>');

Updating Your Database Automatically From Remote Database Even Different Database Engine Even Without Coding

You can update your database automatically from remote database using http protocol even without coding. You can update database from different database engine. As for example you can update mssql from mysql or another.

Here are steps to do:

  1. Create manifest of database_export Worker Process. Configure how exporting will be done.
  2. Create a scheduled to execute manifest periodically.
  3. Create manifest of file_synchronize Queen Process. Configure how to sync data between sites

  4. Configure IPC on your server as appropriate for file_synchronize Queen Process.
  5. Create manifest of database_update Worker Process on your server. Configure how updating will be dane.
  6. Create a scheduled on your server to execute manifest periodically.


After all of that, the only you do is executing all of that manifests.

Now, all of that working automatically to make continuous update.

Using Many Templates For Application

You can use many templates for an application. You also can orchestrate many components/ applications using this methods. You do this by adding 'TemplateSpaceHolder' xml element under 'page' root xml.

See below for your example:



<?xml version="1.0" encoding="UTF-8"?>
<page name="NestMaint" id="NestMaint" >
<processor PageSecurityCode="Page|NestMaint" HelpContext="LIGHTARMY-Applications.NestConfig" sOnlyTemplateFileName="NestMaint.html" CanPublic="false">

<PageSecurityCode>
<Name>Nest Maintenance</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.NestConfig</HelpContext>
</PageSecurityCode>

<PageActionSelectionScript><![CDATA[
switch ((string)GetCurrentPageConfig('sForm')) {
case 'NestMaint':
CIISONLINE_NestMaint::NestMaintAction(GetCurrentPageConfig('sAction'));
}
]]></PageActionSelectionScript>
<TemplateProcessingScript><![CDATA[
CIISONLINE_Header::Menu_Show();
CIISONLINE_Footer::FooterForm_Show();
CIISONLINE_NestMaint::MenuPath_Show();
CIISONLINE_NestMaint::NestMaint_Show();
]]></TemplateProcessingScript>
<ResponseProcessingScript><![CDATA[
ResponseWrite (PrintVar('main'));
]]></ResponseProcessingScript>
<IncludeFile>PageClass/Header.php</IncludeFile>
<IncludeFile>PageClass/Footer.php</IncludeFile>
<IncludeFile>PageClass/NestMaint.php</IncludeFile>

<TemplateSpaceHolder name="Header">Header.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Footer">Footer.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space01">Space01.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space02">Space02.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space03">Space03.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space04">Space04.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space05">Space05.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space06">Space06.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space07">Space07.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space08">Space08.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space09">Space09.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space10">Space10.html</TemplateSpaceHolder>

</processor>
</page>

How Securing Web Access LightArmy

LightArmy has default web access allowing access only to the root and 'Public' folder. And all other folders inside root are blocked for access using .htaccess. If you using apache web server you may not need to do anythings, your web structure has been secured.

For another please configure as above mention: giving access only to the root and 'Public' folder and you must block another folders.

Security Code Auto Registration

Security Code Auto Registration is a way to register your application automatically for authorization. Administrator is the only user granted for access at this auto registration.

Using this feature, you will not must entered manually to database to configure user access right to application. LightArmy first will create a unique or supplied identity for your application and register it to LightArmy registry.

Now, you can configure user access right using web-based applications provided. LightArmy provides you two ways of: you can configure per user (user-based) or you can configure per application (application-based).

If you think to whom users application will be given access, you use application-based. If you thing what accesses you will give to a user, you use user-based.

User-based access right management:


Application-based access right management:


Analogy:
You place your file on operating system (i.e. Linux, Windows , etc) at any folder and then you can configure access right of that application.

Note:
You can create hierarchy of security code as you wish as you create file system hierarchy.

How to cache your page?

You create your page as any other pages. To cache your page, you just only add an attribute 'Cache' with value of 'true' for page xml element of your page configuration (*.pageconf file). For more custom cache, utilize two other attributes: CacheLifetime, and CacheKeys.

CacheLifetime attribute defines for how long time (in minutes), page cache is valid. CacheKeys attribute defines in what parameters (key), separate cache will be made for the same page. As for example, you have page to deliver user information that not change for a user but different from user to user, you can use user id for CacheKeys.

Here is for your example:



<?xml version="1.0" encoding="UTF-8"?>
<page name="HelpFile" id="HelpFile" Cache="true" CacheLifetime="0" CacheKeys="fn::GetParam('context_id')" >
<processor PageSecurityCode="Page|HelpFile" HelpContext="LIGHTARMY-Applications.HelpFile"
sOnlyTemplateFileName="HelpFile.html" CanPublic="true" Authenticate="false"
ValidateSystemConfiguration="false" >

<PageSecurityCode>
<Name>Help File</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.HelpFile</HelpContext>
</PageSecurityCode>

<TemplateProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Show();
]]></TemplateProcessingScript>

<ResponseProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Print();
]]></ResponseProcessingScript>

<IncludeFile>PageClass/HelpFile.php</IncludeFile>

</processor>
</page>

How to use dynamic value inside page configuration?

You can assign dynamic value to any parameters inside page configuration (*.pageconf file). You define your dynamic value using prefix 'fn::' for parameter value. As for example: fn::GetParam('context_id'). Any statement after prefix must can be evaluated and resulting a simple value.

Here is for your example:



<?xml version="1.0" encoding="UTF-8"?>
<page name="HelpFile" id="HelpFile" Cache="true" CacheLifetime="0" CacheKeys="fn::GetParam('context_id')" >
<processor PageSecurityCode="Page|HelpFile" HelpContext="LIGHTARMY-Applications.HelpFile"
sOnlyTemplateFileName="HelpFile.html" CanPublic="true" Authenticate="false"
ValidateSystemConfiguration="false" >

<PageSecurityCode>
<Name>Help File</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.HelpFile</HelpContext>
</PageSecurityCode>

<TemplateProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Show();
]]></TemplateProcessingScript>

<ResponseProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Print();
]]></ResponseProcessingScript>

<IncludeFile>PageClass/HelpFile.php</IncludeFile>

</processor>
</page>

How to create static page?

You create your page as any other pages. To change your page as static page, you just only add an attribute 'Static' with value of 'true' for page xml element of your page configuration (*.pageconf file).

If you want to use parameter for your static page, you can utilize cache inside page configuration. There are some attributes related to cached page: Cache, CacheLifetime, and CacheKeys.

Here is for your example:



<?xml version="1.0" encoding="UTF-8"?>
<page name="HelpFile" id="HelpFile" Cache="true" CacheLifetime="0" CacheKeys="fn::GetParam('context_id')" >
<processor PageSecurityCode="Page|HelpFile" HelpContext="LIGHTARMY-Applications.HelpFile"
sOnlyTemplateFileName="HelpFile.html" CanPublic="true" Authenticate="false"
ValidateSystemConfiguration="false" >

<PageSecurityCode>
<Name>Help File</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.HelpFile</HelpContext>
</PageSecurityCode>

<TemplateProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Show();
]]></TemplateProcessingScript>

<ResponseProcessingScript><![CDATA[
CIISONLINE_HelpFile::HelpFile_Print();
]]></ResponseProcessingScript>

<IncludeFile>PageClass/HelpFile.php</IncludeFile>

</processor>
</page>

How to link help context-sensitive with application?

You do link help context-sensitive with application inside of its configuration (*.pageconf file). Inside 'page' xml root will present a 'processor' xml element. For static security code, you define a HelpContext attribute to do. Other, you create HelpContext element inside PageSecurityCode element under 'processor' xml element.

See below for your example:



<?xml version="1.0" encoding="UTF-8"?>
<page name="NestMaint" id="NestMaint" >
<processor PageSecurityCode="Page|NestMaint" HelpContext="LIGHTARMY-Applications.NestConfig" sOnlyTemplateFileName="NestMaint.html" CanPublic="false">

<PageSecurityCode>
<Name>Nest Maintenance</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.NestConfig</HelpContext>
</PageSecurityCode>

<PageActionSelectionScript><![CDATA[
switch ((string)GetCurrentPageConfig('sForm')) {
case 'NestMaint':
CIISONLINE_NestMaint::NestMaintAction(GetCurrentPageConfig('sAction'));
}
]]></PageActionSelectionScript>
<TemplateProcessingScript><![CDATA[
CIISONLINE_Header::Menu_Show();
CIISONLINE_Footer::FooterForm_Show();
CIISONLINE_NestMaint::MenuPath_Show();
CIISONLINE_NestMaint::NestMaint_Show();
]]></TemplateProcessingScript>
<ResponseProcessingScript><![CDATA[
ResponseWrite (PrintVar('main'));
]]></ResponseProcessingScript>
<IncludeFile>PageClass/Header.php</IncludeFile>
<IncludeFile>PageClass/Footer.php</IncludeFile>
<IncludeFile>PageClass/NestMaint.php</IncludeFile>

<TemplateSpaceHolder name="Header">Header.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Footer">Footer.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space01">Space01.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space02">Space02.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space03">Space03.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space04">Space04.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space05">Space05.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space06">Space06.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space07">Space07.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space08">Space08.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space09">Space09.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space10">Space10.html</TemplateSpaceHolder>

</processor>
</page>

How to use Remote Queue?

First you need to define a queue box with the type of Remote. Fill the queue server uri, username and password.

Now you can access queue as any other type of queue and completely transparent. You can put message, get message, delete message, and list messages using common way.

Here is an example of queue configuration using remote queue:



<?xml version="1.0" encoding="UTF-8"?>
<configuration id="administration">
<section name="queue">
<config name="boxes">
<config name="subscriber">
<config name="buffer">
<config name="storage">
<config name="type">FileSystem</config>
<config name="directory">buffer</config>
</config>
</config>
<config name="handled">
<config name="storage">
<config name="type">FileSystem</config>
<config name="directory">handled</config>
</config>
</config>


<config name="storage">
<config name="type">Remote</config>
<config name="authkeyfilter">CIISONLINE_FEP_STREAMWRAPPER::AuthKeyFilter</config>
<config name="server">http://localhost/knowledge/Queue.php</config>
<config name="user">steve</config>
<config name="password">password</config>
<config name="secure">1</config>
</config>
</config>
</config>
</section>
</configuration>

Steps for delivering SMS application

You need kannel SMS/WAP gateway to deliver SMS application using LightArmy. Here are your steps:

  • Install and configure Kannel SMS/WAP gateway. See Kannel documentation. You can use this for many services. Kannel website: http://www.kannel.org/

  • Create Kannel interface for LightArmy and configure the settings. You can use this for many services.
    Here is for an example:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration id="kannel">
    <section name="core">
    <!--Gateway Configuration -->
    <config name="description">KANNEL MBUNI SMS/MMS Service</config>
    <config name="handler"></config>
    <config name="serviceresponse"></config>

    <config name="auth">
    <config name="username">kannel</config>
    <config name="password">lennak</config>
    </config>

    <config name="path">
    <config name="bearerbox">bearerbox</config>
    <config name="smsbox">smsbox</config>
    <config name="wapbox">wapbox</config>
    <config name="mmsbox">mmsbox</config>
    <config name="mmsrelay">mmsrelay</config>
    <config name="mmsproxy">mmsproxy</config>
    <config name="mmsfromemail">mmsfromemail</config>
    </config>

    <config name="interface">
    <config name="smsposturl"><![CDATA[http://localhost/admin/Restricted/kannel.php?processstage=incoming&message-mime=sms]]></config>
    <config name="smsgeturl"><![CDATA[http://localhost/admin/Restricted/kannel.php?processstage=incoming&message-mime=sms]]></config>
    <config name="smsxmlurl"></config>
    <config name="smsexec"><![CDATA[/System/Kannel/kannel.php processstage=incoming\&message-mime=sms]]></config>
    <config name="smssend"><![CDATA[http://localhost:13013/cgi-bin/sendsms]]></config>
    <config name="smsdlr"><![CDATA[http://localhost/admin/Restricted/kannel.php?processstage=delivery&message-mime=sms]]></config>

    <config name="mmsposturl"><![CDATA[http://localhost/admin/Restricted/kannel.php?processstage=incoming&message-mime=mms]]></config>
    <config name="mmsdlr"><![CDATA[http://localhost/admin/Restricted/kannel.php?processstage=delivery&message-mime=sms]]></config>
    <config name="mmssend"><![CDATA[http://localhost:13014/cgi-bin/sendmms]]></config>
    </config>

    </section>
    </configuration>



  • Create manifest of kannel handler you what (direct reply, stomp, or queue)
    If you choose stomp you need ActiveMQ queue server. ActiveMQ website: http://activemq.apache.org/
    If you choose queue you need queue.
    Here is for an example:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration id="queue_handler">
    <section name="core">
    <!-- Service Handler Configuration-->
    <config name="handler">
    <config name="type">queue_handler</config>
    <config name="name"><![CDATA[SMSPasswordService]]></config>
    <config name="description"><![CDATA[SMS Password Service]]></config>
    <config name="start"></config>
    <config name="end"></config>

    <config name="disableincoming">0</config>
    <config name="disableoutgoing">0</config>
    <config name="disabledelivery">1</config>
    </config>

    <!-- Queue Storage -->
    <config name="connections">
    <config name="mainqueue">
    <config name="type">QUEUE</config>
    <config name="storages">
    <config name="smsincoming">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:inbox</config>
    </config>
    <config name="smsoutgoing">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:outbox</config>
    </config>
    <config name="smsdelivery">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:delivery</config>
    </config>
    <config name="mmsincoming">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:inbox</config>
    </config>
    <config name="mmsoutgoing">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:outbox</config>
    </config>
    <config name="mmsdelivery">
    <config name="ref">QUEUEBOX:QUEUE:SMSPasswordService:delivery</config>
    </config>
    </config>
    </config>
    </config>

    <!-- Database Connection -->
    <config name="connections">
    <config name="kanneldb">
    <config name="type">DATABASE</config>
    <config name="dbtype">mysql</config>
    <config name="host">172.16.250.129</config>
    <config name="username">ciisonline</config>
    <config name="password"></config>
    <config name="dbname">ciisonline</config>
    </config>
    </config>

    <!-- Database Tables -->
    <config name="connections">
    <config name="kanneldb">
    <config name="tables">
    <config name="smsincoming">sms_inbox</config>
    <config name="smsoutgoing">sms_oubox</config>
    <config name="mmsincoming">sms_inbox</config>
    <config name="mmsoutgoing">sms_oubox</config>
    </config>
    </config>
    </config>

    </section>
    </configuration>



  • Create manifest of Kannel Service as appropriate. Use kannel_stompservice for stomp handler. Use kannel_queueservice for queue.
    Here is for an example:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration id="kannel_queueservice">
    <section name="core">
    <!-- Process Configuration-->
    <config name="process">
    <config name="type">kannel_queueservice</config>
    <config name="name">KANNEL_QUEUESERVICE_PASSWORD</config>
    <config name="start"></config>
    <config name="end"></config>
    </config>

    <!--Service Configuration-->
    <config name="service">
    <config name="responder">
    <config name="name">Password</config>
    <config name="directory">Application/SMS/Responder/</config>
    </config>
    <config name="log">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    </config>
    <config name="queue">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    <config name="delivery">smsdelivery</config>
    </config>
    </config>

    <!--Kannel Configuration-->
    <config name="kannel">
    <config name="validate">1</config>
    <config name="name"></config>
    <config name="service">Password</config>
    <config name="auth">
    <config name="username">kannel</config>
    <config name="password">lennak</config>
    </config>
    </config>

    </section>
    </configuration>



  • Create database for logging messages as you need.

  • Create manifest of Kannel Sender as appropriate. Use kannel_stompsender for stomp handler. Use kannel_queuesender for queue.
    Here is for an example:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration id="kannel_queuesender">
    <section name="core">
    <!-- Process Configuration-->
    <config name="process">
    <config name="type">kannel_queuesender</config>
    <config name="name">KANNEL_QUEUESENDER_PASSWORD</config>
    <config name="start"></config>
    <config name="end"></config>
    </config>

    <!--Sender Configuration-->
    <config name="sender">
    <config name="updatestatus">1</config>
    </config>

    <!--Delivery Configuration-->
    <config name="delivery">
    <config name="disable">0</config>
    <config name="interface"></config>
    </config>

    <!--Service Configuration-->
    <config name="service">
    <config name="log">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    </config>
    <config name="queue">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    <config name="delivery">smsdelivery</config>
    </config>
    </config>

    <!--Kannel Configuration-->
    <config name="kannel">
    <config name="validate">1</config>
    <config name="name"></config>
    <config name="service">Password</config>
    <config name="auth">
    <config name="username">kannel</config>
    <config name="password">lennak</config>
    </config>
    </config>

    </section>
    </configuration>



  • If you want to know the status of delivery, create manifest of Kannel delivery status as appropriate. Use kannel_stompdeliverystatus for stomp handler. Use kannel_queuedeliverystatus for queue.
    Here is for an example:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration id="kannel_queuedeliverystatus">
    <section name="core">
    <!-- Process Configuration-->
    <config name="process">
    <config name="type">kannel_queuedeliverystatus</config>
    <config name="name">KANNEL_QUEUEDELIVERYSTATUS_PASSWORD</config>
    <config name="start"></config>
    <config name="end"></config>
    </config>

    <!--Service Configuration-->
    <config name="service">
    <config name="log">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    </config>
    <config name="queue">
    <config name="incoming">smsincoming</config>
    <config name="outgoing">smsoutgoing</config>
    <config name="delivery">smsdelivery</config>
    </config>
    </config>

    <!--Kannel Configuration-->
    <config name="kannel">
    <config name="validate">1</config>
    <config name="name"></config>
    <config name="service">Password</config>
    <config name="auth">
    <config name="username">kannel</config>
    <config name="password">lennak</config>
    </config>
    </config>

    </section>
    </configuration>



  • Create your responder for your service. Responder is the only program (code) you need to create for your specific purpose. You can use any available responder if appropriate.
    Here is for an example:


    <?php

    class Password {

    static function handle($headers,$body,$addheaders=null) {
    $statement = $body;
    while (strpos($statement,' ')!==false) {
    $statement = str_replace(' ',' ',$statement);
    }

    $words = explode(' ',$statement);
    if (isset($headers['from']) && count($words)==3 && strtolower($words[0])=='password' && false!==($pos=strpos($words[1],'@'))) {
    $from = $headers['from'];
    $email = $words[1];
    $password = $words[2];
    return 'test only..';
    // check for sender and email and response if successful only
    }

    return 'another';
    }
    }

    ?>





After all of that, you just start all of that manifests.
Now SMS service is available for serving.

If you want to change your service you may only change the last step and make/change code as appropriate or even no programming needed.

Note:
You can integrate SMS application with any other applications easily. You can shutting down computer using SMS as for example. Another example is sending you an SMS if a process is terminated. You can also sending SMS by email and so on.

Using Parameterized component (Application)

Parameterized component (application) is component or application than can be customized using parameter(s). Behavior of component or application will be different for different parameter(s) in used.

Here is an example of parameterized component,CIISONLINE_FileEditor, and its usage on web application as an example:

parameterized component (FileEditor.php):


<?p
class CIISONLINE_FileEditor extends CIISONLINE_PageProcessor{

static function MenuPath_Show() {
if (GetCurrentUserConfig('bMenuPathShow')) {
SetVar ('FileEditorPageMenuPath', ToHTML(GetTextLanguage('sFileEditorPageMenuPathTitle')));
} else {
SetVar ('MenuPath', '');
}
}

protected static function CommonSetVar() {
/* Common Javascript Setting Value */
CommonSetVar();
/*-------------------------------*/

SetVar ('msg_reallytoupdatefile', ToHTML(GetTextLanguage('sFileEditorMsgReallyToUpdateFile')));
SetVar ('msg_reallytocancelfile', ToHTML(GetTextLanguage('sFileEditorMsgReallyToCancelFile')));

}

/*===============================
* Action of the Record Form
*-------------------------------*/
static function FileEditorAction($sAction) {
/*-------------------------------
* Initialize variables
*-------------------------------*/

/*-------------------------------
* Validate fields
*-------------------------------*/
if ((string)$sAction == 'update') {
/*-------------------------------
* Load all form fields into variables
*-------------------------------*/
$fldfileeditor_contents = GetParam('fileeditor_contents');

/*-------------------------------
* FileEditor Check Event begin
* FileEditor Check Event end
*-------------------------------*/
}
switch ((string)$sAction) {
case 'update':
/*-------------------------------
* FileEditor Update Event begin
* FileEditor Update Event end
*-------------------------------*/

if (isset(self::$config->fileeditor->source->path) && ($fldfilename = self::$config->fileeditor->source->path)
&& @file_put_contents($fldfilename,$fldfileeditor_contents)) {
@chmod($fldfilename,0777);
} else {
SetCurrentPageConfig('sPageErrorMessage',GetTextLanguage('sFileEditorErrCanNotWriteFile'));
}
break;
default:
$sRedirectFileName = GetCurrentUserConfig('sDefaultPage');
ResponseRedirect ($sRedirectFileName);
}
/*-------------------------------
* FileEditor BeforeExecute Event begin
* FileEditor BeforeExecute Event end
*-------------------------------*/
if (strlen(GetCurrentPageConfig('sPageErrorMessage')) > 0) {
OnPageAccessWarningLogWrite (str_replace("<br>",'',GetCurrentPageConfig('sPageErrorMessage')));
return;
}

OnPageAccessInfoLogWrite ();
/*-------------------------------
* FileEditor Action end
*-------------------------------*/
}
/*===============================
* Display Record Form
*-------------------------------*/
static function FileEditor_Show() {
/*-------------------------------
* FileEditor Show begin
*-------------------------------*/
$sFormTitle = GetTextLanguage('sFileEditorFormTitle');
$sAction = GetCurrentPageConfig('sAction');
$sForm = GetCurrentPageConfig('sForm');

$fldfileeditor_contents = '';

/* Common Javascript Setting Value */
self::CommonSetVar();
/*-------------------------------*/

/*-------------------------------
* Load primary key and form parameters
*-------------------------------*/
$sPageErrorMessage = GetCurrentPageConfig('sPageErrorMessage');

$bIsUpdateMode = ((string)$sForm != 'FileEditor' && isset(self::$config->fileeditor->source->path)
&& ($fldfilename = self::$config->fileeditor->source->path) && file_exists($fldfilename));

if ((string)$sPageErrorMessage == '') {

if ($bIsUpdateMode) {
$fldfileeditor_contents = file_get_contents($fldfilename);

SetVar ('ActionMessage', '');
OnPageAccessInfoLogWrite ();
} else {
$fldfileeditor_contents = file_get_contents(self::$config->fileeditor->source->path);

SetVar ('message', (GetTextLanguage('sFileEditorMsgUpdateSuccessfully')));
Parse ('ActionMessage', false);
}
} else {
$fldfileeditor_contents = GetParam ('fileeditor_contents');

SetVar ('message', ($sPageErrorMessage));
SetVar ('FormTitle', ToHTML($sFormTitle));
Parse ('ActionMessage', false);
}

/*-------------------------------
* Load all fields into variables from recordset or input parameters
*-------------------------------*/
Parse ('FileEditorEdit', false);

/*-------------------------------
* FileEditor ShowEdit Event begin
* FileEditor ShowEdit Event end
*-------------------------------*/
SetVar ('FileEditorCancel', '');
/*-------------------------------
* FileEditor Show Event begin
* FileEditor Show Event end
*-------------------------------*/

SetVar ('FormTitle', ToHTML($sFormTitle));

SetVar ('UpdateButton', ToHTML(GetTextLanguage('sFileEditorUpdateButtonTitle')));
SetVar ('CancelButton', ToHTML(GetTextLanguage('sFileEditorCancelButtonTitle')));

/*-------------------------------
* Show form field
*-------------------------------*/
SetVar ('fileeditor_contents', ToHTML($fldfileeditor_contents));

Parse ('FormFileEditor', false);

/*-------------------------------
* FileEditor Show end
*-------------------------------*/
}
}
?>




application #1:
manifest (AliasConfig.pageprop):


<?xml version="1.0" encoding="UTF-8"?>
<configuration id="AliasConfig" >
<section name="fileeditor">
<config name="source">
<config name="path"><![CDATA[./System/Configuration/CIISONLINE.dbconf]]></config>
</config>
</section>
</configuration>



configuration (AliasConfig.pageconf):


<?xml version="1.0" encoding="UTF-8"?>
<page name="AliasConfig" id="AliasConfig" >
<processor PageSecurityCode="1" HelpContext="LIGHTARMY-Applications.AliasConfig"
sOnlyTemplateFileName="FileEditor.html" CanPublic="false">

<PageSecurityCode>
<Name>Alias Configuration</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.AliasConfig</HelpContext>
</PageSecurityCode>

<PageActionSelectionScript><![CDATA[
switch ((string)GetCurrentPageConfig('sForm')) {
case 'FileEditor':
CIISONLINE_FileEditor::FileEditorAction(GetCurrentPageConfig('sAction'));
}
]]></PageActionSelectionScript>
<TemplateProcessingScript><![CDATA[
CIISONLINE_Header::Menu_Show();
CIISONLINE_Footer::FooterForm_Show();
CIISONLINE_FileEditor::MenuPath_Show();
CIISONLINE_FileEditor::FileEditor_Show();

]]></TemplateProcessingScript>
<ResponseProcessingScript><![CDATA[
ResponseWrite (PrintVar('main'));
]]></ResponseProcessingScript>
<IncludeFile>PageClass/Header.php</IncludeFile>
<IncludeFile>PageClass/Footer.php</IncludeFile>
<IncludeFile>PageClass/FileEditor.php</IncludeFile>

<TemplateSpaceHolder name="Header">Header.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Footer">Footer.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space01">Space01.html</TemplateSpaceHolder>

</processor>
</page>



application #2:
manifest (AutoIncludeConfig.pageprop):


<?xml version="1.0" encoding="UTF-8"?>
<configuration id="AutoIncludeConfig" >
<section name="fileeditor">
<config name="source">
<config name="path"><![CDATA[./System/Configuration/CIISONLINE.coreconf]]></config>
</config>
</section>
</configuration>



configuration (AutoIncludeConfig.pageconf):


<?xml version="1.0" encoding="UTF-8"?>
<page name="AutoIncludeConfig" id="AutoIncludeConfig" >
<processor PageSecurityCode="2" HelpContext="LIGHTARMY-Applications.AutoIncludeConfig"
sOnlyTemplateFileName="FileEditor.html" CanPublic="false">

<PageSecurityCode>
<Name>AutoInclude Configuration</Name>
<Description></Description>
<HelpContext>LIGHTARMY-Applications.AutoIncludeConfig</HelpContext>
</PageSecurityCode>

<PageActionSelectionScript><![CDATA[
switch ((string)GetCurrentPageConfig('sForm')) {
case 'FileEditor':
CIISONLINE_FileEditor::FileEditorAction(GetCurrentPageConfig('sAction'));
}
]]></PageActionSelectionScript>
<TemplateProcessingScript><![CDATA[
CIISONLINE_Header::Menu_Show();
CIISONLINE_Footer::FooterForm_Show();
CIISONLINE_FileEditor::MenuPath_Show();
CIISONLINE_FileEditor::FileEditor_Show();

]]></TemplateProcessingScript>
<ResponseProcessingScript><![CDATA[
ResponseWrite (PrintVar('main'));
]]></ResponseProcessingScript>
<IncludeFile>PageClass/Header.php</IncludeFile>
<IncludeFile>PageClass/Footer.php</IncludeFile>
<IncludeFile>PageClass/FileEditor.php</IncludeFile>

<TemplateSpaceHolder name="Header">Header.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Footer">Footer.html</TemplateSpaceHolder>
<TemplateSpaceHolder name="Space01">Space01.html</TemplateSpaceHolder>

</processor>
</page>



You can also use different style for that applications as needed.

What kind of contents the help file is ?

There are five files to render help: contents, index, keywords, name and overview.
You will access the contents using context id like this: context_id=<root help>.ManifestProcessMaint.Queen.email_autoresponse. Here are as that examples:

contents:


<p><font face="Verdana" size="2">
<p>
<img src="help::this.figures.help-s.png"/>
<h3>Email Autoresponder Manifest Process Maintenance Page</h3>
</p>
<p>
<a id="Purpose"><b>Purpose</b></a><br>
Maintain an email autoresponder manifest process.
<br><br>
The Email Autoresponse takes an incoming email message
from a mailbox, and sends the response using the
recogniser patern to determine the response to 'replyto'
/or sender.
<br><br>
As with all Lightant queenProcess, you are required to
have a unique 'process.name' value. The 'process.type'
value corresponds to the processor source to load from
the processes directory. If this configuration file is
designed to load the code in processes/foo/bar.php, the
entry for 'process.type' should be foo_bar.
</p>
<p>
<a id="Operations"><b>Operations</b></a><br>
<ol type="I">
<li>Create<br>
<br>
<br>
<ol>
<li>Screenshots<br>
<br>
<img src="help::this.figures.hlp_en_queenmanifestmaint_new__email_autoresponse.png"/>
</li>
<br>
<li>Fields<br>
<br>
<ol type="a">
<li>Write manifest as explain in <b>Manifest Contents</b> below.<br>
</li>
<br>
</ol>
</li>
</ol>
</li>
<li>Update<br>
<br>
<br>
<ol>
<li>Screenshots<br>
<br>
<img src="help::this.figures.hlp_en_queenmanifestmaint_update__email_autoresponse.png"/>
</li>
<br>
<li>Fields<br>
<br>
<ol type="a">
<li>Write manifest as explain in <b>Manifest Contents</b> below.<br>
</li>
<br>
</ol>
</li>
</ol>
</li>
<li>Delete<br>
<br>
<br>
<ol>
<li>Screenshots<br>
<br>
<img src="help::this.figures.hlp_en_queenmanifestmaint_update__email_autoresponse.png"/>
</li>
<br>
<li>Fields<br>
<br>
<ol type="a">
</ol>
</li>
</ol>
</li>
<li>Cancel<br>
<br>
<br>
<ol>
<li>Screenshots<br>
<br>
<img src="help::this.figures.hlp_en_queenmanifestmaint_update__email_autoresponse.png"/>
</li>
<br>
<li>Fields<br>
<br>
<ol type="a">
</ol>
</li>
</ol>
</li>
</ol>
</p>
<p>
<a id="ManifestContents"><b>Manifest Contents</b></a><br>
<ol>
<li>Structure<br>
<fieldset style="border: 1px dotted ;" >
<PRE>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration id=&quot;email_autoresponse&quot;&gt;
&lt;section name=&quot;core&quot;&gt;
&lt;!-- Process Configuration--&gt;
&lt;config name=&quot;process&quot;&gt;
&lt;config name=&quot;type&quot;&gt;email_autoresponse&lt;/config&gt;
&lt;config name=&quot;name&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;description&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;start&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;end&quot;&gt;&lt;/config&gt;
&lt;/config&gt;

&lt;!--Mail Connection--&gt;
&lt;config name=&quot;connections&quot;&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;type&quot;&gt;Mail&lt;/config&gt;
&lt;config name=&quot;host&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;user&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;password&quot;&gt;&lt;/config&gt;

&lt;config name=&quot;service&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;authuser&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;crypto&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;anonymous&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;debug&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;secure&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;norsh&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;notls&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;readonly&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;validate-cert&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;novalidate-cert&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;options&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;n_retries&quot;&gt;&lt;/config&gt;

&lt;config name=&quot;port&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;mailboxes&quot;&gt;
&lt;config name=&quot;source&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;handled&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;unhandled&quot;&gt;&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;

&lt;config name=&quot;testcode&quot;&gt;&lt;/config&gt;

&lt;!--Recognizer--&gt;
&lt;config name=&quot;recognizer&quot;&gt;
&lt;config name=&quot;minLetters&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;maxLetters&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;brain&quot;&gt;
#THE BRAIN CONFIGURATION#
&lt;/config&gt;
&lt;/config&gt;

&lt;!--Responder--&gt;
&lt;config name=&quot;responder&quot;&gt;
&lt;config name=&quot;default&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;directory&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;names&quot;&gt;
&lt;config name=&quot;{RESPONDER NAME}&quot;&gt;
&lt;config name=&quot;type&quot;&gt;&lt;&gt;
#THE RESPONDER CONFIGURATION#
&lt;/config&gt;
&lt;config name=&quot;{RESPONDER NAME}&quot;&gt;
&lt;config name=&quot;type&quot;&gt;&lt;&gt;
#THE RESPONDER CONFIGURATION#
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;

&lt;!--Control--&gt;
&lt;config name=&quot;control&quot;&gt;
&lt;config name=&quot;sleepingduration&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;errorsthreshold&quot;&gt;&lt;/config&gt;
&lt;/config&gt;

&lt;!--Response--&gt;
&lt;config name=&quot;response&quot;&gt;
&lt;config name=&quot;to&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;from&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;replyto&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;rpath&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;cc&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;bcc&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;subject&quot;&gt;&lt;/config&gt;
&lt;/config&gt;

&lt;/section&gt;
&lt;/configuration&gt;
</PRE>
</fieldset>
</li>
<li>Parameters<br>
<ol type="a">
<li>id<br>
The identity of manifest.
</li>
<li>core.process.type<br>
The process type of manifest. Type is email_autoresponse.
</li>
<li>core.process.name<br>
The name given to this manifest.
</li>
<li>core.process.description<br>
The additional information to manifest.
</li>
<li>core.process.start<br>
The first date (time) the process will be executed.
</li>
<li>core.process.end<br>
The last date (time) the process will be executed.
</li>
<li>core.connections.mail.type<br>
The type of connection. The value should be and always: MAIL.
</li>
<li>core.connections.mail.host<br>
The mail server host name or IP address.
</li>
<li>core.connections.mail.user<br>
The account/ user of mail server.
</li>
<li>core.connections.mail.password<br>
The password of account/user of mail server.
</li>
<li>core.connections.mail.service<br>
The type of service of this mail connection.
</li>
<li>core.connections.mail.authuser<br>
The remote authentication user.
</li>
<li>core.connections.mail.crypto<br>
The crypto type of connection:ssl,tls,null.
</li>
<li>core.connections.mail.anonymous<br>
For anonymous connection mode.
</li>
<li>core.connections.mail.debug<br>
Activate debuging.
</li>
<li>core.connections.mail.secure<br>
Do not transmit a plaintext password.
</li>
<li>core.connections.mail.norsh<br>
Do not use rsh or ssh to establish a preauthenticated.
</li>
<li>core.connections.mail.notls<br>
Do not do start-tls.
</li>
<li>core.connections.mail.readonly<br>
Request read-only mailbox open.
</li>
<li>core.connections.mail.validate-cert<br>
Validate certificates from tls/ssl server.
</li>
<li>core.connections.mail.novalidate-cert<br>
Do not validate certificates from tls/ssl server.
</li>
<li>core.connections.mail.options<br>
Options of connection.
</li>
<li>core.connections.mail.n_retries<br>
Number of maximum connect attempts.
</li>
<li>core.connections.mail.port<br>
Port to your mail server.
</li>
<li>core.connections.mail.mailboxes.source<br>
Mailbox name.
</li>
<li>core.connections.mail.mailboxes.handled<br>
Mailbox name for handled email.
</li>
<li>core.connections.mail.mailboxes.unhandled<br>
Mailbox name for unhandled email.
</li>
<li>core.testcode<br>
The test code of email contents.
</li>
<li>core.recognizer.minLetters<br>
The anagram minimum length.
</li>
<li>core.recognizer.maxLetters<br>
The anagram maximum length.
</li>
<li>core.recognizer.brain<br>
The brain configuration.
</li>
<li>core.responder.default<br>
The default response.
</li>
<li>core.responder.directory<br>
The directory location of responder.
</li>
<li>core.responder.names<br>
The responder configuration.
</li>
<li>core.control.sleepingduration<br>
The sleeping time on subsequence errors.
</li>
<li>core.control.errorsthreshold<br>
The errors threshold for sleeping stage.
</li>
<li>core.response.to<br>
The destination of email.
</li>
<li>core.response.from<br>
The source of email.
</li>
<li>core.response.replyto<br>
The destination of reply.
</li>
<li>core.response.rpath<br>
The return path on error.
</li>
<li>core.response.cc<br>
The cc of email.
</li>
<li>core.response.bcc<br>
The bcc of email.
</li>
<li>core.response.subject<br>
The subject of email.
</li>
</ol>
</li>
<li>Example<br>
<fieldset style="border: 1px dotted ;" >
<PRE>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration id=&quot;email_autoresponse&quot;&gt;
&lt;section name=&quot;core&quot;&gt;
&lt;!-- Process Configuration--&gt;
&lt;config name=&quot;process&quot;&gt;
&lt;config name=&quot;type&quot;&gt;email_autoresponse&lt;/config&gt;
&lt;config name=&quot;name&quot;&gt;CIISONLINE_COM_AUTORESPONSE&lt;/config&gt;
&lt;config name=&quot;start&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;end&quot;&gt;&lt;/config&gt;
&lt;/config&gt;

&lt;!--Mail Connection--&gt;
&lt;config name=&quot;connections&quot;&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;type&quot;&gt;Mail&lt;/config&gt;
&lt;config name=&quot;host&quot;&gt;imap.gmail.com&lt;/config&gt;
&lt;config name=&quot;user&quot;&gt;ciisonline.com&lt;/config&gt;
&lt;config name=&quot;password&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;crypto&quot;&gt;ssl&lt;/config&gt;
&lt;config name=&quot;port&quot;&gt;993&lt;/config&gt;
&lt;config name=&quot;service&quot;&gt;imap&lt;/config&gt;

&lt;config name=&quot;mailboxes&quot;&gt;
&lt;config name=&quot;source&quot;&gt;inbox&lt;/config&gt;
&lt;config name=&quot;handled&quot;&gt;handled&lt;/config&gt;
&lt;config name=&quot;unhandled&quot;&gt;unhandled&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;

&lt;!--Recognizer--&gt;
&lt;config name=&quot;recognizer&quot;&gt;
&lt;config name=&quot;minLetters&quot;&gt;5&lt;/config&gt;
&lt;config name=&quot;maxLetters&quot;&gt;7&lt;/config&gt;
&lt;config name=&quot;brain&quot;&gt;
&lt;config name=&quot;type&quot;&gt;TextBrain&lt;/config&gt;
&lt;config name=&quot;fact&quot;&gt;Application/Email/Recognizers/responder.fact&lt;/config&gt;
&lt;config name=&quot;knowledge&quot;&gt;Application/Email/Recognizers/responder.knowledge&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;

&lt;!--Responder--&gt;
&lt;config name=&quot;responder&quot;&gt;
&lt;config name=&quot;default&quot;&gt;Default&lt;/config&gt;
&lt;config name=&quot;directory&quot;&gt;Application/Email/Responder/&lt;/config&gt;
&lt;config name=&quot;names&quot;&gt;
&lt;config name=&quot;Default&quot;&gt;
&lt;!--#THE RESPONDER CONFIGURATION#--&gt;
&lt;config name=&quot;type&quot;&gt;Application_Email_Responder_Body&lt;/config&gt;
&lt;config name=&quot;use_template&quot;&gt;1&lt;/config&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;from&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;fromname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;replyto&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;replytoname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;rpath&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;body&quot; xml:space=&quot;preserve&quot;&gt;
Hello {toname},

Thanks You
{fromname}
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;config name=&quot;OrderForm&quot;&gt;
&lt;!--#THE RESPONDER CONFIGURATION#--&gt;
&lt;config name=&quot;type&quot;&gt;Application_Email_Responder_Body&lt;/config&gt;
&lt;config name=&quot;use_template&quot;&gt;1&lt;/config&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;from&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;fromname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;replyto&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;replytoname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;rpath&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;body&quot;&gt;OrderForm&lt;/config&gt;
&lt;config name=&quot;bodyfile&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;altbody&quot;&gt;&lt;/config&gt;
&lt;config name=&quot;altbodyfile&quot;&gt;&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;config name=&quot;ProductInfo&quot;&gt;
&lt;!--#THE RESPONDER CONFIGURATION#--&gt;
&lt;config name=&quot;type&quot;&gt;Application_Email_Responder_Mime&lt;/config&gt;
&lt;config name=&quot;use_template&quot;&gt;1&lt;/config&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;from&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;fromname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;replyto&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;replytoname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;rpath&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;!--&lt;config name=&quot;mime&quot;&gt;&lt;/config&gt;--&gt;
&lt;config name=&quot;mimefile&quot;&gt;Application/Email/Mimes/html.eml&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;config name=&quot;ProductCatalog&quot;&gt;
&lt;!--#THE RESPONDER CONFIGURATION#--&gt;
&lt;config name=&quot;type&quot;&gt;Application_Email_Responder_Mime&lt;/config&gt;
&lt;config name=&quot;use_template&quot;&gt;1&lt;/config&gt;
&lt;config name=&quot;mail&quot;&gt;
&lt;config name=&quot;from&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;fromname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;replyto&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;config name=&quot;replytoname&quot;&gt;CIISONLINE NET&lt;/config&gt;
&lt;config name=&quot;rpath&quot;&gt;ciisonline.net@gmail.com&lt;/config&gt;
&lt;!--&lt;config name=&quot;mime&quot;&gt;&lt;/config&gt;--&gt;
&lt;config name=&quot;mimefile&quot;&gt;Application/Email/Mimes/message.eml&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;
&lt;/config&gt;

&lt;!--Control--&gt;
&lt;config name=&quot;control&quot;&gt;
&lt;config name=&quot;sleepingduration&quot;&gt;1000&lt;/config&gt;
&lt;config name=&quot;errorsthreshold&quot;&gt;10&lt;/config&gt;
&lt;/config&gt;

&lt;!--Response--&gt;
&lt;/section&gt;
&lt;/configuration&gt;
</PRE>
</fieldset>
</li>
</ol>
</p>
<p>
<a id="RelatedPages"><b>Related Pages</b></a><br>
<ol>
<li><a href="help::this.ManifestProcessesList">Manifest Processes List Page</a><br>
Display list of Queen manifest processes.
</li>
</ol>
</p>
<p>
<a id="RelatedTopics"><b>Related Topics</b></a><br>
<ol>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.General.Manifest">Manifest (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.General.ServiceBus">Service Bus (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.General.Capability">Capability (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.General.AutomationPlatform">Automation Platform (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.General.ProcessPlatform">Process Platform (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.Application.Queen">Queen (Concept)</a></li>
<li><a href="help::LIGHTARMY-UserGuide.Concepts.Application.Nest">Nest (Concept)</a></li>
</ol>
</p>
<p>
<a id="Notes"><b>Notes</b></a><br>
<ol>
</ol>
</p>
</font></p>




index:


Email Autoresponder Manifest Process Maintenance
Email Autoresponder Manifest Process Maintenance Page



keywords:


Email Autoresponder Manifest Process Maintenance
Email Autoresponder Manifest Process Maintenance Page



name:


Email Autoresponder Manifest Process Maintenance Page



overview:


<p><font face="Verdana" size="2">
<p>
<h3>Email Autoresponder Manifest Process Maintenance Page</h3>
</p>
<p>
<a id="Purpose"><b>Purpose</b></a><br>
Maintain an email autoresponder manifest process.
<br><br>
The Email Autoresponse takes an incoming email message
from a mailbox, and sends the response using the
recogniser patern to determine the response to 'replyto'
/or sender.
<br><br>
As with all Lightant queenProcess, you are required to
have a unique 'process.name' value. The 'process.type'
value corresponds to the processor source to load from
the processes directory. If this configuration file is
designed to load the code in processes/foo/bar.php, the
entry for 'process.type' should be foo_bar.
</p>

CommentLuv Enabled

Followers