Professional Documents
Culture Documents
92-300 Builder Fundamentals Course
92-300 Builder Fundamentals Course
Livelink Builder
Fundamentals
Course
Copyright
Copyright 1995-2004 by Open Text Corporation. This documentation and the software described in it are
copyrighted with all rights reserved. The software is subject to the terms of a license agreement. Under the
copyright laws, this manual or the software may not be copied in whole or part, without the written consent of
Open Text Corporation, except in the normal use of the software itself, or to make a backup copy. The same
proprietary and copyright notices must be affixed to any permitted copies as were affixed to the original. This
exception does not allow copies to be made for others, whether or not sold. You may use the software on any
computer, but extra copies cannot be made for this purpose. Under the law, copying includes translating into
another language or format.
Open Text Corporation is the owner of the trademarks Open Text, Livelink®, Livelink Intranet, Livelink Change
Agents, Change Agents, Livelink Channels, Livelink Discussions, Livelink Explorer, Livelink Library, Livelink
Collaboration, Livelink Project Collaboration, Livelink SDK, Livelink Search, Livelink Spider, Livelink Tasks,
Livelink Workflow, Livelink Channels, Livelink Forms, Livelink LiveReports, Livelink Prospectors, Livelink X-
Active, and Livelink Activators. Other trademarks and trade names in the documentation are owned by other
companies and are used for product and company identification and information only.
Credits: Howard Pell, Dave Slater, Marie Lindsay, Dee Keyser and Rahmat Costas. Many thanks to the other
Open Text staff who assisted with the creation of this course.
• Create modules to package your customizations for easy installation and upgrades
• Write code using OScript, Livelink's programming language
• Create request handlers to process new functionality
• Add new types of items to be stored and managed by Livelink
• Add new interface components and modify the current interface
• Integrate your code into the Livelink object system in supported ways
Prerequisites:
• Programming knowledge and experience (especially object-oriented languages such as
C++)
• Application development knowledge and experience
• Basic knowledge of HTML for Web interface customization
• Strong knowledge of the Livelink interface and functionality
Convention Indicates
<snip> Indicates that a segment of code has been omitted for brevity
Bold • Term being introduced for the first time – for example:
Livelink is a web-based system that enterprises use for
intellectual capital management.
Underline • The name of a hypertext link that you click while performing an
operation – for example:
Locate the group you want, then click its Select link.
“Quoted string” • The name of a particular Livelink item, folder on disk, or other
element used in an example or exercise – for example:
Locate the “Sample Docs” folder on your C: drive.
4.1.1 The Kernel Module, Core Modules, and Optional Modules ......................... 4-3
Section 5: OScript
9.3 How Item Commands Are Processed: The LL Request Handler ............................. 9-7
9.4 Identifying the Item Type: Global Variables for SubTypes ...................................... 9-9
10.3 Controlling Tabs On Your Node Type’s Info Page ................................................. 10-9
10.4 Controlling the Add New Item Menu for a Node Type......................................... 10-11
11.2 Using the DTree ExtendedData Column to Store Node Data.................................. 11-5
11.6 Getting the Additional Data into the Database ...................................................... 11-15
12.3 Doing the Work: The Action Object’s _SubclassExecute()and WebLingo ............ 12-9
12.4 Tying the Action Object to the Interface with a WebNodeCmd Object................ 12-11
13.2 The APISRV OSpace (The Start of the Chain) ....................................................... 13-5
14.9 A Final Word on Navigation Menu Items – Removing Them .............................. 14-19
Appendix A: Internationalization
Appendix D: Glossary
Appendix E: Quiz
Notes:
As we start the course, we want to make sure you understand what Livelink is, what the
Livelink SDK is, and what the goals are for this course.
Objectives:
• Identify where the Livelink SDK fits into the overall Livelink product
• Define differences between Livelink Builder and the Livelink API and when to use which
one
• Understand the general areas of customization that are supported by Livelink Builder
1.1 Livelink
When you work with the Builder, you can see and
manipulate the objects that create Livelink’s functionality.
The greatest area of complexity in doing development with
the Builder is trying to understand and maneuver in this
large set of code. You need to know what kinds of
customizations are easy, what are hard, and which are
supported when you upgrade to new releases. We will lay
out the guidelines in this course.
The Navigation
Menus
The
Function/Info
menu
Livelink
Nodes
*
We will cover this topic in class, and give you a basis for exploring the other customizations. You will find
more information about the other topics in the product documentation.
1.5 Summary
At the heart of every Livelink transaction lies a request handler object containing a set of
code for processing a URL sent from a user’s web browser. This section focuses on the
concepts behind the architectural components of Livelink and the lifecycle of a request
handler.
Objectives:
Web browser
Web browser Web browser Web browser
Web server
Livelink server
Web browser
Web browser Web browser Web browser
Web server
opentext.ini file
Livelink CGI
Modules
Other executables
Livelink server
module.ini file
WebLingo
objects files and
support files
Database
As the Livelink Server is started, Livelink uses a file called The opentext.ini file is
opentext.ini to initialize the system. The opentext.ini file described in detail in the Help
pages on the Administration
stores various startup and configuration parameters, such section.
as:
• A set of WebLingo files for dynamically generating the A WebLingo file is an HTML
interface for the functionality (optional) file containing embedded
OScript. OScript is Livelink’s
programming language. The
• A set of images, help files, and other support files OScript in the file is
(optional) processed to dynamically
generate HTML pages that
reflect system data.
• An INI file defining the configuration parameters for
the module
?func=user.edituser&userID=5644
Dynamically Generated
HTML File
1
Livelink CGI
$WebDsp.
2
RequestHandlerSubsystem
Object
Dispatch() method
fRegistry = <’admin.adminfactories=#180025f2,…
‘user.edituser’=#59000194, …>
4
edituser.html
WebLingo EditUser Request Handler
File Object Database
Execute() method
fHTMLfile string ----‘edituser.html’
3
2.4 Summary
Welcome to the exercises! We assume that some of you attending this course would prefer
step-by-step details as you practice, that some of you would prefer to just experiment, and
that most of you would prefer something in between. So each exercise begins with a
summary of what we recommend you do at the top, then a detailed list of the actions to take.
You can glance at the summary and follow it, or you can follow each step. We recommend
that you read through each exercise before following the step-by-step details so that you can
better understand what is required. If you like to just experiment, please do, but please do the
exercise first — each exercise builds upon the previous one.
Notes:
• The variable LLHOME is used throughout these exercises to represent the Livelink
installation directory on your computer. If you cannot find this directory, please ask the
instructor. Please write it here __________________________________________
• In all cases spelling counts. Inside methods, Livelink is case insensitive except for string
comparisons; however, outside methods, always consider things are case sensitive.
• Pay particular attention to the data types of features, especially of Dynamic features.
Legend:
Direction Example
Interface elements (buttons, fields, menu items) are CHOOSE Inspect from the Tools menu.
indicated in bold.
Object and feature names are indicated by this EDIT LLNode.Execute() to include the new code.
typeface.
SET fName = contact
String values and code samples also use .fFilesToCopy = {'two'}
this typeface.
1. A 2. 3. 4. 5. 6. 7. 8. 9. 10.A
F Dynamically Generated
HTML File
E $WebDsp.
RequestHandlerSubsystem
Object
Dispatch() method
fRegistry -----…<’admin.adminlogin=#900014b,…
> ---------- ‘user.edituser’=#22000194, …>
As you get ready to create a new module, you need to understand the basics of the Builder’s
interface and functionality. In this section, we’ll show you the Builder tools for working with
objects, searching for items, and examining item values.
Objectives:
Web browser
Web browser Web browser Web browser
Web server
Livelink Builder
Livelink server
Database
Figure 3-1: How the Livelink Builder replaces the Livelink server during development
Object
Root object OSpace A
Orphan object
OSpace B
OSpace C
The Inspector
The Debugger
Browsing
Preference
Locked
OSpace
Features Pane
(see feature
Expanded
details later in
OSpace
this section)
Selected Selected
object’s object’s ID
OSpace number
# OSpace dumped on
m {'kernel'}
I {#1,&INVALID MAP[0]}
N Suggestions Root
f Documentation
s
#ifdef DOC
#endif
sEND
f Globals
v #101
f Startup
s
// Initialize globals object
$Suggestions = .Globals.Initialize()
sEND
I {#108,#1}
N Exercises
f Tester
Save Choosing the Save command with a Browser Important: The Save
window active causes all changes you’ve command saves to disk only if
the Browser window is active;
made to any OSpace to be saved to disk.
if another window (such as the
script editor) is active, the Save
Export Choosing the Export OSpace command command only registers
OSpace causes a text file of the OSpace to be created. changes to the active item, and
This is essential for backing up your work and that only to memory.
in case your original OSpace file (which is
binary) becomes corrupted. Preferences
control how the export file is named. Save
and export often.
After importing an OSpace,
Import You can recreate an OSpace from an you must run BuildOspace()
OSpace exported file by choosing the Import OSpace and SetRequestHandlers().
command and selecting the DMP file from a We’ll explain these later.
dialog box. The DMP file will be imported into
the unlocked OSpace you have selected
Attribute:
stores default
date format
Method: Formats
date using
fDefFormat
feature
Select a feature to
see its value at the
bottom of the window
The Object menu and the Feature menu (and the context
menu, which appears when you right-click a feature)
display several commands for working with features.
A x=5
A x=5
When an object is
overridden, all
B x=5 C x=10 descendants of the
object inherit the
changes
x=5 x=10 x=10
D E F
A x=60
When an inherited
feature has already
B x=60 C x=10 been overridden it no
longer re-inherits
changes from its parent
x=60 x=10 x=10
D E F
Inherited feature a feature inherited from the parent You can clear the
checkboxes at the top
that has not been modified in the of the features list to
object filter out the types of
features you do not
Overridden a feature inherited from the parent want to see at the
moment.
feature that has been modified in this object
Contents of list
depends on type
of item you’re
searching for;
double-click to
open found item
• features by name
• objects by name
Across:
• one object
• an OSpace
• all OSpaces
Value of currently
selected feature
Feature
dragged
into the list
Object
dragged
into the
list
1. Choose Inspector from the Tools menu to open the The values listed in
Inspector Browser window, or with a feature the Inspector window are
selected, choose Inspect from the Features menu. direct references to
features. This means that
if you change the feature
2. To add a new expression: either (a) in the value in the Inspector,
uppermost textbox, type a fragment of code whose you are changing the
value stored in the
result you wish to see, or (b) drag a feature or object feature.
from a features list into the lower half of the
Inspector window and the select the Eval button.
3.13 Summary
Notes:
The first work you do in the Livelink Builder should be to set up a module to contain your
customizations. Modules make your work easy to package and move to production
environments, and are easily created in Livelink.
Objectives:
Figure 4-1: The top of the Install Modules page, showing installed modules
Figure 4-2: The bottom of the Install Modules page, showing modules that
can be installed
Module
ini file
OSpace files for deriving functionality:
WebModule object
RequestHandlerGroup object
ospace Request Handler object
Support files:
help node.gif
28_node.gif
staging Configure
Request Handler Object
Performs the work of installing and
uninstalling the module. Uses
module.ini file features of the WebModule object
to determine what to do.
1. Decide on a name for your new module. It’s a good idea to use something relevant to
your customizations. (We’re going to make a “suggestions” module during the course
lectures).
2. Navigate to the staging directory in your Livelink installation’s root directory. If there
is no staging directory, create one.
3. Create a new directory in the staging directory and name it using your module name
followed by the major version number, minor version number and revision number of
your module separated by “_” (for example, “suggestions_1_0_0”).
4. Create the directories needed for your customizations within your new module’s
directory. At minimum your module will need an “ospace” folder. It will also
probably need an “html” folder, a “support” folder and maybe a “help” folder.
module.ini file
RequestHandlerGroup
Configure Root
WebLingo
WebModule New functionality objects
OSpace files and
New functionality support files
New functionality
Globals
Module
Other orphans
WebModule Object
Features:
fEnabled -------------True
fName ----------------“Suggestions Module”
fModuleName ------“suggestions”
fOSpaces------------{‘suggestions’}
fVersion--------------{‘1’,’0’,’r’,’0’}
fDependencies ---{{‘kernel’, 8, 1}}
fFilesToCopy -------{{'%3support%1','%4%5%1'}}
fSetupQueryString “func=suggestions.configure&module=suggestions&nextURL=%1”
0DumpModuleConfigToFile() method
Regarding the fDependencies feature: All modules depend on the Kernel module. Do not remove this
module from the dependencies list. You should add additional dependencies as additional list items.
You should add a module to your dependencies list if:
• You orphan any object from a non-core Module OSpace into your module
• You use any global references to a non-core Module’s objects in your scripts
Feature Notes
fEnabled Many of the objects you create will inherit an fEnabled feature. This boolean
controls object initialization (see the Initialization topic later in the section for more
details) and is used to enable and disable functionality.
fName The fName feature stores the display name of your module. This name will be
displayed on the Livelink Administration pages when your module is ready to
install, uninstall and upgrade.
fModuleName The fModuleName stores the internal name for your module. It should be in all
lower case and match the name you used when creating your module directory
structure.
fOSpaces This feature specifies the list of OSpaces in your module. The order in which the
OSpaces appear in the list is unimportant.
fVersion In order for your module to install and upgrade properly, the numeric list items
must match the numbers specified in your module’s directory name, such as
suggestions_1_0_0.
fFilesToCopy This feature is used by the Configure request handler (see Section 4.6) to specify
the “from” and “to” directories where your module will be copied during
installation. The % signs indicate placeholders for parameters used during the
installation (see the object’s Documentation feature for details).
fSetupQuery This string contains the URL for the Configure request handler (see Section 4.6.
String During execution, the nextURL=%1 parameter is populated with a call to the
request that should be performed after the configuration request completes.
SuggestionsModule Object
Features concerning initialization:
• __Init() method
• fEnabled ------ TRUE
Suggestions Globals Object
Features:
• BuildOSpace() method (setup script)
• f__InitObjects list --- {#35000132,#35000134,#350003b5…} Root Object
• (other features for global references…) Startup() method runs
at system startup,
locates all objects
named by f_InitObjects,
runs their _Init()
methods
Figure 4-10: How an OSpace’s Globals object keeps a list of all objects
that need initialization
Livelink does not assume that you want every object you
create to become part of the interface right away. Most
class objects have an fEnabled feature that is defaulted to
False, and this “turns off” the functionality of the orphans
and children you create of the object.
The Globals object for every OSpace contains a list feature Reminder: The Startup()
called f__InitObjects, a list of all the objects in the OSpace method of an OSpace’s Root
which need to be initialized. As a developer, you must tell object is automatically executed
whenever the OSpace is
Livelink to update this list whenever you create an orphan opened.
or child object that needs to be initialized. To update the
f__InitObjects list, just run the BuildOSpace() method in There is a BuildOSpaces
command under the Tools
the Globals object of your OSpace. When you run this menu of the Builder. This
script, Builder will look for all the objects in your OSpace command will run the
that contain an __Init() script and add each object’s id to Globals.BuildOSpaces() method
of every open OSpace. Since
f__InitObjects. this can take some time to
transact, we normally
When a module’s OSpace opens during system startup, the recommend that you run the
BuildOSpace() method for the
OSpace’s Root.Startup() method automatically runs the OSpace in which you’re working
__Init() method of every object listed in the OSpace’s instead. You may want to run
Globals.f__InitObjects feature. If an object’s fEnabled the BuildOSpaces command
once towards the end of your
feature has been set to true, that object will be initialized development project, just to
and registered with its subsystem. make sure you haven’t forgotten
to enable any objects.
Step set 4.5: Enabling Objects
Configure
request
handler
RequestHandlerGroup
object
module.INI file
Figure 4-12: Structure and contents of a module directory ready for "staging"
Suggestions
$WebDsp. Request Handler Group Object
RequestHandlerSubsystem
SetRequestHandlers() method
Object
fRequestHandlers list—
Dispatch() method {{'sug.Configure,#7e003993},
{'sug.ListSuggestions',#7e003430}, …}
fRegistry assoc…<’admin.adminlogin=#900014b,…
> ---------- ‘project.editparticipants’=#40000aac, …>
Configure Request
Project Handler Object
Request Handler Group Object
SetRequestHandlers() method ListSuggestions Request
fRequestHandlers list— {{'project.Configure',#400007f5}, Handler Object
-------------- {'Projects.AddParticipants',#40000aaa},
-------------- {'Projects.AddParticipants2',#40000aab},
-------------- {'Projects.EditParticipants',#40000aac}…}
AddParticipants2 EditParticipants
Request Handler Object Request Handler Object
ll
WebNode RH
Request
Handler Fetch
Request Group RH
Handler Add
Subsystem Version
Registry WebDoc RH
Request View
Handler RH
Group Check
In
RH
Suggestions Reserve
Request RH
Handler Group
Suggestions
RH
[dependencies]
requires_1={'kernel',8,1}
[description]
Version=1.0 r 0
Name=Suggestions Module
moduleName=suggestions
[install]
Url=func=suggestions.configure&module=suggestions&nextURL=%1
[OSpaces]
ospace_1=suggestions
Figure 4-17: A new module in the “Installable Modules” section of the Install Modules page
1. Save and export your new Ospace, then quit and restart
Builder. It may also be a
good idea to make a
backup copy of your
2. Navigate to the Livelink Admin Install Modules Page. whole module while
The Installable Modules section of the page displays a list Builder is closed and
prior to attempting the
of modules that can be installed. module installation.
Don’t forget to backup
3. Click the checkbox to the left of the Suggestions module the opentext.ini file at
the same time
and then click the Install button.
Livelink will install your module, and you will be prompted
to restart your server.
If you are developing your module, you’ll probably want your OSpace to open in “unlocked” mode automatically
when you start the Builder. This will save you time as you develop. To do this you need to make a small change
to the webbuilder.lxe file.
1. Navigate to your Livelink root installation directory, and open the webbuilder.lxe file (from within the
Builder or with a text editor).
3. And change it to include the name of the ospace in all upper case and between quotes:
List changeStateOSpaces = { "SUGGESTIONS" }
4.10 Summary
□ 1. In the builder select File->open and navigate to your solutions CD -> toolkit directory.
Open the makeANewModule.lxe file and select the command Script->run.
□ 2. Call your new module “contact”, and “Contact Module”. You can number it 1 0 r 0 if
you like.
Bonus:
Do you recall how to force the Builder to open your OSpace in unlocked mode? EDIT the
webbuilder.lxe file to enable this, following the instructions in the note of section 4.9.
□ 3. CHOOSE a suitable name for your module: During these exercises, you will be making
a module for managing information about contacts, such as the customer contacts for a
sales organization. We will refer to the module as the “contact” module throughout these
exercises.
□ 4. If there is no “staging” directory below LLHOME, CREATE one. (Reminder: We are using
“LLHOME” to represent the Livelink installation directory.)
□ 7. Your directory structure should look similar to the following (supposing LLHOME =
“C:\livelink”):
C:\livelink\staging\contact_1_0_0\ospace\
C:\livelink\staging\contact_1_0_0\html\
C:\livelink\staging\contact_1_0_0\support\
□ 1. From the Builder, CREATE a new OSpace and name it contact.oll. Do you recall
where this OSpace file should reside?
How: OSpace menu → New OSpace. NAVIGATE to
LLHOME\staging\contact_1_0_0\ospace. NAME the file contact.oll.
Add the WebModule object, configure its features, and make it start automatically when
Livelink is started.
□ 3. SET the following features of ContactModule: (Do you recall what each one does?)
□ g. fSetUpQueryString = (String)
func=contact.configure&module=contact&nextURL=%1
□ 4. SELECT each of the features you set in step 3 and look in the lower right of the OSpace
Browser window to VERIFY that the contents are set as you expected.
□ 5. SAVE and EXPORT your new OSpace. STOP and START the Builder.
□ 6. INSTALL your module from the Livelink Administration pages. As a precaution, you
might want to back up your module and the opentext.ini file before you attempt an
install (just in case things go wrong during your install).
Notes:
At its most basic level, Livelink is a set of scripts and a set of values used by those scripts.
This section introduces OScript, Livelink’s scripting language, and it introduces the tools
for creating and debugging scripts.
Objectives:
By the end of this section, you will be able to create and debug scripts written with OScript.
In the process, you’ll learn how to:
Inheritance
Method name List of all methods in this object
state
“Break on entry”
Edit status (changed, toggle for
locked, unlocked) debugging
Editing pane
Choose the Compile command from the Script menu (or Livelink maintains both a
click the button) to compile a script. “text” and a “compiled”
version of methods. Scripts
that are stored as external
Click the button to compile (and save to memory) all files are always compiled
before they are executed.
scripts for a selected object.
The script is only saved to disk when you save all OSpace
changes to disk, which happens when you choose the Save
command with an Object Browser window active.
Figure 5-5: The Open Selection command, available when a method is highlighted
Figure 5-6: The Debug window (Debug command from the Window menu)
List of
variables
Stack
(Intermediate
values of a
computation are
stored on the
stack.)
If you select a
variable you
can edit it here.
Press TAB to
Status of the current save your edits.
line of code
Lists all
Breakpoint (Set by methods
double-clicking.) currently
involved and
allows switching
between the
Pointer to current methods.
line of code
Figure 5-7: The Debugger window (Debug command from Script menu)
// Private method
// Override this method to perform specific attribute assignment to
// the node.
// Parameters:
// node The DAPI node to be created.
// createInfo Addition information in order to create the node.
// context Custom parameter
// Return an assoc: Statements are terminated by
// OK TRUE if ok. the end of the line, and the
// ErrMsg Application error message if not ok. backslash (\) is the line
// ApiError Error returned by API if not ok. continuation character.
Boolean ok = TRUE
Convention: Variable
//insert custom code here names start with a lower
//create assoc to store new data case character, and each
assoc suggBox; dynamic request = createInfo.request word of a “compound”
name is capitalized.
//populate assoc
suggBox.dept = request.dept
suggBox.subject = request.subject There are two options for comments: double
slashes (//) and C-style:
//store sugg data /* This is a comment too*/
node.pExtendedData = suggBox
if IsUndefined( rtnval.OK )
rtnval.OK = ok
rtnval.ErrMsg = errMsg
rtnval.ApiError = apiError
end Convention: FunctionNames are
capitalized, with each word of a
return( rtnval ) “compound” name capitalized.
end
5.9 Operators
File.Close( infile )
switch color
case "pink"
outputString = "Just right."
end
case "red"
outputString = "Needs more white."
end
case "white"
outputString = "Needs more red."
end
default
outputString = "You need to combine red and white to make pink."
end
end
Figure 5-12: Switch statement example (creating output for various values)
If Statements
if boolean_expression
statements In these syntax
elseif boolean_expression descriptions, italics
statements denote a “placeholder”
else for a variable or value,
statements and angle brackets (< > )
end denote optional code.
While Loops
while ( boolean_expression )
code_block
end
Repeat/Until Loops
repeat
code_block
until ( boolean_expression )
Switch Statements
switch variable
case value1
code_block
end
case value2
code_block
end
[default
code_block
end]
end
string message
integer i
for i = 2 to 10
message = "And then there were " + Str.String(I)
Echo( message )
end
RESULT
And then there were 2
And then there were 3
And then there were 4
(etc.)
string message
integer i
for ( i = 2; i <= 10; i += 1 )
message = "And then there were " + Str.String(i)
Echo( message )
end
Figure 5-14: C-style for loop example (same result as in Figure 5-13)
Figure 5-15: Example of looping through a RecArray and building output using the
Str.Format() function (see also Section 5.12.1)
5.12.1 Strings
5.12.2 Lists
assoc userData
userData.dept = "Accounting"
userData.name = "Joseph"
userData.ext = "3340"
string s = Str.Format( \
"Emp: %1. Department: %2. Phone: %3.", \
userData.name, userData.dept, userData.ext)
Echo( s )
Figure 5-22: Example of using an Assoc to store and retrieve a set of related information
list userData
userData[1] = "Accounting"
userData[2] = "Joseph"
userData[3] = "3340"
string s = Str.Format( \
"Emp: %1. Department: %2. Phone: %3.", \
userData[2], userData[1], userData[3] )
Echo( s )
Figure 5-23: The same as Figure 5-22, but using a list—see the advantages of an Assoc?
String outputString
String columnName
Echo( outputString )
Figure 5-24: Example of using the “value of” operator to retrieve Assoc elements by using
the values of a list’s elements
5.12.3 Assocs
DAPINode xfolder
// code for getting a folder here
xfolder.pName = "Training documents"
xfolder.pDComment = "various training docs"
5.12.5 DAPINodes
RESULT
"The price is $100"
Syntax:
PackageName.FunctionName( parameters )
One of the packages that you may use often is the DAPI
package of built-in functions.
FilePkg Object
Features:
• FormatFile()
• GetFiles()
• fDefaultDir
Figure 5-32: Example of retrieving feature values, running methods, and populating a
feature of an object
5.14 Objects
Suggestions Object
Globals object for the OSpace
“Suggestions”. Global variable
$Suggestions used to refer to
FilePkg Object
the object.
Features:
Features:
• FormatFiles() method
• CompileAll() method
• fFileType feature
• FilePkg object reference
• EnterSuggestion object reference
result = $Suggestions.FilePkg.FormatFiles()
$GlobalName.featureName
The OS.NewTemp()
built-in function creates
a temporary object for
the current Livelink
Session.
Figure 5-36: Example function that requires one date input argument and returns a string,
stored in the DatePkg object’s FormatLong() method—note that the method name
is not the same as its first function’s name
(Example of
an “implied
string output = FormatDate( Date.Now(), "international" ) main
echo(output) function”)
string outputString
switch formatString
case "long"
outputString = Date.DateToString( inputDate, '%A, %B %d, %Y' )
end
case "international"
outputString = Date.DateToString( inputDate, '%Y%m%d' )
end
case "short"
outputString = "etc."
end
end
return outputString
end
Figure 5-38: Example of a method which calls a function within the method
string auditString
return auditString
end
Figure 5-39: A function header that uses all the declaration options
auditLine = CreateLogString()
auditLine = CreateLogString( 'DELETED' )
auditLine = CreateLogString( 'ENTERED', Date.Now(),"cho" )
Figure 5-40: Examples of calling the function in Figure 5-39, sometimes using the default
values for input arguments
string auditString
// rest of code here,
// assigning value to auditString
return auditString
end
Figure 5-41: A function header for the same function as in Figure 5-39—but this time, with
only the declaration options that are absolutely required for the function to operate
Figure 5-42: Examples of calling the function in Figure 5-41—note that since none of the
arguments are optional, they must all be passed to the function
return returnValue
end
5.17 Summary
• You can create your own functions, using the same sort
of syntax you use in other programming languages.
Functions are normally stored in methods; when you
want to call the function, you use the method name, and
Livelink will execute the first (main) method in the
function.
Create a utility object and make this object globally available in Livelink. Write a script in
this object that will accept a string containing an external file path, will read that external
file (a file of contacts) into a RecArray, and will then return the RecArray. Then, in the root
object of your contact module, create a method that will call this utility script, and assign the
results to a dynamic feature you have also created in your root object. Obtain an input file
(contacts.txt) from your CD.
□ 1. Your instructor will provide a file called contacts.txt. (On your CD in the Student
Solutions directory) Each line of the file contains comma-delimited contact information
for a customer. LOCATE this file. It will be used in subsequent steps.
□ 2. CREATE a child object of your OSpace’s root object and call it ContactUtils. Make
this object globally available. (How: RIGHT-CLICK the object → Add to Globals) Use
the default name ContactUtils as the name for the global object reference feature.
(If you like, see the example code at the end of this section’s exercise for reference, as
you perform this and the subsequent steps.)
• CREATE a function header that defines a return datatype of RecArray and accepts a string
parameter containing a file path
• Using the RecArray built-in function RecArray.Create(), WRITE some code to create a
RecArray with five fields named to correspond to the fields in the contacts.txt file:
firstname, lastname, email, phonenumber, and customernumber.
• WRITE code to read each line of the contacts.txt file and add it as a record to your new
RecArray.
There are multiple ways to do this, but we think you’ll find these built-in functions
useful: File.Open(), File.Read(), Str.Elements(), Str.Tab(), File.EOF(),
RecArray.AddRecord(), File.Close().
□ 6. ADD a dynamic feature called fContacts to your OSpace’s root object. You will store
information in this feature.
□ 8. EDIT CallReadContacts():
• CALL your ReadContacts() method (do you remember how to call global objects?),
passing it the path to the contacts.txt file.
• SAVE the return value from ReadContacts() in your new fContacts dynamic feature.
□ 10.MAKE SURE your Debug window is open and RUN CallReadContacts(). LOOK at the
Debug window for results.
ReadContacts() method:
currentRecord.customerNumber = \
Str.StringToInteger(currentRecord.customerNumber)
CallReadContacts() method:
.fContacts = $Contact.ContactUtils.ReadContacts( \
"c:\Builder Course files\contacts.txt" )
record contactRec
end
You now know what a request handler is, and you have used one to set up your module. Now
that you have had an introduction to OScript, it’s time to show you how to create new request
handlers to implement new functionality.
Objectives:
?func=user.edituser&userID=5644
Dynamically Generated
HTML File
1
Livelink CGI
$WebDsp.
2
RequestHandlerSubsystem
Object
Dispatch() method
fRegistry = <’admin.adminfactories=#180025f2,…
‘user.edituser’=#59000194, …>
4
edituser.html
WebLingo EditUser Request Handler
File Object Database
Execute() method
fHTMLfile string ----‘edituser.html’
3
Figure 6-4: Key features of the Request Handler object (EditUser example)
Here are some of the other features that request handlers share. The ones that are most
commonly modified for customizations are highlighted in bold:
Documentation Text describing the request handler’s purpose. (Defined as a script to make it
easier to read.)
ExecuteHandler() Entry point for the request handler, directing the error checking, execution, and
output generation.
Execute() The method that performs database transactions (or calls other methods that
perform database transactions) and sets required request handler features.
fError If defined, Livelink will display its contents in an error page as the output for the
request handler instead of the defined HTML page. (Normally, you set this
feature to a string from within the Execute() method if an error occurs.)
fErrorPrefix A “header” message for an error page—displayed above the contents of fError
(if fError is defined).
fHTMLFile The name of the WebLingo file that generates the HTML page with the results
of the request.
fHTMLLetter If the fHTMLFile feature is not set, Livelink appends the request handler object
name to the string in fHTMLLetter and looks for a WebLingo file of this name to
generate the HTML page with the results of the request.
fLocation The URL to call after the Request Handler finishes executing (and before it
checks fHTMLfile or fHTMLLetter).
fPrototype A list of lists that define the datatypes of input arguments passed to the request
handler via the URL.
GenerateOutput() Determines the output to display, be it an HTML file, an error page, a file
download dialog box, or a different URL.
?func=user.edituser&userID=5644&nextURL=TRUE
Figure 6-5: How the URL relates to the request handler’s fPrototype feature
.fPrototype =\
{\
{ 'filepath', StringType,”The path of the file to read”, FALSE },\
{ 'nextURL', StringType, [WebUser_RHParam.NextURL], TRUE }\
}
end Xlate—you can
just use a string
Figure 6-7: Example SetPrototype() method constant
• assigns default values to any optional parameters The OScript constants that
represent the datatypes include:
The fPrototype feature is a list containing one list element IntegerType
StringType, BooleanType,
for each input argument. See Figure 6-6 for the details of DateType, ListType,
the list for each input argument. ObjectType, RealType. There
are others (see the Builder
The second element of the lists, which is the datatype of the online help) but the above listed
ones are datatypes that can be
argument, is most easily defined by passing one of the passed to request handlers in
OScript keywords representing datatypes. For this reason, the URL arguments.
use the SetPrototype() method in the request handler
object as a setup script for defining the fPrototype feature.
And don’t forget to run the method!
return Undefined
end
Figure 6-8: Example Execute() method, using the r parameter to get data sent to the
request handler
Path
if .fError is defined (for example, “Couldn’t locate directory.”), then
display the error message in a dynamically generated page
else if .fDownloadFile is defined (for example, “out.txt”), then
download the file
else if .fLocation is defined (for examle, “http://www.corphome.com”) then
go to that URL
else make an HTML page,
using file named in fHTMLfile (for example, “listregions.html”)
or if fHTMLfile is undefined, using file name of fHTMLletter + objectname + “.html”
else
make up an error message and display it in a dynamically generated page
If IsDefined(filepath)
suggestions = \
$Suggestions.SuggestionsUtils.ReadSuggestions(filepath)
end
If IsDefined(suggestions) \
Setting new feature to
and IsNotError(suggestions) data to be used on
.fSuggestions = suggestions HTML page if there’s
else no problem
.fError = "Error loading suggestions"
end Setting fError to
trigger Error page
return Undefined if there’s a problem
end
//
// Display the suggestion boxes
<html>
</table>
</body>
</html>
…?func=suggestions.getsuggestions&filepath=c:\builder+course+files\suggfi
le.txt
Figure 6-13 The URL suffix to call the new request handler
fErrorPrefix
In Section 8, we’ll show you one way to tie the URL into
the interface, so that you (and other users) don’t have to
type it manually.
6.9 Summary
Make a request handler whose execute method will call the utility script you created in the
last section, and pass it the same external file path. Create an fResponse feature in your
request handler. Have the Execute() method save the returned value of that script in an Assoc
called response.data.contacts, and save that assoc in the fContacts feature you created.
Note: you could have orphaned the WEBDSP : WebDsp Root : RequestHandler
instead. Why wouldn’t you?
□ 2. Set fFuncPrefix = contact, so that calls to the child request handlers will have the
format “?func=contact.requesthandlerName”.
□ 6. ADD a new dynamic feature to your GetContacts request handler to store the results
of the request. Call this new feature fContacts, and leave it Undefined.
□ 8. EDIT GetContacts.Execute():
• After the function declaration, DECLARE an Assoc variable in which to store contacts
information.
• READ the filepath argument that is passed to the request handler (remember how to use
the r parameter?), and PASS it to ReadContacts().
• If the file was read successfully, ASSIGN the value of the contacts variable to the
fContacts feature you created earlier. If the file was not read successfully, SET
GetContacts.fError to an error string that should be displayed.
SetPrototype() method:
.fPrototype = { \
{ "filepath", StringType, "the name of the file to read", FALSE }}
recArray contacts
If IsDefined(filepath)
contacts = $Contact.ContactUtils.ReadContacts(filepath)
end
If Length(contacts) > 0
.fcontacts = contacts
else
.fError = "No contacts or Error reading contacts file."
end
return Undefined
end
□ 1. CHOOSE one of these options for specifying the name of the HTML file which will
display the request handler results:
• You can set the fHTMLFile feature of your GetContacts request handler to be the name
of the HTML file you want called after your request is completed (consider
contacts.html).
• You can set the fHTMLLetter feature of your GetContacts request handler to be the first
part of the name of your HTML file and Livelink will automatically append the request
handler object name (GetContacts) to this prefix when searching for the HTML file.
Again, a good option for fHTMLLetter is the name of your module—so if you set
□ 2. Using the Script Editor or another text editor, CREATE the WebLingo file that will
display the results of your request handler.
• Use a table to OUTPUT the results of your request handler. Remember, you stored the
results (a RecArray) in a feature called fContacts.
• The first row of the table should be your column headings, and each row after the
heading should be a contact record.
Here is a very basic example of what the code could look like:
;RecArray contactsArray = .fcontacts
;record contact
<html>
<body>
<table border=1>
<tr>
<td><b>Name</b></td>
<td><b>Email</b></td>
<td><b>Phone Number</b></td>
<td><b>Customer Number</b></td>
</tr>
;for contact in contactsArray
<tr>
<td>`contact.lastName`, `contact.FirstName`</td>
<td>`contact.email`</td>
<td>`contact.phoneNumber`</td>
<td>`Str.String( contact.customerNumber)`</td>
</tr>
;end
</table>
</body>
</html>
□ 3. SAVE the WebLingo file in your module’s HTML directory, and give it a name
according to the option you selected above (1a or 1b).
□ 4. SAVE and EXPORT your OSpace, and STOP and START the Builder.
□ 5. TEST your work: From your web browser, ENTER the Livelink URL that calls your new
request handler. Remember, you’ll have to include a parameter for the path of the file
your request handler is going to read. Use a + in place of any spaces in the file path.
For example:
http://localhost/Livelink/livelink.exe?func=contact.GetContacts
&filepath=c:\Builder+Course+Files\contacts.txt
WebLingo gives you infinite possibilities for creating a user interface that is based on
Livelink content and graced with Livelink’s look and feel. You’ve had an introduction to
how WebLingo files are called by request handlers—now it’s time to show you the details.
Objectives:
commonheader.html
infoproperties.html displays header
is the “driving” page
Another HTML page
infotabs.html drives each tab—for
displays tabs example,
infoaudit.html displays
audit tab
menufoot.html
displays footer
browseheader.html sets up
args and calls browsesearch.html displays
browse.html commonheader.html search bar if appropriate
is the “driving” page
commonheader.html
displays header and
calls other webscripts dashboards.html displays
navigation dropdowns
browseimages.html displays
any images (named in
Presentation tab)
browsecatalogs.html displays
catalog items if appropriate
browseview.html displays
list of items if appropriate
menufoot.html
displays footer
;args.noTicker = noTicker
This webscript
;if adminHelp calls another
;args.HelpParams = "&adminHelp" webscript
;end
Figure 7-3: The imasthead.html file, which contains the webscript used for the header on
most Livelink Info pages
Most Livelink pages use the same header and footer, with a
few variations. For this and many other aspects of the
All Webscript
interface, Livelink uses webscripts. A webscript is a
directives are case-
WebLingo file which you can call from other WebLingo
files and to which you can pass input arguments—in other
words, a webscript is a WebLingo function.
There are three WebLingo directives for creating and An Xlate is a placeholder
for a localized string that is part
calling webscripts: of the text of the user interface.
This allows the same WebLingo
• ;;webscript indicates the start of a webscript. The file or other script to be used for
Livelink in English, French,
webscript directive is analogous to the Function header Japanese and other languages.
of a script feature.
If you want to see the text
stored for an Xlate, select its
• ;;end indicates the end of a webscript. text from the Script Editor, then
choose Open Xlate from the
• ;;call is used to direct Livelink to insert the “processed” Script menu.
contents of a webscript at the point of the call.
Syntax:
;;html{html statements;;}
<HTML>
<!-- File: webnode/info.html --> HTMLPrefix() returns
<!-- RequestHandler: ll --> the path to this file’s
html directory
;Assoc element
<HEAD>
<TITLE>`title`</TITLE>
…snip
<BODY BGCOLOR="#FFFFFF" BACKGROUND="`img`pattern.gif"
ONLOAD="resetPopup()">
In addition to using:
A call to .Styles()
2. For CLASSES
Step set 7.1: To add a new CSS when your module is installed. And remove it again
when your module is uninstalled.
Figure 7-12: Livelink header before and after commonheader.html file change
</TD>
;;end
7.7 Summary
Modify the WebLingo file you created in the previous exercise to output the standard Livelink
header and footer with your contacts in between. Feel free to experiment and exercise your
HTML skills here.
□ 1. In the Builder, OPEN the WebLingo file you created in the last exercise.
How: File menu → Open, navigate to your module’s html directory and double-click
the file name. (Or if you created it from the Builder in the first place, you’ll see it in the
File menu → Recent submenu.)
• ADD the required code in the appropriate spot to call the commonheader.html WebLingo
file, passing it arguments to define the title and background color.
• Near the end of your new WebLingo file, CALL the menufoot.html webscript to display
a standard Livelink footer at the bottom of the Contacts page. The menufoot WebScript
is in the same directory as commonheader.html and requires no arguments.
□ 3. Now GO to your web browser and ENTER the Livelink URL that will call your request
handler. The results should look something like this:
<html>
<head>
`%L.Styles()`
</head>
;string htmlPrefix = .HTMLPrefix()
;assoc args
; args.Title1 = "CONTACTS"
; args.BGcolor = "pink"
Back up and then edit the commonheader.html file. Add some extra code to
commonheader.html that will give this page a unique company look (like our class example).
□ 1. NAVIGATE to your Livelink installation’s main HTML directory and MAKE A BACKUP
copy of commonheader.html.
□ 2. From the Builder, OPEN the commonheader.html file and ADD CODE to display a
corporate banner.
If you would like to base your code on the class example, the banner from the lecture is
on the CD in \student solutions\section7\banner.txt.
□ 4. GO to your web browser and OPEN a Livelink page to see your changes. How do they
look?
□ 1. EDIT the livelink.css file in the support directory and copy the lines for the label class.
Create a new CSS file in your module’s support directory called contacts.css and
paste the copied label class.
/*
The style to use for the label part of the label/value pair.
Use with:
<TD>
*/
.label {
width: 15%;
white-space: nowrap;
color: #434343;
background-color: #e2e2e2;
border-left: 1px solid #ffffff;
border-top: 1px solid #ffffff;
border-right: 1px solid #999999;
font-family: Tahoma, Verdana, Geneva, Arial,
Helvetica, sans-serif;
text-align: left;
font-weight: bold;
font-size: 11px;
}
□ 3. Modify your weblingo file to include the label class for the table column headings.
<tr class="label">
□ 4. Save all your work. Now GO to your web browser and ENTER the Livelink URL that
will call your request handler. How does your table look?
Notes:
Now that you have a working request handler, you can type its URL to run it—but you are
not going to want to ask your users to do that. There are a number of ways to plug your
request handler into the Livelink interface; we’re going to start by showing you how to add
items to the Enterprise menu, which is an example of a navigation menu.
Objectives:
By the end of this section, you will be able to add module-related commands to the
Enterprise, Personal, and other navigation menus.
Figure 8-1: A Livelink page showing the navigation menus designed to be easily enhanced
Figure 8-2: How the key indicates where items will appear in the navigation menus
Projects 09110.0
Figure 8-3: Keys for some of the items that populate the navigation menus
xxyzzzz.0
These URLs have no dynamic arguments and can be used in the navigation menus:
http://www.opentext.com/training
http://myserver/livelink/livelink?func=ll&objId=2126&objAction=browse
&sort=name
This URL cannot be used in the navigation menus because its nextURL argument
normally changes each time the URL is called:
?func=ll&objId=2126&objAction=properties&nexturl=%2FLLV8%2Flivelink%3
Ffunc%3Dll%26objId%3D2126%26objAction%3Dbrowse%26sort%3Dname
Figure 8-4: Examples of URLs that can and cannot be added to the navigation menus
Livelink’s navigation menus are built by the Livelink The items added to the
Navigation Callback Subsystem’s Items() method the first Enterprise menu by system
administrators are also
time a Livelink page is accessed after startup. For stored in fItems. The
performance reasons, the Items() method caches the menus administrator is required to
in the fItems feature of the same object. This includes each stop and restart Livelink to
see the changes take
menu item’s URL. The fItems feature is not rebuilt until the effect.
server is restarted. As a result of this caching, the URLs
used in the Navigation menus must be constant and cannot
require any dynamic arguments.
return retVal
(The inherited script contains this line—you may
end want to delete it.)
Figure 8-6: Some of the items that populate the navigation menus
• The name of the assoc in the items assoc is the key The Web.Escape()
discussed in section 8.3. built-in function converts a
string to URL format by
“escaping” non-alphabetic
• The assoc has two elements: name to store the menu characters into URL
command name, and url to store the command to hexadecimal sequences and
by converting spaces to the
execute. “+” sign. You will want to use
this function when you need
Step set 8.2: Edit the NavigationCallback.Execute() to include strings as
Method arguments in a URL.
8.6 Summary
/* Add this line to define the URL that is sent when a user
clicks your new Navigation menu item. */
item_contacts.name = "Get Contacts"
item_contacts.url = \
str.format("%1?func=contact.GetContacts&filepath=%2", \
scriptName, Web.Escape("c:\Builder Course Files\contacts.txt"))
// Items = undefined
• Instead of leaving the items assoc Undefined, ADD the items_contact assoc as a new
element of the items assoc, have the “key” of the new element be set so the new item
will appear in the first section of the Enterprise menu :
items.('11' + .mSectionOne + "Contacts" + ".0") = item_contacts
□ 8. TEST your work by looking for your new command on the Enterprise Workspace
navigation menu. Is it there? Does it work?
Will your users require a link to get to any areas of Livelink from the Navigation menus?
Will you need to modify any other Livelink pages?
The LLIAPI OSpace contains a base set of LLNode objects that manage the different
types of Livelink items, also referred to as node types. The WebNode OSpace contains
the WebNode objects that provide the interface and commands for LLNodes. Together
these objects are used to implement a commonly desired customization: the addition of
new types of items to be stored and managed by Livelink.
Objectives:
DTree table:
DATAID NAME PERMID
DTreeACL table:
1290 Marketing 1290
DataID ACLType RightID Permissions
1923 OutdoorGear News 1923
1290 1 124 65670
2340 Get your T-shirt 1923
1290 2 349 284938
1290 3 -1 36995
DVersData table: 1290 0 138 584923
DocID VersionID ProviderID FileName 1290 4 -2 293948
1382 3 2384 Jan23.xls 1923 2 458 394923
2383 8 3483 jobs.html 1923 1 124 675765
2383 7 3429 jobs.html 1923 3 -1 39492
3848 1 5994 ann.doc 1923 0 138 393949
1923 0 349 494994
ProviderData table:
ProviderID ProviderData RefCnt
2383 22393 1
BlobData table:
2389 22838 1
OwnerID LongID SegmentID Segment
2034 24293 2
0 22838 1
2342 28223 1
0 24293 1
0 24293 2
DAudit table: 0 24293 3
DataID UserID Event 0 28223 1
124 2934 DELETE
138 2838 VIEW llAttrData table:
349 4554 FETCH ID Vernum AttrType
458 2332 RESERVE 124 1 -10
138 5 7
1382 2 6
3848 2 6
• The DTree table stores one record for each item, with a
DataID column that uniquely identifies each item and a
Subtype column that identifies the node type (folder,
query, document, etc.) of the item.
newnode = DAPI.AllocNode()
DAudit table
DTree table
DVersData Etc.
table
LLNode objects The objects which store the basic information and code for the
underlying functionality for the different types of nodes. There is
one LLNode object for each type of node.
WebNode The objects which store the information and code for driving the
objects web representation of the types of nodes. There is one
WebNode object for each type of node.
The ll request The request handler which processes almost all functions
handler object against nodes. There is one ll request handler object.
Figure 9-3: The base objects involved in creating and managing Livelink nodes
?func=ll&objId=2402&objAction=browse&sort=name
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2402 Budgets 0
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the web
node object
Get the action
to perform
$TypeWorkflowAttachment
$ApplTypeAttachment
$ApplTypeDiscussion
$ApplTypeDiscussionItem
$ApplTypeDocument
$ApplTypeFolder
$ApplTypeNews
$ApplTypeProject
$ApplTypeProjectVol
$ApplTypeReport
$ApplTypeSystem
$ApplTypeTask
$ApplTypeTaskList
$ApplTypeTaskListVol
$ApplTypeUserWorkbin
$ApplTypeVolReports
"?func=ll&objId=2402&objAction=browse"
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2402 Budgets 0
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the node
objects (ll & web)
Get the action to
perform
$ApplTypeSuggestion = 2001
3. Name the class object after the types of nodes you will create—
for example, Suggestions LLNodes.
4. Create a child of the Nodes class object, and name the child
after your new first node type, for example, SuggestionBox.
"?func=ll&objId=2402&objAction=browse"
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2402 Budgets 0
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the node
type objects
Get the action
to perform
Each LLNode object may have (and most all of them do) a
corresponding WebNode object. The LLNode and
WebNode objects are linked by subtype. WebNodes
implement the web interface for a node.
2. Name the class object after the types of nodes you’ll be To compare
fParentApplTypes to
creating—for example, Suggestions WebNodes. fParentSubTypes, here’s an
example: When
3. Create a child of the WebNodes class object. Name the fParentApplTypes includes
child object after your node—for example, $ApplTypeFolder, a
suggestion box can be added
SuggestionBoxWebNode. to any node that belongs to
the $ApplTypeFolder family.
4. Set fEnabled to TRUE, then run the BuildOSpace() When fParentSubtypes
includes $TypeFolder, a
method of your OSpace’s Globals object. suggestion box can be added
(This object must also be initialized so that it is only to folder nodes.
registered with a subsystem at startup.)
9. Test: Save, export, exit, restart, and create a new node Did you notice that we
of your new type in the Enterprise Workspace. didn’t write any code to make
(Livelink finds and uses a “default” html template the nodes “do” anything yet
our new node type already
for entering a new item of your type.) has some of functionality?
That’s because Action objects
and WebNodeCmds already
present in Livelink add
functionality to our new node
type. You’ll see how to create
new ones as the course
progresses.
9.8 Summary
Create a new “Contact” node type for containing contact records added by your sales staff.
The contact records will include a customer name, ID number, phone number, and e-mail
address, much like the data stored in the contacts.txt file. After adding the basic information
for a contact, sales staff will be able to add documents and other types of nodes as
“children” of a contact node, in order to record notes of meetings, conference calls, and
other information regarding the contact.
Create a new “Contact” ApplType, create a new LLNode object for a Contact, then register
and initialize it.
□ 2. RUN Root.Startup() (to define the global variable in preparation for step 8).
□ 3. ORPHAN LLIAPI : LLIApi Root : LLNode object, calling it Contact LLNodes. This
new object will be a class object for all LLNodes in your OSpace.
□ 5. Now REGISTER your new Contact object (your LLNode for the new Contact
nodetype):
□ 6. To define the name of the node type for the Add Items menu, SET Contact.fName =
Contact.
□ 7. SELECT and ASSIGN a number to fSubtype of 2000 or greater. (For this exercise,
please use 2002 to make it easier for you and the instructor when debugging).
□ 9. If you orphaned this node from LLNode, fContainer is already set to True. (You want
your new node type to be a container).
□ 10.Finally, SET (or verify the setting of) some of the other inherited booleans:
What other Boolean features are there for this node? Which would you want set to True,
which would you want set to False?
□ 5. DECIDE where your contact records can be added in the Livelink hierarchy, then do one
or both of the following in a setup script (and DON’T FORGET to RUN the setup script):
□ 6. CHANGE the type of fGif to a string (in which object will you make this change?).
Then SET fGif to the name of the 16 x 16 GIF file provided for contacts, contact.gif.
Look in c:\Builder Course Files\ for contact.gif.
□ 7. PLACE the GIF file named in the previous step in the LLHOME\support\contact
directory, as well as in your module’s support directory.
□ 8. SAVE and EXPORT your OSpace, then EXIT and RESTART the Builder.
□ 9. TEST your work: LAUNCH a web browser and GO to the Enterprise Workspace (or a
place where contacts can be added). CLICK the Add New Item menu.
9.9.4 Questions
When you choose your node type, can you enter a new node?
Notes:
WebNode objects maintain lists of commands that can be performed against nodes of their
type. A WebNodeCmd object builds the URL, display name and other GUI aspects for each
of the WebNode’s commands. There are existing WebNodeCmd objects that your node uses
to generate its commands.
Objectives:
• Specify which of the “off-the-shelf” commands for manipulating Livelink items you want
to use with a new node type
• Control what appears on the Add New Item menu for your node type
View
WebNodeCmd Object
Browse
WebNodeCmd Object
The
Functions
menu
The open
“placeholder” is used
when clicking the
Figure 10-2: Portion of a “browser” page name of the item
;if nodeRec.Catalog == 0
The Cmd() method gets
;rowfactor ^= 1 the WebNodeCmd object
corresponding to the
;webNode = webNodes.GetItem( nodeRec.subtype ) open “placeholder”…
;open = webNode.Cmd( "open" )
.fCmdNames =\
{\
{ "Open", "Browse" },\
\ The WebNodeCmd
{ "Browse" },\ object’s registered
{ "Copy" },\ name
{ "CreateAlias" },\
{ "CreateChild" },\
The “placeholder”
{ "Delete" },\
{ "EditConfig" },\
{ "Move" },\
{ "Properties" },\ Properties required for
{ "Permissions" }\ non-java menus only
}
Figure 10-4: Excerpt from the WebNode.0SetUp() script for a Folder, setting fCmdNames
1. In your WebNode, create your own setup method, We seemed to have the
called 1Setup(). Open the 0Setup() method and “Make Favorite”, “Make
copy the portion that defines the fCmdNames News”, and “Set Notification
commands appear without
feature . asking for them. Later we’ll
(The 0Setup() method also has the basic code for see how these are
creating prototypes for the various commands, as automatically set for custom
nodes like Suggestion Box.
you will see later in the course.)
.fCmdNamesInfo = {{'Properties'},{'Audit'},\
{'References'},{'Info'}}
For the
“Specific” tab
3. Save, export, exit, restart, and return to Livelink to
view the tabs on the node’s Info page.
Figure 10-9: The Add Items Popup for a Node with fChildSubTypes of $TypeContact,
$TypeFolder and $TypeDocument
10.4 Controlling the Add New Item Menu for a Node Type
Step set 10.3: Adding Items to the Add New Item Menu
-AND/OR-
10.5 Summary
• The items that appear in the Add New Item menu for a
given type of “container” are defined by the values in
the WebNode.fChildApplTypes and
WebNode.fChildSubTypes features. (As well as by the
values in other webnode object’s
WebNode.fParentApplTypes and
WebNode.fParentSubtypes features.)
Add functionality to your new “contact” node, including commands, Info page tabs, and the
ability to add new items to a contact.
Add commands for working with your new node. Start by writing code to allow users to click
the name of the contact record and “browse”. Add other basic commands as well.
□ 1. The WebNodes.fCmdNames feature holds all command names for the node. A
convenient method for setting the value of fCmdNames is to copy from the 0SetUp()
method:
• COPY the fCmdNames section from the 0Setup() method into your 1Setup() method
and MODIFY it to reflect the operations you wish end users to perform on contacts. (See
the example below.)
.fCmdNames = \
{ \
{ "Open", "Browse" }, \
{ "Copy" }, \
{ "CreateAlias" }, \
{ "Delete" }, \
{ "Move" }, \
{ "Permissions" }\
}
Reminder: Each list element of fCmdNames can contain two strings (for example,
{"Open","Browse"}). This allows you to “map” a label to the command.
Reminder: include “Properties” in this list if your users will use the non-Java interface.
Note: The line continuation character “\” cannot span blank lines. That is, if you
delete a line from the file, be sure that you do not leave a blank line.
□ 3. TEST your work: STOP and START the Builder, RETURN to the web browser, and
BROWSE a contact to test your work.
Are there new functions available on the Functions drop down menu?
□ 1. OPEN 0SetUp()and COPY the fCmdNamesInfo section into your 1SetUp() script.
□ 2. EDIT the code which sets fCmdNamesInfo to DEFINE the Info commands (and tabs in
the Info page) for your contact. It should look something like this:
.fCmdNamesInfo = \
{ \
{ 'Properties' }, \
{ 'Audit' }, \
{ 'References' }, \
{ 'Info' } \
}
□ 4. TEST your work: EXIT and RESTART the Builder, then RETURN to Livelink via your web
browser to view the Function dropdown and tabs on a contact’s Info page.
□ 1. Sales staff should be able to add documents and perhaps other types of nodes to
contacts, in order to record information about conference calls, meetings, and other
transactions with the customer.
□ 2. RUN the script(s), SAVE your work, and EXPORT your OSpace.
□ 3. TEST your work: EXIT and RESTART the Builder, and browse a contact from your web
browser. What Livelink objects can you now add to contact nodes?
All of the standard Livelink system attributes (name, comments, modified date, etc.) are
automatically maintained for each type of node, including the new ones you create. If you
want to store additional data, specific to your new node type, Livelink provides several
storage options. In this section we’ll briefly discuss the various storage options and explore
one option, using the DTree’s ExtendedData column, in detail.
Objectives:
Figure 11-2: The Add page for suggestion boxes, with additional attributes
ExecuteHandler() gets a
request, including an assoc of
data, and passes it to Execute().
ExecuteHandler() calls
GenerateOutput().
As you will see, the code you write will use information
stored in fRequest and save information in fResponse. The
LL request handler looks for certain elements in these
features. See Section 12 for more information.
?func=ll&objType=2001&objaction=create&parentID=2402
ll Request Handler
Object
Features:
Execute() method Get the subtype
Create.html
1. Create the top of the Add page
2. If ll.fResponse.data.webscript is defined, call the
named webscript
3. If ll.fResponse.data.attributes is defined, display the
attributes for the page
4. Display the Submit/Reset buttons and the footer.
Figure 11-4: The path of execution for the creation of a new type of node
This same model is used for the Info page for an item:
There’s an Action-Info() method that passes the WebLingo
filenames stored in fHTMLInfoBase and fHTMLInfo to
the LL request handler.
;;webscript suggbox
;string img = .img()
<tr>
<td class="label">Department:</td>
<td class="labelverticaldividerright"
background="`img`tbl-divider-ver.gif"
style="background-repeat: repeat-y;">
<img height="1" alt="" src="`img`spacer.gif" width="2" border="0">
</td>
<td><input class="valueeditable" type="text" name="dept" size=5 ></td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif" width="3"
border="0">
</td>
</tr>
</tr>
<tr>
<td class="label" valign="top" nowrap>Subject:</td>
<td class="labelverticaldividerright"
background="`.img()`tbl-divider-ver.gif"
style="background-repeat: repeat-y;">
<img height="1" alt="" src="`.img()`spacer.gif" width="2"
border="0">
</td>
<td>
<input class="valueeditable" type="text" name="subject" size=40 >
</td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif" width="3"
border="0">
</td>
</tr>
</tr>
;;end
Figure 11-5: Example webscript for adding fields to the Add Item page
WebNode Object
Features:
fSubType integer Add Item Page (create.html)
Displays Add Page
fCmdNames list
Calls Action-Create2() on Submit
Action-Create() method
Action-Create2() method
fPrototypeCreate2 list
Figure 11-6: Action- Create()/Create2() method Sequence when creating a new node
.fPrototypeCreate2 = \
{ \
{ "parentId", IntegerType, [WebNode_RHParams.ParentID], FALSE }, \
{ "name", StringType, [WebNode_RHParams.Name], FALSE }, \
{ "comment", StringType, [WebNode_RHParams.Comment], TRUE }, \
{ "nextURL", StringType, [WebNode_RHParams.URLToReturnTo], FALSE},\
{ "dept", IntegerType, "department concerned" , FALSE },\
{ "subject", StringType, "general subject", TRUE } \
}
LLNode.NodeCreateSubclassPre
Alias, generation
LLNode.NodeCreateSubclass code here
// Private method
//
// Override this method to perform specific attributes
// assignment to the node.
//
// Parameters:
// node The DAPI node to be created.
// createInfo Additional information for the node.
// context Custom parameter.
//
// Return an assoc:
// OK TRUE if ok.
// ErrMsg Application error message if not ok.
// ApiError Error returned by API if not ok.
If IsDefined(node.pExtendedData) \
&& Type(node.pExtendedData) == Assoc.AssocType
//merge data assoc with existing pExtendedData assoc
node.pExtendedData = Assoc.Merge(node.pExtendedData, suggbox)
else
If pExtendedData already contains
//store data assoc in PExtenedData info (check, just in case), then add
node.pExtendedData = suggbox our info to it (using Assoc.Merge).
end
if IsUndefined( rtnval.OK )
If pExtendedData is undefined
rtnval.OK = ok
(nothing stored), then add our
rtnval.ErrMsg = errMsg assoc to it.
rtnval.ApiError = apiError
end
return( rtnval )
end
11.7 Summary
Perform the necessary steps to add new metadata, “customer number” and “phone
number”, to your contact node type, using the pExtendedData provision. Display the
attributes on the “Add a New Contact” page. Also, make the changes needed for updating
these attributes on the “Specific” tab of the “Info” page.
;;webscript contactcreate
;string img = .img()
<tr>
<td class="label">Customer No.:</td>
<td class="labelverticaldividerright" background="`img`tbl-divider-
ver.gif" style="background-repeat: repeat-y;">
<img height="1" alt="" src="`img`spacer.gif" width="2"
border="0">
</td>
<td>
<input class="valueeditable" type="text" name="custno" size=5>
</td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif"
width="3" border="0">
</td>
</tr>
</tr>
<tr>
<td class="label" valign="top" nowrap>Phone No.:</td>
<td class="labelverticaldividerright" background="`.img()`tbl-
divider-ver.gif" style="background-repeat: repeat-y;">
<img height="1" alt="" src="`.img()`spacer.gif" width="2"
border="0">
</td>
<td>
<input class="valueeditable" type="text" name="phoneno" size=40>
</td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif"
width="3" border="0">
</td>
</tr>
</tr>
;;end
□ 3. COPY the code for defining fPrototypeCreate2 from the 0 Setup() method to your
1Setup() method in your Contact WebNode object. Set fPrototypeCreate2 to look
like this:
.fPrototypeCreate2 = { \
{ "parentId", IntegerType, [WebNode_RHParams.ParentID], FALSE }, \
{ "name", StringType, [WebNode_RHParams.Name], FALSE }, \
{ "comment", StringType, [WebNode_RHParams.Comment], TRUE }, \
{ "nextURL", StringType, [WebNode_RHParams.URLToReturnTo], FALSE },\
{ "custno", IntegerType, "customer number", FALSE },\
{ "phoneno", StringType, "phone number", TRUE } }
• DECLARE an assoc.
After:
Object dapiCtx = createInfo.DapiCtx
Insert:
assoc contact
//populate contact
contact.custno = request.custno
contact.phoneno = request.phoneno
If IsDefined(node.pExtendedData) \
&& Type(node.pExtendedData) == Assoc.AssocType
//merge data assoc with existing pExtendedData assoc
node.pExtendedData = Assoc.Merge(node.pExtendedData,
contact)
else
//store data assoc in PExtenedData
node.pExtendedData = contact
end
□ 7. TEST your work: SAVE and EXPORT your OSpace, STOP and RESTART the Builder, and
ADD a new contact to see the prompt for customer number and phone number.
Create the functionality to update the attributes you just added. While we haven’t discussed
this step in class, you should be able to implement this functionality on your own; however,
we provide the following steps and hints, plus a sample solution at the end of the exercise.
Hint: Use fRequest.node.pExtendedData to access the extended data for the node
from the contactupdate.html page.
□ 5. COMPILE and RUN this script, SAVE and EXPORT your OSpace, and STOP and RESTART
the Builder.
□ 6. TEST your work: GO to the Info page of an existing contact and SELECT the tab labeled
“Specific”. You should now be able to change the values for the Customer Number
and Phone Number attributes.
Bonus:
OPEN the Info page on a contact that has a defined customer number and phone number.
CLICK the Update button at the bottom of the General tab. Then VISIT the Specific tab in the
Info page of that same contact. Are the customer number and phone number still there? If
not, see if you can figure out why, and add some code so the customer number and phone
number values do not get cleared? (Hint: What methods does the General page’s Update
button call?)
contactupdate.html page:
;;webscript contactupdate
; dynamic custno, phoneno, extendeddata = .frequest.node.pExtendedData
; if IsDefined( extendeddata )
; custno = extendeddata.custno
; phoneno = extendeddata.phoneno
; else
; custno = ""
; phoneno = ""
; end
;string img = .img()
<tr>
<td class="label">Customer No.:</td>
<td class="labelverticaldividerright"
background="`img`tbl-divider-ver.gif"
style="background-repeat: repeat-y;">
<img height="1" alt="" src="`img`spacer.gif" width="2" border="0">
</td>
<td><input class="valueeditable" type="text" name="custno"
size=5 value="`custno`"></td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif"
width="3" border="0">
</td>
</tr>
</tr>
<tr>
<td class="label" valign="top" nowrap>Phone No.:</td>
<td class="labelverticaldividerright"
background="`.img()`tbl-divider-ver.gif"
style="background-repeat: repeat-y;">
<img height="1" alt="" src="`.img()`spacer.gif" width="2"
border="0">
</td>
<td><input class="valueeditable" type="text" name="phoneno"
size=40 value="`phoneno`"></td>
<tr class="horizontalcelldivider">
<td class="labelhorizontaldivider">
<img height="1" alt="" src="`img`spacer.gif" width="1"
border="0">
</td>
<td class="valuehorizontaldivider" colspan="2">
<img height="1" alt="" src="`img`tbl-divider-hor.gif"
width="3" border="0">
</td>
</tr>
</tr>
;;end
NodeUpdateSubClassPre() method:
// Private method
// Override this method to perform specific attrbutes assignment to the
node
// or preforming checking before actual updating.
//
// Parameters:
//
// node The DAPI node to be updated.
// updateInfo Attribute information in order to assign values.
// context Custom parameter.
//
// Return an assoc:
//
// OK TRUE if ok.
// ErrMsg Application error message if not ok.
// ApiError Error returned by API if not ok.
Assoc result
Assoc rtnval
Dynamic apiError
String errMsg
Boolean ok = TRUE
Object dapiCtx = updateInfo.DapiCtx
assoc contact
contact.custno = request.custno
contact.phoneno = request.phoneno
If IsDefined(node.pExtendedData) \
&& Type(node.pExtendedData) == Assoc.AssocType
//merge data assoc with existing pExtendedData assoc
node.pExtendedData = Assoc.Merge(node.pExtendedData, contact)
else
//store data assoc in PExtenedData
node.pExtendedData = contact
end
if IsUndefined( rtnval.OK )
rtnval.OK = ok
rtnval.ErrMsg = errMsg
rtnval.ApiError = apiError
end
return( rtnval )
end
Notes:
Thus far, you’ve been using existing Livelink node commands to create and manipulate a
new node type. But how do you implement new types of node commands? Creating new
commands and plugging them into the interface is the topic of this section.
Objectives:
Browse
WebNodeCmd Object
"?func=ll&objId=2402&objAction=browse"
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2402 Budgets 0
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the node
type objects
Get the action
to perform
Search for an
Folder LLNode Object Action object for
Features: that objAction and Reserve
Action Object
fSubType integer----0
Features:
_NodeTypes() method
_SubclassExecute() method
_ProtoType() method
If no Action object exists, search fWebScript
for a method of the WebNode
named Action-objActionValue fErrorPrefix
Figure 12-1: How Action objects fit into the ll request handler picture
Action Object
Features:
_NodeTypes() method-------------Returns the list of node types to which the Action object
should be applied.
_SubclassExecute() method -----Performs the action.
_Prototype() method ---------------Defines the prototype for the action, validating and
converting inputs (optional).
fWebScript string -------------------Names the WebLingo file for the action (optional).
fErrorPrefix string -------------------Error message, to define if an error should be returned
instead of a WebLingo file.
fEnabled boolean -------------------Enables the object for initialization.
Element Description
node A DAPINode containing the item (node) referred to by the request.
PrgCtx The program session information, containing subelements such as
fUSession, with the requesting user’s information, and fDbConnect,
with all the database connection information.
objectId The ID of the item (node) the user’s request is about.
PrgCtx.fUSession The requesting user’s information (userid, username, etc.).
PrgCtx.fDbConnect The database connection information (tablespace, userid, password,
etc.).
query_string The URL request string.
LL Request
Element Handler feature Description
populated
response.error.message fError If defined (with a string), contains an error string and
triggers the display of an Error page containing this
string, prefixed with the contents of fErrorPrefix.
response.error.prefix fErrorPrefix If fError is set and fErrorPrefix contains a string, the
error page will show this string at the top of the
page, followed by the contents of fErrorMessage.
(“Error processing request” is the default.)
response.error.detail fErrorDetail If fError is set and fErrorDetail contains a string, the
error page will display a “Show Details” button,
which when clicked shows the string in a dialog box.
response.filename fDownloadFile If defined, contains the name of a file on the server
to download and triggers the action of downloading
the file.
response.mimeType fDownloadFile If defined, contains the MIME type of the file named
MimeType in fDownloadFile.
response.location fLocation If defined, contains a URL string and triggers a call
to that URL once the request is complete.
response.webscript fHTMLFile If defined, contains the name of a WebLingo file and
triggers the generation of an HTML page based on
this file once the request is complete.
response.data fResponse.data Stores data retrieved during the execution of the
_SubclassExecute() method, for use in the
WebLingo file named in fHTMLfile.
Define a “response”
function Assoc _SubclassExecute( \ assoc for storing results
Object webNode, \
Record request )
Pull elements from the
Assoc response = ._NewResponse() request record that are
Object node = request.node needed for performing
the data transactions
List contents = DAPI.ListSubNodes( node )
Add elements to the
If IsNotError(contents) response.data assoc to
response.data.contents = contents store the data to be used
else in the WebLingo file
response.error.prefix = "Error getting contents"
response.error.message = "Container is empty"
end
Add elements to define
return response response.error.prefix and
end response.error.message
if there is a problem
Figure 12-7: Example WebLingo file for an Action object (see Figure 12-11 for results)
"?func=ll&objId=2402&objAction=browse"
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2402 Budgets 0
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the web
node object
Get the action
to perform
Checkout
Search for an
Action Object
Folder LLNode Object Action object for Features:
Features: that objAction and Reserve
_NodeTypes() method
Action Object
fSubType integer--- 0
_SubclassExecute() method
Features:
_ProtoType() method
_NodeTypes() method
fWebScript
_SubclassExecute() method
fErrorPrefix method
_ProtoType()
If no Action object exists, search fWebScript
for a method of the WebNode
named Action-objActionValue fErrorPrefix
Figure 12-8: How WebNodeCmd objects fit into the ll request handler picture
1. Orphan WebNode:WebNodeRoot:WebNodeCmd ,
and name it to be a class object for all
WebNodeCmd objects in your OSpace. (In our By default, the command is
example, we’re using SuggestionsCommands.) listed under the Function menu of
the node types specified with the
_NodeTypes() method. You can
2. Create a child of the orphan. Give it the same name edit the _CmdTypes() method of
you gave your Action object. the WebNodeCmd object to
specify a different display location
for the command. For example, if
3. Set the new object’s fEnabled feature to True and the method returns { ‘info’ }, the
run your OSpace’s Globals.BuildOSpace() method command displays as a tab on the
to prepare the object for initialization. Info page for the applicable
nodes.
4. Set the following features of the new object:
(continued)
.fPerms = $PSeeContents
Figure 12-11: Result of the “List Items and Author” example command
Browse
WebNodeCmd Object
"?func=ll&objId=2440&objAction=browse"
DTREE Table
DATAID NAME SUBTYPE (etc.)
2401 Erg.doc 144
ll Request Handler 2440 Manual 136
Object
2403 Find the… 208
Features:
2404 Time.xls 144
Execute() method Get the subtype
(etc.)
Find the web
node object
Get the action
to perform
Checkout
Search for an
Action Object
Compound Doc Action object for Features:
LLNode Object that objAction and Browse
node type. _NodeTypes() method
Action Object
Features:
_SubclassExecute() method
Features:
fSubType integer ---0
_ProtoType() method
_NodeTypes() method
fWebScript
_SubclassExecute() method
fErrorPrefix method
_ProtoType()
Since an action object was fWebScript
found, the existing Action-
Browse() method is not used. fErrorPrefix
Compound Doc
WebNode Object
Features:
fSubType integer-----0
Action-Browse() method
Action-Delete() method
Action-Move() method
The folder and other node type objects will continue to use
the off-the-shelf “browse” functionality, but the compound
document will use the Browse functionality you defined.
12.6 Summary
Create a new command for the new contact node. The new command should list the name,
the created date and last modified date of the items within a contact. Have the command
appear in the Function menu of the Info page. Also have this command work for folder nodes
and compound document nodes. When you select the command,
□ 3. SET fEnabled to True, then RUN the BUILDOSPACE() method of your Globals object.
□ 4. If you wish to name your WebLingo file (the one that will display the results of your
new command) anything other than itemsinfo.html, you must STORE that name in the
fWebScript feature.
□ 5. CHANGE the data type of fErrorPrefix to String (in which object will you do this?).
Then SET fErrorPrefix = Error Listing Contents.
□ 6. EDIT _Nodetypes() to return {0, 2002} (the subtypes for folders and contacts).
Include other subtypes if you want this command to be available to them.
□ 7. EDIT _SubclassExecute() to get the contents of the item that the user was viewing
when selecting this command, using the DAPI.ListSubNodes() built-in function.
Example:
dynamic node = request.node
dynamic contents = DAPI.ListSubNodes( node )
□ 9. COMPILE and SAVE _SubClassExecute(), and then SAVE and EXPORT your OSpace.
□ 8. EDIT _Nodetypes()to return {0, 2002} (the subtypes for folders and contacts).
Include other subtypes if you want this command to be available to them.
□ 10.RUN the setup script. (Note: By default, the 0Setup() method’s code is commented
out—be sure to remove the comments.)
□ 1. CREATE an itemsinfo.html file in your module’s html directory. (If you set the
fWebScript feature of your action object, make sure the filename matches.)
□ 2. EDIT the itemsinfo.html file to contain a table that lists the name, creation date, and
modify date of each child of the item. (Hint: Look at the online help for the DAPI
package to see a list of DAPINode attributes. There is an example itemsinfo.html file
at the end of this exercise.)
□ 3. After successfully compiling and saving the WebLingo file, EXIT the Builder and
RESTART it.
□ 4. TEST your work: VISIT the Info page of a folder or a contact that contains children. Is
the “Browse Content Info” command available from the Function menu? Does it work?
itemsinfo.html File:
<html>
<title>Content Information</title>`%L.Styles()`
<body ONLOAD="onLoadFunction()">
;string htmlPrefix = .HTMLPrefix()
;assoc args
; args.Title1 = "<B>Contents Information</B>"
; args.BGColor = "blue"
;;call <htmlPrefix + "commonheader.html">( args )
<table>
;dynamic request = .fRequest
;dynamic contents = .fResponse.data.contents
;DAPInode item
<TR BGCOLOR="#CCCCCC">
<TD>Name</TD>
<TD>Created</TD>
<TD>Last Modified</TD>
</TR>
;for item in contents
<tr>
<td>`item.pName`</td>
<td>`item.pCreateDate`</td>
<td>`item.pModifyDate`</td>
</tr>
;end
</table>
Notes:
These next sections will use two examples to illustrate how and where to begin your
modifications and how to locate methods and built-in functions to override existing Livelink
functionality.
In this section we look at building a recycle-bin or garbage can for deleted documents. This
example shows how to trace through the chain of events of a request handler from beginning
to end.
Section 14 looks at modifying the navigation menus. Here, a different approach is used,
starting with an HTML page and tracing the operations from how the menu is created to
how it is displayed to the user.
You need to see the chain of events Livelink takes in servicing a request. Once you see this,
you want to find the appropriate place(s) to break into that chain.
The head of the chain is always ServerCallback in the APIServer object in the APISRV
OSpace. The other end of the chain is typically the generation of an HTML page.
You ultimately want to break into the chain and insert your
own code in one or more places, so you must find the
appropriate links to break.
You already know one link of the chain: the method where
you set the break on entry. Now you must find the ends of
the chain and the other links between.
ThreadStartup (the new Creates a socket and calls the method DispatchLLServer in
temporary one) the RequestHandlerSubsystem object, which is in the
WEBDSP OSpace. Once complete, it closes the socket and
deletes the thread.
GetItem Uses a simple caching technique where all the request handler
name and pointer pairs are stored in …
fRegistry An assoc containing the names and pointers to all the enabled
request handlers.
ExecuteHandler This is the main routine of the request handler. It calls the
following methods as required.
ExecuteWithLogin If there is no cookie then redirect the user to the login page
telling it to come back here once the user logs in. If the user has a
cookie, ensure it is valid and then call …
If there is a prototype
then ensure the
parameters are okay
GenerateOutput Decides upon the type of output to generate and calls the
appropriate method.
Writing the code for the recycle bin is not really the point
of this example, finding out where to write the code is, and
so we have met our objective.
13.5 Summary
13.7.1 Exercise 1
13.7.2 Exercise 2
Start at any page that has the navigation menus and view
the source.
Scroll through the code until you find something that looks
like it has something to do with the navigation menus. In
this case the JavaScript function looks like a definite
candidate.
;Integer iItemNum
;List menuNames
;Assoc item
;String img = .Img()
;Boolean NetscapeOnMac = $WebLL.WebUtils.MacClient( .fArgs ) &&
!$WebLL.WebUtils.MSIEclient( .fArgs )
;Boolean MSIE = $WebLL.WebUtils.MSIEclient( .fArgs )
;String myLeavePage = ''
;Boolean targetParent = FALSE
;Boolean MacPlatform = $WebLL.WebUtils.MacClient( .fArgs )
;Object sysPrefs = $Kernel.SystemPreferences
;Integer startStaticMenu = 0
;Dynamic leftMenu = undefined
;String lastMenuName = ""
;Integer tdWidth = 4
;Integer width = 100
// if leftMenu
;if ( IsFeature( args, 'LeftMenu' ) && IsDefined( args.LeftMenu ) )
;tdWidth += 1
;end
At the top of the file you can see that GlobalMenu gets the
contents of fArgs to use to determine the type of browser
the user has.
/////////////////////////////
// Main Menu Name Generation
/////////////////////////////
;String theURL
;Integer pos
;String nMenu
;Assoc allMenuItems = $WebLL.LivelinkNavigationCallbackSubsystem.Items( Undefined,
.fArgs )
;Integer lastMenu = 0
///////////////////////////////////////
// Main Menu Generation
////////////////////////////////////////
GlobalMenu.html Continued…
$WebLL.LivelinkNavigationCallbackSubsystem.Items()
$WebLL.LivelinkNavigationCallbackSubsystem.Items()
1. The method first tests to see if fItems is defined. So Take a look at the
it’s really true that the navigation menus are cached, .ForceSetup() method.
as fItems is the cache.
It next sets two elements to the URL and name of this menu
item.
It then sets the items assoc to contain the item_1 assoc, but
notice where inside items it is stored.
item_1.func_url = "?func=personal.settings"
item_1.name = [Home_Label.Settings]
items.( '12' + .NextToolsSection() + Str.ValueToString( 40 ) + ".0" ) = item_1
Remember all the times you set fEnabled = true and ran
BuildOSpace? When did you have to do it? Only when
your object had an __Init method.
It seems clear then that this is the object you should orphan
in your OSpace if you want to add items to the navigation
menus. That is, the object gets registered by the __Init
method when you run BuildOSpace. The Execute method
is run when the navigation menus are built by the
Subsystem items method.
14.10 Summary
Select one of the following exercises. If you have time, do the other.
Using the techniques presented in class discover how the Administration pages are
constructed and create a new Suggestion (or Contacts) Administration section as is shown
below:
The Get Suggestions (Get Contacts) link should work, the Clear Suggestions (Clear
Contacts) can point to your favourite web site.
Extra credit:
Experiment with the placement of your section on the Administration page. Can you put it at
the top of the Administration page? At the bottom?
Modify the Enterprise Workspace pages to add a new column entitled Owner. Then for each
Livelink item in the list view, display the name of the item’s owner in that new column. Do
not sort this column.
Extra credit:
Allow the user to click on the owner’s name and see the information page of that user.
14.12.1 Exercise 1
14.12.2 Exercise 2
2) View the source of this page and search for the name of a Livelink object on the page.
Scroll up and note the HTML comment <!-- File: webnode/browseview.html -->
3) In the Builder, open the file browseview.html and review the code to see how it sets up
the table with column headings and then displays one row for each Livelink item. Set a
break-on-entry.
5) Return to the Builder to the debugger and step through the code noticing how the
contents variable is set and then used in the for loop. Notice that the information you
wish to display is contained in this variable
6) Stop the debugger and make a copy of the browseview.html file before modifying it.
7) Find the code that creates the column headings for the list area of the display and add a
new column with the appropriate name.
8) Find the code in the for loop that creates the row entry for each Livelink item and add a
new column with the appropriate information.
1) Go to any page that allows you to click on a user’s name, for example, the general page
of a document.
2) View the source and note the comment at the top of the file <!-- File:
webnode/infoproperties.html -->
3) Scroll down to the section marked <!-- Created By / Owner --> and review the code.
Notice the ;;call statements to <htmlPrefix + 'douserdialog.html'>
Notes:
At the time of writing, Open Text provides Livelink in US English, French, and German.
This optional section is devoted to explaining how the off-the-shelf Livelink interface is
translated, as well as how to translate your customizations of Livelink. We investigate the
tools available for translation and the methods for using those tools.
Objectives:
By the end of this appendix, you will be able to use XLates to prepare your module for
translation into another language.
Figure A-1: The same page from the German and US English versions of Livelink (Livelink
8.1.5 example)
The translation of a software program is just what you might think: the conversion of its
words, phrases, and sentences in one language to the words, phrases and sentences of another
language. Internationalization is the process of preparing code for translation/localization.
Internationalization is performed only once, whereas localization is performed for every
locale.
Localization includes translation from one language to another, but also includes the
conversion of date formats, monetary units, measurement units and any other changes that
are necessary to conform to the standards of a given locale. Livelink’s off-the-shelf OSpaces
have been internationalized, and Livelink is currently being localized into German and
French, with other languages on the way. Livelink also provides commands and other
functionality for internationalizing your own OSpace objects.
You need to know that it’s there and generally how it works, because it’s an integral part of
the code that you are enhancing and modifying.
Even if you do not need to translate Livelink to another language, you can still make good
use of the internationalization functionality if your task is to change the overall nomenclature
in the Livelink interface to the lexicon of your organization — this is another form of
localization.
My Livelink system will be used by people speaking <language here>. What languages
are available for Livelink?
Livelink 8 has been translated to German, French, and Japanese, and Livelink 9 is in the
process of being translated into these languages.
Can I translate my custom code into one of the languages that Livelink supports?
Yes. This section explains the details. You will also find helpful information in the chapter
concerning Internationalization in the Livelink Builder Developer’s Guide.
Not without help from Open Text. In order to create a Livelink version in another language,
you must acquire special code. If you have a strong need to have Livelink translated to
another language, please contact your Open Text account manager, who can start the ball
rolling for you.
Translated
Figure A-2: Example of a dialog box containing a translated message and buttons
Translated
Figure A-3: Example of a page of the Livelink interface containing translated prompts
Figure A-4: The webwork module directory for a US English installation, showing two
OSpaces and their corresponding XDBs
Livelink provides several tools for facilitating the translation of its interface into other
languages.
How does Livelink manage to use one set of OSpaces for all of the languages to which
it's translated?
Each OSpace has an XDB File for each language into which it is translated. For example, for
the Projects OSpace, “project.oll”, there is a corresponding XDB file for each language,
called “projectUSA.xdb”, “projectFRN.xdb”, etc. (The format of the file name is important
— see A.3.)
XDB stands for “Xlate DataBase” OSpace. An XDB file stores the information required to
translate each string of user text in its OSpace and corresponding HTML files. For each
string, the XDB stores:
• a key identifying the string. This is a component of what you actually see in the script or
HTML file (see Figure A-6).
• the actual text to display, in the correct language
• a comment about the intention of the user text, for the benefit of the translators
This set of information forms an Xlate. The Xlates are organized into groups for easier
management, and the groups in an XDB are given names that become part of the Xlate’s key.
To display the XDB files that are part of your Livelink installation in the Builder, choose
Show XDBs from the Browser menu.
<TR>
<TD NOWRAP COLSPAN="2" BGCOLOR="#CCCCCC">
<FONT SIZE="2" FACE="`[WebDsp_Font.SansSerif]`">
`[WebUser_HTMLLabel.EnterPassword_]`</FONT></TD>
<TD NOWRAP COLSPAN="2"><INPUT TYPE="PASSWORD" NAME="password"
MAXLENGTH="64"></TD>
</TR> XDB Xlate group Xlate key
<TR>
<TD NOWRAP COLSPAN="2" BGCOLOR="#CCCCCC" NOAP>
<FONT SIZE="2" FACE="`[WebDsp_Font.SansSerif]`">
`[WebUser_HTMLLabel.VerifyPassword_]`</FONT></TD>
<TD NOWRAP COLSPAN="2"><INPUT TYPE="PASSWORD" NAME="verify_pw"
MAXLENGTH="64"></TD>
</TR>
Figure A-6: Portion of the HTML file which generates the Add New User page, with Xlates
highlighted
For each page of the Livelink interface, the corresponding HTML file contains not only the
OScript for dynamically generating portions of the page, but also the Xlate keys. XLate keys
are also found in object methods and other features of objects which contribute to the text of
the interface.
When the Open Text developers created the Livelink interface, they first created it in
English. They then used Builder tools to locate all of the strings in the HTML files, scripts,
and features and replace them with Xlates. They even replaced the HTML code for
indicating the fonts and styles to use, because they might need to be changed when
translating (especially into a character set like Kanji).
X?
The letter “x” is an accepted shorthand notation for many things:
• an unknown quantity, for example, x = 2 πr.
• the Greek letter ‘Χ’ (Chi), for example, when it is used as a prefix for Xmas.
• the prefix “trans”, as in Xmitter, Xport, and Xaction — hence Xlate.
Yes it does. Each Xlate group is represented by an object. The Xlate’s “key” is the name of
the feature of an object. The actual translated string is the content of the feature.
You should never attempt to modify Xlate “objects” and “features” through the Browser.
Always use the Edit Xlate window (see Section A.5).
To simplify the process: For the modules you create, you use the Internationalization
Window in the Builder to create XDBs and replace all of your user text with Xlates. Export
each XDB to a text file, give the text file to a translator to translate (or do it yourself), then
import the XDB text file containing the translated Xlates to a new XDB using the Livelink
server for that language. Et voilà!
You need to create an XDB file for each OSpace you are translating. To create an XDB file:
(Of course, if you replace all your user strings with Xlates, you’ll need to create an XDB for
the language you used to create the interface, in addition to XDBs for the languages to which
you want to translate your code.)
You will be replacing portions of your scripts and other code — so the OSpaces you are
changing must be unlocked.
3. From the Internationalization window, choose the “Quoted Strings” radio button, select
an area in which to search from the in dropdown list, and click the Search button.
Livelink lists all of the strings found in the selected area in the lower half of the
Internationalization window. (See A.3.2 for important information concerning
“concatenated strings” vs. “quoted strings”.)
5. If the string is part of a script, choose Xlate Selection from the Script menu. If the string
is stored in a feature, choose Xlate All from the Text menu.
The XDB Search window opens and automatically searches for an existing Xlate for the
string. Any matching Xlates are listed in the lower half of the XDB Search window. If
one or more Xlates are found, you should strongly consider using one of the existing
Xlates. This will make the text in your interface more consistent. Be careful, however, to
consider how the Xlate might be changed over time for the strings it is currently
translating — for example, a string in the “Project_HTMLLabel” group might look nice
for your module today, but it might be changed to something too specific to Projects in
the future.
After you make your decision, here are your options:
• Select a row and click the Replace button to replace the string with the existing
Xlate.
The string is replaced by the “key” for the Xlate, in the format
[OSpace_Group.Xlate].
• Click the New button to create a new Xlate. (See Step 4.)
• Click the Cancel button to cancel the process.
6. If there are no matches, or if you click the New button in the XDB Search window, the
New Xlate window opens.
(a) Select the XDB to which you want to add the Xlate from the XDB dropdown list.
(b) Select the Group in which you want to place the Xlate from the Group dropdown list.
(Or use the New Group button to create a new group if you like.)
The XDBs that ship with Livelink have a practical set of groups, centered around the
logic, functionality, and grammar of the interface. Some of the more common groups
include “ErrMsg” for error messages, “HTMLLabel” for HTML labels, and
“message” for Messages.
(c) Type a key for the Xlate in the Key field. Type or paste the string in its current
language into the Translation field. Enter notes about the purpose of the string in the
Intention field. (See A.3.3 for more information.) Then click the Replace button.
The new Xlate is added to the XDB, and the original string is replaced by the “key”
for the Xlate, in the format [OSpace_Group.Xlate].
The item “Q1 Report” could not be added to the “Reports” Folder.
Das Objekt “Q1 Report” konnte nicht in das Verzeichnis “Reports” eingefugt werden.
The Internationalization window and the Script Editor both provide tools for allowing you to
convert code like this:
"The item " + itemName + "could not be added to the" + folderName + " Folder."
The latter is much more “translatable” into other languages, where the order of the subjects,
objects, etc. may be different. (See Figure A-12.) To assist with this process, the
Internationalization Window allows you to search for Concatenated strings by clicking the
corresponding radio button, selecting the area to search, then clicking the Search button.
You can double-click rows listed in the Internationalization window and convert them to the
better format. You can then select the converted string and make it into an Xlate.
You can also use the Find Next Concatenated String command in the Script Editor’s Script
menu to find concatenated strings when working on a particular script.
For more information about the Str.Format function, see the OScript Language reference
documentation for the Str package.
If you give the string “%1 was %2 for %3” to someone to translate, how are they going to
know what %1, %2, and %3 stand for? You’re going to write some good notes in the
Intentions field for the XLate, that’s how.
For example: If the string for which you’re creating an Xlate is:
The item %1 was stored in the %2 Folder
Your Intention field for the XLate should say something like:
Status message notifying user of successful storage of item.
%1 – item name
%2 – folder name
Step set A.4: Export the current language XDB to a text file.
2. Select an XDB, click OK, then specify a target directory for the text file.
The exported text file is in the form of a tab-delimited text file with four fields: Group,
Key, Translation, and Intention.
3. Give the text file to your translators, and tell them to modify only the Translation field for
each row of the file.
The only field that needs to be translated is the Translation field, as this is the only text
that the users will see. In fact the first 2 fields must not be altered, or the new language
Xlate will not be found. (You may want to import the TXT file into a spreadsheet
program and “write lock” the first two fields.)
4. Create a new XDB for the XDB text file you want to import.
Remember the naming requirement: OSpaceNameCode.XDB
5. Stop the Livelink server in the current language and start the Livelink server in the
language to which you are translating.
Livelink has a separate set of server code for each language, so if you want to run
Livelink in German, you need to have the German installation of Livelink. (If you have a
multi-national organization and would like to have, for example, both English and French
versions of Livelink, you can “point” both installations to the same database, so that there
is one repository of data with two interfaces.)
If you wrote your custom interface in English using an English installation of Livelink,
and you created an XDB for German, you would stop the English installation of Livelink
and start the German installation of Livelink.
6. From the Builder, import a translated XDB text file into its corresponding XDB file by
choosing the Import XDB command from the Internationalization menu of the
Internationalization window.
The Import XDB dialog box displays, listing all of the XDBs into which you can import
an exported XDB file.
7. Select the XDB into which you want to import, then click OK.
The Import XDB file selection dialog box opens, prompting you for the name and
location of the exported XDB file.
Figure A-15: The XDB Search window, locating all occurences of a string
The Open Text developers have already replaced all the user text with Xlates. However, there
are still steps to setting up a new language version of Livelink at the “source” level that
requires the use of a localization “toolkit”. The toolkit is designed for translation houses who
are planning to do a significant project, not for minor translations. If you want to translate
Livelink into another language, contact your Open Text account representative, who can
make the proper contacts for initiating this kind of project.
A.5 I just want to change the wording a bit. Can I do that with
Xlates?
Absolutely. “Translating” can mean translating from Livelink’s more generic terminology to
the specific terminology used in your organization. You can use the XDB Search window to
assist with this kind of work.
10. Enter the string you wish to search for in the Find field. If you want the search to be case
sensitive, or if you want the Xlate’s Translation field to exactly match the string, click the
appropriate checkboxes. Then click the Search button.
The search results are displayed in the table at the bottom of the window. Note that unless
you check the “exact match” checkbox, Livelink tries to assist you by including Xlates
that are a close approximation of the string you entered.
11. Decide which, if any, of the Xlates you want to change. For each Xlate you want to edit,
double-click the row to open it in the Edit Xlate window.
You can modify only the Translation and Intention fields in this window. Pay careful
attention to the Intention field’s contents — it can provide valuable information about the
purpose of the translation, especially as regards any parameters. Close the window to
save your changes.
The Script Editor has a number of useful commands for internationalizing scripts, including Find next
Quoted String, Find next HTML String, Find next Concatenated String, and more. Read about these
commands in the Livelink Builder Developer’s Guide.
<TR>
<TD NOWRAP COLSPAN="2" BGCOLOR="#CCCCCC" NOAP> <FONT SIZE="2"
FACE="`[WebDsp_Font.SansSerif]`"> `[WebUser_HTMLLabel.VerifyPassword_]`
</FONT></TD>
<TD NOWRAP COLSPAN="2"><INPUT TYPE="PASSWORD" NAME="verify_pw"
MAXLENGTH="64"></TD>
</TR>
<TR>
<TD NOWRAP COLSPAN="2" BGCOLOR="#CCCCCC" NOAP><FONT SIZE="2"
FACE="Arial,Helvetica,sans-serif"> Verify Password:</FONT></TD>
<TD NOWRAP COLSPAN="2"><INPUT TYPE="PASSWORD" NAME="verify_pw"
MAXLENGTH="64"></TD>
</TR>
A.6 This is all very nice, but I’m not doing any translating, and I’m
tired of looking at Xlates while doing Builder development. Can
I get rid of them?
You cannot easily eliminate all of the Xlates, but it’s fairly simple to create a “localized”
version of an HTML file that you’re working on:
1. Open the HTML file you want to “localize” in the Script Editor.
A.7 Summary
Livelink’s internationalization functionality makes it simple to use the same Livelink code
for different language versions of Livelink.
You can use the Internationalization technology to translate your custom code into another of
the languages supported by Livelink (which at the time of this writing include US English,
French, and German). You can also use this technology to edit the interface text to match
your organization’s lexicon.
Xlates are language-neutral tags in Livelink scripts, webscripts, and features that are
converted to a particular language at runtime. XDBs are collections of Xlates with their
corresponding translated text. Xlates within an XDB are organized into groups.
To translate new code into another language, you: Create an XDB for each OSpace; replace
all user strings in the code with Xlates; export the XDB to a text file for translation; and
import the text file as a new XDB.
If you want to translate the Livelink off-the-shelf code into another language, you need to
work with Open Text developers to create a new Livelink server language version.
The Internationalization window and the XDB Search window are the two primary tools for
converting user strings to Xlates. The Internationalization window lists strings to be “Xlated”
and provides the interface for creating XDBs and groups within XDBs. The XDB Search
window searches existing XDBs for Xlates containing text you intend to translate.
Remember to refer to the Livelink Builder Developer’s Guide for more information about the
Internationalization tools.
Many organizations, once they have created a new module for Livelink, wish to assist users
in using their new Livelink functionality by adding their own help information to Livelink’s
existing help system. This is a trivial and relatively non time-consuming task in Livelink.
You will need to have a basic knowledge of designing HTML pages (or find someone who
can help you design them) and, of course, the Builder if you are taking on the task of adding
help for your custom Livelink modules.
Objectives:
By the end of this appendix, you will know how to create custom help for your module. In
the process, you will learn how to:
• Inform the module about the help files, so that they are installed when the module is
installed
Discussions |d_main.html
Topics
Replies
Figure B-3: Help interface built from the file in Figure B-2
The TOC.txt file defines the menu items for the left frame
of the Help page and the links to files to display in the right
frame.
<HTML>
<HEAD>
<TITLE>Reply to a Discussion Topic</TITLE>
</HEAD>
<<<SNIP>>>
<p>While the project team coordinator(s), members, and guests can view all
discussion topics and replies, only individuals with the first two roles
can reply to a topic.
<p>To reply to a topic you are currently reading, follow the steps below.
To reply to a topic you have already read and closed, click the link for
the discussion containing the topic to which you want to reply. Then, to
access the complete list of topics on the Discussion page, select All.
From this list, click a topic and then follow the steps below.
<<<SNIP>>>
Link to another help file
<h3><a name="related">Related Topics:</a></h3>
in the same module
<ul>
<li><a href="d_main.html">Discussions</a>
<li><a href="d_mrk_top_rd.html">Mark Topics Read</a>
<li><a href="d_post_top.html">Post a Discussion Topic</a>
<li><a href="d_view_disc.html">View a Discussion</a>
</ul>
<p>To go to a different Livelink page, use the <a href="../go_to.html">Go
to menu</a> or the <a href="../go_to.html#frameset">Livelink Menubar</a>
at any time.
Link to a help file in the
<P>Detailed information is available about using Livelink's <ahelp directory
“core”
href="../using_help.html">online Help</a> and about how to <A
HREF="../navigate.html">navigate</a> through Livelink.
<!-- Footer -->
<P>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<TR>
<TD NOWRAP ALIGN=LEFT VALIGN="MIDDLE" BGCOLOR="#CCCCCC">
<FONT SIZE="0" FACE="Arial, Helvetica, sans-serif"
COLOR="#666666"> Livelink ® Version 8, Copyright © 1995-1999
Open Text Inc. All rights reserved.</FONT></TD>
<TD NOWRAP ALIGN="RIGHT" BGCOLOR="#CCCCCC"><A HREF="#top"><IMG
SRC="../arrowup2.gif" ALT="Top" WIDTH="16" HEIGHT="16"
BORDER="0"></A></TD>
</TR>
</TABLE></BODY></HTML>
You can define relative links within the help HTML files to
link to other help HTML files:
{{'%3support%1','%4%5%1'},{'%3help%1','%4help%1%5%1'}}
[HelpMap]
mapping_6={'LL.Topic.view','d_view_disc.html'}
mapping_5={'LL.Topic.create','d_post_top.html'}
mapping_4={'LL.Reply.view','d_view_disc.html'}
mapping_3={'LL.Reply.create','d_disc_rply.html'}
mapping_2={'LL.Discussion.view','d_view_disc.html'}
mapping_1={'LL.Discussion.create','d_add_disc.html'}
Figure B-7: The [HELPMAP] section of the Discussion module’s INI file
{{'LL.Discussion.create','d_add_disc.html'},
{'LL.Discussion.view','d_view_disc.html'},
{'LL.Reply.create','d_disc_rply.html'},
{'LL.Reply.view','d_view_disc.html'},
{'LL.Topic.create','d_post_top.html'},
B.5 Summary
This appendix lists all of the OSpace objects whose names contain the string “Pkg” or “Util”,
since those strings are a naming convention for objects with handy, reusable features. If there
was a populated Documentation feature, this feature was included as well. We used a script
to get the raw content for this appendix – here is the script:
echo("============================================")
echo("A complete list of all Util and Pkg objects.")
echo("OSpace", str.tab(), str.tab(), "Object")
C.1 Format
OSpace Name
Object Name
“Documentation” if a documentation feature has been overridden
The text in the documentation feature, if the Documentation feature has been overriden
Name of new or overridden feature
The objects are listed in the order in which they were exported from the OSpaces, which is
probably in the order that the OSpaces were opened.
Kernel Kernel
OSpaceUtils FileUtils
Timings MoveRecursive
TimingSub6 MoveOverlay
TimingSub5 Move
TimingSub4 GetTempDir
TimingSub3 FileListRecursive
TimingSub2 DirSeparator
TimingSub1 DeleteRecursive
TimingSub0 DeleteOverlay
Timing Delete
ListOpenOSpaces CreateTempDir
IsOSpace CopyRecursive
IsDescendant CopyOverlay
IsCircular Copy
InitObjects BaseName
ImportObject 0 Test MoveRecursive
GetRequired 0 Test DeleteRecursive
GetOrphans 0 Test CopyRecursive
GetOSpaceRoot
GetOSpaceObjectsWithFeature
GetOSpaceObjects
GetDescendantsWithFeature2
GetDescendantsWithFeature
GetDescendants
Fix Scripts
ExportObject
DescribeObjectInheritance
DependencySort
ChildrenByOSpace
ChildrenByInheritance
AlphaObjects
AllChildren
Kernel Kernel
XlateUtils ResourceUtils
_XlateBuiltinsTest OpenResourceFile
XlateDBs
VerifyAll
Verify Kernel
UnlockXDB ModuleUtils
SetXlation Documentation
SetIntention Module Utils are the place to go to get
SearchDBs things done to a 'generic' module.
OpenXDB
NewXlation This objects contains scripts that can
NewXlateGroup determine if a module's requirements
NewXlateDB (installation pre-req's) are satisfied.
LockXDB
LocalizeString This object contains scripts that can 'file
LocalizeFile install' or file uninstall a module.\
IsXlation _SplitOffVersionNumber
IsXlateDB _OTHome
ImportHTMLString _ListOSpacesForModule
ImportHTMLFile _GetVersionFromPath
GetXlation _GetModulePathHelper
GetXlateGroup RegisterModuleToOSpaceMap
GetIntention OpenInstalledModuleOSpaces
GetDBName OSpacesFromFile
GetDBLanguage MoveBackToStaging
GetDBFromGroup ModuleIniPath
FindQuotedString MarkAsUninstalled
FindHTMLString MarkAsInstalled
FindConcatenatedString ListUpgradableModules
Filter ListUninstalledModules
ExportHTMLString ListUninstallableModules
ExportHTMLFile ListInstalledModules
DeleteXlation ListAlwaysInstalledModules
DeleteIntention IsUninstallable
GetNiceName
GetModuleToOSpaceMap
GetDependencies
FindStagingPath
FindModulePath
FindModuleOSpaces
DescriptionFromFile
DescribeUpgradableModules
DescribeUninstalledModules
DescribeUninstallableModules
DescribeInstalledModules
DependenciesSatisfiedWithout
DependenciesSatisfied
DependenciesFromFile
ClearOSpaceCache
Kernel DBWizAPI
Utils ConnectPkg
fObsoleteAgents OpenLog
fController Disconnect
_Upgrade5040 Connect
StatsReset CloseLog
StatsReport Check
ScheduleUpdate
ScheduleGetByID
ScheduleGet DBWizAPI
ScheduleAdd ExecPkg
Log fTriggerProc
LoadConfigSchedule fStorageProc
Err fDisplayName
DBType UseAccount
ConfigUpdate UpdateUsers
ConfigLoad UpdateSchema
UpdateModule
UpdateLibrary
Kernel UpdateGrants
Utils ProcessScripts
fPathSep ModifyAccount
fController InitDapi
_Upgrade5040 GrantAccess
PathSep DropTriggers
ObtainNotificationStatus DropTables
MessagesTest CreateTriggers
MessagesReport CreateTables
MessagesPurgeByDate CreateAccount
MessagesMaxSeqNo BringUpToDate
MessagesGet
MessagesDeleteAll
Log
InterestsGetSpecific
InterestsGet
InterestsDeleteAll
InterestsDelete
InterestsAdd
GetScriptName
EventAdd
Err
DBWizAPI
VerifyPkg
Documentation
VerifyPkg performs simple SQL queries against a
Livelink database to find any errors in the Livelink
schema or in the storage of Livelink information.
****************************************
HOW TO INSTALL A NEW VERIFICATION OBJECT
****************************************
1) It is highly recommended that you read section 2 before
adding a verification object.
2) Write the SQL statement your verification will use to
check the database table(s).
3) Determine the group to which your new verification
will belong. This should be dictated by the .InitRec()
feature of each verification group. See the description
of .InitRec() in Section 2 for details
IF
there is no suitable group or errorRecArray for your
verification object:
a) Create a new child or orphan of VerifyPkg. The
name will correspond, in most cases, to the
database table being verified.
b) Over-ride the .InitRec() feature. Each field of the
recArray will, in most cases, correspond to a
column name from the table being verified.
c) Over-ride the .DBCols feature. This list contains
the string names of the columns of the table
being verified. Exercise care in this list: the
strings of .DBCols are used to create the SQL statement.
d) Over-ride the .fTableName feature. This string
is the table name used in the construction of the
SQL statement.
*********************************************************
DESCRIPTION OF FEATURES, SCRIPTS, AND LAYOUT IN VERIFYPKG
*********************************************************
It consists of a family of groups, each of which contains
verification objects capable of performing independent
verifications, and each of which returns a recArray of error
information. The general layout is as follows:
DBWizAPI
|
VerifyPkg
| |
VerGroup VerGroup
| |
VerObject(s) VerObject(s)
The following are the current groups and their recArray descriptions as defined
in the .InitRec() features.
'OwnerID',\\
'SegmentID' } )
fWhereClause
fTableName
fGUIText
fExternal
fErrorMsg
fEnabled
fDisplayable
__Init
SetupCursor
InitRec
GetGUIText
FormatCols
Execute
DBCol
DBWizAPI
DBWizAPI FormAPIExecPkg
Utility
CheckExtStorage
DBWizAPI
DSPExecPkg
DBWizAPI
ExecPkg orphan
DBWizAPI
ExecPkg
DBWizAPI
FormExecPkg
DBWizAP
Undelete ExecPkg
DBWizAPI
WFMainExecPkg
DBWizAPI
Rendition ExecPkg
DBWizAPI
SystemObjExecPkg
DBWizAP
WebExpExecPkg
DBWizAPI
ReportExecPkg
DBWizAPI
Polling ExecPkg
LLIApi
NodeUtil
Documentation
Description:
This is a package contains utility methods dealing with DAPI nodes.
Fields:
Refer to the superclass documentation for inherited fields.
Methods:
Refer to the superclass documentation for inherited methods.
IsEditable
GetPath
Node2Rec
UnreservableByID StreamSocketToNode
StreamValToNode StreamNodeToVal
StreamTextToNode StreamNodeToText
StreamNodeToSocket GetUserAttributes
StreamBytesToNode GetUniqueName
RootInfoGet GetSystemAttributes
PreScreenClause GetPath
PermissionsUpgradeToRWD GetNodeTypeName
PermMaskToSee GetAuditAssoc
PermMaskToAssoc FindDapiCtx
PermListToMask CopyAttributes
PermAssocToMask CheckPermissions
Node2Rec CheckName
LocalizeAuditEvent Audit
ListNodesByIDs ApplyPermsToSubNodes
ListNodes AppendPermissionsToRec
IsNameUnique
IsEditable
LLIApi LLIApi
CatPkg DbInfoPkg
ListCategories fStrHideKey
ListAttributes fNeedToWrite
IsIdentifier fCurrLine
GetDefaultValue fConnectInfo
GetAttrValues WriteDbInfo
GetAttrInfo UnmapServerType
FindAttrType SessionRecToList
CreateAttrArray SessionListToStorage
CategoryUpdate SessionListToRec
CategoryDelete SessionListFromStorage
CategoryCreate ReadLine
AttrTypeToDbType ReadInfoPath
AttrRecsProcess ReadDbinfoV3
AnyRequired ReadDbinfoV2
AddAttrRecords ReadDbInfoV1
ReadDbInfo
PutConnectInfo
New
MapServerTypeFromString
MapServerType
GetConnectInfo
GetConnectField
FindRec
DelRec
LLIApi
RecArrayPkg
String2RecArray
String2Rec
Record2List
RecArray2List
Rec2String
Rec2List
NewRecord
MergeSimilarRecArrays
MergeRecArrays
List2Record
List2RecArray
List2Assoc
GetRecordIndex
GetFieldVal
DumpRecord
DumpRecArray
DeleteRecord
CopyRec
ClearFieldValue
CheckField
Assoc2List
AddFieldsToRecord
LLIApi
ReleasePkg
VolumeGetByID
VolumeGet
VolumeCreate
ReleasesGet
ReleasedNodeGet
ReleaseStringGet
ReleaseGet
ReleaseCreate
PreReleaseCheck
MasterNodeGet
DomainIsEnabled
DomainGet
LLIApi DomainDisplayNameGet
UsersPkg DisplayNameFormat
Documentation CheckUserLoginName
Description: CheckTabPerms
The root object of LLIApi ospace. CheckPassword
CheckGroupName
Fields: CheckDomainName
fNameLength - The max length AttributesUpdate
for a user name and group name. Defined AllDomainsGroupNew
as 48. The field can hold up to 64 AllDomainsGroupIDGet
characters. But since we add "( delete ) AllDomainsGroupGet
userId" to the userName or groupName
when we delete a user or group, the actual
name can only be less than 48 characters.
fNameLength LLIApi
fMaxUsersInGroup AdminPkg
fMaxUsers UserCreated
fDefaultPWExpirationDate Documentation
fChangePWAtFirstLoginDate Description:
UsersNumGet Deprecated.\
UsersList
UserUpdate
UserNew LLIApi
UserLogout QueryPkg
UserLogin TextQueryAssocGet
UserDisplayNamesAdd QueryAssocGet
UserDisplayNameGet
UserDelete
UserChange
UpdateAdminCookie
PrivsMaskToAssoc
PrivsAssocToMask
PasswordExpirationEnabled
PWDExpireDaysGet
NewUserExpirationDateGet
NameXlateGet
NameXlateAdd
NameGetByID
MyPublicGroupsGet
IsEditable
IsDeleted
IsDefaultGroup
GroupsList
GroupUpdate
GroupNumUsers
GroupNew
GroupDelete
GetUserById
GetAdminCookie
ExpandGroup
DomainUpdate
DomainSystemNameUpdate
DomainSystemNameGet
DomainNew
LLIApi LLIApi
FormatPkg FactoryUtil
fTimeZones LoadDB
fDefFormat Load
fDefDisplayFormat IsCreatable
ValToString Delete
ToIdentifier Add
ToByteString
TestStringToDate
StringToVal LLIApi
StringToDate NewsUtil
StringItemsGet GetSources
StrChangeAll GetNews
RealToPercentage
IsIdentifier
HTMLifyText
GetValue
GetTimeZones
GetTimeZoneByNumber
GetTimeFormat
GetIDsClause
GetIDClauses
GetErrDisplayDate
GetDateFormat
FormatMacroField
FormatDate
DateToList
DateFormatInit
ConvertToSeconds
ConvertFromSeconds
0SetupTimeZone
LLIApi
CacheUtil
_Write
_ObjectDate
_GetObjectDate
_Delete
Update
Touch
New
Load
Delete
Cleanup
0 Test1
Documentation
This package is used to maintain a cache of objects (values) in the
database .. the objects are identified by a unique id .. they are
date stamped when created and when updated .. a method can be called
to clean the cache (stuff older than a certain number of days)
Note that the field ObjectDate contains the expiration date of the
cached object and is undefined if the object should not be flushed
from the cache by the cleanup routines.
commit
/
Modifications:
JEM 1999.03 Modified CacheUtil to allow an update to keep the existing
ObjectDate field instead of forcing new one
LLIApi LLIApi
AuthentPkg XMLUtil
LivelinkAuthentication fZeroOrOne
GetUserName fZeroOrMore
GetHiddenPassword fOneOrMore
AuthenticationMethod fLLSystemID
Documentation fLLRootElementVersion
Description: fLLRootElement
This is a container for scripts that fLLPublicID
deal with authentication in Livelink. fISODateFormat
fEmpty
fCharacterData
LLIApi fAttValueFixed
DAPIExtraPkg fAttStringType
fEnabled fAttRequired
fApplTypes fAttNoDefault
CBVersionDelete fAttNameToken
CBDelete fAttID
fAttEntity
LLIApi fAny
AttrUtil Parens
Documentation NotationPublicId
Description: LivelinkDTDFilename
This object AttrUtil contains LivelinkDTD
utility script for the CreateSchemaNotation
complex attribute CreateSchemaElement
implementation.\ CreateSchemaAttribute
UpgradeNodes CreateIDAttribute
TextToValidValues AttNotationType
NumNodesOutdated
GetValuesForIndexing LLPatch
GetDefByID Utils
GetDefAssocByID Sort
GetAttrsForSearch Patch
GetAttrDataWithSourceOption Dump
GenerateMappingRecords
FieldNameToSpec
DumpDefinitions WebDsp
DumpData HTMLPkg
AttrGroupCurrVerGet fButtonBar
AttrDefReferences RemoveDocumentStructureElements
AttrDefIsUsed MailtoAddressSeparator
AttrDefGet ImagePrefix
AttrDefCheckRequired FmtURL
FmtPopupItems
FmtDueDate
FmtDate
ContainsHTML
ArgsToURL
WebDsp
MIMETypePkg
Documentation
Description:
MIMETypePkg defines an object which provides MIME type-
related services. These services include: managing MIME
type to file extension, MIME type to AutoRec type, and GIF
to MIME type mappings, AutoRec-ing a file upload's MIME
type, and determining a version's MIME type.
Data Members:
Assoc .fAutoRecMIMETypes
AutoRec type to MIME type mappings.
String .fDefaultMIMEType
The default MIME type.
Assoc .fFileExtMIMETypes
File extension to MIME type mappings.
String .fFilenameAutoRecTypes
MIME type to AutoRec type mapping textfile name
(currently autorec.types).
String .fFilenameMIMEGIFs
GIF filename to MIME type mapping textfile name
(currently mime.gifs).
String .fFilenameMIMETypes
MIME type to file extension mapping textfile name
(currently mime.types).
Assoc .fMIMETypeFileExts
MIME type to file extension(s) mappings.
Assoc .fMIMETypeGIFs
MIME type to GIF filename mappings.
String .fMIMETypeGIFsDefault
Used to set fMIMETypeGIFs' default item.
List .fMIMETypes
Available MIME types.
Modifications:
DJW 11/06/97 Initial version.
DJW 12/10/97 Added .GetAutoRecMIMETypes().fMIMETypes
fMIMETypeGIFsDefault
fMIMETypeGIFs
fMIMETypeFileExts
fFilenameMIMETypes
fFilenameMIMEGIFs
fFilenameAutoRecTypes
fFileExtMIMETypes
fDefaultMIMEType
fAutoRecMIMETypes
__Init
_SetMIMETypes
_SetMIMETypeGIFs
_SetAutoRecMIMETypes
IsInMIMETypeList
GetMIMETypes
GetMIMETypeGIF
GetMIMETypeFileExts
GetMIMETypeFileExt
GetFileExtMIMEType
GetDefaultMIMEType
GetAutoRecMIMETypes
GetAutoRecMIMEType
FindFile
AutoRecMIMEType
WebDsp WebDsp
WebModuleUtils WebTimingsPkg
SupportPath Documentation
SetupUrl Description:
RemoveLineFromHTML WebTimingsPkg defines an
QueryStringFromIniFile object which provides web request
GetModuleDocPath timing services.
GetDocPath
FindHTMLFile Data Members:
FileNameBuilder Assoc .fTimingData
AddLineToHTML Collection of the
provided timing data.
fTimingData
WebDsp fLineCount
RequestHandlerUtils fCSVLogFile
Documentation __Init
Description:
ResetTimingData
This object is just a container for
OutputCSVEntry
functions that relate to request handlers
MergeTimingData
GetTimingDataTypes
Data Members:
GetTimingData
fRequestHandlerGrandPa
GenerateSummaryTimings
Object ref points to the first ever
DeleteTimingData
request handler (private)
AddTimingData
Modifications:
WJM Sept 26, 1997
First Version.
fRequestHandlerGrandPa
SetContentRH
ServiceString
ListRHsInThisOSpace
IsKindOfRequestHandler
WebLL IndexObject
WebUtils UpdateUtils
fMenu fStopIniKeyword
UserGifTags fIniSection
UserGifTag fIniKeyword
UserGifAltTag fExcludedMimeTypesSection
UserGif fCookiePrefName
UnixClient StopExtraction
TextToNumber Setup
SortIndicatorGet SetLogin
SetTargetBrowseCookie SetLastUpdate
SetCookie ReIndex
NoJavaInHTML IsStopExtraction
NoFunctionPopup IsPrefValueDefined
NetscapeClient IsMimeTypeExcluded
NavJavaEnabled GetLogin
NavAllowOverride GetLastUpdate
MacClient DeleteLastUpdate
MSIEClient ClearStopExtraction
GetUserLinkInfo AddEvent
GetMenu
GetCookie
EditUserGifTag IndexObject
DisplayStylesGet IndexObjectUtils
AddMenu fIndexTimeFormat
fIndexDateFormat
MetaString
IndexObject IndexTimeToString
RegionUtils IndexDateToString
fRegionAssoc
fIniSection
fIniKeyWord IndexObject
__Init VerifyUtils
UpdateRegions fStatusIniKeyword
SaveRegionAssoc fLogFileName
IsRegionUndefined fIniSection
IsRegionDefined StatusSet
GetRegionAssoc Status
DeleteAllRegions LogWrite
DefineRegion LogClear
GetLogFileName
IndexObject
CorrectIndexUtils
fStatusIniKeyword
fLogFileName
WebAdmin Hh
AdminUtils HHUtils
fINSOTemplateHTML fObjName
WriteOT6Config fExcludedMimeTypes
SortNodeTypes fDefaultValue
SetSysCookie _PutDataToDB
SetDBInfo _GetDataFromDB
ResyncAll PutDataToDB
ProviderInfo IsBrowserViewable
GetNodeAuditEvents HHDoc
GenerateINSOTemplate HHBuffer
GetFilteredContent
GetExcludedMimeTypes
WebAdmin GetDataFromDB
WebStatusPkg ExpandQuery
Update 0 test
Setup
APIExplorer
Inbox APIExplorerUtils
InboxUtil GetRegisteredSubtypeExtension
fStatusPending _Test
fStatusOnHold RegisterExplorerType
fStatusIssue IsCompoundDocSubtype
fStatusInProcess GetRegisteredSubtype
fStatusCompleted GetExplorerTypeRegistry
fStatusCancelled _InitializeFeatures
ValueToStatusStr
ValueToStatus
ValueToPriorityStr
ValueToPriority
ValueToDueDate
StatusStrToValue
PriorityStrToValue
IsActiveExpression
CodesStatus
CodesPriority
Hh
DocFetcherUtils
GetURLContent
GetDocToDisk
CreateBroker
CheckNodes
SupSearch CheckFileNameForBadChars
SearchUtils BSlashToFSlash
fLibrarySearchEngines
fLibraryIndex
fLibraryIPool SupSearch
fLibrary ScriptUtils
fHelpIndex SpiderCreation
fHelp SearchManagerCreation
fAdminHelpIndex SearchCreation
fAdminHelp ProducerCreation
UpdateSearchEnginesList IntermediateCreation
StopIPool IndexUpdateCreation
StartIPool FilterCreation
SetPermissions EnterpriseExtractorCreation
RemoveQuotesFromPath DataFlowCreation
RemoveLastSlash ConsumerCreation
PortValidation
NameValidation
IsValidURL SupSearch
HelpDataSourceInitialControlRules CacheUtils
GetPorts fEnabled
GetOrphanedSlices fDefaultNumEntries
GetIndexObjs fCacheDateTime
GetDirFromFilePath fCache
GetDataFlowParameters __Init
GetBrokerObjs _BuildKey
FSlashToBSlash SetEntryValues
EnterpriseDataSourceInitialControlRules SetData
CreateThis GetNumberofObjects
CreateSearchManager GetEntryValue
CreateSearch GetDefaultValue
CreateProcess GetData
CreateLibraryExtraction DeleteData
CreateIPool 0 EchoCache
CreateBrokerAlias
SupSearch
DAPIExtraPkg
Documentation
All of the functions in this package return an assoc
Parameters
Returns
ok = TRUE|FALSE
errMsg = Error String
_GetVersionID
Get
Delete
Add
Sovmgmt Websovmgmt
Utils DataFlowRuleUtils
fSOVtempFileName _RuleString5
fSOVAlertDirectory _RuleString4
fSMTPMailtemplateHTML _RuleString3
fPendingOperations _RuleString2
fMailConfig _RuleString1
_MailMessage _CreateReportString
_GetTimeStatus _CreateActionString
_GetRules _CreateActionAndReportString
_GetMessages CreateUserPrintableRuleString
_GetMailFileName CreateRuleAltTagString
_GetEmailAddress
_GenerateUserMessage
_GenerateUsageTable Distributedsupport
_GenerateSummaryMailMessage Utils
_GenerateHTMLMailMessage GetORB
_GenerateCompleteMessageList GetBOA
_GenerateBackupMailMessage
_GenerateASCIIMailMessage Distributedsupport
TestSOVMailMessage PrivateUtils
SetTimeStatus CopyORB
SetMsgsSeen
SetMailConfig
ResetSOVManagement Formapi
RemoveIBRNotificationInstanceRule FormTemplatePkg
GetTimeStatus _UpgradeValueTemplate
GetMsgTypeList _LoadTemplateInfo
GetMessages _GetInfoFromRendition
GetMailConfig _FlattenSchema
GetIBRNotificationInstanceRules VerifyTableSchema
GetCustomMessages ValidateTemplateView
GetCompleteListOfMessages ValidateTemplate
DoPendingOperation UpgradeFormData
DoMailMessage UpdateTableSchema
ConvertUsers TemplateNodeFromID
ClearPendingOperation TemplateNodeFromFormNode
ClearMsgLine SetTemplateSQLTableName
ClearAllMessages NewSchema
AddPendingOperation ListViews
AddMsgLine GetTemplateSQLTableName
AddInstanceRule GetTemplateFieldList
AddCustomLine GetTemplateFieldInfo
fMailOffline GetAllTemplateInfo
FlattenData
CreateSQLTable
ConvertDefaults
BackMapSchema
AddField
Formapi Formapi
FormRevisablePkg FormSubmitPkg
fTemplateWritePerms fTemplateWritePerms
fTemplateReadPerms fTemplateReadPerms
fTemplateDeletePerms fTemplateDeletePerms
fSubType fSubType
fRequiresNode fObjectFactory
fObjectFactory fName
fName fIsDataModifiable
fFormWritePerms fIsDataListable
fFormReadPerms fFormWritePerms
fFormDeletePerms fFormReadPerms
fFlags fFormDeletePerms
fEnabled fFlags
__Init fEnabled
SaveNonFormData __Init
SaveData SubmitData
PurgeData MoveData
MoveData MechRightsUpdate
MechRightsUpdate MechRightUpdate
MechRightUpdate MechRightDelete
MechRightDelete MechRightAdd
MechRightAdd LoadData
LoadNonFormData ListData
LoadData IsModifiable
InitStorage IsListable
GetSubmitDispatchArgs InitSubmitArchive
GetFlags GetSubmitDispatchArgs
GetFlag GetFlags
FactoryType GetFlag
FactoryName FactoryType
DeleteAllNonFormData FactoryName
DeleteAllData DeleteOneData
CreatePre DeleteAllData
CopyData CreatePre
0 Setup CopyData
0 Setup
Formapi
FormUtil
fMinorVer
fMajorVer
ToIdentifier
StreamValToNodeVersion
SetDataFromFlatData
IsIdentifier
GetAttrToParentAssoc
DeepCopy
CreateRendition
Formapi
WFFormSubmitPkg
Formapi
FormViewPkg
fSubType Formapi
fName HTMLFormViewPkg
fEnabled fSubType
fAddableToTemplate fName
fAddableAsTemplate fEnabled
__Init fAddableToTemplate
NodeAddVersionSubclassPre
NodeAddVersionSubclassPost
NodeAddVersionSubclass
AddViewToTemplate
WF
WAPIPkg GetStatusSortPref
fErrorMsg GetStatusPagingPref
XLateStatus GetStatusListStepName
XLateAuditInfo GetStatusListRows
UpdateWorkflowMap GetStatusListRelation
TestCondValues GetStatusKindPref
StartWF GetStatusExprPref
SetWorkUserData GetStatusCondInfo
SetWorkDataPackage GetStatus
SetWFStatus GetProxyPref
SetTaskDoneData GetPagePref
SetSubWorkReturnData GetMapStatusInfo
SetSubWorkData GetInitiatorID
SetStatusTypePref GetGroupDispoChoice
SetStatusSortPref GetExpandGroupData
SetStatusPagingPref GetEvaluateData
SetStatusNoArchiveExprPref GetDispositionData
SetStatusKindPref GetAuditRec
SetStatusArchiveExprPref GetAuditPref
SetProxyPref GenericCB
SetPagePref FinishTask
SetExpandGroupData Expand
SetAuditPref EvaluateCondition
SetAdvancedPerformer DeleteWorkPackages
SaveWork DeleteDispositions
SaveSubMap CustomStartWF
SaveDisposition CustomCB
ReplaceVariable CreateWorkPackage
RemoveWorkDataPackage CheckWrkPkgTaskDone
LoadWorkPkgRec CheckWFPermissions
LoadWorkData CheckTaskAssignedToUser
LoadUpdateMap AddWorkDataPackage
LoadSubMap AddIndexNotifyRow
IsNotificationEnabled AddAuditData
HasByPassPerm AcceptTask
GetWorkPackages 0Documentation
GetWFStatusList
GetWFPermissions
GetTodoList
GetStatusTypePref
WF DropTaskRecord
MapStoragePkg DropLinkRecord
SaveMap CreateWorkPkgRec
LoadMap CreateWFPermissionRecArray
IsTempStorage CreateTasksRec
GetMapFromTempHolder CreateModificationMap
GetHolderName CreateMapRec
GetHolderByID CreateMapInfoRec
CreateTempHolder CreateMap
CheckEditable CreateLinksRec
0Documentation CreateAttribRec
CleanupPkgsAfterModify
AddLinkRecord
WF 0Documentation
WFMapPkg
fVerNumMinor
fVerNumMajor WF
_WillLoopbackBeSelfContained WFCustomScriptPkg
_IsStepInLoopbackBlock __Init
_DoesLinkCauseLoopback StartWF
VerifyMapDefinition CBExecute
VFMakeNewFreshMap 0Documentation
VFDeletePackage
VFAddPackage
VFAddNewTask WF
UpdateMapDefinition AdvancedPerformerPkg
_SetSubMapID
UpdateEvaluateData
SyncUserIDsInMapDef _SendToAllUsers
SyncTaskWorkPackages VerifyDefinition
SetToSameUser
SetSubMapCallbacks
SetPackagesVersionInfo SetToMultiUsers
SetMapTempStorage SetToAttrUsers
EvaluateUser
SetMapCallbacks
SaveMapPackages
SaveMap WF
RemoveCBInfoType WFUtils
ReadyWMapRec UpdateV8ToV9SubMapTask
ReadyTasksRec UpdateV8ToV9Attributes
ReadyPkgsForModify UpdateTaskCallback
ReadyLinksRec UpdateSubMapDataInfo
PrepareWorkPackage UpdateOperator
PrepareMapData UpdateMapCallback
PrepareLinkCache UpdateFormFieldInfo
LoadMap UpdateConjunction
IsLinkValid UpdateConditionalInfo
GetWFTypes
GetWFRoleTypes
GetWFDataTypes
GetValidEvents
GetObjectScripts
GetNewTaskRec
GetMapData
GetAllDispositionInfo
GetAllConditionalInfo
FormatPainterIconData
DropUserIDsFromMapDef
otadmin
Utils
WF fSingle
XMLICCustomScriptPkg fAdminActionSection
fAdminActionKeyword
WebNode StartAdminActionTransaction
WebNodeUtils HTTPServerURL
Documentation GetDeselectFileName
Description: EndAdminActionTransaction
WebNodeUtils defines a class DeselectDBPre
which contains WebNode utility DeselectDB
functions. DeleteSetupPrefs
Data Members:
WebOTCIndex
None.
WebOTCIndexUtils
Space2NoSpace
Modifications:
GetSystemVolumeFolders
DJW 09/97 Initial version.
GetLibraryNode
RetrieveTree CreateFolder
NodeToWebNode
ModifiedIMG
GetRightName WebOTCIndex
GetRightIcon FindSimiliarUtils
GetRightIMGs fObjName
GetRightIMG fDefaultValue
GetRightGIF _PutStatsToDB
_GetStatsFromDB
PutStatsToDB
Home GetStatsFromDB
HomeUtils
Remove
GetTickerData sbroker
GetFavoritesData Util
Get fNewBrokers
Add StoreSearchData
SearchLogNewSearch
SearchLog
Home QueryWhereFromTemplate
TabsUtil QueryWhere
ManageTasks QueryOTSQLFromTemplate
ManageStatus
QueryMerge
ManageProjects QueryFromTemplate
ManageNews PutSearchData
ManageFavorites
MergeSearchResults
DefaultTabs GetSlicesFromTemplate
Add GetSearchDataFromID
GetSearchData
Channel GetCollections
ChannelUtils FixSavedQueries
ViewAllChannels DeleteSearchTemplates
UpdateNewsCount CreateSearchLog
ManageMyChannels Convert
GetWriteableChannels ApplyQueryKids
GetReadableChannels AppendLocation
GetChannels
sbrokerweb sbrokerweb
BrokerUtil AttributeUtil
searchFormUpdate _ItemLQLWhereConnect
UpdateAttrList WriteNewAttrList
TurnOnComponents WriteAttrList
Truncation UpdateNewAttrList
Template ProcessCategoryArgs
SortColumns PrefixOTToRegion
SetVirtureSysAttributes ModifierMapping
SetBrokerParameters ListCatAttributes
SearchForm GetWidgetCommand
ResetAttributes GetWhereFromAttrList
RecArray2AssocList GetSearchWidgetList
ProcessArgs GetSearchWidgetByName
NewSearch GetSearchWidget
MergeOTSQL GetOTSFromNewAttributes
ListAllAttributes GetOTSFromAttributes
GetWhereFromArgs GetNewAttrTableFieldNames
GetVirtureSysAttributes GetLQLFromItemDate
GetSystemSearchObjs GetLQLFromItem
GetSystemDefDsp GetFulltextWidget
GetSystemBrokers GetFilteredAttributes
GetSysAttributeByName GetAttrsForSearch
GetSlicesFromArgs GetAttributeTable
GetSearchModeInOrder GetAttrTableFieldNames
GetResults ConvertTemplate
GetObjectTypes CategoryExist
GetOTSQLWhere
GetModifiersName
GetLibraryBroker sbrokerweb
GetFieldNames TemplateUtil
GetDspOptsFromNode WriteTemplate
GetDisplayName UpdateTemplate
GetDefDspOpts Template
GetDate SetDefaultTemplate
GetComponentsInOrder SaveTemplate
GetCategories SaveAsTemplate
GetBrokers NewSearchFromTemplate
GetAttributeByName2 HardCodedSystemDefTemplate
GetAttributeByName GetUserTemplateFolderNode
GetAllSearchObjs GetTemplateList
DisplayOption GetSystemDefTemplate
ConstructRegions GetSearchTemplateNode
BrokerDefDspRegion GetSearchBarDefTemplate
AssocList2RecArray GetReadableTemplates
ApplyQuery GetPSTFolderNode
AddToOtherSection GetAdminTemplateNode
AddSynthetic DefTemplate
CreateUserTemplateFolder
CreateSearchTemplateNode
sbrokerweb SystemObj
RegionUtil BackupUtil
GetAllQueryRegions UpdateRestoreFile
GetAllDisplayRegions SetConfigFile
ReadRestoreFile
ReadHistoryFile
sbrokerweb MakeRestoreTable
ButtonUtil MakeHistoryTable
GetButtonsInOrder IsEnterpriseDataSrc
GetRemoteFile
SystemObj GetIndexPath
Utils GetBCMFromDataSource
ReadFileContents DeleteConfigFile
PrintAssoc CreateRestoreFile
GetProcessTermination CreateProcess
ArgsToAssoc CreateConfigFile
CreateConfigAssoc
CleanupManagerProcesses
SystemObj BuildCompleteLabel
DBUpgradePkg AddEnterpriseReExtraction
UpdateSysTemplateFolderType
UpdateDefaultRegionsOnEnterprise
RenameFilterToOTDocCnv SystemObj
PutTextToNode ConfigFileUtils
MoveRegionMapToVersData SetConfigFile
HardCodedSystemDefTemplate MoveConfigFile
GetTextFromNode CreateConfigFile
CreatePersonalTemplateFolderNew
CreatePersonalTemplateFolder Report
AddQLToKeywords ReportUtils
ReadImportFile
SystemObj ImportString
TagPkg GetObjectPrompt
RemoveTaggedRegion GetMenuItems
RemoveItalicTags GetInvMenuItems
GenerateSubstitutionString
GenerateBindings
ExportReports
AddSQLArg
Dirwalk
Utils
DirWalkerCreation
DirWalkerCleanup
DWErrorHandler
CreateDirWalker
Xmlactivator Themes
Utils ThemesUtils
fName test
XMLActivatorCreation reverseAssocOrder
SetConfigFile fkey
MetadataValidation fDefaultThemeSettings
GetInfo ThemesDate
CreateXMLActivator SplitTerms
PutThemesSettings
MakeGraph
NLQSearc GetThemesSettings
NLQutils GetThemesInfoFromResults
ProcessNLQ GetStatsFromResults
GetHotWords GetRating
GetPlateau
Summarizer GetOriginalQuery
SumUtils GetMyThemes
fObjName GetClustersAndPhrasesFromList
_PutDataToDB GetClusterSeeds
_GetDataFromDB FormatTopic
PutDataToDB FormatLocationNameURL
HighlightOffsets FormatLocationName
Highlight DateWhere
GetDataFromDB DateName
DateCategory
CullPhrases
ClusterList
AddRegionToSelect
AddNames
0 Setup
Formwfapi Task
FormWFUtils TaskListUtils
UpdateSubmapData _TasksGet
_TaskInfoSet
_ResourcesDetailSet
XMLDSP _MilestonesDetailSet
Utils _AssigneesGet
SaveErrorLogFile UpdateTaskListCount
QDEcho TaskSubTypeClause
MakeTempFile TaskListSummary
GetRelayLock TaskListAttachmentAssoc
DOMToFile ResourcesDetail
CompactInt RemoveMilestoneReferences
MilestonesDetail
WebDoc MilestoneInfo
WebDocUtils ManageMyTasklists
VStreamToWeb LengthDays
UpdateAttr GetWriteableTaskLists
Space2UnderScore GetTaskLists
SetupAttribs GetTaskListMenu
NodeToWeb GetTaskListInfo
NodeToView GetReadableTaskLists
ManageMyReservedItems GetMilestones
GetVersionMIMEType ClauseTaskMilestone
GetName ClauseTaskAttachment
GetHits ClauseTaskAndGroupSubType
GetFileUploadName AttachmentRecArray
GetFileUploadInfo AssigneeDetail
GetDownloadFileName
CreateQueryString Project
CreateFileUploadVersion ProjectUtils
CreateFileUploadDocument ManageMyProjects
BadChar2UnderScore MailToURL
AutoRec GetReadableProjects
GetMenu
WebUser
WebUserPkg
UGSearchPrototype
UGSearchDomainPopup
ManageMyGroups
GroupCount
GetSortString
GetGroupEmail
FormatFullName
FormatDisplayName
ExecuteUserSearch
Documentation
Discussion
TopicPkg
Documentation
Description:
The package contains methods that supports Livelink discussion.
A discussion and all its items do not have permissions set. The
access permissions is actually based on the permissions of the
discussion. Every nodes in the discussion volume have PermID
defined to the discussion's DataID.
This package supports the read items list for a user of a discussion.
The read list is in the form:
The read list or a deleted list will be compacted when more items
are read and more items are deleted.
Fields:
Refer to the superclass documentation for inherited fields.
Methods:
Refer to the superclass documentation for inherited methods.
OTCIndex Webform
Utils WebFormPkg
UpdateRegionMap _IsNotError
SetDictionaries _GetTemplateNode
GetMechLists
EditFormData
OTCIndex
PermissionObjectHandlerUtils
Workflow Webform
AdminIndexPkg
fEnabled
WebAttribute __Init
WebAttributeUtils GetSectionInfo
GetCategoryNamesFromNode
GetCategoryNames
Webform
LivelinkIndexPkg
Webxmlactivator fEnabled
Utils __Init
ParseFormUtil GetSectionInfo
TextEdit Webform
TextEditUtils WebSubmitPkg
GetEditableMimeTypes fSubType
fHTMLCreateStationery
Undelete fHTMLCreate
UndeleteUtils fEnabled
fPurgeStatusIniKeyword __Init
fIniSection SubmitData
fExcludedSubtypeIniKeyword Name
SetDefaultIniSettings GetArgsFromRequest
SaveDeletedData GetAPIObj
PurgeStatusSet Create2
PurgeStatus
PurgeDeletedDocsTable Webform
IsSubTypeExcluded WebStoragePkg
GetOriginalPath fSubType
GetNodeDeletedDocVol fHTMLCreateStationery
GetDeletedData fHTMLCreate
DBUpgradeMSSQL fEnabled
__Init
Undelete Name
LogUtils GetAPIObj
LogWrite Create2
LogClear
GetLogFileName
Rendition
RenditionUtils
Webform QueueAgain
WebFormViewPkg LogErrors
fSubType
LoadQueue
fMustRedirect LoadPrefs
fHelpKey EnQueue
fHTMLFile
DeQueueBySeq
fHTMLAddVersion DeQueueByID
fFrameFriendly
fEnabled
__Init WebWork
_SubclassCreatePre WFPkg
_SubclassCreateIsCreatable StartWorkflow
_SubclassCreate2Pre SetURLArg
_SubclassCreate SetTaskIDArg
_AddVersion2 SetPaneIndexArg
ValuesFromRequest SetNewStatusArg
UpdateRequestParams SaveMap
URLCreate LoadMap
RedirectAfterSave GetStatusPageInfo
Name GetStatusLocationList
IsFrameFriendly GetStatusIcon
GetSubmitDispatchArgs GetStatusDisplayUserSettings
GetStandardExtendedData GetStatusDisplaySortOrder
GetRedirectLocation GetStatusDisplayKind
DisplayForm GetStatusDisplayInfo
AddVersionInfo GetStatusColor
GetStartTaskData
GetSortInfo
Webform GetNextTask
ExtDataPkg GetMapName
fEnabled
GetHeaderTypeArgs
__Init GetDefaultDisplay
AddExtendedData GetAllStatusIcons
GetAllPainterInfo
Webform CheckTaskAssignee
WFWebSubmitPkg AddStatusSortInfo
Webform WebWork
HFormViewPkg StatusPkg
_UpdateFormSchema GetWhereClause
_SendFormDownWire GetNameTypes
_ParseArgsForFormData GetInitiatorTypes
_GetViewPath GetExecuteStatusTypes
_GetViewDirPath GetDateTypes
_GetView GetAllStatusInfo
fSubType GenerateWhereClause
fMustRedirect
fEnabled
ValuesFromRequest
RedirectAfterSave
DisplayForm
Main
TextFindUtil
WebWFP ReplaceAllText
WFPkg Replace
StoreCallbackData
FindText
SetURLDirtyFlag FindAgain
SavePaintedMap Find
SaveMap
LoadMap
IsMapDirty Builder
GetPropertiesPageInfo Builder Utils
GetPerformer
GetNavMenuItems
GetMapLocationInfo Builder
GetEventData Path Utils
GetCallbackFields StoreValue
ReadOnly
OpDefinitions
WebFormwf MakeGlobalPath
WFPkg MakeFeaturePath
SaveFormData MakeExprPath
GetWorkflowExtendedData MakeDebuggerPath
GetFormEditData IsValid
GetExtendedFormData IsExpandable
GetValue
GetName
XMLWFIC GetElements
WFUtils GeneratePathName
XMLToPackages
SetTargetStates
SendToTargets Builder
SendFinishCheck Utilities
QDDepth SystemFeatures
PrepareTargets Post
PackagesToXML NewOSpaceSetup
GetTargetStates NewOSpace
ExtractTargetStates MoveObject
CreateStringHash MoveFeatures
ImportObject
ImportOSpace
Main GlobalsParent
Dialog Utils ExportObject
YesNo ExportOSpace
SaveChanges DeleteObjectAndChildren
Notify
CopyObject
Error CopyFeatures
Confirm
Ask
Action object Used to add new or override existing commands for node types.
ApplType A group of node types. ApplTypes are used to identify a group of node
types at once, for example, when naming the node types which can be
used as the parent or child of a given node type.
Child object An object directly below another object in an object tree, which
inherits features from its parent.
Class object An object containing some base functionality that is reused and
augmented by the children of that object, which children are often
called subclasses.
DTree table A table in the Livelink schema that stores one record for every
DAPINode.
ExtendedData column A column in the DTree table which can store custom data for a node.
fCmdNames feature A feature of each WebNode object that maintains a list of commands
that can be performed against the node type. The URLs for these
commands are stored in WebNodeCmd objects.
fCmdNamesInfo feature A feature of each WebNode object that maintains a list of tab
names that appear on the Info page for nodes of the type defined by the
WebNode.
Feature A value (string, number, recArray, method, etc.), given a name and
stored as a component of an object. Features are dynamically typed in
Livelink, which means that you can store a string in them one moment,
and a date the next moment.
fPrototype feature A list feature for request handler and WebNode objects that defines the
input parameters for calls to the object.
Globals object An object which stores references to all features which should be
accessed globally using the syntax $GlobalName.featureName. Every
OSpace contains one Globals object.
Inherited feature A feature inherited from the parent that has not been modified in the
object.
ll request handler The request handler that processes most actions against Livelink items.
Localization The process of translating the user interface text from one language to
another.
New feature A new feature for this object that does not exist in the parent object.
Node type A type of Livelink item (such as the document node type, the folder
node type, or the workflow node type).
Object reference An object reference feature stores the ID number of another object.
opentext.ini file A configuration file that is used during system startup to set options
and specify the modules that should be loaded when the server is
started.
Orphan object A child object that is not stored in the same OSpace as its parent.
OScript A full featured programming language that lies at the heart of Livelink,
driving its functionality. OScript is used in primarily in methods and
WebLingo files.
OSpace A set of objects stored in a file, including a root object and the root
object’s descendants (called an object tree) and often some orphan
objects.
Overridden feature A feature inherited from the parent that has been modified in
this object.
Parent object The object that is directly above an object in an object tree, from
whom an object inherits features.
Root object The object at the very top of an object tree. There is one root object per
OSpace. The Startup() method of the root object runs when the
OSpace is opened.
Setup script A method that is used to populate other features of an object, and that
is run only by the developer during development.
Subsystems Objects that manage a related group of objects. For example, the
ModuleSubsystem provides scripts for retrieving and registering all of
the WebModule objects throughout Livelink.
WebModule An object which stores all the details about a module, such as its name,
dependencies, and version number.
WebNode An object whose attributes and methods drive the web representation
for a node type.
WebNodeCmd An object that defines the URL, display name, icon, and some of the
enabling and disabling behavior for a WebNode command.
Whew! That was a lot of information, and this is only the beginning—remember, this course
is called Builder Fundamentals. Here’s a summary of what we did and some information
about where to go next.
?func=user.edituser&userID=5644
18. What are the basic steps for creating a request handler?
19. How does data get from the Livelink database into an
HTML file when using a request handler?
22. What are the basic steps you take to put a new
command on the Navigation menus?
24. Name two of the tables in the Livelink schema that are
used to store Livelink nodes (items).
30. Name some of the ways you can store custom data with
a node.
We have: