Gotchas!
=======
All items for a page *must* be part of a list!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OK: (list (function1 param1)(function2 param2))
NOT OK: (begin (function1 param1)(function2 param2))
Various components
~~~~~~~~~~~~~~~~~~
The URL:
http://the.domain.com/pagename/p1/p2/p3?param1=value1
(s:get-page-params) => '("p1" "p2")
(s:get-param 'param1) => "value1"
(s:get-param 'param1 'number) => number or #f
NOTE: it is often practical to use the generic (s:get-inp ...) which
will first look for the POST input variable and then fall back
to the GET param. This allows one to switch back and forth
between GET and POST during development without changing the code.
(s:get-inp 'param1) ;; trys to find input by name of param1, followed by trying get-param
Create a link.
~~~~~~~~~~~~~~
(s:a name 'href
(s:link-to "pagename/blah" ""))
Call current page with new param
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In view.scm:
(s:center "[" (s:a 'href (s:link-to "polls"
'id
(begin
(poll:poll 'fill-polls)
(poll:poll 'get-next-poll)))
"Go to the next poll") "]")
In control.scm:
(let ((poll-id (s:get-param 'id)))
;; do stuff based on poll-id
Call an action on a specific page
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(s:a 'href (s:link-to "polls" 'id (poll:poll 'get 'id)
'action "poll.edit")
"Suggest changes to this poll")
NOT TRUE! This calls fuction poll.edit (should be in control.scm). Parameter set is 'id to a poll num.
A complex link example
~~~~~~~~~~~~~~~~~~~~~~
(s:a "Reply" 'href (s:link-to (s:current-page)
'action "discussion.reply" ;; <page>.<action>
'reply_to (number->string (hash-table-ref row 'posts.id))
'id (s:get "discussion.parent_object_id")) "reply")
;; use (s:get-param to get the 'id, or 'reply_to values
Get and set a session var
~~~~~~~~~~~~~~~~~~~~~~~~~
(s:session-var-get "keyname")
(s:session-var-get "keyname" 'number)
(s:session-var-set! "keyname" "value")
5.1 Page local vars
(s:set! key val)
(s:get key)
make a selection drop down
~~~~~~~~~~~~~~~~~~~~~~~~~~
;; items is a hierarchial alist
;; ( (label1 value1 dispval1 #t) ;; <== this one is selected
;; (label2 (label3 value2 dispval2)
;; (label4 value3 dispval3)))
In view.scm:
;; Label Value visible-str selected
(s:select '(("World" 0)("Country" 1)("State" 2 "The state" #t )("Town/City" 3)) 'name 'scope)
Visible str will be shown if provided. Selected will set that entry to pre-selected.
To select a specific entry:
(s:select '(("World" 0 "world" #f)("Country" 1 "country" #t)("State" 2 "state" #f)("Town/City" 3 "town" #f)) 'name 'scope)
In control.scm:
(let ((scope (s:get-input 'scope))
(scope-num (s:get-input 'scope 'number))) ;; 'number, 'raw or 'escaped
....
The optional fourth entry sets that item as selected if true
Simple error reporting
~~~~~~~~~~~~~~~~~~~~~~
In control.scm:
(s:set-err "You must provide an email address")
In view.scm:
(s:get-err s:err-font)
Or:
(s:get-err (lambda (x)(s:err-font x (s:br))))
Sharing data between pages
~~~~~~~~~~~~~~~~~~~~~~~~~~
NOTE: This data is *not* preserved between cgi calls.
;; In first page called
(s:shared-set! "somekey" somevalue)
;; In a page called later
(let ((dat (s:shared-get "somekey")))
( .... ))
Misc useful stuff
~~~~~~~~~~~~~~~~~
i. Lazy/safe string->number
(s:any->number val)
ii. Random string
(session:make-rand-string len)
iii. string to number for pgint
(s:any->pgint val)
Forms and input
~~~~~~~~~~~~~~~
(s:form 'action "login.login" 'method "post"
(s:input-preserve 'type "text" 'name "email-address" 'size "16" 'maxlength "30")
(s:input 'type "submit" 'name "form-name" 'value "login"))
(s:get-input 'email-address)
To preserve the input simply do a set of the value on the 'name field:
(s:set! "email-address" "matt@kiatoa.com")
Radio buttons:
(s:div 'class "col_3"
(s:input 'type "radio" 'id "group-type1" 'name "group-type" 'value "private" 'checked "checked")
(s:label 'for "group-type1" 'class "inline" "Private")
(s:input 'type "radio" 'id "group-type2" 'name "group-type" 'value "public")
(s:label 'for "group-type2" 'class "inline" "Public"))
(s:get-input 'group-type) ==> returns private or public depending on which is selected.