Index: openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/Attic/xowiki-portlet-procs.tcl,v diff -u -r1.18 -r1.19 --- openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl 12 Jan 2007 14:10:44 -0000 1.18 +++ openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl 15 Jan 2007 11:41:59 -0000 1.19 @@ -32,6 +32,30 @@ return [list $locale $locale_clause] } + ::xowiki::Portlet instproc category_clause {category_spec {item_ref p.item_id}} { + # the category_spec has the syntax "a,b,c|d,e", where the values are category_ids + # pipe symbols are or-operations, commas are and-operations; + # no parenthesis are permitted + set extra_where_clause "" + set or_names [list] + set ors [list] + foreach cid_or [split $category_spec |] { + set ands [list] + set and_names [list] + foreach cid_and [split $cid_or ,] { + lappend and_names [::category::get_name $cid_and] + lappend ands "exists (select 1 from category_object_map \ + where object_id = p.item_id and category_id = $cid_and)" + } + lappend or_names "[join $and_names { and }]" + lappend ors "([join $ands { and }])" + } + set cnames "[join $or_names { or }]" + set extra_where_clause "and ([join $ors { or }])" + my log "--cnames $category_spec -> $cnames" + return [list $cnames $extra_where_clause] + } + } namespace eval ::xowiki::portlet { @@ -42,9 +66,11 @@ my instvar package_id name title set class [namespace tail [my info class]] set id [expr {[my exists id] ? "id='[my id]'" : ""}] - set link [expr {[string match "*:*" $name] ? [$package_id pretty_link $name] : ""}] + set link [expr {[string match "*:*" $name] ? + "$title" : + $title}] return "
\ - $title
\ + $link
\
[next]
" } Class ::xowiki::portlet::decoration=plain -instproc render {} { @@ -560,11 +586,16 @@ set node() root set node_cnt 0 + set extra_where_clause "" + if {[my exists category_id]} { + foreach {cnames extra_where_clause} [my category_clause [my set category_id]] break + } + set folder_id [$package_id set folder_id] set pages [::xowiki::Page instantiate_objects -sql "select page_id, page_order, name, title \ from xowiki_page_live_revision p \ where parent_id = $folder_id \ - and not page_order is NULL"] + and not page_order is NULL $extra_where_clause"] $pages mixin add ::xo::OrderedComposite::IndexCompare $pages orderby page_order @@ -781,6 +812,7 @@ {-ajax true} {-expand_all false} {-remove_levels 0} + {-category_id} } my get_parameters switch -- $style { @@ -799,7 +831,6 @@ ::xowiki::Page requireJS "/resources/ajaxhelper/yui/treeview/treeview.js" #::xowiki::Page requireJS "http://www.json.org/json.js" ;# for toJSONString - my set book_mode $book_mode if {!$book_mode} { ###### my set book_mode [[my set __including_page] exists __is_book_page] @@ -808,6 +839,7 @@ set ajax 0 } my set ajax $ajax + if {[info exists category_id]} {my set category_id $category_id} set js_tree_cmds [my get_nodes $open_page $package_id $expand_all $remove_levels] @@ -822,23 +854,32 @@ -parameter {{__decoration plain}} book instproc render {} { - my initialize -parameter { } + my initialize -parameter { -category_id } my get_parameters my instvar __including_page lappend ::xowiki_page_item_id_rendered [$__including_page item_id] $__including_page set __is_book_page 1 + set extra_where_clause "" + set cnames "" + if {[info exists category_id]} { + foreach {cnames extra_where_clause} [my category_clause $category_id] break + } + set pages [::xowiki::Page instantiate_objects -sql \ "select page_id, page_order, name, title, item_id \ from xowiki_page_live_revision p \ where parent_id = [$package_id folder_id] \ - and not page_order is NULL \ + and not page_order is NULL $extra_where_clause \ [::xowiki::Page container_already_rendered item_id]" ] $pages mixin add ::xo::OrderedComposite::IndexCompare $pages orderby page_order set output "" + if {$cnames ne ""} { + append output "
Filtered by categories: $cnames
" + } set return_url [::xo::cc url] foreach o [$pages children] { @@ -857,9 +898,7 @@ $p set unresolved_references 0 #$p set render_adp 0 set content [$p get_content] - if {[regexp package_id $content]} {my log "--CONTENT 0 $content"} set content [string map [list "\{\{" "\\\{\{"] $content] - if {[regexp package_id $content]} {my log "--CONTENT 1 $content"} regexp {^.*:([^:]+)$} $name _ anchor append output "" \ $edit_markup \