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 -N -r1.55.2.23 -r1.55.2.24 --- openacs-4/packages/xowiki/tcl/folder-procs.tcl 2 Sep 2019 10:25:51 -0000 1.55.2.23 +++ openacs-4/packages/xowiki/tcl/folder-procs.tcl 17 Sep 2019 11:23:02 -0000 1.55.2.24 @@ -139,10 +139,12 @@ set folders [list] # safety belt, for recursive structures - if {$depth < 1} {return $folders} + if {$depth < 1} { + return $folders + } # - # get folders + # Get Folders # set sql [:folder_query -form_id $folder_form_id \ -parent_id $parent_id \ @@ -153,17 +155,17 @@ -object_class ::xowiki::FormPage -initialize true] # - # get links + # Get links. # set sql [:folder_query -form_id $link_form_id \ -parent_id $parent_id \ -package_id $package_id] #ns_log notice "links (parent-id ='$parent_id'):\n$sql" set links [::xowiki::FormPage instantiate_objects -sql $sql \ - -named_objects true -object_named_after "item_id" \ - -object_class ::xowiki::FormPage -initialize true] + -named_objects true -object_named_after "item_id" \ + -object_class ::xowiki::FormPage -initialize true] - #:msg "[llength [$links children]] links" + #:msg "[llength [$links children]] links under $parent_id " set folders [$folder_pages children] @@ -174,12 +176,14 @@ foreach l [$links children] { set link_type [$l get_property_from_link_page link_type] set cross_package [$l get_property_from_link_page cross_package] + #:log "==================== [$l name]: link_type $link_type cross package $cross_package" if {$link_type ne "folder_link"} continue if {$cross_package} { # - # we found a cross-package link. These kind of links require further queries + # We found a cross-package link. These kind of links require + # further queries. # set target [$l get_target_from_link_page] set sub_folders [:collect_folders -package_id [$target physical_package_id] \ @@ -518,10 +522,13 @@ :get_parameters set current_folder ${:__including_page} + #:log "child-resources: including_page current_folder $current_folder '[$current_folder name]'" if {$parent eq ".."} { set current_folder [$current_folder parent_id] ::xo::db::CrClass get_instance_from_db -item_id $current_folder + } elseif {$parent eq "."} { + # current_folder is already set } else { set page [::$package_id get_page_from_item_ref \ -use_package_path true \ @@ -531,34 +538,40 @@ $parent] set current_folder $page } + #:log "child-resources parent $parent, current_folder $current_folder '[$current_folder name]', folder is formPage [$current_folder istype ::xowiki::FormPage]" if {![$current_folder istype ::xowiki::FormPage]} { # current folder has to be a FormPage set current_folder [$current_folder parent_id] + #:log "###### use parent of current folder $current_folder '[$current_folder name]'" + if {![$current_folder istype ::xowiki::FormPage]} { error "child-resources not included from a FormPage" } } set :current_folder_id [$current_folder item_id] - if {[::xo::cc query_parameter m] ne "list" && $parent ne ".."} { + set logical_folder_id ${:current_folder_id} + if {[$current_folder exists physical_item_id]} { + set :current_folder_id [$current_folder set physical_item_id] + } + + if {[::xo::cc query_parameter m] ne "list"} { set index [$current_folder property index] + #:log "child-resources: current folder $current_folder has index <$index>" if {$index ne ""} { set download [string match "file:*" $index] + #:log "child-resources: lookup index under [$current_folder item_id] ${:current_folder_id}" set index_link [::$package_id pretty_link \ - -parent_id [$current_folder item_id] \ + -parent_id ${:current_folder_id} \ -download $download \ $index] return [::$package_id returnredirect $index_link] } } - 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 current_folder_pretty_link [$current_folder pretty_link] set return_url [ad_return_url -default_url $current_folder_pretty_link] set category_url [export_vars -base [::$package_id package_url] { @@ -641,13 +654,17 @@ foreach c [$items children] { set name [$c name] + #:log "===###=== child-resources: get link for $name under ::$package_id logical_folder_id $logical_folder_id" + #set ::DDD 1 set page_link [::$package_id pretty_link \ -parent_id $logical_folder_id \ -context_url $url \ -folder_ids $folder_ids \ -path_encode false \ -page $c \ $name] + #:log "===###=== child-resources: get link for $name under ::$package_id -> $page_link" + #unset ::DDD set icon [$c render_icon] ad_try { 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 -N -r1.284.2.26 -r1.284.2.27 --- openacs-4/packages/xowiki/tcl/form-field-procs.tcl 2 Sep 2019 17:00:08 -0000 1.284.2.26 +++ openacs-4/packages/xowiki/tcl/form-field-procs.tcl 17 Sep 2019 11:23:02 -0000 1.284.2.27 @@ -3297,7 +3297,8 @@ include instproc pretty_value {v} { if {$v eq ""} { return $v } - set item_id [${:object} get_property_from_link_page item_id] + set item_id [${:object} get_property_from_link_page item_id 0] + :log "##### include in ${:object} '[${:object} name]': get_property_from_link_page ${:object} item_id => <$item_id> (resolve_local ${:resolve_local})" if {$item_id == 0} { # Here, we could call "::xowiki::Link render" to offer the user means # to create the entry like with [[..]], if he has sufficient permissions...; @@ -3314,7 +3315,7 @@ # resetting esp. the item-id is dangerous. # Therefore we reset it immediately after the rendering # - #:log "set __RESOLVE_LOCAL" + #:log "#### RESOLVE LOCAL: setting for $item [$item name] set_resolve_context -parent_id [${:object} parent_id] -item_id [${:object} item_id]" $item set __RESOLVE_LOCAL 1 $item set_resolve_context \ -package_id [${:object} package_id] -parent_id [${:object} parent_id] \ 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 -N -r1.332.2.32 -r1.332.2.33 --- openacs-4/packages/xowiki/tcl/package-procs.tcl 12 Sep 2019 08:59:56 -0000 1.332.2.32 +++ openacs-4/packages/xowiki/tcl/package-procs.tcl 17 Sep 2019 11:23:03 -0000 1.332.2.33 @@ -144,6 +144,7 @@ } Package instproc default_language {} { + #:log "Package ${:instance_name} has default_locale [:default_locale]" return [string range [:default_locale] 0 1] } @@ -465,15 +466,13 @@ @param name name of the wiki page } { #:msg "input name=$name, lang=$lang parent_id=$parent_id" - set default_lang [:default_language] - :get_lang_and_name -default_lang $lang -name $name lang name - set host [expr {$absolute ? ($siteurl ne "" ? $siteurl : [ad_url]) : ""}] if {$anchor ne ""} {set anchor \#$anchor} if {$query ne ""} {set query ?$query} - #:log "--LINK $lang == $default_lang [expr {$lang ne $default_lang}] $name" + :get_lang_and_name -default_lang $lang -name $name lang name + set package_prefix [:get_parameter package_prefix ${:package_url}] if {$package_prefix eq "/" && [string length $lang]>2} { # @@ -482,7 +481,7 @@ # set package_prefix ${:package_url} } - #:msg "lang=$lang, default_lang=$default_lang, name=$name, parent_id=$parent_id, package_prefix=$package_prefix" + #:msg "name=$name, parent_id=$parent_id, package_prefix=$package_prefix" if {$path_encode} { set encoded_name [ad_urlencode_path $name] } else { @@ -491,31 +490,28 @@ if {$parent_id eq -100} { # In case, we have a CR toplevel entry, we assume, we can - # resolve it at lease against the root folder of the current + # resolve it at least against the root folder of the current # package. - set folder "" + set folder_path "" set encoded_name "" + set default_lang [:default_language] } else { if {$parent_id eq ""} { ns_log warning "pretty_link of $name: you should consider to pass a parent_id to support folders" set parent_id [:folder_id] } - set folder [:folder_path -parent_id $parent_id -folder_ids $folder_ids -path_encode $path_encode] + set folder_path [:folder_path -parent_id $parent_id -folder_ids $folder_ids -path_encode $path_encode] set pkg [::$parent_id package_id] if {![nsf::is object ::$pkg]} { ::xowiki::Package initialize -package_id $pkg -init_url false -keep_cc true } set package_prefix [$pkg get_parameter package_prefix [$pkg package_url]] + set default_lang [$pkg default_language] } - #:msg "folder_path = $folder, -parent_id $parent_id -folder_ids $folder_ids // default_lang [:default_language]" + #:msg "folder_path = $folder_path, -parent_id $parent_id -folder_ids $folder_ids // default_lang [:default_language]" - # if {$folder ne ""} { - # # if folder has a different language than the content, we have to provide a prefix.... - # regexp {^(..):} $folder _ default_lang - # } + #:log "h=${host}, prefix=${package_prefix}, folder=$folder_path, name=$encoded_name anchor=$anchor download=$download" - #:log "h=${host}, prefix=${package_prefix}, folder=$folder, name=$encoded_name anchor=$anchor download=$download" - # # Lookup plain page name. If we succeed, there is a danger of a # name clash between a folder and a language prefixed page. In @@ -529,7 +525,6 @@ # can have children and same-named folders exist. # set found_id [:lookup -parent_id $parent_id -name $name] - #set found_id [::xo::dc get_value check_folder {select item_id from cr_items where parent_id = :parent_id and name = :name} 0] #:log "-pretty_link: lookup [list :lookup -parent_id $parent_id -name $name] -> $found_id" # @@ -552,25 +547,26 @@ } } - #:log "-pretty_link: found_id=$found_id name=$name,folder=$folder,lang=$lang,default_lang=$default_lang" + #:log "-pretty_link: found_id=$found_id name=$name,folder_path=$folder_path,lang=$lang,default_lang=$default_lang" + #:log "-pretty_link: host <${host}> package_prefix <${package_prefix}>" if {$download} { # # Use the special download (file) syntax. # - set url ${host}${package_prefix}download/file/$folder$encoded_name$query$anchor + set url ${host}${package_prefix}download/file/$folder_path$encoded_name$query$anchor } elseif {$lang ne $default_lang || [[self class] exists www-file($name)]} { # # If files are physical files in the www directory, add the # language prefix # - set url ${host}${package_prefix}${lang}/$folder$encoded_name$query$anchor + set url ${host}${package_prefix}${lang}/$folder_path$encoded_name$query$anchor } elseif {$found_id != 0} { - set url ${host}${package_prefix}$folder${lang}:$encoded_name$query$anchor + set url ${host}${package_prefix}$folder_path${lang}:$encoded_name$query$anchor } else { # # Use the short notation without language prefix. # - set url ${host}${package_prefix}$folder$encoded_name$query$anchor + set url ${host}${package_prefix}$folder_path$encoded_name$query$anchor } #:msg "final url=$url" return $url @@ -1404,44 +1400,68 @@ lang $lang stripped_name $stripped_name name $name ] } - Package instproc lookup { + Package ad_instproc lookup { {-use_package_path true} {-use_site_wide_pages false} {-default_lang ""} -name:required {-parent_id ""} + } -returns integer { + + Lookup name (with maybe cross-package references) from a + given parent_id or from the list of configured instances + (obtained via package_path). + } { - # Lookup name (with maybe cross-package references) from a - # given parent_id or from the list of configured instances - # (obtained via package_path). - # - array set "" [:get_package_id_from_page_name -default_lang $default_lang $name] - #:msg "result = [array get {}]" - if {![info exists (package_id)]} { + #:log "LOOKUP of <$name> on-package: ${:id} parent_id '$parent_id'" + set pkg_info [:get_package_id_from_page_name -default_lang $default_lang $name] + + if {[dict exists $pkg_info package_id]} { + set package_id [dict get $pkg_info package_id] + } else { return 0 } - if {$parent_id eq ""} {set parent_id [$(package_id) folder_id]} - set item_id [::xo::db::CrClass lookup -name $(page_name) -parent_id $parent_id] - #:log "lookup $(page_name) $parent_id in package $(package_id) returns $item_id, parent_id $parent_id" + if {$parent_id eq ""} { + set parent_id [::$package_id folder_id] + } + set item_id [::xo::db::CrClass lookup \ + -name [dict get $pkg_info page_name] \ + -parent_id $parent_id] + #:log "lookup [dict get $pkg_info page_name] $parent_id in package $package_id returns $item_id, parent_id $parent_id" - # Test for "0" is only needed when we want to create the first root folder - if {$item_id == 0 && $parent_id ne "0"} { + # + # Test for "0" is only needed when we want to create the first + # root folder. + # + if {$item_id == 0 && $parent_id != 0} { # - # Page not found so far. Is the parent-page a regular page and a folder-link? - # If so, de-reference the link. + # Page not found so far, get the parent page. # set p [::xo::db::CrClass get_instance_from_db -item_id $parent_id] + # + # Is the parent-page a regular page and a folder-link? + # If so, de-reference the link. + # if {[$p istype ::xowiki::FormPage] && [$p is_link_page] && [$p is_folder_page]} { set target [$p get_target_from_link_page] set target_package_id [$target package_id] - #:msg "SYMLINK LOOKUP from target-package $target_package_id source package $(package_id)" - set target_item_id [::$target_package_id lookup \ - -use_package_path $use_package_path \ - -use_site_wide_pages $use_site_wide_pages \ - -default_lang $default_lang \ - -name $name \ - -parent_id [$target item_id]] + set target_item_id [$target item_id] + #:log "SYMLINK LOOKUP from target-package $target_package_id source package $package_id name $name" + # + # Avoid potential recursive loop + # + if {${:id} != $target_package_id || $parent_id != $target_item_id} { + set target_item_id [::$target_package_id lookup \ + -use_package_path $use_package_path \ + -use_site_wide_pages $use_site_wide_pages \ + -default_lang $default_lang \ + -name $name \ + -parent_id $target_item_id] + } else { + :log "SYMLINK LOOKUP avoid recursive loop name $name package_id ${:id} parent_id [$target item_id]" + set target_item_id 0 + } if {$target_item_id != 0} { #:msg "SYMLINK FIX $target_item_id set_resolve_context -package_id ${:id} -parent_id $parent_id" ::xo::db::CrClass get_instance_from_db -item_id $target_item_id @@ -1802,13 +1822,15 @@ if {$(item_id) == 0} { # - # check symlink (todo: should this happen in package->lookup?) + # Check symlink (todo: should this happen in package->lookup?) # ::xo::db::CrClass get_instance_from_db -item_id $(parent_id) if {[$(parent_id) is_link_page]} { # - # We encompassed a link to a page or folder, treat both the same way. + # We encompassed a link to a page or folder, treat both the same way. # + #:log "item_info_from_url LINK page $(parent_id)" + set link_id $(parent_id) set target [::$link_id get_target_from_link_page]