Index: openacs-4/packages/xowiki/tcl/folder-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/folder-procs.tcl,v diff -u -r1.12 -r1.13 --- openacs-4/packages/xowiki/tcl/folder-procs.tcl 23 Dec 2011 11:48:40 -0000 1.12 +++ openacs-4/packages/xowiki/tcl/folder-procs.tcl 20 Aug 2012 09:18:49 -0000 1.13 @@ -426,157 +426,175 @@ ########################################################### # # ::xowiki::includelet::child-resources - # - ########################################################### - ::xowiki::IncludeletClass create child-resources \ - -superclass ::xowiki::Includelet \ - -parameter { - { - parameter_declaration { - {-skin:optional "yui-skin-sam"} - {-show_types "::xowiki::Page,::xowiki::File,::xowiki::Form,::xowiki::FormPage"} - {-regexp:optional} - {-with_subtypes:optional false} - {-orderby:optional "last_modified,desc"} - {-publish_status "ready"} - {-view_target ""} - {-html-content} - {-parent .} - {-hide} - } - } - } - - child-resources instproc types_to_show {} { - my get_parameters - foreach type [split $show_types ,] {set ($type) 1} - return [lsort [array names ""]] - } + # + ########################################################### + ::xowiki::IncludeletClass create child-resources \ + -superclass ::xowiki::Includelet \ + -parameter { + { + parameter_declaration { + {-skin:optional "yui-skin-sam"} + {-show_types "::xowiki::Page,::xowiki::File,::xowiki::Form,::xowiki::FormPage"} + {-regexp:optional} + {-with_subtypes:optional false} + {-orderby:optional "last_modified,desc"} + {-publish_status "ready"} + {-view_target ""} + {-html-content} + {-parent .} + {-hide} + } + } + } + + child-resources instproc types_to_show {} { + my get_parameters + foreach type [split $show_types ,] {set ($type) 1} + return [lsort [array names ""]] + } - child-resources instproc render {} { - my get_parameters + child-resources instproc render {} { + my get_parameters - set current_folder [my set __including_page] - if {$parent eq ".."} { - set current_folder [$current_folder parent_id] - ::xo::db::CrClass get_instance_from_db -item_id $current_folder - } - if {![$current_folder istype ::xowiki::FormPage]} { - # current folder has to be a FormPage - set current_folder [$current_folder parent_id] + set current_folder [my set __including_page] + + if {$parent eq ".."} { + set current_folder [$current_folder parent_id] + ::xo::db::CrClass get_instance_from_db -item_id $current_folder + } if {![$current_folder istype ::xowiki::FormPage]} { - error "child-resources not included from a FormPage" + # current folder has to be a FormPage + set current_folder [$current_folder parent_id] + if {![$current_folder istype ::xowiki::FormPage]} { + error "child-resources not included from a FormPage" + } } - } - set current_folder_id [$current_folder item_id] + set current_folder_id [$current_folder item_id] - if {[::xo::cc query_parameter m] ne "list" && $parent ne ".."} { - set index [$current_folder property index] - if {$index ne ""} { - set download [string match "file:*" $index] - set index_link [$package_id pretty_link \ - -parent_id [$current_folder item_id] \ - -download $download \ - $index] - return [$package_id returnredirect $index_link] + if {[::xo::cc query_parameter m] ne "list" && $parent ne ".."} { + set index [$current_folder property index] + if {$index ne ""} { + set download [string match "file:*" $index] + set index_link [$package_id pretty_link \ + -parent_id [$current_folder item_id] \ + -download $download \ + $index] + return [$package_id returnredirect $index_link] + } } - } - set logical_folder_id $current_folder_id - if {[$current_folder exists physical_item_id]} { - #my msg "!!! $current_folder_id to [$current_folder set physical_item_id]" - set current_folder_id [$current_folder set physical_item_id] - } - #my msg "current_folder_id $current_folder_id logical_folder_id $logical_folder_id" + set logical_folder_id $current_folder_id + if {[$current_folder exists physical_item_id]} { + set current_folder_id [$current_folder set physical_item_id] + } - $package_id instvar package_key + $package_id instvar package_key - set return_url [::xo::cc url] ;#"[$package_id package_url]edit-done" - set category_url [export_vars -base [$package_id package_url] { {manage-categories 1} {object_id $package_id}}] + set return_url [::xo::cc url] ;#"[$package_id package_url]edit-done" + set category_url [export_vars -base [$package_id package_url] { {manage-categories 1} {object_id $package_id}}] - set columns {objects edit object_type name last_modified delete} - foreach column $columns {set ::hidden($column) 0 } - if {[info exists hide]} { - foreach column $hide {if {[info exists ::hidden($column)]} {set ::hidden($column) 1}} - } + set columns {objects edit object_type name last_modified delete} + foreach column $columns {set ::hidden($column) 0 } + if {[info exists hide]} { + foreach column $hide {if {[info exists ::hidden($column)]} {set ::hidden($column) 1}} + } - set t [::YUI::DataTable new -skin $skin -volatile \ - -columns { - BulkAction objects -id ID -hide $::hidden(objects) -actions { - Action new -label select -tooltip select -url admin/select - } - # The "-html" options are currenty ignored in the YUI - # DataTable. Not sure, it can be integrated in the traditional way. - # - # A full example for skinning the datatable is here: - # http://developer.yahoo.com/yui/examples/datatable/dt_skinning.html - # - HiddenField ID - AnchorField edit -CSSclass edit-item-button -label "" \ - -hide $::hidden(edit) \ - -html {style "padding: 0px;"} - Field object_type -label [_ xowiki.page_kind] -orderby object_type -richtext false \ - -hide $::hidden(object_type) \ - -html {style "padding: 0px;"} - AnchorField name -label [_ xowiki.Page-name] -orderby name \ - -hide $::hidden(name) \ - -html {style "padding: 2px;"} - Field last_modified -label [_ xowiki.Page-last_modified] -orderby last_modified \ - -hide $::hidden(last_modified) - AnchorField delete -CSSclass delete-item-button \ - -hide $::hidden(delete) \ - -label "" ;#-html {onClick "return(confirm('Confirm delete?'));"} - }] + set t [::YUI::DataTable new -skin $skin -volatile \ + -columns { + BulkAction objects -id ID -hide $::hidden(objects) -actions { + Action new -label select -tooltip select -url admin/select + } + # The "-html" options are currenty ignored in the YUI + # DataTable. Not sure, it can be integrated in the traditional way. + # + # A full example for skinning the datatable is here: + # http://developer.yahoo.com/yui/examples/datatable/dt_skinning.html + # + HiddenField ID + AnchorField edit -CSSclass edit-item-button -label "" \ + -hide $::hidden(edit) \ + -html {style "padding: 0px;"} + Field object_type -label [_ xowiki.page_kind] -orderby object_type -richtext false \ + -hide $::hidden(object_type) \ + -html {style "padding: 0px;"} + AnchorField name -label [_ xowiki.Page-name] -orderby name \ + -hide $::hidden(name) \ + -html {style "padding: 2px;"} + Field last_modified -label [_ xowiki.Page-last_modified] -orderby last_modified \ + -hide $::hidden(last_modified) + AnchorField delete -CSSclass delete-item-button \ + -hide $::hidden(delete) \ + -label "" ;#-html {onClick "return(confirm('Confirm delete?'));"} + }] - set extra_where_clause "true" - # TODO: why filter on title and name? - if {[info exists regexp]} {set extra_where_clause "(bt.title ~ '$regexp' OR ci.name ~ '$regexp' )"} - set publish_status_clause [::xowiki::Includelet publish_status_clause $publish_status] + set extra_where_clause "true" + # TODO: why filter on title and name? + if {[info exists regexp]} {set extra_where_clause "(bt.title ~ '$regexp' OR ci.name ~ '$regexp' )"} + set publish_status_clause [::xowiki::Includelet publish_status_clause $publish_status] - set items [::xowiki::FormPage get_folder_children \ - -folder_id $current_folder_id \ - -object_types [my types_to_show] \ - -extra_where_clause $extra_where_clause] + set items [::xowiki::FormPage get_all_children \ + -folder_id $current_folder_id \ + -object_types [my types_to_show] \ + -extra_where_clause $extra_where_clause] - foreach c [$items children] { - set name [$c name] - set page_link [::$package_id pretty_link -parent_id $logical_folder_id $name] - array set icon [$c render_icon] - if {[catch {set prettyName [$c pretty_name]} errorMsg]} { - my msg "can't obtain pretty name of [$c item_id] [$c name]: $errorMsg" - set prettyName $name - } + set package_id [::xo::cc package_id] + set pkg ::$package_id + set url [::xo::cc url] + $pkg get_lang_and_name -default_lang "" -name [$current_folder name] lang name + set folder [$pkg folder_path -parent_id [$current_folder parent_id]] - #set delete_link [export_vars -base [$package_id package_url] \ - # [list {delete 1} \ - # [list item_id [$c item_id]] \ - # [list name [$c pretty_link]] return_url]] + foreach c [$items children] { + set name [$c name] + set page_link [::$package_id pretty_link \ + -parent_id $logical_folder_id \ + -context_url $url $name] - set delete_link [export_vars -base $page_link {{m delete} return_url}] + array set icon [$c render_icon] + + if {[catch {set prettyName [$c pretty_name]} errorMsg]} { + my msg "can't obtain pretty name of [$c item_id] [$c name]: $errorMsg" + set prettyName $name + } - $t add \ - -ID [$c name] \ - -name $prettyName \ + #set delete_link [export_vars -base [$package_id package_url] \ + # [list {delete 1} \ + # [list item_id [$c item_id]] \ + # [list name [$c pretty_link]] return_url]] + + set delete_link [export_vars -base $page_link {{m delete} return_url}] + + $t add \ + -ID [$c name] \ + -name $prettyName \ -name.href [export_vars -base $page_link {template_file html-content}] \ - -name.title [$c set title] \ - -object_type $icon(text) \ - -object_type.richtext $icon(is_richtext) \ - -last_modified [$c set last_modified] \ - -edit "" \ - -edit.href [export_vars -base $page_link {{m edit} return_url}] \ - -edit.title #xowiki.edit# \ - -delete "" \ - -delete.href $delete_link \ - -delete.title #xowiki.delete# - } + -name.title [$c set title] \ + -object_type $icon(text) \ + -object_type.richtext $icon(is_richtext) \ + -last_modified [$c set last_modified] \ + -edit "" \ + -edit.href [export_vars -base $page_link {{m edit} return_url}] \ + -edit.title #xowiki.edit# \ + -delete "" \ + -delete.href $delete_link \ + -delete.title #xowiki.delete# + } - foreach {att order} [split $orderby ,] break - $t orderby -order [expr {$order eq "asc" ? "increasing" : "decreasing"}] $att - set resources_list [$t asHTML] - return [$t asHTML] - } + foreach {att order} [split $orderby ,] break + $t orderby -order [expr {$order eq "asc" ? "increasing" : "decreasing"}] $att + set resources_list "[$t asHTML]" + + set viewers [util_coalesce [$current_folder property viewers] [$current_folder get_parameter viewers]] + set viewer_links "" + foreach v $viewers { + set wf_link "${v}?p.folder=[${current_folder} name]" + append wf_link "&m=create-or-use" + append viewer_links [subst -nocommands -nobackslashes {
  • view with $v
  • }] + } + return " [$t asHTML]" + + } } namespace eval ::xowiki::formfield { Index: openacs-4/packages/xowiki/tcl/package-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/package-procs.tcl,v diff -u -r1.255 -r1.256 --- openacs-4/packages/xowiki/tcl/package-procs.tcl 11 Aug 2012 08:36:14 -0000 1.255 +++ openacs-4/packages/xowiki/tcl/package-procs.tcl 20 Aug 2012 09:18:49 -0000 1.256 @@ -157,17 +157,42 @@ } } + Package instproc get_page_from_super {-folder_id:required name} { + set package [self] + set inherit_folders [FormPage get_super_folders $package $folder_id] + + foreach item_ref $inherit_folders { + set folder [::xo::cc cache [list $package get_page_from_item_ref $item_ref]] + if {$folder eq ""} { + my log "Error: Could not resolve parameter folder page '$item_ref' of FormPage [self]." + } else { + set item_id [::xo::db::CrClass lookup -name $name -parent_id [$folder item_id]] + if { $item_id != 0 } { + return $item_id + } + } + } + return 0 + } + + Package instproc get_parent_and_name {-path:required -lang:required -parent_id:required vparent vlocal_name} { my upvar $vparent parent $vlocal_name local_name - #my log "path=$path parent_id=$parent_id" if {[regexp {^([^/]+)/(.+)$} $path _ parent local_name]} { # try without a prefix - #set p [::xo::db::CrClass lookup -name $parent -parent_id $parent_id] set p [my lookup -name $parent -parent_id $parent_id] - #my msg "path '$path' check '$parent' $parent_id returns $p" if {$p == 0} { + # check if page is inherited + set p2 [my get_page_from_super -folder_id $parent_id $parent] + if { $p2 != 0 } { + set p $p2 + } + + } + + if {$p == 0} { # pages are stored with a lang prefix set p [my lookup -name ${lang}:$parent -parent_id $parent_id] #my log "check with prefix '${lang}:$parent' returned $p" @@ -188,6 +213,7 @@ } } } + if {$p != 0} { return $p } @@ -213,7 +239,7 @@ return "" } - Package instproc folder_path {{-parent_id ""}} { + Package instproc folder_path {{-parent_id ""} {-context_url ""}} { # # handle different parent_ids # @@ -225,9 +251,27 @@ # will be found by the object resolver. For the time being, we # do nothing more about this. # + # + if { $context_url ne {} } { + set parts [lreverse [split $context_url {/}]] + set index 0 + } + set path "" while {1} { set fo [::xo::db::CrClass get_instance_from_db -item_id $parent_id] + if { $context_url ne {} } { + set context_name [lindex $parts $index] + if { [$fo name] != $context_name } { + + set context_folder [my get_page_from_name -assume_folder true -name $context_name] + #my msg "context_name [$context_folder serialize]" + set context_id [$context_folder item_id] + set fo [::xo::db::CrClass get_instance_from_db -item_id $context_id] + } + incr index + } + #my get_lang_and_name -name [$fo name] lang stripped_name #set path $stripped_name/$path set path [$fo name]/$path @@ -267,6 +311,7 @@ {-lang ""} {-parent_id ""} {-download false} + {-context_url ""} name } { Generate a (minimal) link to a wiki page with the specified name. @@ -308,7 +353,7 @@ } #set encoded_name [string map [list %2d - %5f _ %2e .] [ns_urlencode $name]] - set folder [my folder_path -parent_id $parent_id] + set folder [my folder_path -parent_id $parent_id -context_url $context_url] #my msg "folder_path = $folder, default_lang [my default_language]" # if {$folder ne ""} { @@ -889,8 +934,9 @@ # # @return item-ref info # + set item_id 0 - if {$lang eq $default_lang || $lang eq "file" || [string match *:* $stripped_name]} { + if {$lang eq $default_lang || [string match *:* $stripped_name]} { # try a direct lookup; ($lang eq "file" needed for links to files) set item_id [::xo::db::CrClass lookup -name $stripped_name -parent_id $parent_id] if {$item_id != 0} { @@ -899,6 +945,16 @@ #my log "direct $stripped_name" } } + + # TODO + #my log ">>>>>>>> HERE HERE item_id=$item_id" + if { $item_id == 0 } { + set item_id [my get_page_from_super -folder_id $parent_id $stripped_name] + if { $item_id != 0 } { + set name $stripped_name + } + } + if {$item_id == 0} { set name ${lang}:$stripped_name set item_id [::xo::db::CrClass lookup -name $name -parent_id $parent_id] @@ -1257,7 +1313,6 @@ set tag $stripped_url set summary [::xo::cc query_parameter summary 0] set popular [::xo::cc query_parameter popular 0] - if {[string is boolean -strict $popular]} { set popular 0 } set tag_kind [expr {$popular ? "ptag" :"tag"}] set weblog_page [my get_parameter weblog_page] my get_lang_and_name -default_lang $default_lang -name $weblog_page (lang) (stripped_name) 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.454 -r1.455 --- openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 18 Jun 2012 18:02:19 -0000 1.454 +++ openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 20 Aug 2012 09:18:49 -0000 1.455 @@ -3153,6 +3153,115 @@ return $result } + + FormPage proc get_super_folders {package folder_id {acc ""}} { + + set folder [::xo::db::CrClass get_instance_from_db -item_id $folder_id -revision_id 0] + set package_id [$folder package_id] + + set inherit_folders [util_coalesce [$folder property inherit_folders] [$folder get_parameter inherit_folders]] + + # new_folders contains everything + # in the second list, i.e. inherit_folders, + # that wasn't in the first, i.e. acc + lassign [util_intersect3 $acc $inherit_folders] _dummy1_ _dummy2_ new_folders + set acc [concat $acc $new_folders] + while { $new_folders ne {} } { + set item_ref [lindex $new_folders 0] + set new_folders [lrange $new_folders 1 end] + set page [$package get_page_from_item_ref $item_ref] + set folder_id [$page item_id] + set inherit_folders [FormPage get_super_folders $package $folder_id $acc] + lassign [util_intersect3 $acc $inherit_folders] _dummy1_ _dummy2_ new_new_folders + set acc [concat $acc $new_new_folders] + set new_folders [concat $new_folders $new_new_folders] + } + return $acc + } + + FormPage proc get_all_children { + -folder_id:required + {-publish_status ready} + {-object_types {::xowiki::Page ::xowiki::Form ::xowiki::FormPage}} + {-extra_where_clause true} + } { + + set folder [::xo::db::CrClass get_instance_from_db -item_id $folder_id -revision_id 0] + set package_id [$folder package_id] + + set publish_status_clause [::xowiki::Includelet publish_status_clause $publish_status] + set result [::xo::OrderedComposite new -destroy_on_cleanup] + + set list_of_folders [list $folder_id] + set inherit_folders [FormPage get_super_folders $package_id $folder_id] + my log inherit_folders=$inherit_folders + + foreach item_ref $inherit_folders { + set folder [::xo::cc cache [list $package_id get_page_from_item_ref $item_ref]] + if {$folder eq ""} { + my log "Error: Could not resolve parameter folder page '$item_ref' of FormPage [self]." + } else { + lappend list_of_folders [$folder item_id] + } + } + + foreach folder_id $list_of_folders { + foreach object_type $object_types { + set attributes [list revision_id creation_user title parent_id page_order \ + "to_char(last_modified,'YYYY-MM-DD HH24:MI') as last_modified" ] + set base_table [$object_type set table_name]i + if {$object_type eq "::xowiki::FormPage"} { + set attributes "* $attributes" + } + set items [$object_type get_instances_from_db \ + -folder_id $folder_id \ + -with_subtypes false \ + -select_attributes $attributes \ + -where_clause "$extra_where_clause $publish_status_clause" \ + -base_table $base_table] + + foreach i [$items children] { + $result add $i + } + } + } + return $result + } + + # part of the code copied from Package->get_parameter + # see xowiki/www/prototypes/folder.form.page + FormPage instproc get_parameter {attribute {default ""}} { + # TODO: check whether the following comment applies here + # Try to get the parameter from the parameter_page. We have to + # be very cautious here to avoid recursive calls (e.g. when + # resolve_page_name needs as well parameters such as + # use_connection_locale or subst_blank_in_name, etc.). + # + set value "" + set pp [my property ParameterPages] + if {$pp ne {}} { + if {![regexp {/?..:} $pp]} { + my log "Error: Name of parameter page '$pp' of FormPage [self] must contain a language prefix" + } else { + set page [::xo::cc cache [list [my package_id] get_page_from_item_ref $pp]] + if {$page eq ""} { + my log "Error: Could not resolve parameter page '$pp' of FormPage [self]." + } + + if {$page ne "" && [$page exists instance_attributes]} { + array set __ia [$page set instance_attributes] + if {[info exists __ia($attribute)]} { + set value $__ia($attribute) + } + } + } + } + + + if {$value eq {}} {set value [next $attribute $default]} + return $value + } + # # begin property management #