Search · Index

Webinar - Part 1 - Basics

OpenACS Basics - Part 1

On 2006-10-15 Tracy Adams gave a webinar for developers on OpenACS basics. Here are notes, that might be of use for people who are starting to learn the toolkit. For example for easy copy-n-paste during learning sessions.

We assume the reader has a working instance of OpenACS at hand. If not, there are other sections of xowiki, that cover the installation and configuration of OACS.

Configuration for the turorial 

The default config puts the files of the toolkit to:


In this case, the dir of our interest for now, will be:


 We will edit all our tutorial files in that directory.

Hello, world! 

 OACS uses combination of TCL and ADP pages for clear separation of logic and presentation. TCL pages are just a TCL scripts and ADP are HTML pages with some extra tags. However the early versions of the toolkit rendered pages within TCL. We will use some of the earlier features of the toolkit.

Open a file "helo-1.tcl" in the path:


and put there:

# helo-1.tcl # return standard HTTP headers ReturnHeaders ns_write "hello, world!"

 now, open Your FireFox and go to:


or maybe with the port number: 


instead of "yourhost" put the name or IP of the host of the edited instance of OACS. It also refers to all examples which follow.

Note the lack of .tcl extension at url. OACS has a Request Processor, that figures out the right extension and fetches the file.

ReturnHeaders - returns HTTP headers to the browser ns_write - just writes string to the browser

The docs for the entire system can be found at:


Note also very useful API browser and search boxes at:


( maybe the URL will need also the port number, depending on Your config, for example:



Set a value

 To use a variable just put a value in it:

# helo-2.tcl
# first, set the value for a
set a 10

# then use it
ns_write "value of a is $a"

The value of the var can also be a string:

# helo-3.tcl
# first, set the value for a
set name "John"

# then use it
ns_write "My name is $name"

To get the value of the var:

# helo-4.tcl ReturnHeaders set a 10 # let's use the value of a for new var: set b $a ns_write "<br/> value of b is $b" # we can also do this like that: set c [set b] ns_write "<br/> value of c is $c"

The form [set varname] form of getting the value of the var seems at first a bit too long, but it comes in handy when doing some metadata manipulations.

Call a func

To evaluate the function ( or call a procedure ) use [ ] as follows:

# helo-4b.tcl ReturnHeaders set a 10 # let's use the value of a for new var: # expr is a func that returns the result of the math expression given # as the argument. using square braces we call this func set b [ expr $a + 5 ] ns_write "<br/> value of b is $b"

 Lists are simple

To create a list:

# helo-5.tcl
set mylist [ list "red" "green" "blue" ] 
ns_write "<p> mylist is: $mylist"

( TODO: more on the lists - creation, adding, deleting, finding, etc...)

More complex structures: ns_set  

See the docs on ns_set:

# helo-6.tcl ReturnHeaders

# create a new set with a name "the_name_of_the_set": set vars_by_names [ ns_set create the_name_of_the_set ] # the name of the set is different that the name of the # variable, that contains that set # put some variables into the set: ns_set put $vars_by_names red   $red ns_set put $vars_by_names green $green ns_set put $vars_by_names blue  $blue # how many things do we have in the bag? set size [ ns_set size $vars_by_names ] ns_write "size of the set:  $size " # let's show them: ns_write "<br>red:   [ ns_set get $vars_by_names red   ]" ns_write "<br>green: [ ns_set get $vars_by_names green ]" ns_write "<br>blue:  [ ns_set get $vars_by_names blue  ]" # the same, but better: ns_write "<hr/>" set size [ ns_set size $vars_by_names ]

#     counter     condition      change the counter for { set i 0 } { $i < $size } { incr i } {     set key   [ns_set key   $vars_by_names $i]     set value [ns_set value $vars_by_names $i]     ns_write "<br/> $key: $value " }

Parameters for the page

It is very simple to control the way the parameters from query string go to our page:

ad_page_contract {
    demonstrates using of ad_page_contract
} {

ns_write "id is: $id"

1. try to reach the page http://yourhost/helo-7 without the query string     the page should display the message about input problems

2. try the same with the url: http://yourhost/helo-7?id=123    the page should write the message: "id is 123"

3. try the same with the url: http://yourhost/helo-7?id=asdf    the page should display the message about id not being the integer

The parameter can be optional:

#helo-8.tcl ad_page_contract {     demonstrates using of ad_page_contract } {     id:integer,optional }

set id "<b>not necessary but optional</b>" ReturnHeaders ns_write "id is: $id"

Access control 

Using ad_conn, we can discover many useful info: 

# helo-9.tcl

# check if the user is logged in, redirect if not ad_maybe_redirect_for_registration ReturnHeaders # id of the user set user_id [ad_conn user_id] ns_write "user_id: $user_id" # peer's IP set user_ip [ad_conn peeraddr] ns_write "<p> user's IP: $user_ip"

Logic and Presentation

Now let's get to TCL + ADP stuff which allows to separate the work of the designer from the work of the developer.

Most of the pages in OACS consist of at least TCL and ADP componetns. Here is how:

In most cases TCL and ADP pages are named the same, exept for the extension. It is possible to explicitly call the presentation page from the script. See the docs for ad_return_template.

In the following example we will use helo-10.tcl and helo-10.adp.

in TCL we do some data manipulation

# helo-10.tcl ad_page_contract {     demonstrates TCL and ADP combination     and multirow } {     id:integer,optional } -properties {     a:onevalue     alist:multirow }

set a 10 # create the multirow multirow create alist no name      color # add rows multirow append alist 1  Adam      red multirow append alist 2  Ben       blue multirow append alist 3  Catherine green multirow append alist 4  Danae     black

then we present it in ADP. Put the script below into helo-10.adp: ( note: remove the space between @ and the name of the variable below; I do not know how to escape the @ )

<master> <p>     the value of a is @ a@ </p> <blockquote>     <multiple name="alist">         <li> @ - @ ( color: @ alist.color@ )

</li>     </multiple> </blockquote>

 now open the page in browser:


That's all.

The webinar took place on sunday 2006-10-15 at 2:30 P.M. Eastern time.

Many thanks to Tracy Adams, who was presenting the material.  

( corrections welcome, especially of my english )

Previous Month March 2017
Sun Mon Tue Wed Thu Fri Sat
26 27 28 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 (1) 20 21 22 23 24 (1) 25
26 27 28 29 30 31 1

Popular tags

17 , 5.9.0 , 5.9.1 , ad_form , ADP , ajax , aolserver , asynchronous , bgdelivery , bootstrap , bugtracker , CentOS , COMET , CSP , CSRF , cvs , debian , emacs , fedora , FreeBSD , hstore , includelets , install , installation , installers , install-ns , javascript , libthread , linux , monitoring
No registered users in community xowiki
in last 30 minutes