Index: openacs-4/packages/xowiki/tcl/includelet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/includelet-procs.tcl,v diff -u -r1.191.2.10 -r1.191.2.11 --- openacs-4/packages/xowiki/tcl/includelet-procs.tcl 13 Mar 2014 12:25:08 -0000 1.191.2.10 +++ openacs-4/packages/xowiki/tcl/includelet-procs.tcl 27 Mar 2014 15:18:07 -0000 1.191.2.11 @@ -654,183 +654,184 @@ # set href "[[my package_id] package_url]?manage-categories&object_id=$object_id" return [[my set __including_page] include \ - [list edit-item-button -link $href -title "Manage Categories" -target _blank]]] + [list edit-item-button -link $href -title "Manage Categories" -target _blank]] + } } + return "" } - return "" -} -categories instproc category_tree_missing {{-name ""} -edit_html} { - # todo i18n - if {$name eq ""} { - #set msg "No category tree found." - # maybe it is better to stay quiet in case, no category name was provided - set msg "" - } else { - set msg "No category tree with name '$name' found." + + categories instproc category_tree_missing {{-name ""} -edit_html} { + # todo i18n + if {$name eq ""} { + #set msg "No category tree found." + # maybe it is better to stay quiet in case, no category name was provided + set msg "" + } else { + set msg "No category tree with name '$name' found." + } + [my package_id] flush_page_fragment_cache -scope agg + set html "
$msg
" + if {$edit_html ne ""} { + return "$html Manage Categories? $edit_html" + } + return $html } - [my package_id] flush_page_fragment_cache -scope agg - set html "
$msg
" - if {$edit_html ne ""} { - return "$html Manage Categories? $edit_html" - } - return $html -} - -categories instproc render {} { - my get_parameters - - set content "" - set folder_id [$package_id folder_id] - set open_item_id [expr {$open_page ne "" ? - [::xo::db::CrClass lookup -name $open_page -parent_id $folder_id] : 0}] - - lassign [::xowiki::Includelet locale_clause -revisions r -items ci $package_id $locale] \ - locale locale_clause - - set trees [::xowiki::Category get_mapped_trees -object_id $package_id -locale $locale \ - -names $tree_name \ - -output {tree_id tree_name}] - - #my msg "[llength $trees] == 0 && $tree_name" - if {[llength $trees] == 0 && $tree_name ne ""} { - # we have nothing left from mapped trees, maybe the tree_names are not mapped; - # try to get these - foreach name $tree_name { - #set tree_id [lindex [category_tree::get_id $tree_name $locale] 0] - set tree_id [lindex [category_tree::get_id $tree_name] 0] - if {$tree_id ne ""} { - lappend trees [list $tree_id $name] + + categories instproc render {} { + my get_parameters + + set content "" + set folder_id [$package_id folder_id] + set open_item_id [expr {$open_page ne "" ? + [::xo::db::CrClass lookup -name $open_page -parent_id $folder_id] : 0}] + + lassign [::xowiki::Includelet locale_clause -revisions r -items ci $package_id $locale] \ + locale locale_clause + + set trees [::xowiki::Category get_mapped_trees -object_id $package_id -locale $locale \ + -names $tree_name \ + -output {tree_id tree_name}] + + #my msg "[llength $trees] == 0 && $tree_name" + if {[llength $trees] == 0 && $tree_name ne ""} { + # we have nothing left from mapped trees, maybe the tree_names are not mapped; + # try to get these + foreach name $tree_name { + #set tree_id [lindex [category_tree::get_id $tree_name $locale] 0] + set tree_id [lindex [category_tree::get_id $tree_name] 0] + if {$tree_id ne ""} { + lappend trees [list $tree_id $name] + } } } - } - - set edit_html [my category_tree_edit_button -object_id $package_id -allow_edit $allow_edit] - if {[llength $trees] == 0} { - return [my category_tree_missing -name $tree_name -edit_html $edit_html] - } - - if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]} - - foreach tree $trees { - lassign $tree tree_id my_tree_name ... - - set edit_html [my category_tree_edit_button -object_id $package_id \ - -allow_edit $allow_edit -tree_id $tree_id] - #append content "
$edit_html
\n" - - if {!$no_tree_name} { - append content "

