ad_categorization_widget {-db 0 -which_table "" -what_id 0 -name "category_id_list" -multiple_p 1 -size 0}What it does:
Given a specific row in the database, return a select widget that contains the entire category hierarchy. Categories already mapped to the database row will be pre-selected.Defined in: /web/philip/tcl/ad-categories.tcl
Source code:
arg_parser_for_ad_categorization_widget $args # Validate that all mandatory arguments have been supplied. # set missing_args [list] if { $db == 0 } { lappend missing_args "db" } if { [empty_string_p $which_table] } { lappend missing_args "which_table" } if { $what_id == 0 } { lappend missing_args "what_id" } set n_missing_args [llength $missing_args] if { $n_missing_args > 0 } { error "missing $n_missing_args arg(s): [join $missing_args ", "]" } # Format the <select> tag. # set widget "<select name=\"$name\"" if { $multiple_p } { append widget " multiple" } if { $size > 0 } { append widget " size=$size" } append widget ">\n" # Fetch the list of categories to which this table row is already mapped. # set mapped_categories [database_to_tcl_list $db "select category_id from site_wide_category_map where on_which_table = '$which_table' and on_what_id = '$what_id'"] # Fetch the entire category hierarchy. # set selection [ns_db select $db "select c.category_id, lpad(' ', 12*(ch.tree_level - 1),' ') as indent, c.category, c.category_type from categories c, (select child_category_id, rownum as tree_rownum, level as tree_level from category_hierarchy start with parent_category_id is null connect by prior child_category_id = parent_category_id) ch where c.category_id = ch.child_category_id order by ch.tree_rownum"] while { [ns_db getrow $db $selection] } { set_variables_after_query append widget "<option value=$category_id" # If the category is already mapped to this database row, then # pre-select it. # # lsearch is slow for long lists so we may want to store # mapped categories as array keys. # if { [lsearch $mapped_categories $category_id] != -1 } { append widget " selected" } append widget ">${indent}${category}" if { ![empty_string_p $category_type] } { append widget " ($category_type)" } append widget "\n" } append widget "</select>" return $widget