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.96 -r1.97 --- openacs-4/packages/xowiki/tcl/form-field-procs.tcl 17 Sep 2008 19:04:40 -0000 1.96 +++ openacs-4/packages/xowiki/tcl/form-field-procs.tcl 25 Sep 2008 13:38:42 -0000 1.97 @@ -501,6 +501,73 @@ ########################################################### # + # ::xowiki::formfield::file + # + ########################################################### + + Class file -superclass FormField -parameter { + {size 40} + link_label + } + file instproc tmpfile {value} {my set [self proc] $value} + file instproc content-type {value} {my set [self proc] $value} + file instproc initialize {} { + my type file + my set widget_type file(file) + next + } + file instproc entry_name {value} { + set entry_name file:[[my object] name]-[my name] + } + file instproc process_user_input {} { + my instvar value + + if {[my value] eq ""} { + # nothing to do + return + } + set folder_id [[my object] set parent_id] + set entry_name [my entry_name $value] + #my msg "guess mime_type of $entry_name = [::xowiki::guesstype $value] // [my set content-type]" + + if {[set id [::xo::db::CrClass lookup -name $entry_name -parent_id $folder_id]]} { + # file entry exists already, create a new revision + set file_object [::xo::db::CrClass get_instance_from_db -item_id $id] + $file_object set import_file [my set tmpfile] + $file_object set mime_type [::xowiki::guesstype $entry_name] + $file_object set title $value + $file_object save + } else { + # create a new file + set file_object [::xowiki::File new -destroy_on_cleanup \ + -title $value \ + -name $entry_name \ + -parent_id $folder_id \ + -mime_type [::xowiki::guesstype $entry_name] \ + -package_id [[my object] package_id] \ + -creation_user [::xo::cc user_id] ] + $file_object set import_file [my set tmpfile] + $file_object save_new + } + } + + file instproc pretty_value {v} { + if {$v ne ""} { + if {[my exists link_label]} { + set link_label [my localize [my link_label]] + } else { + set link_label $v + } + set l [::xowiki::Link new -volatile \ + -page [my object] \ + -extra_query_parameter [list [list filename $v]] \ + -type file -name [my entry_name $v] -label $link_label] + return [$l render] + } + } + + ########################################################### + # # ::xowiki::formfield::hidden # ########################################################### Index: openacs-4/packages/xowiki/tcl/link-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/link-procs.tcl,v diff -u -r1.47 -r1.48 --- openacs-4/packages/xowiki/tcl/link-procs.tcl 15 Aug 2008 13:20:17 -0000 1.47 +++ openacs-4/packages/xowiki/tcl/link-procs.tcl 25 Sep 2008 13:38:43 -0000 1.48 @@ -11,7 +11,7 @@ # generic links # Class create BaseLink -parameter { - cssclass href label title target + cssclass href label title target extra_query_parameter } BaseLink instproc mk_css_class {-additional {-default ""}} { @@ -267,6 +267,9 @@ append embed_options "$f = '[my set $f]' " } } + if {[my exists extra_query_parameter]} { + set internal_href [export_vars -base $internal_href [my extra_query_parameter]] + } if {![info exists embed_options]} { return "$label" } else { Index: openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl,v diff -u -r1.101 -r1.102 --- openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl 5 Sep 2008 17:18:23 -0000 1.101 +++ openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl 25 Sep 2008 13:38:43 -0000 1.102 @@ -171,6 +171,7 @@ .swf {set mime application/x-shockwave-flash} .wmv {set mime video/x-ms-wmv} .class - .jar {set mime application/java} + default {set mime application/octet-stream} } } return $mime 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.175 -r1.176 --- openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 24 Sep 2008 09:57:13 -0000 1.175 +++ openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 25 Sep 2008 13:38:43 -0000 1.176 @@ -731,11 +731,16 @@ } default { # user form content fields - set f [my lookup_form_field -name $att $form_fields] - set value [$f value [string trim [::xo::cc form_parameter $att]]] - #my msg "value of $att ($f) = '$value'" - if {![string match *.* $att]} {set __ia($att) $value} - if {[$f exists is_category_field]} {foreach v $value {lappend category_ids $v}} + if {[regexp {^(.+)[.](tmpfile|content-type)} $att _ file field]} { + set f [my lookup_form_field -name $file $form_fields] + $f $field [string trim [::xo::cc form_parameter $att]] + } else { + set f [my lookup_form_field -name $att $form_fields] + set value [$f value [string trim [::xo::cc form_parameter $att]]] + #my msg "value of $att ($f) = '$value'" + if {![string match *.* $att]} {set __ia($att) $value} + if {[$f exists is_category_field]} {foreach v $value {lappend category_ids $v}} + } } } if {[string match *.* $att]} { @@ -1262,6 +1267,7 @@ # append some fields after the HTML contents of the form # set submit_button_class "" + set has_file 0 $root appendFromScript { # append category fields foreach f $form_fields { @@ -1271,6 +1277,9 @@ } elseif {[$f has_instance_variable editor wym]} { set submit_button_class "wymupdate" } + if {[$f has_instance_variable type file]} { + set has_file 1 + } } # insert unreported errors @@ -1292,6 +1301,7 @@ } set url [export_vars -base [$package_id pretty_link [my name]] {{m "edit"} return_url}] $form setAttribute action $url method POST + if {$has_file} {$form setAttribute enctype multipart/form-data} Form add_dom_attribute_value $form class "margin-form" } my set_form_data $form_fields @@ -1322,12 +1332,16 @@ } File instproc download {} { - my instvar text mime_type package_id item_id revision_id + my instvar mime_type package_id $package_id set mime_type $mime_type set use_bg_delivery [expr {![catch {ns_conn contentsentlength}] && [info command ::bgdelivery] ne ""}] $package_id set delivery \ [expr {$use_bg_delivery ? "ad_returnfile_background" : "ns_returnfile"}] + if {[my exists_query_parameter filename]} { + set filename [my query_parameter filename] + ns_set put [ns_conn outputheaders] Content-Disposition "attachment;filename=$filename" + } #my log "--F FILE=[my full_file_name]" return [my full_file_name] }