Index: openacs-4/packages/xowiki/tcl/form-field-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/form-field-procs.tcl,v diff -u -r1.5 -r1.6 --- openacs-4/packages/xowiki/tcl/form-field-procs.tcl 29 Jun 2007 12:06:42 -0000 1.5 +++ openacs-4/packages/xowiki/tcl/form-field-procs.tcl 2 Jul 2007 11:45:30 -0000 1.6 @@ -27,7 +27,8 @@ } FormField instproc init {} { if {![my exists label]} {my label [string totitle [my name]]} - if {[my exists id]} {my html(id) [my id]} + if {![my exists id]} {my id [my name]} + if {[my exists id]} {my set html(id) [my id]} #my msg "calling config_from_spec '[my spec]'" my config_from_spec [my spec] } @@ -73,13 +74,18 @@ numeric {my class [self class]::text; #for the time being } select {my class [self class]::select} - scale {my class [self class]::scale} + #scale {my class [self class]::scale} month {my class [self class]::month} date {my class [self class]::date} label=* {my label [lindex [split $s =] 1]} help_text=* {my help_text [lindex [split $s =] 1]} - *=* {set l [split $s =]; my [lindex $l 0] [lindex $l 1]} - default {error "unknown spec for entry [my name]: '$s'"} + *=* { + set l [split $s =] + if {[catch {my [lindex $l 0] [lindex $l 1]} errMsg]} { + my msg "Error during setting attribute [lindex $l 0] to value [lindex $l 1]: $errMsg" + } + } + default {my msg "Ignoring unknown spec for entry [my name]: '$s'"} } } ::xotcl::Class::Parameter searchDefaults [self]; # todo will be different in xotcl 1.6.* @@ -126,10 +132,9 @@ FormField instproc render_form_widget {} { # todo: for all types set atts [list type text] - foreach att {size name value} { + foreach att {size id name value} { if {[my exists $att]} {lappend atts $att [my set $att]} } - ::html::div -class form-widget {::html::input $atts {}} } @@ -145,7 +150,7 @@ FormField instproc render_item {} { ::html::div -class form-item-wrapper { ::html::div -class form-label { - ::html::label -for [my name] { + ::html::label -for [my id] { ::html::t [my label] } if {[my required]} { @@ -158,6 +163,7 @@ my render_error_msg } } + FormField instproc renderValue {v} { if {[my exists options]} { foreach o [my set options] { @@ -247,11 +253,27 @@ Class FormField::select -superclass FormField -parameter { {options ""} + {multiple "false"} } FormField::select instproc initialize {} { my set widget_type text(select) } + FormField::select instproc render_form_widget {} { + ::html::div -class form-widget { + set atts [list id [my id] name [my name]] + if {[my multiple]} {lappend atts multiple [my multiple]} + ::html::select $atts { + foreach {name value} [my options] { + set atts [list value $value] + #my msg "lsearch [my value] $value ==> [lsearch [my value] $value]" + if {[lsearch [my value] $value] > -1} { + lappend atts selected on + } + ::html::option $atts {::html::t $name} + }}} + } + Class FormField::month -superclass FormField -superclass FormField::select FormField::month instproc initialize {} { my options { Index: openacs-4/packages/xowiki/tcl/xowiki-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-procs.tcl,v diff -u -r1.127 -r1.128 --- openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 1 Jul 2007 15:28:38 -0000 1.127 +++ openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 2 Jul 2007 11:45:30 -0000 1.128 @@ -1210,7 +1210,7 @@ } - FormInstance instproc save_data {old_name} { + FormInstance instproc save_data {old_name category_ids} { my log "-- [self args]" my instvar package_id name db_transaction { @@ -1223,6 +1223,9 @@ my set publish_status "ready" } } + # could be optimized, if we do not want to have categories (form constraints?) + category::map_object -remove_old -object_id [my item_id] $category_ids + my save my log "-- old_name $old_name, name $name" if {$old_name ne $name} { @@ -1234,15 +1237,15 @@ return [my item_id] } - FormInstance ad_instproc save-form-data {} { - Method to be called from a submit button of the form - } { - my instvar package_id name - my save_data [::xo::cc form_parameter __object_name ""] - my log "--forminstance redirect to [$package_id pretty_link $name]" - $package_id returnredirect \ - [my query_parameter "return_url" [$package_id pretty_link $name]] - } + # FormInstance ad_instproc save-form-data {} { +# Method to be called from a submit button of the form +# } { +# my instvar package_id name +# my save_data [::xo::cc form_parameter __object_name ""] +# my log "--forminstance redirect to [$package_id pretty_link $name]" +# $package_id returnredirect \ +# [my query_parameter "return_url" [$package_id pretty_link $name]] +# } } Index: openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl,v diff -u -r1.58 -r1.59 --- openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 29 Jun 2007 12:06:42 -0000 1.58 +++ openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 2 Jul 2007 11:45:30 -0000 1.59 @@ -398,7 +398,8 @@ Get the values from the form and store it as instance attributes. } { - set form_fields [list] + set form_fields [list] + set category_ids [list] set validation_errors 0 set form [lindex [my get_from_template form] 0] if {$form ne ""} { @@ -415,8 +416,10 @@ incr validation_errors } lappend form_fields $f - switch -- $att { + switch -glob -- $att { + __form_action - __object_name {} + __category_* {lappend category_ids $value} __name {my set $matt $value} __title {my set $matt $value} __page_order {my set $matt $value} @@ -426,7 +429,7 @@ my log "--set instance attributes to [array get __ia]" my set instance_attributes [array get __ia] } - return [list $validation_errors $form_fields] + return [list $validation_errors $form_fields $category_ids] } FormInstance instproc insert_form_fields {field_names root fcn form_fields} { @@ -440,7 +443,45 @@ } } } + + FormInstance instproc insert_category_fields {} { + # todo: flag, when categories should be included or not (form constraints?) + #if {![my with_categories]} return + + set container_object_id [my package_id] + set category_trees [category_tree::get_mapped_trees $container_object_id] + set category_ids [category::get_mapped_categories [my item_id]] + foreach category_tree $category_trees { + foreach {tree_id tree_name subtree_id assign_single_p require_category_p} $category_tree break + + set options [list] + if {!$require_category_p} {lappend options "" ""} + set value "" + foreach category [category_tree::get_tree -subtree_id $subtree_id $tree_id] { + foreach {category_id category_name deprecated_p level} $category break + if {[lsearch $category_ids $category_id] > -1} {set value $category_id} + set category_name [ad_quotehtml [lang::util::localize $category_name]] + if { $level>1 } { + set category_name "[string repeat { } [expr {2*$level -4}]]..$category_name" + } + lappend options $category_name $category_id + } + set f [FormField new \ + -name "__category_${tree_name}_$tree_id" \ + -label $tree_name \ + -type select \ + -value $value \ + -required $require_category_p] + $f destroy_on_cleanup + $f options $options + $f multiple [expr {!$assign_single_p}] + #my msg [$f serialize] + $f render_item + } + + } + FormInstance instproc edit { {-validation_errors ""} } { @@ -471,7 +512,7 @@ # # we have to valiate and save the form data # - foreach {validation_errors form_fields} [my get_form_data] break + foreach {validation_errors form_fields category_ids} [my get_form_data] break if {$validation_errors != 0} { #my msg "$validation_errors errors in $form_fields" #foreach f $form_fields { my msg "$f: [$f name] '[$f set value]' err: [$f error_msg] " } @@ -482,7 +523,7 @@ # we have no validation erros, so we can save the content # my instvar name - my save_data [::xo::cc form_parameter __object_name ""] + my save_data [::xo::cc form_parameter __object_name ""] $category_ids my log "--forminstance redirect to [$package_id pretty_link $name]" $package_id returnredirect \ [my query_parameter "return_url" [$package_id pretty_link $name]] @@ -498,17 +539,21 @@ dom parse -simple -html $form doc $doc documentElement root - ::require_html_procs $root firstChild fcn + + # insert hidden form fields $root insertBeforeFromScript { ::html::input -type hidden -name __object_name -value [my name] ::html::input -type hidden -name __form_action -value save-form-data } $fcn + # insert automatic form fields on top (for named entries, e.g. name and title) my insert_form_fields $field_names $root $fcn $form_fields - - $root appendFromScript { + + $root appendFromScript { + my insert_category_fields + # insert unreported errors and add a submit field at bottom foreach f $form_fields { if {[$f set error_msg] ne "" && ![$f exists error_reported]} { $f render_error_msg