$my_tree_name $edit_html

" - } elseif {$edit_html ne ""} { - append content "$edit_html
" + + set edit_html [my category_tree_edit_button -object_id $package_id -allow_edit $allow_edit] + if {[llength $trees] == 0} { + return [my category_tree_missing -name $tree_name -edit_html $edit_html] } - set categories [list] - set pos 0 - set cattree(0) [::xowiki::Tree new -volatile -orderby pos \ - -id [my id]-$my_tree_name -name $my_tree_name] + + if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]} + + foreach tree $trees { + lassign $tree tree_id my_tree_name ... + + set edit_html [my category_tree_edit_button -object_id $package_id \ + -allow_edit $allow_edit -tree_id $tree_id] + #append content "
$edit_html
\n" - set category_infos [::xowiki::Category get_category_infos \ - -locale $locale -tree_id $tree_id] - foreach category_info $category_infos { - lassign $category_info cid category_label deprecated_p level - set c [::xowiki::TreeNode new -orderby pos \ - -level $level -label $category_label -pos [incr pos]] - set cattree($level) $c - set plevel [expr {$level -1}] - $cattree($plevel) add $c - set category($cid) $c - lappend categories $cid - } - - if {[llength $categories] == 0} { - return $content - } - - if {[info exists ordered_composite]} { - set items [list] - foreach c [$ordered_composite children] {lappend items [$c item_id]} - - # If we have no item, provide a dummy one to avoid sql error - # later - if {[llength $items]<1} {set items -4711} - - if {$count} { - set sql "category_object_map c - where c.object_id in ([join $items ,]) " - } else { - # TODO: the non-count-part for the ordered_composite is not - # tested yet. Although "ordered compostite" can be used - # only programmatically for now, the code below should be - # tested. It would be as well possible to obtain titles and - # names etc. from the ordered composite, resulting in a - # faster SQL like above. - set sql "category_object_map c, cr_items ci, cr_revisions r - where c.object_id in ([join $items ,]) + if {!$no_tree_name} { + append content "

$my_tree_name $edit_html

" + } elseif {$edit_html ne ""} { + append content "$edit_html
" + } + set categories [list] + set pos 0 + set cattree(0) [::xowiki::Tree new -volatile -orderby pos \ + -id [my id]-$my_tree_name -name $my_tree_name] + + set category_infos [::xowiki::Category get_category_infos \ + -locale $locale -tree_id $tree_id] + foreach category_info $category_infos { + lassign $category_info cid category_label deprecated_p level + set c [::xowiki::TreeNode new -orderby pos \ + -level $level -label $category_label -pos [incr pos]] + set cattree($level) $c + set plevel [expr {$level -1}] + $cattree($plevel) add $c + set category($cid) $c + lappend categories $cid + } + + if {[llength $categories] == 0} { + return $content + } + + if {[info exists ordered_composite]} { + set items [list] + foreach c [$ordered_composite children] {lappend items [$c item_id]} + + # If we have no item, provide a dummy one to avoid sql error + # later + if {[llength $items]<1} {set items -4711} + + if {$count} { + set sql "category_object_map c + where c.object_id in ([join $items ,]) " + } else { + # TODO: the non-count-part for the ordered_composite is not + # tested yet. Although "ordered compostite" can be used + # only programmatically for now, the code below should be + # tested. It would be as well possible to obtain titles and + # names etc. from the ordered composite, resulting in a + # faster SQL like above. + set sql "category_object_map c, cr_items ci, cr_revisions r + where c.object_id in ([join $items ,]) and c.object_id = ci.item_id and and r.revision_id = ci.live_revision " + } + } else { + set sql "category_object_map c, cr_items ci, cr_revisions r, xowiki_page p \ + where c.object_id = ci.item_id and ci.parent_id = $folder_id \ + and ci.content_type not in ('::xowiki::PageTemplate') \ + and c.category_id in ([join $categories ,]) \ + and r.revision_id = ci.live_revision \ + and p.page_id = r.revision_id \ + and ci.publish_status <> 'production'" } - } else { - set sql "category_object_map c, cr_items ci, cr_revisions r, xowiki_page p \ - where c.object_id = ci.item_id and ci.parent_id = $folder_id \ - and ci.content_type not in ('::xowiki::PageTemplate') \ - and c.category_id in ([join $categories ,]) \ - and r.revision_id = ci.live_revision \ - and p.page_id = r.revision_id \ - and ci.publish_status <> 'production'" - } - - if {$except_category_ids ne ""} { - append sql \ - " and not exists (select * from category_object_map c2 \ - where ci.item_id = c2.object_id \ - and c2.category_id in ($except_category_ids))" - } - #ns_log notice "--c category_ids=$category_ids" - if {$category_ids ne ""} { - foreach cid [split $category_ids ,] { - set or_ids [split $cid |] - foreach or_id $or_ids { if {![string is integer $or_id]} {error "invalid category_ids"}} - append sql " and exists (select * from category_object_map \ + + if {$except_category_ids ne ""} { + append sql \ + " and not exists (select * from category_object_map c2 \ + where ci.item_id = c2.object_id \ + and c2.category_id in ($except_category_ids))" + } + #ns_log notice "--c category_ids=$category_ids" + if {$category_ids ne ""} { + foreach cid [split $category_ids ,] { + set or_ids [split $cid |] + foreach or_id $or_ids { if {![string is integer $or_id]} {error "invalid category_ids"}} + append sql " and exists (select * from category_object_map \ where object_id = ci.item_id and category_id in ([join $or_ids ,]))" + } } + append sql $locale_clause + + if {$count} { + ::xo::dc foreach get_counts \ + "select count(*) as nr,category_id from $sql group by category_id" { + $category($category_id) set count $nr + set s [expr {$summary ? "&summary=$summary" : ""}] + $category($category_id) href [ad_conn url]?category_id=$category_id$s + $category($category_id) open_tree + } + append content [$cattree(0) render -style [my set style]] + } else { + lassign [split $order_items_by ,] orderby direction ;# e.g. "title,asc" + set increasing [expr {$direction ne "desc"}] + set order_column ", p.page_order" + + ::xo::dc foreach get_pages \ + "select ci.item_id, ci.name, ci.parent_id, r.title, category_id $order_column from $sql" { + if {$title eq ""} {set title $name} + set itemobj [Object new] + set prefix "" + set suffix "" + foreach var {name title prefix suffix page_order} {$itemobj set $var [set $var]} + $itemobj set href [::$package_id pretty_link -parent_id $parent_id $name] + $cattree(0) add_item \ + -category $category($category_id) \ + -itemobj $itemobj \ + -orderby $orderby \ + -increasing $increasing \ + -open_item [expr {$item_id == $open_item_id}] + } + append content [$cattree(0) render -style [my set style]] + } } - append sql $locale_clause - - if {$count} { - ::xo::dc foreach get_counts \ - "select count(*) as nr,category_id from $sql group by category_id" { - $category($category_id) set count $nr - set s [expr {$summary ? "&summary=$summary" : ""}] - $category($category_id) href [ad_conn url]?category_id=$category_id$s - $category($category_id) open_tree - } - append content [$cattree(0) render -style [my set style]] - } else { - lassign [split $order_items_by ,] orderby direction ;# e.g. "title,asc" - set increasing [expr {$direction ne "desc"}] - set order_column ", p.page_order" - - ::xo::dc foreach get_pages \ - "select ci.item_id, ci.name, ci.parent_id, r.title, category_id $order_column from $sql" { - if {$title eq ""} {set title $name} - set itemobj [Object new] - set prefix "" - set suffix "" - foreach var {name title prefix suffix page_order} {$itemobj set $var [set $var]} - $itemobj set href [::$package_id pretty_link -parent_id $parent_id $name] - $cattree(0) add_item \ - -category $category($category_id) \ - -itemobj $itemobj \ - -orderby $orderby \ - -increasing $increasing \ - -open_item [expr {$item_id == $open_item_id}] - } - append content [$cattree(0) render -style [my set style]] - } + return $content } - return $content } -} namespace eval ::xowiki::includelet {