Index: openacs-4/packages/acs-core-docs/www/eng-standards-filenaming.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-core-docs/www/eng-standards-filenaming.html,v diff -u -r1.7 -r1.7.2.1 --- openacs-4/packages/acs-core-docs/www/eng-standards-filenaming.html 7 Mar 2002 06:55:36 -0000 1.7 +++ openacs-4/packages/acs-core-docs/www/eng-standards-filenaming.html 15 May 2002 23:26:18 -0000 1.7.2.1 @@ -1,161 +1,65 @@ - - - -ACS File Naming and Formatting Standards - - - - - - - - - -
-

-ACS File Naming and Formatting Standards

-

By michael@arsdigita.com and -aure@arsdigita.com -

-

+ACS File Naming and Formatting Standards

ACS File Naming and Formatting Standards

By michael@arsdigita.com and +aure@arsdigita.com


+ OpenACS docs are written by the named authors, but may be edited + by OpenACS documentation staff. +

To ensure consistency (and its collateral benefit, maintainability), we define and adhere to standards in the following areas: -

-
-

-File Nomenclature

-

+

File Nomenclature

Usually we organize our files so that they mainly serve one of the following three purposes: -

-
    -
  • displaying objects and their properties

  • -
  • manipulating or acting on objects in some way (by creating, editing, linking, etc)

  • -
  • housing procedures, packages, data models and other prerequisite code -Essentially, we want our files named in a fashion that reflects their purpose.

  • -
-

+

  • displaying objects and their properties

  • manipulating or acting on objects in some way (by creating, editing, linking, etc)

  • housing procedures, packages, data models and other prerequisite code +Essentially, we want our files named in a fashion that reflects their purpose.

Under the page root (and the template root if using the Style package): -

-
    -
  • -

    For naming files that enable a specific action on an object, use this format:

    -

    -object-verb.extension -

    -

    +

    • For naming files that enable a specific action on an object, use this format:

      +object-verb.extension +

      For example, the page to erase a user's portrait from the database is /admin/users/portrait-erase.tcl. -

      -
    • -
    • -

      However, modules typically deal with only one primary type of object - +

    • However, modules typically deal with only one primary type of object - e.g., the Bookmarks module deals mainly with bookmarks - and so action-type files in modules don't need to be specified by the object they act on. Example: the user pages for the Bookmarks module live in the /bookmarks/ directory, and so there is no need to name the bookmark editing page with a redundant url: /bookmarks/bookmark-edit.tcl. Instead, we omit the object type, and use this convention: -

      -

      -verb.extension -

      -

      +

      +verb.extension +

      Thus, the page to edit a bookmark is /bookmarks/edit.tcl. -

      -
    • -
    • -

      For naming files that display the properties of a primary object - such as the bookmark object within the bookmark module - use this convention:

      -

      -one.extension -

      -

      +

    • For naming files that display the properties of a primary object - such as the bookmark object within the bookmark module - use this convention:

      +one.extension +

      For example, the page to view one bookmark is /bookmarks/one.tcl. Note that no verb is necessary for display-type files. -

      -
    • -
    • -

      Otherwise, if the object to be displayed is not the primary feature of a module, simply omit the verb and use the object name:

      -

      -object.extension -

      -

      +

    • Otherwise, if the object to be displayed is not the primary feature of a module, simply omit the verb and use the object name:

      +object.extension +

      For example, the page to view the properties of an ecommerce product is /ecommerce/product.tcl. -

      -
    • -
    • -

      For naming files in a page flow, use the convention:

      -
        -
      • -foobar.extension (Step 1)

      • -
      • -foobar-2.extension (Step 2)

      • -
      • ...

      • -
      • -foobar-N.extension (Step N)

      • -
      -

      -where foobar is determined by the above +

    • For naming files in a page flow, use the convention:

      • foobar.extension (Step 1)

      • foobar-2.extension (Step 2)

      • ...

      • foobar-N.extension (Step N)

      +where foobar is determined by the above rules. -

      -

      +

      Typically, we use a three-step page flow when taking user information: -

      -
        -
      1. Present a form to the user

      2. -
      3. Present a confirmation page to the user

      4. -
      5. Perform the database transaction, then redirect

      6. -
      -
    • -
    • -

      Put data model files in /www/doc/sql, and name them +

      1. Present a form to the user

      2. Present a confirmation page to the user

      3. Perform the database transaction, then redirect

    • Put data model files in /www/doc/sql, and name them for the modules towards which they are used: -

      -

      -module.sql -

      -
    • -
    -

    +

    +module.sql +

In the Tcl library directory: -

-
    -
  • -

    For files that contain module-specific procedures, use the -convention:

    -

    -module-procs.tcl -

    -
  • -
  • -

    For files that contain procedures that are part of the core ACS, -use the convention:

    -

    -ad-description-procs.tcl -

    -
  • -
-
-
-

-URLs

-

-File names also appear within pages, as linked URLs and +

  • For files that contain module-specific procedures, use the +convention:

    +module-procs.tcl +

  • For files that contain procedures that are part of the core ACS, +use the convention:

    +ad-description-procs.tcl +

URLs

+File names also appear within pages, as linked URLs and form targets. When they do, always use abstract URLs (e.g., user-delete instead of user-delete.tcl), because they enhance maintainability. -

-

+

Similarly, when linking to the index page of a directory, do not explicitly name the index file (index.tcl, index.adp, index.html, etc.). Instead, use @@ -164,56 +68,40 @@ (/top-level-dir/). If linking to the directory in which the page is located, use the empty string (""), which browsers will resolve correctly. -

-
-
-

-File Headers and Page Input

-

+

File Headers and Page Input

