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
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.