As a workaround for missing content-repository functionality, copy a provided file into the directory for tcl files:
cp /var/lib/aolserver/service0/packages/acs-core-docs/www/files/note-procs.tcl /var/lib/aolserver/service0/packages/myfirstpackage/tcl/
To make this file take effect, go to the APM and choose "Reload changed" for "MyFirstPackage".
Each user-visible page in your package has, typically, three parts. The tcl file holds the procedural logic for the page, including TCL and database-independent SQL code, and does things like check permissions, invoke the database queries, and modify variables, and the adp page holds html. The -postgres.xql and -oracle.xql files contains database-specific SQL. The default page in any directory is index, so we'll build that first, starting with the tcl file:
[service0 postgresql]$ cd /var/lib/aolserver/service0/myfirstpackages/www [service0 www]$ emacs index.tcl
Paste this into the file.
ad_page_contract { This is the main page for the package. It displays all of the Notes and provides links to edit them and to create new Notes. @author Your Name (you@example.com) @cvs-id $Id: tutorial-pages.html,v 1.20 2004/02/20 15:13:42 joela Exp $ } set page_title [ad_conn instance_name] set context [list] template::list::create \ -name notes \ -multirow notes \ -actions { "Add a Note" note-edit} \ -elements { edit { link_url_col edit_url display_template { <img src="/resources/acs-subsite/Edit16.gif" width="16" height="16" border="0"> } sub_class narrow } title { label "Title" } delete { link_url_col delete_url display_template { <img src="/resources/acs-subsite/Delete16.gif" width="16" height="16" border="0"> } sub_class narrow } } db_multirow \ -extend { edit_url delete_url } notes notes_select { select ci.item_id, n.title from cr_items ci, mfp_notesx n where n.revision_id = ci.live_revision } { set edit_url [export_vars -base "note-edit" {item_id}] set delete_url [export_vars -base "note-delete" {item_id}] }
Now index.adp:
<master> <property name="title">@page_title;noquote@</property> <property name="context">@context;noquote@</property> <listtemplate name="notes"></listtemplate>
Now we create the add/edit page. If note_id is passed in, it edits that note. Otherwise, it presents a form for adding notes. Edit note-edit.tcl:
ad_page_contract { This is the view-edit page for notes. @author Your Name (you@example.com) @cvs-id $Id: tutorial-pages.html,v 1.20 2004/02/20 15:13:42 joela Exp $ @param item_id If present, assume we are editing that note. Otherwise, we are creating a new note. } { item_id:integer,optional } ad_form -name note -form { {item_id:key} {title:text {label Title}} } -new_request { permission::require_permission -object_id [ad_conn package_id] -privilege create set page_title "Add a Note" set context [list $page_title] } -edit_request { permission::require_write_permission -object_id $item_id mfp::note::get \ -item_id $item_id \ -array note_array set title $note_array(title) set page_title "Edit a Note" set context [list $page_title] } -new_data { mfp::note::add \ -title $title \ -item_id $item_id set message "Note $title added" } -edit_data { mfp::note::edit \ -item_id $item_id \ -title $title set message "Note $title changed" } -after_submit { ad_returnredirect -message $message "." ad_script_abort }
And note-edit.adp:
<master> <property name="title">@page_title;noquote@</property> <property name="context">@context;noquote@</property> <property name="focus">note.title</property> <formtemplate id="note"></formtemplate>
And the delete page. Since it has no UI, there is only a tcl page, and no adp page. Edit note-delete.tcl:
ad_page_contract { This deletes a note @author Your Name (you@example.com) @cvs-id $Id: tutorial-pages.html,v 1.20 2004/02/20 15:13:42 joela Exp $ @param item_id The item_id of the note to delete } { item_id:integer } permission::require_write_permission -object_id $item_id set title [item::get_title $item_id] mfp::note::delete -item_id $item_id ad_returnredirect -message "Item $title deleted." "."