::xotcl::Class
::Generic::Form
Class Hierarchy of ::Generic::Form
- ::xotcl::Object
- Meta-class:
- ::xotcl::Class
![[i]](/resources/acs-subsite/ZoomIn16.gif)
- Methods for instances:
- __api_make_doc, __api_make_forward_doc, __timediff, abstract, ad_doc, ad_forward, ad_proc, appendC, arrayC, asHTML, autonameC, check, classC, cleanupC, configureC, containsC, copyC, db_0or1rowC, db_1rowC, debug, defaultmethodC, destroyC, destroy_on_cleanup, dot_append_method, dotclass, dotcode, dotquote, dotquotel, ds, evalC, existsC, extractConfigureArg, filterC, filterguardC, filtersearch, forward, hasclass, incrC, infoC, init, instvarC, invarC, isclass, ismetaclass, ismixin, isobject, istype, lappendC, log, method, mixinC, mixinguardC, moveC, msg, noinitC, objectparameter, parametercmdC, proc, procsearch, qn, requireNamespaceC, residualargsC, self, serialize, setC, set_instance_vars_defaults, show-object, substC, traceC, unknown, unsetC, uplevelC, upvarC, volatileC, vwait
- Methods to be applied on the class (in addition to the methods provided by the meta-class):
- getExitHandler, setExitHandler, unsetExitHandler
- ::Generic::Form
- Meta-class:
- ::xotcl::Class
![[i]](/resources/acs-subsite/ZoomIn16.gif)
- Parameter for instances:
- action (default "[::xo::cc url]"), add_page_title, data, edit_page_title, fields, folder_id (default "-100"), html (default ""), name (default "[namespace tail [self]]"), submit_link (default "."), validate (default ""), with_categories (default "false")
- Methods for instances:
- after_submit, edit_data, edit_request, form_vars, generate, init, new_data, new_request, on_submit, on_validation_error, request, set_form_data
- Methods to be applied on the class:
- Methods provided by the meta-class
Class for the simplified generation of forms. This class was designed
together with the content repository class
::xo::db::CrClass.
- fields: form elements as described in
ad_form.
- data: data object (e.g. instance if CrItem)
- folder_id: associated folder id
- name: of this form, used for naming the template,
defaults to the object name
- add_page_title: page title when adding content items
- edit_page_title: page title when editing content items
- with_categories: display form with categories (default false)
- submit_link: link for page after submit
Defined in packages/xotcl-core/tcl/generic-procs.tclClass Relations
- superclass: ::xotcl::Object
![[i]](/resources/acs-subsite/ZoomIn16.gif)
- subclass: ::xowiki::WikiForm
![[i]](/resources/acs-subsite/ZoomIn16.gif)
::xotcl::Class create ::Generic::Form \
-superclass ::xotcl::Object \
-parameter {{action "[::xo::cc url]"} add_page_title data edit_page_title fields \
{folder_id -100} {html ""} {name {[namespace tail [self]]}} {submit_link "."} {validate ""} \
{with_categories false}}
Methods
instproc after_submit
::xowiki::policy5 instproc after_submit item_id {
my instvar data
set link [my submit_link]
if {$link eq "view"} {
set link [export_vars -base $link {item_id}]
}
#ns_log notice "-- redirect to $link // [string match *\?* $link]"
ad_returnredirect $link
ad_script_abort
}
instproc edit_data
::xowiki::policy5 instproc edit_data {} {
#my log "--- edit_data --- setting form vars=[my form_vars]"
my instvar data
foreach __var [my form_vars] {
$data set $__var [my var $__var]
}
$data initialize_loaded_object
db_transaction {
$data save
set old_name [::xo::cc form_parameter __object_name ""]
set new_name [$data set name]
if {$old_name ne $new_name} {
#my msg "rename from $old_name to $new_name"
$data rename -old_name $old_name -new_name $new_name
}
}
return [$data set item_id]
}
instproc edit_request
::xowiki::policy5 instproc edit_request item_id {
#my log "--- edit_request ---"
my request write
my set_form_data
}
instproc form_vars
::xowiki::policy5 instproc form_vars {} {
set vars [list]
foreach varspec [my fields] {
lappend vars [lindex [split [lindex $varspec 0] :] 0]
}
return $vars
}
<instance of ::Generic::Form
> generate [ -template template ] \
[ -export export ]
the method generate is used to actually generate the form template
from the specifications and to set up page_title and context
when appropriate.
- Switches:
- -template (defaults to
"formTemplate"
) (optional) - -export (optional)
::xowiki::policy5 instproc generate {{-template "formTemplate"} -export} {
# set form name for adp file
my set $template [my name]
my instvar data folder_id
set object_type [[$data info class] object_type]
if {[catch {set object_name [$data set name]}]} {set object_name ""}
#my log "-- $data, cl=[$data info class] [[$data info class] object_type]"
#my log "--e [my name] final fields [my fields]"
set exports [list [list object_type $object_type] [list folder_id $folder_id] [list __object_name $object_name]]
if {[info exists export]} {foreach pair $export {lappend exports $pair}}
ad_form -name [my name] -form [my fields] -export $exports -action [my action] -html [my html]
set new_data "set item_id \[[self] new_data\]"
set edit_data "set item_id \[[self] edit_data\]"
set new_request "[self] new_request"
set edit_request "[self] edit_request \$item_id"
set after_submit "[self] after_submit \$item_id"
set on_validation_error "[self] on_validation_error"
set on_submit "[self] on_submit \$item_id"
if {[my with_categories]} {
set coid [expr {[$data exists item_id] ? [$data set item_id] : ""}]
category::ad_form::add_widgets -form_name [my name] -container_object_id [$data package_id] -categorized_object_id $coid
append new_data {
category::map_object -remove_old -object_id $item_id $category_ids
#ns_log notice "-- new data category::map_object -remove_old -object_id $item_id $category_ids"
#db_dml [my qn insert_asc_named_object] # "insert into acs_named_objects (object_id,object_name,package_id) # values (:item_id, :name, :package_id)"
}
append edit_data {
#db_dml [my qn update_asc_named_object] # "update acs_named_objects set object_name = :name, # package_id = :package_id where object_id = :item_id"
#ns_log notice "-- edit data category::map_object -remove_old -object_id $item_id $category_ids"
category::map_object -remove_old -object_id $item_id $category_ids
}
append on_submit {
set category_ids [category::ad_form::get_categories -container_object_id $package_id]
}
}
#ns_log notice "-- ad_form new_data=<$new_data> edit_data=<$edit_data> edit_request=<$edit_request>"
# action blocks must be added last
ad_form -extend -name [my name] -validate [my validate] -new_data $new_data -edit_data $edit_data -on_submit $on_submit -new_request $new_request -edit_request $edit_request -on_validation_error $on_validation_error -after_submit $after_submit
}
instproc init
::xowiki::policy5 instproc init {} {
set level [template::adp_level]
my forward var uplevel #$level set
my instvar data folder_id
set package_id [$data package_id]
set folder_id [expr {[$data exists parent_id] ? [$data parent_id] : [$package_id folder_id]}]
set class [$data info class]
if {![my exists add_page_title]} {
my set add_page_title [_ xotcl-core.create_new_type [list type [$class pretty_name]]]
}
if {![my exists edit_page_title]} {
my set edit_page_title [_ xotcl-core.edit_type [list type [$class pretty_name]]]
}
# check, if the specified fields are available from the data source
# and ignore the unavailable entries
set checked_fields [list]
set available_atts [$class array names db_slot]
#my log "-- available atts <$available_atts>"
lappend available_atts [$class id_column] item_id
if {![my exists fields]} {my mkFields}
#my log --fields=[my fields]
}
instproc new_data
::xowiki::policy5 instproc new_data {} {
my instvar data
#my log "--- new_data ---"
foreach __var [my form_vars] {
$data set $__var [my var $__var]
}
$data initialize_loaded_object
$data save_new
return [$data set item_id]
}
instproc new_request
::xowiki::policy5 instproc new_request {} {
#my log "--- new_request ---"
my request create
my set_form_data
}
instproc on_submit
::xowiki::policy5 instproc on_submit item_id {
# The content of this proc is strictly speaking not necessary.
# However, on redirects after a submit to the same page, it
# ensures the setting of edit_form_page_title and context
my request write
}
instproc on_validation_error
::xowiki::policy5 instproc on_validation_error {} {
my instvar edit_form_page_title context
#my log "-- "
set edit_form_page_title [my edit_page_title]
set context [list $edit_form_page_title]
}
instproc request
::xowiki::policy5 instproc request privilege {
my instvar edit_form_page_title context data
set package_id [$data package_id]
if {[my isobject ::$package_id] && ![::$package_id exists policy]} {
# not needed, if governed by a policy
auth::require_login
permission::require_permission -object_id $package_id -privilege $privilege
}
set edit_form_page_title [if {$privilege eq "create"} {my add_page_title} {my edit_page_title}]
set context [list $edit_form_page_title]
}
instproc set_form_data
::xowiki::policy5 instproc set_form_data {} {
my instvar data
foreach var [[$data info class] array names db_slot] {
if {[$data exists $var]} {
my var $var [list [$data set $var]]
}
}
}