Include the appropriate standard header in all scripts. The first line should be a comment specifying the file path relative to the ACS root directory. e.g. -

-

+

# /www/index.tcl -

-

+

or -

-

+

# /tcl/module-defs.tcl -

-

+

For static content files (html or adp), include a CVS identification tag as a comment at the top of the file, e.g. -

-
+

 <!-- file-standards.html,v 1.2 2000/09/19 07:22:45 ron Exp -->
-
-

+

In addition, all static HTML files, documentation and other pages should have a visible CVS ID stamp, at least during development. These can be removed at release times. This should take the form of a line like this: -

-
+

 <p>
 Last Modified: file-standards.html,v 1.2 2000/09/19 07:22:45 ron Exp
 </p>
-
-

+

This can be at the top or bottom of the file. -

-

Using ad_page_contract

-

+

Using ad_page_contract

For non-library Tcl files (those not in the private Tcl directory), use ad_page_contract after the file path comment (this supersedes set_the_usual_form_variables and ad_return_complaint). Here is an example of using ad_page_contract, which serves both documentation and page input validation purposes: -

-
+

 # www/register/user-login-2.tcl
 
 ad_page_contract {
@@ -231,47 +119,35 @@
     {return_url {[ad_pvt_home]}}
     {persistent_cookie_p f}
 }
-
-

+

Salient features of ad_page_contract: -

-
    -
  • A mandatory documentation string is the first argument. This has -the standard form with javadoc-style @author, @cvs-id, etc, and should contain a short description of the recieved variables and any necessary explanations.

  • -
  • The second argument specifies the page +

    • A mandatory documentation string is the first argument. This has +the standard form with javadoc-style @author, @cvs-id, etc, and should contain a short description of the recieved variables and any necessary explanations.

    • The second argument specifies the page inputs. The syntax for switches/flags (e.g. multiple-list, array, etc.) uses a colon (:) followed by any number of flags separated by commas (,), e.g. foo:integer,multiple,trim. In particular, multiple and array are the flags that correspond to the old -ad_page_variables flags.

    • -
    • There are new flags: trim, notnull and +ad_page_variables flags.

    • There are new flags: trim, notnull and optional. They do what you'd expect; values will not be trimmed, unless you mark them for it; empty strings are valid input, unless you specify notnull; and a specified variable will be considered required, -unless you declare it optional.

    • -
    • -ad_page_contract can do validation for you: the flags integer +unless you declare it optional.

    • ad_page_contract can do validation for you: the flags integer and sql_identifier will make sure that the values supplied are integers/sql_identifiers. The integer flag will also trim leading zeros. Note that unless you specify notnull, both will accept the empty string. -

    • -
    • Note that ad_page_contract does not generate +

    • Note that ad_page_contract does not generate QQvariables, which were automatically created by ad_page_variables and set_the_usual_form_variables. The use of bind variables makes such previous variable syntax obsolete. -

    • -
    -

    Using ad_library

    -

    +

Using ad_library

For shared Tcl library files, use ad_library after the file path comment. Its only argument is a doc_string in the standard (javadoc-style) format, like ad_page_contract. Don't forget to put the @cvs-id in there. Here is an example of using ad_library: -

-
+

 # tcl/wp-defs.tcl
 
 ad_library {
@@ -280,43 +156,32 @@
     @author John Doe (jdoe@arsdigita.com)
     @cvs-id file-standards.html,v 1.2 2000/09/19 07:22:45 ron Exp
 }
-
-

Non-Tcl Files

-

+

Non-Tcl Files

For SQL and other non-Tcl source files, the following file header structure is recommended: -

-
--- path relative to the ACS root directory
+

+-- path relative to the ACS root directory
 --
--- brief description of the file's purpose
+-- brief description of the file's purpose
 --
--- author
--- created
+-- author
+-- created
 --
 -- $Id$
-
-

+

Of course, replace "--" with the comment delimiter appropriate for the language in which you are programming. -

-
-
-

-Page Construction

-

+

Page Construction

Construct the page as one Tcl variable (name it page_content), and then send it back to the browser with one call to doc_return, which will call db_release_unused_handles prior to executing ns_return, effectively combining the two operations. -

-

+

For example: -

-
-set page_content "[ad_header "Page Title"]
+

+set page_content "[ad_header "Page Title"]
 
-<h2>Page Title</h2>
+<h2>Page Title</h2>
 
 <hr>
 
@@ -327,16 +192,15 @@
     select row_information 
     from bar
 } {
-    append page_content "<li>row_information\n"
+    append page_content "<li>row_information\n"
 }
 
 append page_content "</ul>
 
 [ad_footer]"
 
 doc_return 200 text/html $page_content
-
-

+

The old convention was to call ReturnHeaders and then ns_write for each distinct chunk of the page. This approach has the disadvantage of tying up a scarce and valuable @@ -349,56 +213,22 @@ first, so that the user is not left to stare at an empty page while the query is running.) -

-

+

Local procedures (i.e., procedures defined and used only within one -page) should be prefixed with "module_" and +page) should be prefixed with "module_" and should be used rarely, only when they are exceedingly useful. -

-

+

All files that prepare HTML to display should end with [ad_footer] or -[module_footer]. If your module requires its own footer, +[module_footer]. If your module requires its own footer, this footer should call ad_footer within it. Why? Because when we adapt the ACS to a new site, it is often the case that the client will want a much fancier display than the ACS standard. We like to be able to edit ad_header (which quite possibly can start a <table>) and ad_footer (which may need to end the table started in ad_footer) to customize the look and feel of the entire site. -

-
-
-

-Tcl Library Files

-

+

Tcl Library Files

Further standards for Tcl library files are under discussion; we plan to include naming conventions for procs. -

-

($Id$)

-
-
-
- - +