Commit eae222ae authored by Frank Bergmann's avatar Frank Bergmann

- OpenACS 5.6

parent 43018758
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="de_DE" charset="ISO-8859-1">
<msg key="cadmin">Management der Kategorien</msg>
<msg key="Categories">Kategorien</msg>
<msg key="code_export">Code zum Erstellen der Kategoriebume exportieren</msg>
<msg key="code_necessary">TCL Code um ausgewhlte Kategoriebume zu importieren</msg>
<msg key="export">Export</msg>
</message_catalog>
<?xml version="1.0" encoding="utf-8"?>
<message_catalog package_key="categories" locale="el_GR" charset="utf-8">
<msg key="cadmin">Κατηγορία διαχείρισης</msg>
<msg key="code_export">Εξαγωγή κώδικα για επαναδημιουργία δένδρων κατηγοριών</msg>
<msg key="code_necessary">Tcl κώδικα για επαναδημιουργία επιλεγμένων δένδρων κατηγοριών</msg>
<msg key="export">Εξαγωγή</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="en_US" charset="ISO-8859-1">
<msg key="cadmin">Category Management</msg>
<msg key="Categories">Categories</msg>
<msg key="code_export">Export code to recreate category trees</msg>
<msg key="code_necessary">Tcl code to recreate selected category trees</msg>
<msg key="export">Export</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="es_ES" charset="ISO-8859-1">
<msg key="cadmin">Administración de Categorías</msg>
<msg key="Categories">Categorías</msg>
<msg key="code_export">Exportar código para recrear los árboles de categorías</msg>
<msg key="code_necessary">Código Tcl para recrear los árboles de categorías seleccionados</msg>
<msg key="export">Exportar</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="nl_NL" charset="ISO-8859-1">
<msg key="cadmin">Categorienbeheer</msg>
<msg key="code_export">Exporteer code om categoriebomen opnieuw aan te maken</msg>
<msg key="code_necessary">Tcl-code om betreffende categoriebomen opnieuw aan te maken</msg>
<msg key="export">Exporteren</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="nl_ZA" charset="ISO-8859-1">
<msg key="cadmin">Kategoriebeheer</msg>
<msg key="code_export">Eksporteer kode om kategoriebome opnuut aan te maak</msg>
<msg key="code_necessary">Tcl-kode om betreffende kategoriebome opnuut aan te maak</msg>
<msg key="export">Eksporteer</msg>
</message_catalog>
<?xml version="1.0" encoding="utf-8"?>
<message_catalog package_key="categories" locale="pl_PL" charset="utf-8">
<msg key="cadmin">Zarządzanie Kategoriami</msg>
<msg key="code_export">Eksportuj kod do odtworzenia drzew kategorii</msg>
<msg key="code_necessary">Kod Tcl do odtworzenia wybranych kategorii</msg>
<msg key="export">Eksportuj</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="categories" locale="pt_BR" charset="ISO-8859-1">
<msg key="cadmin">Gerenciamento de Categorias</msg>
<msg key="code_export">Exportar cdigo para recriar rvores de categoria</msg>
<msg key="code_necessary">Cdigo Tcl para recriar as rvores de categoria selecionadas</msg>
<msg key="export">Exportar</msg>
</message_catalog>
......@@ -2,24 +2,26 @@
<!-- Generated by the OpenACS Package Manager -->
<package key="categories" url="http://openacs.org/repository/apm/packages/categories" type="apm_service">
<license>GPL V2.0 or any later version</license>
<package-name>Categories</package-name>
<pretty-plural>Categories</pretty-plural>
<initial-install-p>f</initial-install-p>
<singleton-p>f</singleton-p>
<auto-mount>categories</auto-mount>
<version name="1.0d7" url="http://openacs.org/repository/apm/packages/categories-1.0d7">
<owner>timo@timohentschel.de</owner>
<version name="1.1.2d4" url="http://openacs.org/repository/apm/packages/categories-1.1.2d4">
<owner url="mailto:timo@timohentschel.de">timo@timohentschel.de</owner>
<summary>Manage categories in category trees and let users map objects to categories.</summary>
<release-date>2003-04-16</release-date>
<description format="text/html">Datamodel for category trees with supporting API and management pages. Provides a widget for
<release-date>2008-11-06</release-date>
<description format="text/html">Datamodel for category trees with supporting API and management pages. Provides a widget for
general categorization of arbitrary objects and tracks which package instances use which category trees. Also supports localization.</description>
<provides url="categories" version="1.0d7"/>
<maturity>0</maturity>
<provides url="categories" version="1.1.2d4"/>
<requires url="acs-kernel" version="5.5.0"/>
<callbacks>
<callback type="after-install" proc="category::after_install"/>
<callback type="before-uninstall" proc="category::before_uninstall"/>
<callback type="after-install" proc="category::after_install"/>
</callbacks>
<parameters>
<!-- No version parameters -->
......
<h1>Categorize @name@</h1>
<if @catass_list@ not nil>
<h2> Current categories</h2>
<p>@catass_list;noquote@</p>
</if>
<formtemplate id="catass"></formtemplate>
if {![exists_and_not_null object_id]} {
ad_complain "You must specify an object to categorize"
}
if {![exists_and_not_null container_id]} {
set container_id [ad_conn subsite_id]
}
set name [db_string title {select title from acs_objects where object_id = :object_id} -default $object_id]
# Category mapping stuff
# add category form
ad_form -action map -method GET -name catass -form {
{object_id:integer(hidden)
{value $object_id}
}
{container_id:integer(hidden)
{value $container_id}
}
}
category::ad_form::add_widgets -container_object_id $container_id -form_name catass
# mapped categories:
set catass_list [category::list::get_pretty_list \
-category_link_eval "list-categories?cat=\$__category_id" \
-remove_link_eval "remove?cat=\$__category_id&object_id=$object_id" \
-remove_link_text "<b style=\"color: red\">X</b>" \
[category::get_mapped_categories $object_id]]
<listtemplate name="content"></listtemplate>
\ No newline at end of file
# Display the site contributions
# If user_id set it will be limited by that user otherwise all users.
# if limit set then only limit items will be displayed.
# if root_node_id exists then only return things under root node.
set root_node_id [ad_conn node_id]
if {![info exists user_id]} {
set user_id {}
}
if {![info exists category]} {
set category {}
}
if {[info exists supress]} {
foreach key $supress {
set hide($key) 1
}
}
if {[info exists limit]
&& [regexp {^[0-9]+$} $limit]} {
set limit " limit $limit"
} else {
set limit {}
}
if {![info exists format]} {
set format table
}
if {[info exists root_node_id]} {
set packages [subsite::util::packages -node_id $root_node_id]
} else {
set packages {}
}
lappend elements object_title {
label {Title}
display_template {<a href="/o/@content.object_id@">@content.title@</a>}
}
if {![info exists hide(pretty_name)]} {
lappend elements pretty_name {
label {Type}
display_template {<a href="/o/@content.object_id@">@content.object_type@</a>}
}
}
lappend elements last_modified {
label {Last update}
display_template "@content.last_modified;noquote@"
html {align right}
}
# lappend elements new {
# label {New}
# display_template "@content.new;noquote@"
# html {align right}
#}
if {$user_id eq ""} {
lappend elements name {
label {Created by}
display_template {<a href="@content.user_url@" title="Member page">@content.name@</a>}
}
}
template::list::create \
-name content \
-multirow content \
-key object_id \
-elements $elements \
-selected_format $format \
-filters {
user_id {}
} \
-formats {
table {
label Table
layout table
}
list {
label List
layout list
template {
<div style="padding: 0 0 1em 0;"><listelement name="object_title"> \[<listelement name="pretty_name">\] - <listelement name="new"><br>
<span style="color: \#ccc;">by <listelement name="name">, <listelement name="last_modified"></span></div>
}
}
} \
-orderby {
object_title {
orderby lower(o.title)
}
pretty_name {
orderby lower(t.pretty_name)
}
last_modified {
orderby_asc {o.last_modified desc}
orderby_desc {o.last_modified asc}
}
name {
orderby_asc "lower(u.last_name),lower(u.first_names)"
orderby_desc "lower(u.last_name) desc,lower(u.first_names) desc"
}
}
set now [clock_to_ansi [clock seconds]]
set restrict {}
if {$user_id ne ""} {
append restrict "\nand o.creation_user = :user_id"
}
if {$category ne ""} {
append restrict "\nand exists (select 1 from category_object_map c where c.object_id = o.object_id and c.category_id = :category)"
}
if {$packages ne ""} {
append restrict "\nand o.package_id in ([join $packages ,])"
}
# JCDXXX: TODO: need to get the dimension to display, need to find the right CoP, permissions
db_multirow -extend {url_one user_url new} content content "
SELECT o.title, o.object_id, o.title, t.pretty_name as object_type, to_char(o.last_modified,'YYYY-MM-DD HH24:MI:SS') as last_modified, u.user_id, u.first_names || ' ' || u.last_name as name
FROM acs_object_types t, acs_objects o
left outer join cr_items i on (o.object_id = i.item_id)
left outer join acs_users_all u on (u.user_id = o.creation_user)
WHERE t.object_type = case when o.object_type = 'content_item' then i.content_type else o.object_type end
and o.object_type in ('content_item','pinds_blog_entry','forums_forum','forums_message',
'cal_item','bt_bug','bt_patch', 'news', 'faq', 'faq_q_and_a', 'bookshelf_book', 'job_posting','survey')
and (o.object_type != 'content_item' or i.content_type in ('content_extlink','file_storage_object','pa_album','pa_photo','static_page','news','job', 'content_revision'))
$restrict
[template::list::orderby_clause -orderby -name "content"]$limit" {
# TODO: JCDXXX - make this work in general.
if {($object_id % 3) == 0} {
set new {<span class="new" style="color: red">NEW</span>}
} else {
set new {}
}
# TODO: JCDXXX - make this work in general.
regsub {/www/cop1/static} $title {} title
set last_modified [regsub -all { } [util::age_pretty -hours_limit 0 -mode_2_fmt "%X %a" -mode_3_fmt "%x" -timestamp_ansi $last_modified -sysdate_ansi $now] {\&nbsp;}]
set user_url [acs_community_member_url -user_id $user_id]
if {[catch {set url_one [acs_sc_call -error FtsContentProvider url [list $object_id] $object_type]} errMsg]} {
global errorCode
set url_one $errorCode
}
}
\ No newline at end of file
<div style="float: left;">
<div>
<multiple name="categories">
<h2>@categories.tree_name@</h2>
<ul>
<group column="tree_id">
<if @categories.category_id@ eq @cat@><li><b>@categories.pad;noquote@@categories.category_name@ <if @categories.count@ gt 0>(@categories.count@)</if></b></li></if>
<else>
<if @categories.count@ gt 0 or @categories.child_sum@ gt 0>
<li>@categories.pad;noquote@<if @categories.count@ gt 0><a href="?cat=@categories.category_id@" rel="nofollow">@categories.category_name@</a> (@categories.count@)</if><else>@categories.category_name@</else>
</li>
</if>
</else>
</group>
</ul>
</multiple>
</div>
<div>
<if @cat@ not nil><include src="/packages/categories/lib/contributions" orderby="@orderby@" category="@cat@" root_node_id="@node_id@"></if>
</div>
</div>
if {![exists_and_not_null cat]} {
set cat {}
}
if {![exists_and_not_null orderby]} {
set orderby "object_title"
}
set user_id [ad_conn user_id]
# Get category data.
set counts {}
set node_id [ad_conn node_id]
set packages [subsite::util::packages -node_id $node_id]
db_foreach category_count "
SELECT c.category_id as catid, count(*) as count
FROM category_object_map c, acs_objects o
where c.object_id = o.object_id
and o.package_id in ([join $packages ,])
and exists (select 1
from acs_object_party_privilege_map pm
where pm.object_id = c.object_id
and pm.party_id = :user_id
and pm.privilege = 'read')
group by c.category_id
" {
lappend counts $catid $count
}
category_tree::get_multirow -datasource categories -container_id [ad_conn subsite_id] -category_counts $counts
OK
\ No newline at end of file
if {![exists_and_not_null object_id]} {
ad_complain "You must specify an item to map"
}
if {![exists_and_not_null container_id]} {
ad_complain "You must specify a container to map the object to"
}
ad_form -name catass -form {
{object_id:integer(hidden)
{value $object_id}
}
{container_id:integer(hidden)
{value $container_id}
}
}
category::ad_form::add_widgets -container_object_id $container_id -form_name catass
ad_form -extend -name catass -on_submit {
ns_log Notice "JCD: trees [category_tree::get_mapped_trees $container_id]"
set category_ids [category::ad_form::get_categories -container_object_id $container_id]
ns_log Notice "JCD: mapping $category_ids"
category::map_object \
-object_id $object_id \
$category_ids
}
ad_returnredirect [get_referrer]
############
# Category Tree "@tree.tree_name@"
############
category_tree::import \
-name {@tree.tree_name@} \
-description {@tree.description@} \
-locale $default_locale \
-categories {<multiple name="categories">
@categories.pad;noquote@@categories.level@ {@categories.name@}</multiple>
}
set default_locale [lang::system::site_wide_locale]
array set tree [category_tree::get_data $tree_id $default_locale]
multirow create categories name level pad
foreach category [category_tree::get_tree -all $tree_id $default_locale] {
util_unlist $category category_id category_name deprecated_p level
multirow append categories $category_name $level [string repeat "&nbsp;" [expr {2 * $level - 2}]]
}
set package_id [ad_conn package_id]
if {![info exists ctx_id]} {
set package_id [ad_conn package_id]
} else {
set package_id $ctx_id
}
set languages [lang::system::get_locale_options]
ad_form -name tree_form -mode [ad_decode [ad_form_new_p -key tree_id] 1 edit display] -action tree-form -export { locale object_id } -form {
ad_form -name tree_form \
-mode [ad_decode [ad_form_new_p -key tree_id] 1 edit display] \
-action tree-form \
-export { locale object_id ctx_id } \
-form {
{tree_id:key}
{tree_name:text {label "Name"} {html {size 50 maxlength 50}}}
{language:text(select) {label "Language"} {options $languages}}
......@@ -22,14 +30,14 @@ ad_form -name tree_form -mode [ad_decode [ad_form_new_p -key tree_id] 1 edit dis
category_tree::add -tree_id $tree_id -name $tree_name -description $description -locale $language -context_id $package_id
if { [info exists object_id] } {
category_tree::map -tree_id $tree_id -object_id $object_id
set return_url [export_vars -base one-object { locale object_id }]
set return_url [export_vars -base object-map { locale object_id ctx_id}]
} else {
set return_url [export_vars -base tree-view { tree_id locale }]
set return_url [export_vars -base tree-view { tree_id locale ctx_id}]
}
}
} -edit_data {
category_tree::update -tree_id $tree_id -name $tree_name -description $description -locale $language
set return_url [export_vars -base tree-view { tree_id locale object_id }]
set return_url [export_vars -base tree-view { tree_id locale object_id ctx_id}]
} -after_submit {
ad_returnredirect $return_url
ad_script_abort
......
......@@ -135,6 +135,7 @@ create table category_tree_map (
subtree_category_id integer default null constraint cat_tree_map_subtree_id_fk references categories,
assign_single_p char(1) default 'f' constraint cat_tree_map_single_p_ck check (assign_single_p in ('t','f')),
require_category_p char(1) default 'f' constraint cat_tree_map_categ_p_ck check (require_category_p in ('t','f')),
widget varchar2(20),
primary key (object_id, tree_id)
) organization index;
......@@ -162,6 +163,9 @@ comment on column category_tree_map.assign_single_p is '
comment on column category_tree_map.require_category_p is '
Do the users have to assign at least one category to objects?
';
comment on column category_tree_map.widget is '
What widget do we want to use for this cateogry?
';
create table category_object_map (
category_id integer constraint cat_object_map_category_id_fk references categories on delete cascade,
......
......@@ -28,7 +28,7 @@ CREATE OR REPLACE PACKAGE BODY category_link AS
IS
v_link_id integer;
BEGIN
select category_links_id_seq.nextval() into v_link_id from dual;
select category_links_id_seq.nextval into v_link_id from dual;
insert into category_links (link_id, from_category_id, to_category_id)
values (v_link_id, new.from_category_id, new.to_category_id);
......
......@@ -91,7 +91,8 @@ CREATE OR REPLACE PACKAGE BODY CATEGORY AS
creation_date => creation_date,
creation_user => creation_user,
creation_ip => creation_ip,
context_id => tree_id
context_id => tree_id,
title => name
);
if (new.parent_id is null) then
......
......@@ -62,7 +62,7 @@ CREATE OR REPLACE PACKAGE BODY category_synonym AS
BEGIN
-- get new synonym_id
if (new.synonym_id is null) then
select category_synonyms_id_seq.nextval() into v_synonym_id from dual;
select category_synonyms_id_seq.nextval into v_synonym_id from dual;
else
v_synonym_id := new.synonym_id;
end if;
......@@ -141,7 +141,7 @@ CREATE OR REPLACE PACKAGE BODY category_synonym AS
end if;
-- get new search query id
select category_search_id_seq.nextval() into v_query_id from dual;
select category_search_id_seq.nextval into v_query_id from dual;
-- convert string to uppercase and substitute special chars
v_search_text := category_synonym.convert_string (search.search_text);
......
......@@ -57,7 +57,8 @@ as
tree_id in category_trees.tree_id%TYPE,
subtree_category_id in categories.category_id%TYPE default null,
assign_single_p in category_tree_map.assign_single_p%TYPE default 'f',
require_category_p in category_tree_map.require_category_p%TYPE default 'f'
require_category_p in category_tree_map.require_category_p%TYPE default 'f',
widget in category_tree_map.widget%TYPE
);
PROCEDURE unmap (
......@@ -98,7 +99,8 @@ as
creation_date => creation_date,
creation_user => creation_user,
creation_ip => creation_ip,
context_id => context_id
context_id => context_id,
title => tree_name
);
insert into category_trees
......@@ -265,7 +267,8 @@ as
tree_id in category_trees.tree_id%TYPE,
subtree_category_id in categories.category_id%TYPE default null,
assign_single_p in category_tree_map.assign_single_p%TYPE default 'f',
require_category_p in category_tree_map.require_category_p%TYPE default 'f'
require_category_p in category_tree_map.require_category_p%TYPE default 'f',
widget in category_tree_map.widget%TYPE
) is
v_map_count integer;
BEGIN
......@@ -277,9 +280,9 @@ as
if v_map_count = 0 then
insert into category_tree_map
(tree_id, subtree_category_id, object_id, assign_single_p, require_category_p)
(tree_id, subtree_category_id, object_id, assign_single_p, require_category_p,widget)
values (map.tree_id, map.subtree_category_id, map.object_id,
map.assign_single_p, map.require_category_p);
map.assign_single_p, map.require_category_p,map.widget);
end if;
END map;
......
alter table category_tree_map add (
widget varchar2(20)
);
comment on column category_tree_map.widget is '
What widget do we want to use for this cateogry?
';
@@../category-tree-package.sql
-- Populate the title field of acs_objects with the category
-- name or tree name
--
-- @author Jeff Davis <davis@xarg.net>
-- @creation-date 2005-02-06
@@ ../category-package.sql
@@ ../category-tree-package.sql
......@@ -172,6 +172,7 @@ create table category_tree_map (
require_category_p char(1) default 'f'
constraint cat_tree_map_categ_p_ck
check (require_category_p in ('t','f')),
widget varchar(20),
primary key (object_id, tree_id)
);
......@@ -199,6 +200,10 @@ comment on column category_tree_map.assign_single_p is '
comment on column category_tree_map.require_category_p is '
Do the users have to assign at least one category to objects?
';
comment on column category_tree_map.widget is '
What widget do we want to use for this cateogry?
';
create table category_object_map (
category_id integer
......@@ -447,7 +452,9 @@ comment on column category_search_results.similarity is '
\i category-package.sql
\i category-link-package.sql
\i category-synonym-package.sql
\i categories-relation.sql
\i categories-permissions.sql
\i categories-init.sql
......@@ -18,21 +18,17 @@ drop sequence category_links_id_seq;
drop table category_temp;
drop table category_object_map;
drop table category_object_map cascade;
drop table category_tree_map;
drop index cat_tree_map_ix;
drop index cat_object_map_ix;
drop table category_tree_map cascade;
drop table category_translations;
drop table categories;
drop index categories_left_ix;
drop index categories_parent_ix;
drop table category_tree_translations;
drop table category_trees;
drop table category_trees cascade;
delete from acs_permissions where object_id in
(select object_id from acs_objects where object_type = 'category_tree');
......@@ -40,11 +36,6 @@ delete from acs_objects where object_type='category';
delete from acs_objects where object_type='category_tree';
begin;
select acs_object_type__drop_type('category', 't');
select acs_object_type__drop_type('category_tree', 't');
end;
drop function category_synonym__convert_string (varchar);
drop function category_synonym__get_similarity (integer, integer, bigint);
drop function category_synonym__search (varchar, varchar);
......@@ -66,7 +57,8 @@ drop function category_tree__del (integer);
drop function category_tree__edit (integer,varchar,varchar,varchar,
char,timestamp with time zone,integer,varchar);
drop function category_tree__copy (integer,integer,integer,varchar);
drop function category_tree__map (integer,integer,integer,char);
drop function category_tree__map (integer,integer,integer,char,char,varchar);
drop function category_tree__unmap (integer,integer);
drop function category_tree__check_nested_ind (integer);
-- drop function category_tree__index_children (integer,integer);
......@@ -109,3 +101,14 @@ select acs_sc_operation__delete(acs_sc_operation__get_id('AcsObject','PageUrl'))
-- this should be being handled at the tcl callback level but isn't?
select acs_sc_impl__delete('AcsObject','category_idhandler');
select acs_sc_impl__delete('AcsObject','category_tree_idhandler');
-- from categories-relation
select acs_rel_type__drop_type('user_meta_category_rel','t');
select acs_rel_type__drop_type('meta_category_rel','t');
select acs_rel_type__drop_role('party');
select acs_rel_type__drop_role('meta_category');
select acs_rel_type__drop_role('category');
select acs_object_type__drop_type('category', 't');
select acs_object_type__drop_type('category_tree', 't');
--
-- Categories Relation
--
-- @author Miguel Marin (miguelmarin@viaro.net)
-- @author Viaro Networks www.viaro.net
-- @creation-date 2005-07-26
--
create function inline_0 ()
returns integer as '
begin
-- We create the roles to use them on the rel_type create
PERFORM acs_rel_type__create_role(''party'', ''Party'', ''Parties'');
PERFORM acs_rel_type__create_role(''category'', ''Category'', ''Categories'');
PERFORM acs_rel_type__create_role(''meta_category'', ''Meta Category'', ''Meta Categories'');
-- Creating two new rel_types
PERFORM acs_rel_type__create_type (
''meta_category_rel'', -- rel_type
''Meta Category Relation'', -- pretty_name
''Meta Category Relation'', -- pretty_plural
''relationship'', -- supertype
''meta_categories'', -- table_name
''meta_category_id'', -- id_column
null, -- package_name
''category'', -- object_type_one
''category'', -- role_one
1, -- min_n_rels_one
1, -- max_n_rels_one
''category'', -- object_type_two
''category'', -- role_two
1, -- min_n_rels_two
1 -- max_n_rels_two
);
PERFORM acs_rel_type__create_type (
''user_meta_category_rel'', -- rel_type
''User Meta Category Relation'', -- pretty_name
''User Meta Category Relation'', -- pretty_plural
''relationship'', -- supertype
''user_meta_categories'', -- table_name
''user_meta_category_id'', -- id_column
null, -- package_name
''meta_category_rel'', -- object_type_one
''meta_category'', -- role_one
1, -- min_n_rels_one
1, -- max_n_rels_one
''party'', -- object_type_two
''party'', -- role_two
1, -- min_n_rels_two
1 -- max_n_rels_two
);
return 0;
end;' language 'plpgsql';
select inline_0 ();
drop function inline_0 ();
......@@ -41,7 +41,9 @@ begin
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_tree_id, -- context_id
''t'' -- security_inherit_p
''t'', -- security_inherit_p
p_name, -- title
null -- package_id
);
if (p_parent_id is null) then
......@@ -324,11 +326,13 @@ begin
end;
' language 'plpgsql';
create or replace function category__name (
integer -- category_id
)
returns integer as '
declare
p_category_id alias for $1;
v_name varchar;
begin
select name into v_name
......
......@@ -37,7 +37,9 @@ begin
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_context_id -- context_id
p_context_id, -- context_id
p_tree_name, -- title
null -- package_id
);
insert into category_trees
......@@ -186,9 +188,9 @@ declare
p_creation_user alias for $3;
p_creation_ip alias for $4;
source RECORD;
v_new_left_ind integer;
v_category_id integer;
source record;
begin
select coalesce(max(right_ind),0) into v_new_left_ind
from categories
......@@ -197,6 +199,7 @@ begin
for source in (select category_id, parent_id, left_ind, right_ind from categories where tree_id = p_source_tree) loop
v_category_id := acs_object__new (
null,
''category'', -- object_type
now(), -- creation_date
p_creation_user, -- creation_user
......@@ -211,11 +214,11 @@ begin
end loop;
-- correct parent_ids
update categories c
update categories
set parent_id = (select t.category_id
from categories s, categories t
where s.category_id = c.parent_id
and t.tree_id = copy.dest_tree
where s.category_id = categories.parent_id
and t.tree_id = p_dest_tree
and s.left_ind + v_new_left_ind = t.left_ind)
where tree_id = p_dest_tree;
......@@ -241,7 +244,8 @@ create or replace function category_tree__map (
integer, -- tree_id
integer, -- subtree_category_id
char, -- assign_single_p
char -- require_category_p
char, -- require_category_p
varchar -- widget
)
returns integer as '
declare
......@@ -250,6 +254,7 @@ declare
p_subtree_category_id alias for $3;
p_assign_single_p alias for $4;
p_require_category_p alias for $5;
p_widget alias for $6;
v_map_count integer;
begin
......@@ -262,9 +267,9 @@ begin
if v_map_count = 0 then
insert into category_tree_map
(tree_id, subtree_category_id, object_id,
assign_single_p, require_category_p)
assign_single_p, require_category_p, widget)
values (p_tree_id, p_subtree_category_id, p_object_id,
p_assign_single_p, p_require_category_p);
p_assign_single_p, p_require_category_p, p_widget);
end if;
return 0;
end;
......
alter table category_tree_map add column widget varchar(20);
drop function category_tree__map ( integer, integer, integer, char, char );
create or replace function category_tree__map (
integer, -- object_id
integer, -- tree_id
integer, -- subtree_category_id
char, -- assign_single_p
char, -- require_category_p
varchar -- widget
)
returns integer as '
declare
p_object_id alias for $1;
p_tree_id alias for $2;
p_subtree_category_id alias for $3;
p_assign_single_p alias for $4;
p_require_category_p alias for $5;
p_widget alias for $6;
v_map_count integer;
begin
select count(*)
into v_map_count
from category_tree_map
where object_id = p_object_id
and tree_id = p_tree_id;
if v_map_count = 0 then
insert into category_tree_map
(tree_id, subtree_category_id, object_id,
assign_single_p, require_category_p, widget)
values (p_tree_id, p_subtree_category_id, p_object_id,
p_assign_single_p, p_require_category_p, p_widget);
end if;
return 0;
end;
' language 'plpgsql';
-- add missing alias for $1
create or replace function category__name (
integer -- category_id
)
returns integer as '
declare
p_category_id alias for $1;
v_name varchar;
begin
select name into v_name
from category_translations
where category_id = p_category_id
and locale = ''en_US'';
return 0;
end;
' language 'plpgsql';
\ No newline at end of file
create or replace function category_tree__copy (
integer, -- source_tree
integer, -- dest_tree
integer, -- creation_user
varchar -- creation_ip
)
returns integer as '
declare
p_source_tree alias for $1;
p_dest_tree alias for $2;
p_creation_user alias for $3;
p_creation_ip alias for $4;
v_new_left_ind integer;
v_category_id integer;
source record;
begin
select coalesce(max(right_ind),0) into v_new_left_ind
from categories
where tree_id = p_dest_tree;
for source in (select category_id, parent_id, left_ind, right_ind from categories where tree_id = p_source_tree) loop
v_category_id := acs_object__new (
null,
''category'', -- object_type
now(), -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_dest_tree -- context_id
);
insert into categories
(category_id, tree_id, parent_id, left_ind, right_ind)
values
(v_category_id, p_dest_tree, source.parent_id, source.left_ind + v_new_left_ind, source.right_ind + v_new_left_ind);
end loop;
-- correct parent_ids
update categories
set parent_id = (select t.category_id
from categories s, categories t
where s.category_id = categories.parent_id
and t.tree_id = p_dest_tree
and s.left_ind + v_new_left_ind = t.left_ind)
where tree_id = p_dest_tree;
-- copy all translations
insert into category_translations
(category_id, locale, name, description)
(select ct.category_id, t.locale, t.name, t.description
from category_translations t, categories cs, categories ct
where ct.tree_id = p_dest_tree
and cs.tree_id = p_source_tree
and cs.left_ind + v_new_left_ind = ct.left_ind
and t.category_id = cs.category_id);
-- for debugging reasons
perform category_tree__check_nested_ind(p_dest_tree);
return 0;
end;
' language 'plpgsql';
-- source was undeclared.
create or replace function category_tree__copy (
integer, -- source_tree
integer, -- dest_tree
integer, -- creation_user
varchar -- creation_ip
)
returns integer as '
declare
p_source_tree alias for $1;
p_dest_tree alias for $2;
p_creation_user alias for $3;
p_creation_ip alias for $4;
v_new_left_ind integer;
v_category_id integer;
source record;
begin
select coalesce(max(right_ind),0) into v_new_left_ind
from categories
where tree_id = p_dest_tree;
for source in (select category_id, parent_id, left_ind, right_ind from categories where tree_id = p_source_tree) loop
v_category_id := acs_object__new (
''category'', -- object_type
now(), -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_dest_tree -- context_id
);
insert into categories
(category_id, tree_id, parent_id, left_ind, right_ind)
values
(v_category_id, p_dest_tree, source.parent_id, source.left_ind + v_new_left_ind, source.right_ind + v_new_left_ind);
end loop;
-- correct parent_ids
update categories c
set parent_id = (select t.category_id
from categories s, categories t
where s.category_id = c.parent_id
and t.tree_id = copy.dest_tree
and s.left_ind + v_new_left_ind = t.left_ind)
where tree_id = p_dest_tree;
-- copy all translations
insert into category_translations
(category_id, locale, name, description)
(select ct.category_id, t.locale, t.name, t.description
from category_translations t, categories cs, categories ct
where ct.tree_id = p_dest_tree
and cs.tree_id = p_source_tree
and cs.left_ind + v_new_left_ind = ct.left_ind
and t.category_id = cs.category_id);
-- for debugging reasons
perform category_tree__check_nested_ind(p_dest_tree);
return 0;
end;
' language 'plpgsql';
-- Populate the title field of acs_objects with the category
-- name or tree name
--
-- @author Jeff Davis <davis@xarg.net>
-- @creation-date 2005-02-06
create or replace function category__new (
integer, -- category_id
integer, -- tree_id
varchar, -- locale
varchar, -- name
varchar, -- description
integer, -- parent_id
char, -- deprecated_p
timestamp with time zone, -- creation_date
integer, -- creation_user
varchar -- creation_ip
)
returns integer as '
declare
p_category_id alias for $1;
p_tree_id alias for $2;
p_locale alias for $3;
p_name alias for $4;
p_description alias for $5;
p_parent_id alias for $6;
p_deprecated_p alias for $7;
p_creation_date alias for $8;
p_creation_user alias for $9;
p_creation_ip alias for $10;
v_category_id integer;
v_left_ind integer;
v_right_ind integer;
begin
v_category_id := acs_object__new (
p_category_id, -- object_id
''category'', -- object_type
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_tree_id, -- context_id
''t'', -- security_inherit_p
p_name, -- title
null -- package_id
);
if (p_parent_id is null) then
select 1, coalesce(max(right_ind)+1,1) into v_left_ind, v_right_ind
from categories
where tree_id = p_tree_id;
else
select left_ind, right_ind into v_left_ind, v_right_ind
from categories
where category_id = p_parent_id;
end if;
insert into categories
(category_id, tree_id, deprecated_p, parent_id, left_ind, right_ind)
values
(v_category_id, p_tree_id, p_deprecated_p, p_parent_id, -1, -2);
-- move right subtrees to make room for new category
update categories
set left_ind = left_ind + 2,
right_ind = right_ind + 2
where tree_id = p_tree_id
and left_ind > v_right_ind;
-- expand upper nodes to make room for new category
update categories
set right_ind = right_ind + 2
where tree_id = p_tree_id
and left_ind <= v_left_ind
and right_ind >= v_right_ind;
-- insert new category
update categories
set left_ind = v_right_ind,
right_ind = v_right_ind + 1
where category_id = v_category_id;
insert into category_translations
(category_id, locale, name, description)
values
(v_category_id, p_locale, p_name, p_description);
return v_category_id;
end;
' language 'plpgsql';
create or replace function category_tree__new (
integer, -- tree_id
varchar, -- locale
varchar, -- tree_name
varchar, -- description
char, -- site_wide_p
timestamp with time zone, -- creation_date
integer, -- creation_user
varchar, -- creation_ip
integer -- context_id
)
returns integer as '
declare
p_tree_id alias for $1;
p_locale alias for $2;
p_tree_name alias for $3;
p_description alias for $4;
p_site_wide_p alias for $5;
p_creation_date alias for $6;
p_creation_user alias for $7;
p_creation_ip alias for $8;
p_context_id alias for $9;
v_tree_id integer;
begin
v_tree_id := acs_object__new (
p_tree_id, -- object_id
''category_tree'', -- object_type
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_context_id, -- context_id
p_tree_name, -- title
null -- package_id
);
insert into category_trees
(tree_id, site_wide_p)
values
(v_tree_id, p_site_wide_p);
perform acs_permission__grant_permission (
v_tree_id, -- object_id
p_creation_user, -- grantee_id
''category_tree_read'' -- privilege
);
perform acs_permission__grant_permission (
v_tree_id, -- object_id
p_creation_user, -- grantee_id
''category_tree_write'' -- privilege
);
perform acs_permission__grant_permission (
v_tree_id, -- object_id
p_creation_user, -- grantee_id
''category_tree_grant_permissions'' -- privilege
);
insert into category_tree_translations
(tree_id, locale, name, description)
values
(v_tree_id, p_locale, p_tree_name, p_description);
return v_tree_id;
end;
' language 'plpgsql';
--
-- Add Categories Relation Roles and Types
--
-- @author Miguel Marin (miguelmarin@viaro.net)
-- @author Viaro Networks www.viaro.net
-- @creation-date 2005-07-26
--
create function inline_0 ()
returns integer as '
begin
-- We create two roles to use them on the rel_type create
PERFORM acs_rel_type__create_role(''party'', ''Party'', ''Parties'');
PERFORM acs_rel_type__create_role(''category'', ''Category'', ''Categories'');
PERFORM acs_rel_type__create_role(''meta_category'', ''Meta Category'', ''Meta Categories'');
-- Creating two new rel_types
PERFORM acs_rel_type__create_type (
''meta_category_rel'', -- rel_type
''Meta Category Relation'', -- pretty_name
''Meta Category Relation'', -- pretty_plural
''relationship'', -- supertype
''meta_categories'', -- table_name
''meta_category_id'', -- id_column
null, -- package_name
''category'', -- object_type_one
''category'', -- role_one
1, -- min_n_rels_one
1, -- max_n_rels_one
''category'', -- object_type_two
''category'', -- role_two
1, -- min_n_rels_two
1 -- max_n_rels_two
);
PERFORM acs_rel_type__create_type (
''user_meta_category_rel'', -- rel_type
''User Meta Category Relation'', -- pretty_name
''User Meta Category Relation'', -- pretty_plural
''relationship'', -- supertype
''user_meta_categories'', -- table_name
''user_meta_category_id'', -- id_column
null, -- package_name
''meta_category_rel'', -- object_type_one
''meta_category'', -- role_one
1, -- min_n_rels_one
1, -- max_n_rels_one
''party'', -- object_type_two
''party'', -- role_two
1, -- min_n_rels_two
1 -- max_n_rels_two
);
return 0;
end;' language 'plpgsql';
select inline_0 ();
drop function inline_0 ();
......@@ -4,7 +4,7 @@ ad_library {
@author Timo Hentschel (timo@timohentschel.de)
@creation-date 16 April 2003
@cvs-id $Id:
@cvs-id $Id$
}
category::reset_translation_cache
......
......@@ -131,5 +131,16 @@
</querytext>
</fullquery>
<fullquery name="category::map_object.insert_mapped_categories">
<querytext>
insert into category_object_map (category_id, object_id)
select :category_id, :object_id from dual
where not exists (select 1
from category_object_map
where category_id = :category_id
and object_id = :object_id)
</querytext>
</fullquery>
</queryset>
This diff is collapsed.
<?xml version="1.0"?>
<queryset>
<fullquery name="category::count_children.select">
<querytext>
select count(*)
from categories
where parent_id=:category_id
</querytext>
</fullquery>
<fullquery name="category::get_children.get_children_ids">
<querytext>
select category_id
from categories
where parent_id = :category_id
and deprecated_p = 'f'
order by tree_id, left_ind
</querytext>
</fullquery>
<fullquery name="category::get_parent.get_parent_id">
<querytext>
select parent_id
from categories
where category_id = :category_id
</querytext>
</fullquery>
<fullquery name="category::get_id.get_category_id">
<querytext>
select category_id
from category_translations
where name = :name
and locale = :locale
</querytext>
</fullquery>
<fullquery name="category::update.check_category_existence">
<querytext>
......@@ -27,8 +68,11 @@
<querytext>
insert into category_object_map (category_id, object_id)
values (:category_id, :object_id)
select :category_id, :object_id
where not exists (select 1
from category_object_map
where category_id = :category_id
and object_id = :object_id);
</querytext>
</fullquery>
......@@ -60,7 +104,50 @@
</querytext>
</fullquery>
<fullquery name="category::get_mapped_categories_multirow.select">
<querytext>
select co.tree_id, aot.title, c.category_id, ao.title
from category_object_map_tree co, categories c, category_translations ct, acs_objects ao, acs_objects aot
where co.object_id = :object_id
and co.category_id = c.category_id
and c.category_id = ao.object_id
and c.category_id = ct.category_id
and aot.object_id = co.tree_id
and ct.locale = :locale
order by aot.title, ao.title
</querytext>
</fullquery>
<fullquery name="category::get_mapped_categories.get_filtered">
<querytext>
SELECT category_object_map.category_id
FROM category_object_map, categories
WHERE object_id = :object_id
AND tree_id = :tree_id
AND category_object_map.category_id = categories.category_id
</querytext>
</fullquery>
<fullquery name="category::get_objects.get_objects">
<querytext>
SELECT com.object_id
FROM category_object_map com $join_clause
WHERE com.category_id = :category_id $where_clause
</querytext>
</fullquery>
<fullquery name="category::get_id_by_object_title.get_category_id">
<querytext>
select object_id
from acs_objects
where title = :title
and object_type = 'category'
</querytext>
</fullquery>
<fullquery name="category::reset_translation_cache.reset_translation_cache">
<querytext>
......@@ -80,8 +167,7 @@
from category_translations t, categories c
where t.category_id = :category_id
and t.category_id = c.category_id
order by t.locale
</querytext>
</fullquery>
......
......@@ -4,7 +4,7 @@ ad_library {
@author Branimir Dolicki (bdolicki@branimir.com)
@creation-date 06 February 2004
@cvs-id $Id:
@cvs-id $Id$
}
namespace eval category::ad_form {}
......@@ -14,6 +14,8 @@ ad_proc -public category::ad_form::add_widgets {
{-categorized_object_id}
{-form_name:required}
{-element_name "category_id"}
{-excluded_trees {}}
{-help_text {}}
} {
For each category tree associated with this container_object_id (usually
package_id) put a category widget into the ad_form. On form submission the
......@@ -25,7 +27,10 @@ ad_proc -public category::ad_form::add_widgets {
set category_trees [category_tree::get_mapped_trees $container_object_id]
foreach tree $category_trees {
util_unlist $tree tree_id name subtree_id assign_single_p require_category_p
util_unlist $tree tree_id name subtree_id assign_single_p require_category_p widget
if {[lsearch -exact $excluded_trees $tree_id] > -1} {
continue
}
set options ""
if {$assign_single_p == "f"} {
set options ",multiple"
......@@ -40,7 +45,11 @@ ad_proc -public category::ad_form::add_widgets {
{category_subtree_id $subtree_id} \
{category_object_id {[value_if_exists categorized_object_id]}} \
{category_assign_single_p $assign_single_p} \
{category_require_category_p $require_category_p}]]
{category_require_category_p $require_category_p} \
{category_widget $widget} \
{help_text $help_text} \
]]
}
}
......@@ -58,10 +67,14 @@ ad_proc -public category::ad_form::get_categories {
set category_trees [category_tree::get_mapped_trees $container_object_id]
set category_ids [list]
foreach tree $category_trees {
util_unlist $tree tree_id name subtree_id assign_single_p require_category_p
util_unlist $tree tree_id name subtree_id assign_single_p require_category_p widget
upvar #[template::adp_level] \
__category__ad_form__$element_name\_${tree_id} my_category_ids
eval lappend category_ids $my_category_ids
if {[info exists my_category_ids]} {
eval lappend category_ids $my_category_ids
} else {
ns_log Warning "category::ad_form::get_categories: __category__ad_form__$element_name\_${tree_id} for tree $tree_id not found"
}
}
return $category_ids
}
......@@ -4,7 +4,7 @@ ad_library {
@author Timo Hentschel (timo@timohentschel.de)
@creation-date 04 February 2004
@cvs-id $Id:
@cvs-id $Id$
}
namespace eval category_link {}
......
......@@ -7,7 +7,7 @@ ad_library {
@author Timo Hentschel (timo@timohentschel.de)
@creation-date 17 February 2004
@cvs-id $Id:
@cvs-id $Id$
}
namespace eval category::list {}
......@@ -44,7 +44,7 @@ ad_proc -public category::list::collapse_multirow {
set row_id $row($object_column)
set category_id $row($category_column)
if {![empty_string_p $category_id]} {
if {$category_id ne ""} {
lappend category_list $category_id
}
......@@ -65,7 +65,7 @@ ad_proc -public category::list::collapse_multirow {
}
}
for {set counter [expr $rownum+1]} {$counter < $rowcount} {incr counter} {
for {set counter [expr {$rownum+1}]} {$counter < $rowcount} {incr counter} {
uplevel 1 unset ${name}:$counter
}
set rowcount $rownum
......@@ -77,6 +77,9 @@ ad_proc -public category::list::get_pretty_list {
{-category_link ""}
{-category_link_eval ""}
{-category_link_html ""}
{-remove_link ""}
{-remove_link_eval ""}
{-remove_link_text ""}
{-tree_delimiter "; "}
{-tree_colon ": "}
{-tree_link ""}
......@@ -119,9 +122,9 @@ ad_proc -public category::list::get_pretty_list {
@see category::list::prepare_display
@see category::list::elements
} {
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
upvar $uplevel $category_varname category_id $tree_varname tree_id
} elseif {![empty_string_p $tree_link_eval]} {
} elseif {$tree_link_eval ne ""} {
upvar $uplevel $tree_varname tree_id
}
......@@ -146,22 +149,29 @@ ad_proc -public category::list::get_pretty_list {
util_unlist $category category_id category_name tree_id tree_name
set category_name [ad_quotehtml $category_name]
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
set category_link [uplevel $uplevel concat $category_link_eval]
}
if {![empty_string_p $category_link]} {
if {$remove_link_eval ne ""} {
set remove_link [uplevel $uplevel concat $remove_link_eval]
}
if {$category_link ne ""} {
set category_name "<a href=\"$category_link\"$cat_link_html>$category_name</a>"
}
if {$remove_link ne ""} {
append category_name "&nbsp;<a href=\"$remove_link\" title=\"Remove this category\">$remove_link_text</a>"
}
if {$tree_id != $old_tree_id} {
if {![empty_string_p $result]} {
if {$result ne ""} {
append result $tree_delimiter
}
set tree_name [ad_quotehtml $tree_name]
if {![empty_string_p $tree_link_eval]} {
if {$tree_link_eval ne ""} {
set tree_link [uplevel $uplevel concat $tree_link_eval]
}
if {![empty_string_p $tree_link]} {
if {$tree_link ne ""} {
set tree_name "<a href=\"$tree_link\"$cat_tree_link_html>$tree_name</a>"
}
append result "$tree_name$tree_colon$category_name"
......@@ -235,9 +245,9 @@ ad_proc -public category::list::prepare_display {
@see category::list::elements
@see category::list::get_pretty_list
} {
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
upvar 1 $category_varname category_id $tree_varname tree_id
} elseif {![empty_string_p $tree_link_eval]} {
} elseif {$tree_link_eval ne ""} {
upvar 1 $tree_varname tree_id
}
......@@ -251,7 +261,7 @@ ad_proc -public category::list::prepare_display {
}
# get trees to display
if {[empty_string_p $tree_ids]} {
if {$tree_ids eq ""} {
foreach mapped_tree [category_tree::get_mapped_trees $container_object_id] {
lappend tree_ids [lindex $mapped_tree 0]
}
......@@ -279,7 +289,7 @@ ad_proc -public category::list::prepare_display {
for {set i 1} {$i <= ${list_data:rowcount}} {incr i} {
upvar 1 $name:$i row
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
foreach column_name ${list_data:columns} {
upvar 1 $column_name column_value
if { [info exists row($column_name)] } {
......@@ -309,13 +319,13 @@ ad_proc -public category::list::prepare_display {
foreach category $tree_categories($tree_id) {
util_unlist $category category_id category_name
set category_name [ad_quotehtml $category_name]
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
set category_link [uplevel 1 concat $category_link_eval]
}
if {![empty_string_p $category_link]} {
if {$category_link ne ""} {
set category_name "<a href=\"$category_link\"$cat_link_html>$category_name</a>"
}
if {![empty_string_p $pretty_category_list]} {
if {$pretty_category_list ne ""} {
append pretty_category_list "$category_delimiter$category_name"
} else {
set pretty_category_list $category_name
......@@ -339,7 +349,7 @@ ad_proc -public category::list::prepare_display {
for {set i 1} {$i <= ${list_data:rowcount}} {incr i} {
upvar 1 $name:$i row
if {![empty_string_p $category_link_eval]} {
if {$category_link_eval ne ""} {
foreach column_name ${list_data:columns} {
upvar 1 $column_name column_value
if { [info exists row($column_name)] } {
......@@ -462,7 +472,7 @@ ad_proc -public category::list::elements {
}"
return $result
} else {
if {[empty_string_p $tree_ids]} {
if {$tree_ids eq ""} {
# get tree columns in multirow
template::multirow upvar $name list_data
foreach column ${list_data:columns} {
......
<?xml version="1.0"?>
<queryset>
<rdbms><type>postgresql</type><version>7.1</version></rdbms>
<fullquery name="category::relation::add_meta_category.add_meta_relation">
<querytext>
select acs_rel__new ( null, 'meta_category_rel', :category_id_one, :category_id_two, null, null, null )
</querytext>
</fullquery>
<fullquery name="category::relation::add_meta_category.add_user_meta_relation">
<querytext>
select acs_rel__new ( null, 'user_meta_category_rel', :meta_category_id, :user_id, null, null, null )
</querytext>
</fullquery>
</queryset>
ad_library {
Procedures to relate to categories trees (meta category) to one user_id
@author Miguel Marin (miguelmarin@viaro.net)
@author Viaro Networks www.viaro.net
@creation-date 2005-07-26
}
namespace eval category::relation {}
ad_proc -public category::relation::add_meta_category {
-category_id_one:required
-category_id_two:required
{-user_id ""}
} {
Creates a new meta category by creating a realtion between category_id_one
and category_id_two. This relation is also related to the user_id.
@option user_id user that will be related to the meta category.
@option category_id_one one of the two category_id's to be related.
@option category_id_two the other category_id to be related.
@author Miguel Marin (miguelmarin@viaro.net)
@author Viaro Networks www.viaro.net
} {
if { $user_id eq "" } {
set user_id [ad_conn user_id]
}
# First we check if the relation exist, if it does, we don't create a new one
set meta_category_id [db_string get_meta_relation_id {} -default ""]
if { $meta_category_id eq "" } {
set meta_category_id [db_exec_plsql add_meta_relation {}]
}
# Now we check if the user already has the meta category associated,
# if it does, we don't create a new one
set user_meta_category_id [db_string get_user_meta_relation_id {} -default ""]
if { $user_meta_category_id eq "" } {
return [db_exec_plsql add_user_meta_relation {}]
} else {
return $user_meta_category_id
}
}
ad_proc -public category::relation::get_widget {
-tree_id_one:required
-tree_id_two:required
} {
Returns two select menus of the categories on each tree to be used in ad_form. The name of the elements
are meta_category_one and meta_category_two.
@option tree_id_one
@option tree_id_two
@author Miguel Marin (miguelmarin@viaro.net)
@author Viaro Networks www.viaro.net
} {
set label_one [category_tree::get_name $tree_id_one]
set label_two [category_tree::get_name $tree_id_two]
set element_one "\{meta_category_one:integer(select) \{label $label_one\} \{options \{ "
set element_two "\{meta_category_two:integer(select) \{label $label_two\} \{options \{ "
foreach category_one [category_tree::get_tree $tree_id_one] {
set value_one [lindex $category_one 0]
set label_one [lindex $category_one 1]
append element_one "\{$label_one $value_one\} "
}
foreach category_two [category_tree::get_tree $tree_id_two] {
set value_two [lindex $category_two 0]
set label_two [lindex $category_two 1]
append element_two "\{$label_two $value_two\} "
}
append element_one "\} \} \}"
append element_two "\} \} \}"
return "$element_one $element_two"
}
ad_proc -public category::relation::get_meta_categories {
-rel_id:required
} {
return cached list of category_one and category_two of the meta-category
} {
return [util_memoize [list category::relation::get_meta_category_internal -rel_id $rel_id]]
}
ad_proc -private category::relation::get_meta_category_internal {
-rel_id:required
} {
get list of category_one and category_two of the meta-category
} {
db_1row get_categories {}
return [list $object_id_one $object_id_two]
}
<?xml version="1.0"?>
<queryset>
<fullquery name="category::relation::add_meta_category.get_meta_relation_id">
<querytext>
select
rel_id
from
acs_rels
where
rel_type = 'meta_category_rel'
and object_id_one = :category_id_one
and object_id_two = :category_id_two
</querytext>
</fullquery>
<fullquery name="category::relation::add_meta_category.get_user_meta_relation_id">
<querytext>
select
rel_id
from
acs_rels
where
rel_type = 'user_meta_category_rel'
and object_id_one = :meta_category_id
and object_id_two = :user_id
</querytext>
</fullquery>
<fullquery name="category::relation::get_meta_category_internal.get_categories">
<querytext>
select object_id_one, object_id_two
from acs_rels
where rel_id = :rel_id
and rel_type = 'meta_category_rel'
</querytext>
</fullquery>
</queryset>
\ No newline at end of file
......@@ -44,7 +44,7 @@
<fullquery name="category_synonym::search_sweeper.delete_old_searches">
<querytext>
delete from category_search
where last_queried < current_timestamp - '1 day'::interval
where last_queried < current_timestamp - cast('1 days' as interval)
</querytext>
</fullquery>
......
......@@ -5,7 +5,7 @@ ad_library {
@author Timo Hentschel (timo@timohentschel.de)
@creation-date 8 January 2004
@cvs-id $Id:
@cvs-id $Id$
}
......@@ -26,7 +26,7 @@ ad_proc -public category_synonym::add {
@author Bernd Schmeil (bernd@thebernd.de)
@author Timo Hentschel (timo@timohentschel.de)
} {
if {[empty_string_p $locale]} {
if {$locale eq ""} {
set locale [ad_conn locale]
}
......@@ -50,7 +50,7 @@ ad_proc -public category_synonym::edit {
@author Bernd Schmeil (bernd@thebernd.de)
@author Timo Hentschel (timo@timohentschel.de)
} {
if {[empty_string_p $locale]} {
if {$locale eq ""} {
set locale [ad_conn locale]
}
......@@ -84,7 +84,7 @@ ad_proc -public category_synonym::search {
@author Bernd Schmeil (bernd@thebernd.de)
@author Timo Hentschel (timo@timohentschel.de)
} {
if {[empty_string_p $locale]} {
if {$locale eq ""} {
set locale [ad_conn locale]
}
......
......@@ -12,7 +12,8 @@
subtree_category_id => :subtree_category_id,
tree_id => :tree_id,
assign_single_p => :assign_single_p,
require_category_p => :require_category_p);
require_category_p => :require_category_p,
widget => :widget);
end;
</querytext>
......@@ -133,10 +134,10 @@
<fullquery name="category_tree::usage.category_tree_usage">
<querytext>
select t.pretty_plural, n.object_id, n.object_name, p.package_id,
select t.pretty_plural, n.object_id, n.title, p.package_id,
p.instance_name,
acs_permission.permission_p(n.object_id, :user_id, 'read') as read_p
from category_tree_map m, acs_named_objects n,
from category_tree_map m, acs_objects n,
apm_packages p, apm_package_types t
where m.tree_id = :tree_id
and n.object_id = m.object_id
......
......@@ -10,7 +10,9 @@
:tree_id,
:subtree_category_id,
:assign_single_p,
:require_category_p)
:require_category_p,
:widget
)
</querytext>
</fullquery>
......@@ -100,10 +102,10 @@
<fullquery name="category_tree::usage.category_tree_usage">
<querytext>
select t.pretty_plural, n.object_id, n.object_name, p.package_id,
select t.pretty_plural, n.object_id, n.title, p.package_id,
p.instance_name,
acs_permission__permission_p(n.object_id, :user_id, 'read') as read_p
from category_tree_map m, acs_named_objects n,
from category_tree_map m, acs_objects n,
apm_packages p, apm_package_types t
where m.tree_id = :tree_id
and n.object_id = m.object_id
......
This diff is collapsed.
......@@ -11,19 +11,51 @@
</querytext>
</fullquery>
<fullquery name="category_tree::get_categories.get_categories">
<querytext>
select c.category_id as category_id from categories c, category_translations ct
where parent_id is null
and tree_id = :tree_id
and c.category_id = ct.category_id
and locale = :locale
order by name
</querytext>
</fullquery>
<fullquery name="category_tree::edit_mapping.edit_mapping">
<querytext>
update category_tree_map
set assign_single_p = :assign_single_p,
require_category_p = :require_category_p
require_category_p = :require_category_p,
widget = :widget
where tree_id = :tree_id
and object_id = :object_id
</querytext>
</fullquery>
<fullquery name="category_tree::get_id.get_category_tree_id">
<querytext>
select tree_id
from category_tree_translations
where name = :name
and locale = :locale
</querytext>
</fullquery>
<fullquery name="category_tree::get_id_by_object_title.get_tree_id">
<querytext>
select object_id
from acs_objects
where title = :title
and object_type = 'category_tree'
</querytext>
</fullquery>
<fullquery name="category_tree::update.check_tree_existence">
<querytext>
......@@ -41,19 +73,27 @@
<querytext>
select tree_id, subtree_category_id, assign_single_p,
require_category_p
require_category_p, widget
from category_tree_map
where object_id = :object_id
</querytext>
</fullquery>
<fullquery name="category_tree::get_trees.get_trees">
<querytext>
select distinct tree_id
from category_object_map_tree
where object_id = :object_id
</querytext>
</fullquery>
<fullquery name="category_tree::get_mapped_trees_from_object_list.get_mapped_trees_from_object_list">
<querytext>
select tree_id, subtree_category_id, assign_single_p,
require_category_p
require_category_p, widget
from category_tree_map
where object_id in ([join $object_id_list ", "])
......@@ -109,4 +149,16 @@
</fullquery>
<fullquery name="category_tree::get_id.get_category_tree_id">
<querytext>
select tree_id
from category_tree_translations
where name = :name
and locale = :locale
</querytext>
</fullquery>
</queryset>
ad_library {
Procedures for importing/exporting category trees from/to XML documents.
@author Tom Ayles (tom@beatniq.net)
@creation-date 2003-12-02
@cvs-id $Id$
}
namespace eval ::category_tree::xml {}
ad_proc -public ::category_tree::xml::import_from_file {
{-site_wide:boolean}
file
} {
Imports a category tree from a given file.
} {
if {![file exists $file] || ![file readable $file]} {
error {Cannot open file for reading}
}
return [import -site_wide=$site_wide_p [::tDOM::xmlReadFile $file]]
}
ad_proc -public ::category_tree::xml::import {
{-site_wide:boolean}
xml
} {
Imports a category tree from an XML representation.
@param xml A string containing the source XML to import from
@return The category tree identifier
@author Tom Ayles (tom@beatniq.net)
} {
# recode site_wide_p to DB-style boolean
if {$site_wide_p} { set site_wide_p t } else { set site_wide_p f }
set doc [dom parse $xml]
if [catch {set root [$doc documentElement]} err] {
error "Error parsing XML: $err"
}
set tree_id 0
db_transaction {
foreach translation [$root selectNodes {translation}] {
if [catch {set locale [$translation getAttribute locale]}] {
error "Required attribute 'locale' not found"
}
if [catch {set name [[$translation selectNodes {name}] text]}] {
error "Required element 'name' not found"
}
if [catch {set description \
[[$translation selectNodes {description}] text]}] {
set description {}
}
if {$tree_id} {
# tree initialised, add translation
category_tree::update \
-tree_id $tree_id \
-name $name \
-description $description \
-locale $locale
} else {
# initialise tree
set tree_id [category_tree::add \
-site_wide_p $site_wide_p \
-name $name \
-description $description \
-locale $locale]
}
}
foreach category [$root selectNodes {category}] {
add_category -tree_id $tree_id -parent_id {} $category
}
}
$doc delete
return $tree_id
}
ad_proc -private ::category_tree::xml::add_category {
{-tree_id:required}
{-parent_id:required}
node
} {
Imports one category.
} {
set category_id 0
# do translations
foreach translation [$node selectNodes {translation}] {
if [catch {set locale [$translation getAttribute locale]}] {
error "Required attribute 'locale' not found"
}
if [catch {set name [[$translation selectNodes {name}] text]}] {
error "Required element 'name' not found"
}
if [catch {set description \
[[$translation selectNodes {description}] text]}] {
set description {}
}
if {$category_id} {
# category exists, add translation
category::update \
-category_id $category_id \
-locale $locale \
-name $name \
-description $description
} else {
# create category
set category_id [category::add \
-tree_id $tree_id \
-parent_id $parent_id \
-locale $locale \
-name $name \
-description $description]
}
}
# do children
foreach child [$node selectNodes {category}] {
add_category -tree_id $tree_id -parent_id $category_id $child
}
}
ad_library {
Procs which may be invoked using similarly named elements in an
install.xml file.
@creation-date 2005-02-10
@author Lee Denison (lee@thaum.net)
@cvs-id $Id$
}
namespace eval install {}
namespace eval install::xml {}
namespace eval install::xml::action {}
ad_proc -public install::xml::action::load-categories { node } {
Load categories from a file.
} {
set src [apm_required_attribute_value $node src]
set site_wide_p [apm_attribute_value -default 0 $node site-wide-p]
set format [apm_attribute_value -default "simple" $node format]
set id [apm_attribute_value -default "" $node id]
switch -exact $format {
simple {
set tree_id [category_tree::xml::import_from_file \
-site_wide=[template::util::is_true $site_wide_p] \
[acs_root_dir]$src]
}
default {
error "Unsupported format."
}
}
if {$id ne "" } {
set ::install::xml::ids($id) $tree_id
}
}
ad_proc -public install::xml::action::map-category-tree { node } {
Maps a category tree to a specified object.
} {
set tree_id [apm_attribute_value -default "" $node tree-id]
set object_id [apm_attribute_value -default "" $node object-id]
set tree_ids [list]
if {$tree_id eq ""} {
set trees_node [lindex [xml_node_get_children_by_name $node trees] 0]
set trees [xml_node_get_children $trees_node]
foreach tree_node $trees {
lappend tree_ids [apm_invoke_install_proc \
-type object_id \
-node $tree_node]
}
} else {
lappend tree_ids [install::xml::util::get_id $tree_id]
}
set object_ids [list]
if {$object_id eq ""} {
set objects_node [lindex [xml_node_get_children_by_name $node objects] 0]
set objects [xml_node_get_children $objects_node]
foreach object_node $objects {
lappend object_ids [apm_invoke_install_proc \
-type object_id \
-node $object_node]
}
} else {
lappend object_ids [install::xml::util::get_id $object_id]
}
foreach tree_id $tree_ids {
if {[acs_object_type $tree_id] eq "category"} {
set subtree_category_id $tree_id
set tree_id [category::get_tree $subtree_category_id]
} else {
set subtree_category_id {}
}
foreach object_id $object_ids {
category_tree::map -tree_id $tree_id \
-object_id $object_id \
-subtree_category_id $subtree_category_id
}
}
}
# /Users/matthewburke/development/web/bitdojo/packages/categories/tcl/tagcloud-procs.tcl
ad_library {
Procs to generate a tag cloud for a given category tree.
@author Matthew Burke (matt-oacs@bluedino.net)
@creation-date Sun Oct 2 16:58:34 2005
@cvs-id
}
namespace eval category::tagcloud {}
ad_proc -private category::tagcloud::get_minmax_tagweights {
-tag_list:required
} {
Returns a list with the minimum and maximum weight values in the given list.
@author Matthew Burke (matt-oacs@bluedino.net)
} {
set max_weight 0
set min_weight [lindex [lindex $tag_list 0] 1]
foreach tag $tag_list {
set tag_weight [lindex $tag 1]
if {$tag_weight < $min_weight} {
set min_weight $tag_weight
}
if {$tag_weight > $max_weight} {
set max_weight $tag_weight
}
}
return [list $min_weight $max_weight]
}
ad_proc -private category::tagcloud::scale_weight {
-weight:required
-extremes:required
} {
Returns the weight as a font-size between 10px and 36px scaled between
the min and max weights passed in.
@author Matthew Burke (matt-oacs@bluedino.net)
} {
set denominator [expr {[lindex $extremes 1] - [lindex $extremes 0]}]
if {$denominator != 0} {
set multiplier [expr ($weight * 1.0)/$denominator]
} else {
set multiplier 0
}
set result [expr {10 + round($multiplier*(36-10))}]
return $result
}
ad_proc -public category::tagcloud::tagcloud {
-tree_id:required
} {
Generate a tag cloud for the categories in the given category
tree.
@option tree_id tree_id of the tree fro which to generate the cloud.
@return HTML fragment for the tag cloud.
@author Matthew Burke (matt-oacs@bluedino.net)
} {
set html_fragment "<div class=\"tagcloud\">\n"
set tag_list [category::tagcloud::get_tags -tree_id $tree_id]
# now build the frag
set weights [category::tagcloud::get_minmax_tagweights -tag_list $tag_list]
# and what if category package isn't mounted at /category?
foreach tag $tag_list {
append html_fragment "<a href=\"/categories/categories-browse?tree_ids=$tree_id&category_ids=[lindex $tag 0]\" style=\"font-size: [category::tagcloud::scale_weight -weight [lindex $tag 1] -extremes $weights]px;\" class=\"tag\">[lindex $tag 2]</a>\n"
}
append html_fragment "</div>"
return $html_fragment
}
ad_proc -private category::tagcloud::get_tags_no_mem {
-tree_id:required
} {
Returns a list of categories and their weights (number of objects mapped
to each category) for a give category tree.
@author Matthew Burke (matt-oacs@bluedino.net)
@creation-date Oct 1, 2005
} {
set user_locale [ad_conn locale]
set user_id [ad_conn user_id]
set default_locale [parameter::get -parameter DefaultLocale -default en_US]
ns_log Warning "def loc $default_locale"
# this whole locale thing isn't handled well.
# categories get inserted in the site's default_locale and
# the category creator's locale (?)
# so we should check for the reader's locale and use that
# or the default_locale, but ...
set tag_list [db_list_of_lists tagcloud_get_keys {
select category_id, count(com.object_id), min(trans.name)
from categories natural left join category_object_map com natural join category_trees
natural join category_translations trans
where tree_id = :tree_id and trans.locale = :default_locale
and exists (select 1 from acs_object_party_privilege_map ppm
where ppm.object_id = com.object_id
and ppm.privilege = 'read'
and ppm.party_id = :user_id)
group by category_id
}]
}
ad_proc -public category::tagcloud::get_tags {
-tree_id:required
} {
Returns a list of categories and their weights (number of objects mapped
to each category) for a give category tree.
This is a memoized function which caches for two hours.
@author Matthew Burke (matt-oacs@bluedino.net)
@creation-date Oct 1, 2005
@see category::tagcloud::get_tags_no_mem
} {
return [util_memoize [list category::tagcloud::get_tags_no_mem -tree_id $tree_id] 7200]
}
......@@ -14,18 +14,41 @@ namespace eval template::data {}
namespace eval template::data::transform {}
namespace eval template::data::validate {}
ad_proc -public template::widget::category { element_reference tag_attributes } {
# author: Timo Hentschel (timo@timohentschel.de)
ad_proc -public template::widget::category {
element_reference
tag_attributes
} {
Display the category widget. This has a multitude of options:
<ul>
<li>value: Values should be a list of two items: the object_id being viewed and the object_id which the trees are mapped to.
This will get the mapped trees (if no value provided defaults to package_id) and the mapped categories for the object_id. If you
do not provide a value, the following options are used:
<li>category_application_id></li>
<li>category_object_id</li>
<li>category_tree_id</li>
<li>category_subtree_id</li>
<li>category_assign_single_p</li>
<li>category_require_category_p</li>
</ul>
@author: Timo Hentschel (timo@timohentschel.de)
} {
upvar $element_reference element
if { [info exists element(html)] } {
array set attributes $element(html)
array set attributes $element(html)
array set ms_attributes $element(html)
}
array set attributes $tag_attributes
array set ms_attributes $tag_attributes
if { ![info exists element(display_widget)] } {
set display_widget select
} else {
set display_widget $element(display_widget)
}
set ms_attributes(multiple) {}
set all_single_p [info exists attributes(single)]
# Determine the size automatically for a multiselect
......@@ -40,6 +63,7 @@ ad_proc -public template::widget::category { element_reference tag_attributes }
set subtree_id {}
set assign_single_p f
set require_category_p f
set widget {}
if { [exists_and_not_null element(value)] && [llength $element(value)] == 2 } {
# Legacy method for passing parameters
......@@ -64,13 +88,18 @@ ad_proc -public template::widget::category { element_reference tag_attributes }
if { [exists_and_not_null element(category_require_category_p)] } {
set require_category_p $element(category_require_category_p)
}
if { [exists_and_not_null element(category_require_category_p)] } {
set widget $element(category_widget)
}
}
if { [empty_string_p $package_id] } {
if { $package_id eq "" } {
set package_id [ad_conn package_id]
}
if { ![empty_string_p $object_id] && ![info exists element(submit)] } {
if { $object_id ne "" && ![info exists element(submit)] } {
set mapped_categories [category::get_mapped_categories $object_id]
} elseif { $element(values) ne "" && ![info exists element(submit)] } {
set mapped_categories $element(values)
} else {
set mapped_categories [ns_querygetall $element(id)]
# QUIRK: ns_querygetall returns a single-element list {{}} for no values
......@@ -80,28 +109,43 @@ ad_proc -public template::widget::category { element_reference tag_attributes }
}
set output {}
if { [empty_string_p $tree_id] } {
if { $tree_id eq "" } {
set mapped_trees [category_tree::get_mapped_trees $package_id]
} else {
set mapped_trees [list [list $tree_id [category_tree::get_name $tree_id] $subtree_id $assign_single_p $require_category_p]]
set mapped_trees {}
foreach one_tree $tree_id one_subtree $subtree_id assign_single $assign_single_p require_category $require_category_p widget $widget {
if {$assign_single eq ""} {
set assign_single f
}
if {$require_category eq ""} {
set require_category f
}
lappend mapped_trees [list $one_tree [category_tree::get_name $one_tree] $one_subtree $assign_single $require_category $widget]
}
}
foreach mapped_tree $mapped_trees {
util_unlist $mapped_tree tree_id tree_name subtree_id assign_single_p require_category_p
set tree_name [ad_quotehtml $tree_name]
util_unlist $mapped_tree tree_id tree_name subtree_id assign_single_p require_category_p widget
set tree_name [ad_quotehtml [lang::util::localize $tree_name]]
set one_tree [list]
if { $require_category_p == "t" } {
set required_mark "<span class=\"form-required-mark\">*</span>"
} else {
set required_mark {}
}
foreach category [category_tree::get_tree -subtree_id $subtree_id $tree_id] {
util_unlist $category category_id category_name deprecated_p level
set category_name [ad_quotehtml $category_name]
set category_name [ad_quotehtml [lang::util::localize $category_name]]
if { $level>1 } {
set category_name "[string repeat "&nbsp;" [expr 2*$level -4]]..$category_name"
set category_name "[string repeat "&nbsp;" [expr {2*$level -4}]]..$category_name"
}
lappend one_tree [list $category_name $category_id]
}
if { [llength $mapped_trees] > 1 } {
append output " $tree_name\: "
append output "<div class=\"categorySelect\"><div class=\"categoryTreeName\">$tree_name$required_mark</div>"
}
if {$assign_single_p == "t" || $all_single_p} {
......@@ -109,14 +153,31 @@ ad_proc -public template::widget::category { element_reference tag_attributes }
if { $require_category_p == "f" } {
set one_tree [concat [list [list "" ""]] $one_tree]
}
append output [template::widget::menu $element(name) $one_tree $mapped_categories attributes $element(mode)]
# we default to the select widget unless the valid option of radio was provided
ns_log notice "template::widget::menu $element(name) $one_tree $mapped_categories [array get attributes] $element(mode) $widget $display_widget [info exists element(display_widget)]"
if { $widget eq "radio" && ![info exists element(display_widget)] } {
# checkbox was specified at mapping and the display widget was not explicitly defined code
append output [template::widget::menu $element(name) $one_tree $mapped_categories attributes $element(mode) radio]
} else {
append output [template::widget::menu $element(name) $one_tree $mapped_categories attributes $element(mode) $display_widget]
}
} else {
# multiselect widget (if user didn't override with single option)
append output [template::widget::menu $element(name) $one_tree $mapped_categories ms_attributes $element(mode)]
ns_log notice "template::widget::menu $element(name) $one_tree $mapped_categories [array get ms_attributes] $element(mode) $widget $display_widget [info exists element(display_widget)]"
# we default to the multiselect widget (if user didn't override with single option) or select checkbox
if { $widget eq "checkbox" && ![info exists element(display_widget)] } {
# checkbox was specified at mapping and the display widget was not explicitly defined in code
append output [template::widget::menu $element(name) $one_tree $mapped_categories ms_attributes $element(mode) checkbox]
} else {
append output [template::widget::menu $element(name) $one_tree $mapped_categories ms_attributes $element(mode) $display_widget]
}
}
if { [llength $mapped_trees] > 1 } {
append output "</div>"
}
}
return $output
return [lang::util::localize $output]
}
ad_proc -public template::data::validate::category { value_ref message_ref } {
......@@ -182,11 +243,11 @@ ad_proc -public template::data::transform::category { element_ref } {
set require_category_p $element(category_require_category_p)
}
}
if { [empty_string_p $package_id] } {
if { $package_id eq "" } {
set package_id [ad_conn package_id]
}
if { [empty_string_p $tree_id] } {
if { $tree_id eq "" } {
set trees [list]
foreach tree [category_tree::get_mapped_trees $package_id] {
util_unlist $tree tree_id tree_name subtree_id assign_single_p require_category_p
......
......@@ -9,9 +9,10 @@ ad_page_contract {
category_id:integer,multiple
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
db_transaction {
......@@ -24,4 +25,4 @@ db_transaction {
return
}
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
......@@ -9,6 +9,7 @@ ad_page_contract {
category_id:integer,multiple
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -18,7 +19,7 @@ ad_page_contract {
mapped_objects_p:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
multirow create categories category_id category_name objects_p view_url
......@@ -28,16 +29,18 @@ foreach id $category_id {
$id \
[category::get_name $id $locale] \
[db_string check_mapped_objects {}] \
[export_vars -no_empty -base category-usage { {category_id $id} tree_id locale object_id }]
[export_vars -no_empty -base category-usage { {category_id $id} tree_id locale object_id ctx_id}]
}
multirow sort categories -dictionary category_name
set delete_url [export_vars -no_empty -base category-delete-2 { tree_id category_id:multiple locale object_id }]
set cancel_url [export_vars -no_empty -base tree-view { tree_id locale object_id }]
set delete_url [export_vars -no_empty -base category-delete-2 { tree_id category_id:multiple locale object_id ctx_id}]
set cancel_url [export_vars -no_empty -base tree-view { tree_id locale object_id ctx_id}]
set page_title "Delete categories"
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Delete categories"
template::list::create \
......
......@@ -4,6 +4,4 @@
<property name="change_locale">f</property>
<property name="focus">category_form.name</property>
<blockquote>
<formtemplate id="category_form"></formtemplate>
</blockquote>
......@@ -9,12 +9,13 @@ ad_page_contract {
{parent_id:integer,optional [db_null]}
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
context_bar:onevalue
page_title:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
set package_id [ad_conn package_id]
permission::require_permission -object_id $tree_id -privilege category_tree_write
......@@ -24,12 +25,16 @@ if {[info exists category_id]} {
set page_title "Add category"
}
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar $page_title
set languages [lang::system::get_locale_options]
ad_form -name category_form -action category-form -export { tree_id parent_id locale object_id } -form {
ad_form -name category_form -action category-form \
-export { tree_id parent_id locale object_id ctx_id } \
-form {
{category_id:key}
{name:text {label "Name"} {html {size 50 maxlength 200}}}
{language:text(select) {label "Language"} {value $locale} {options $languages}}
......@@ -39,7 +44,7 @@ ad_form -name category_form -action category-form -export { tree_id parent_id lo
set description ""
} -edit_request {
if {![db_0or1row check_translation_existance ""]} {
set default_locale [ad_parameter DefaultLocale acs-lang "en_US"]
set default_locale [parameter::get -parameter DefaultLocale -default en_US]
db_1row get_default_translation ""
}
} -on_submit {
......@@ -49,7 +54,7 @@ ad_form -name category_form -action category-form -export { tree_id parent_id lo
} -edit_data {
category::update -category_id $category_id -locale $language -name $name -description $description
} -after_submit {
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
ad_script_abort
}
......
......@@ -10,6 +10,7 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -17,7 +18,7 @@ ad_page_contract {
trees:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
permission::require_permission -object_id $link_tree_id -privilege category_tree_write
......@@ -27,10 +28,12 @@ set tree_name [category_tree::get_name $tree_id $locale]
set link_tree_name [category_tree::get_name $link_tree_id $locale]
set page_title "Add link from \"$link_tree_name\" to category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}] "Links to $category_name"] \
[list [export_vars -no_empty -base category-link-add {category_id tree_id locale object_id}] "Select link target"] \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}] "Links to $category_name"] \
[list [export_vars -no_empty -base category-link-add {category_id tree_id locale object_id ctx_id}] "Select link target"] \
"Add link"
......@@ -51,9 +54,9 @@ foreach category [category_tree::get_tree -all $link_tree_id $locale] {
template::multirow append tree $link_category_name $link_category_id $forward_exists_p $backward_exists_p \
[string repeat "&nbsp;" [expr ($level-1)*5]] \
[export_vars -no_empty -base category-links-view {{category_id $link_category_id} {tree_id $link_tree_id} locale object_id}] \
[export_vars -no_empty -base category-link-add-3 {link_category_id category_id tree_id locale object_id}] \
[export_vars -no_empty -base category-link-add-4 {link_category_id category_id tree_id locale object_id}]
[export_vars -no_empty -base category-links-view {{category_id $link_category_id} {tree_id $link_tree_id} locale object_id ctx_id}] \
[export_vars -no_empty -base category-link-add-3 {link_category_id category_id tree_id locale object_id ctx_id}] \
[export_vars -no_empty -base category-link-add-4 {link_category_id category_id tree_id locale object_id ctx_id}]
}
template::list::create \
......@@ -63,13 +66,13 @@ template::list::create \
-bulk_actions {
"Add links" "category-link-add-3" "Add category links to checked categories"
"Add bidirectional links" "category-link-add-4" "Add bidirectional category links to checked categories"
} -bulk_action_export_vars { category_id tree_id locale object_id } \
} -bulk_action_export_vars { category_id tree_id locale object_id ctx_id} \
-elements {
links {
sub_class narrow
display_template {
<if @tree.backward_exists_p@ true><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" border="0"></if>
<if @tree.forward_exists_p@ true><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" border="0"></if>
<if @tree.backward_exists_p@ true><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" style="border:0"></if>
<if @tree.forward_exists_p@ true><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" style="border:0"></if>
}
html {align center}
}
......
......@@ -10,9 +10,10 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
db_transaction {
......@@ -24,4 +25,4 @@ db_transaction {
return
}
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}]
......@@ -10,9 +10,10 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
db_transaction {
......@@ -28,4 +29,4 @@ db_transaction {
return
}
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}]
......@@ -9,6 +9,7 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -16,16 +17,18 @@ ad_page_contract {
trees:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
set category_name [category::get_name $category_id $locale]
set page_title "Select target to add a link to category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}] "Links to $category_name"] \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}] "Links to $category_name"] \
"Select link target"
......@@ -34,7 +37,7 @@ template::multirow create trees tree_name tree_id link_add_url
db_foreach get_trees_to_link "" {
set tree_name [category_tree::get_name $link_tree_id $locale]
template::multirow append trees $tree_name $link_tree_id \
[export_vars -no_empty -base category-link-add-2 { link_tree_id category_id tree_id locale object_id }]
[export_vars -no_empty -base category-link-add-2 { link_tree_id category_id tree_id locale object_id ctx_id}]
}
template::multirow sort trees -dictionary tree_name
......
......@@ -10,9 +10,10 @@ ad_page_contract {
tree_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
db_transaction {
......@@ -24,4 +25,4 @@ db_transaction {
return
}
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}]
......@@ -10,6 +10,7 @@ ad_page_contract {
tree_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -18,7 +19,7 @@ ad_page_contract {
cancel_url:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
......@@ -27,9 +28,11 @@ set category_name [category::get_name $category_id $locale]
set allowed_link_ids [list]
set page_title "Delete links with category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id}] "Links to $category_name"] \
[list [export_vars -no_empty -base category-links-view {category_id tree_id locale object_id ctx_id}] "Links to $category_name"] \
"Delete Links"
multirow create category_links linked_category_id linked_tree_id direction
......@@ -43,8 +46,8 @@ db_foreach check_category_links "" {
multirow extend category_links tree_view_url category_view_url tree_name category_name
multirow foreach category_links {
set tree_view_url [export_vars -no_empty -base tree-view { {tree_id $linked_tree_id} locale object_id }]
set category_view_url [export_vars -no_empty -base category-links-view { {category_id $linked_category_id} {tree_id $linked_tree_id} locale object_id }]
set tree_view_url [export_vars -no_empty -base tree-view { {tree_id $linked_tree_id} locale object_id ctx_id}]
set category_view_url [export_vars -no_empty -base category-links-view { {category_id $linked_category_id} {tree_id $linked_tree_id} locale object_id ctx_id}]
set tree_name [category_tree::get_name $linked_tree_id $locale]
set category_name [category::get_name $linked_category_id $locale]
......@@ -52,8 +55,8 @@ multirow foreach category_links {
multirow sort category_links -dictionary tree_name category_name direction
set delete_url [export_vars -no_empty -base category-link-delete-2 { {link_id:multiple $allowed_link_ids} category_id tree_id locale object_id }]
set cancel_url [export_vars -no_empty -base category-links-view { category_id tree_id locale object_id }]
set delete_url [export_vars -no_empty -base category-link-delete-2 { {link_id:multiple $allowed_link_ids} category_id tree_id locale object_id ctx_id}]
set cancel_url [export_vars -no_empty -base category-links-view { category_id tree_id locale object_id ctx_id}]
template::list::create \
-name category_links \
......@@ -63,8 +66,8 @@ template::list::create \
sub_class narrow
label "Direction"
display_template {
<if @category_links.direction@ eq f><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" border="0"></if>
<else><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" border="0"></else>
<if @category_links.direction@ eq f><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" style="border:0"></if>
<else><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" style="border:0"></else>
}
html {align center}
}
......
......@@ -10,20 +10,23 @@ ad_page_contract {
{locale ""}
object_id:integer,optional
orderby:optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
category_links:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
set category_name [category::get_name $category_id $locale]
set page_title "Categories linked with category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Links to $category_name"
......@@ -51,11 +54,12 @@ template::list::create \
tree_id {}
locale {}
object_id {}
ctx_id {}
} -actions [list \
"Add link" [export_vars -no_empty -base category-link-add { category_id tree_id locale object_id }] "Add new category link"] \
"Add link" [export_vars -no_empty -base category-link-add { category_id tree_id locale object_id ctx_id}] "Add new category link"] \
-bulk_actions {
"Delete" "category-link-delete" "Delete checked category links"
} -bulk_action_export_vars { category_id tree_id locale object_id } \
} -bulk_action_export_vars { category_id tree_id locale object_id ctx_id} \
-elements {
checkbox {
display_template {
......@@ -66,8 +70,8 @@ template::list::create \
sub_class narrow
label "Direction"
display_template {
<if @category_links.direction@ eq f><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" border="0"></if>
<else><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" border="0"></else>
<if @category_links.direction@ eq f><img src="/resources/acs-subsite/right.gif" height="16" width="16" alt="forward link" style="border:0"></if>
<else><img src="/resources/acs-subsite/left.gif" height="16" width="16" alt="backward link" style="border:0"></else>
}
html {align center}
}
......@@ -81,7 +85,7 @@ template::list::create \
delete {
sub_class narrow
display_template {
<img src="/resources/acs-subsite/Delete16.gif" height="16" width="16" alt="Delete" border="0">
<img src="/resources/acs-subsite/Delete16.gif" height="16" width="16" alt="Delete" style="border:0">
}
link_url_col delete_url
link_html { title "Delete link" }
......@@ -92,9 +96,9 @@ db_multirow category_links get_category_links ""
multirow extend category_links delete_url tree_view_url category_view_url tree_name category_name
multirow foreach category_links {
set delete_url [export_vars -no_empty -base category-link-delete { link_id category_id tree_id locale object_id }]
set tree_view_url [export_vars -no_empty -base tree-view { {tree_id $linked_tree_id} locale object_id }]
set category_view_url [export_vars -no_empty -base category-links-view { {category_id $linked_category_id} {tree_id $linked_tree_id} locale object_id }]
set delete_url [export_vars -no_empty -base category-link-delete { link_id category_id tree_id locale object_id ctx_id}]
set tree_view_url [export_vars -no_empty -base tree-view { {tree_id $linked_tree_id} locale object_id ctx_id}]
set category_view_url [export_vars -no_empty -base category-links-view { {category_id $linked_category_id} {tree_id $linked_tree_id} locale object_id ctx_id}]
set tree_name [category_tree::get_name $linked_tree_id $locale]
set category_name [category::get_name $linked_category_id $locale]
......
......@@ -10,10 +10,11 @@ ad_page_contract {
{parent_id:integer,optional [db_null]}
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
permission::require_permission -object_id $tree_id -privilege category_tree_write
category::change_parent -tree_id $tree_id -category_id $category_id -parent_id $parent_id
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
......@@ -9,6 +9,7 @@ ad_page_contract {
category_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -16,12 +17,14 @@ ad_page_contract {
tree:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set category_name [category::get_name $category_id $locale]
set page_title "Change parent category of \"$category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Change parent"
......@@ -29,13 +32,13 @@ set subtree_categories_list [db_list get_subtree ""]
template::multirow create tree category_name category_id deprecated_p level left_indent parent_url
template::multirow append tree "Root Level" 0 f 0 "" \
[export_vars -no_empty -base category-parent-change-2 {tree_id category_id locale object_id}]
[export_vars -no_empty -base category-parent-change-2 {tree_id category_id locale object_id ctx_id}]
foreach category [category_tree::get_tree -all $tree_id $locale] {
util_unlist $category parent_id category_name deprecated_p level
if { [lsearch $subtree_categories_list $parent_id]==-1 } {
set parent_url [export_vars -no_empty -base category-parent-change-2 { parent_id tree_id category_id locale object_id }]
set parent_url [export_vars -no_empty -base category-parent-change-2 { parent_id tree_id category_id locale object_id ctx_id }]
} else {
set parent_url ""
}
......
......@@ -8,7 +8,8 @@ ad_page_contract {
category_id:integer,multiple
{locale ""}
object_id:integer,optional
}
ctx_id:integer,optional
}
permission::require_permission -object_id $tree_id -privilege category_tree_write
......@@ -19,4 +20,4 @@ db_transaction {
}
category_tree::flush_cache $tree_id
ad_returnredirect [export_vars -no_empty -base tree-view { tree_id locale object_id }]
ad_returnredirect [export_vars -no_empty -base tree-view { tree_id locale object_id ctx_id}]
......@@ -8,6 +8,7 @@ ad_page_contract {
category_id:integer,multiple
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
permission::require_permission -object_id $tree_id -privilege category_tree_write
......@@ -19,4 +20,4 @@ db_transaction {
}
category_tree::flush_cache $tree_id
ad_returnredirect [export_vars -no_empty -base tree-view { tree_id locale object_id }]
ad_returnredirect [export_vars -no_empty -base tree-view { tree_id locale object_id ctx_id}]
......@@ -26,7 +26,7 @@
and m.category_id = :category_id
and acs_permission__permission_p(m.object_id, :user_id, 'read') = 't'
$order_by_clause
limit $last_row offset $first_row
limit $last_row offset $first_row -1
</querytext>
</fullquery>
......
......@@ -25,7 +25,7 @@ ad_page_contract {
pages:onerow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
array set tree [category_tree::get_data $tree_id $locale]
if {$tree(site_wide_p) == "f"} {
permission::require_permission -object_id $tree_id -privilege category_tree_read
......
......@@ -15,10 +15,10 @@ ad_page_contract {
trees_with_read_permission:multirow
}
set page_title "Category Management"
set page_title "[_ categories.cadmin]"
set context_bar [list $page_title]
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
set package_id [ad_conn package_id]
permission::require_permission -object_id $package_id -privilege category_admin
......@@ -31,9 +31,9 @@ db_foreach trees {} {
array unset tree_array
array set tree_array [category_tree::get_data $tree_id $locale]
if { [string equal $has_write_p "t"] } {
if {$has_write_p == "t"} {
template::multirow append trees_with_write_permission $tree_id $tree_array(tree_name) $site_wide_p $tree_array(description)
} elseif { [string equal $has_read_p "t"] || [string equal $site_wide_p "t"] } {
} elseif { $has_read_p == "t" || $site_wide_p == "t" } {
template::multirow append trees_with_read_permission $tree_id $tree_name $site_wide_p $tree_array(description)
}
}
......@@ -61,12 +61,15 @@ set elements {
}
}
template::list::create \
list::create \
-name trees_with_write_permission \
-no_data "None" \
-elements $elements
-elements $elements \
-key tree_id \
-bulk_action_export_vars {locale} \
-bulk_actions [list "[_ categories.export]" trees-code "[_ categories.code_export]"] \
template::list::create \
list::create \
-name trees_with_read_permission \
-no_data "None" \
-elements $elements
......
......@@ -5,15 +5,7 @@
<if @change_locale@ eq t and @languages@ not nil>
<div style="float: right;">
<formtemplate id="locale_form">
<table cellspacing="2" cellpadding="2" border="0">
<tr class="form-element"><td class="form-label">Language</td>
<td class="form-widget"><formwidget id="locale"></td></tr>
@form_vars;noquote@
<tr class="form-element">
<td align="left" colspan="2"><formwidget id="formbutton:ok"></td></tr>
</table>
</formtemplate>
<formtemplate id="locale_form"></formtemplate>
</div>
</if>
......
......@@ -7,14 +7,27 @@ if { ![info exists change_locale] } {
}
if {![exists_and_not_null locale]} {
set locale [ad_parameter DefaultLocale acs-lang "en_US"]
#set locale [parameter::get -parameter DefaultLocale -default en_US]
set locale [ad_conn locale]
}
set languages [lang::system::get_locale_options]
set vars_to_export_list {tree_id category_id }
ad_form -name locale_form -action [ad_conn url] -export { tree_id category_id } -form {
{locale:text(select) {label "Language"} {value $locale} {options $languages}}
set set_id [ad_conn form]
set varname_list [ad_ns_set_keys -exclude {
tree_id category_id locale form:mode form:id
__confirmed_p __refreshing_p formbutton:ok
__submit_button_name __submit_button_value
} $set_id]
foreach name $varname_list {
set $name [ns_set get $set_id $name]
lappend vars_to_export_list $name
}
set form_vars [export_ns_set_vars form {locale form:mode form:id __confirmed_p __refreshing_p formbutton:ok} [ad_conn form]]
ad_form -name locale_form -action [ad_conn url] \
-export $vars_to_export_list \
-form {
{locale:text(select),optional {label "Language"} {value $locale} {options $languages}}
}
......@@ -8,36 +8,38 @@ ad_page_contract {
@cvs-id $Id:
} {
object_id:integer,notnull
ctx_id:integer,optional
{locale ""}
} -properties {
page_title:onevalue
context_bar:onevalue
context:onevalue
locale:onevalue
mapped_trees:multirow
unmapped_trees:multirow
object_name:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $object_id -privilege admin
set context_bar [category::get_object_context $object_id]
set object_name [lindex $context_bar 1]
set page_title "Category Management"
set page_title [_ categories.cadmin]
set context_bar [list $context_bar $page_title]
template::multirow create mapped_trees tree_name tree_id site_wide_p assign_single_p require_category_p view_url unmap_url edit_url
template::multirow create mapped_trees tree_name tree_id \
site_wide_p assign_single_p require_category_p widget view_url unmap_url edit_url
db_foreach get_mapped_trees "" {
set tree_name [category_tree::get_name $tree_id $locale]
if {![empty_string_p $subtree_category_id]} {
append tree_name " :: [category::get_name $subtree_category_id $locale]"
if {$subtree_category_id ne ""} {
append tree_name " :: [category::get_name $subtree_category_id $locale]"
}
template::multirow append mapped_trees $tree_name $tree_id $site_wide_p \
$assign_single_p $require_category_p \
[export_vars -no_empty -base tree-view { tree_id locale object_id }] \
[export_vars -no_empty -base tree-unmap { tree_id locale object_id }] \
[export_vars -no_empty -base tree-map-2 { tree_id locale object_id {edit_p 1}}]
$assign_single_p $require_category_p $widget \
[export_vars -no_empty -base tree-view { tree_id locale object_id ctx_id}] \
[export_vars -no_empty -base tree-unmap { tree_id locale object_id ctx_id}] \
[export_vars -no_empty -base tree-map-2 { tree_id locale object_id {edit_p 1} ctx_id}]
}
template::multirow sort mapped_trees -dictionary tree_name
......@@ -45,13 +47,13 @@ template::multirow sort mapped_trees -dictionary tree_name
template::multirow create unmapped_trees tree_id tree_name site_wide_p view_url map_url subtree_url
db_foreach get_unmapped_trees "" {
if { [string equal $has_read_permission t] || [string equal $site_wide_p t] } {
if { $has_read_permission == "t" || $site_wide_p == "t" } {
set tree_name [category_tree::get_name $tree_id $locale]
template::multirow append unmapped_trees $tree_id $tree_name $site_wide_p \
[export_vars -no_empty -base tree-view { tree_id locale object_id }] \
[export_vars -no_empty -base tree-map-2 { tree_id locale object_id }] \
[export_vars -no_empty -base tree-map { tree_id locale object_id }]
[export_vars -no_empty -base tree-view { tree_id locale object_id ctx_id}] \
[export_vars -no_empty -base tree-map-2 { tree_id locale object_id ctx_id}] \
[export_vars -no_empty -base tree-map { tree_id locale object_id ctx_id}]
}
}
......@@ -67,7 +69,8 @@ template::list::create \
}
flags {
display_template {
(<if @mapped_trees.site_wide_p@ eq t>Site-Wide Tree,</if>
(<if @mapped_trees.site_wide_p@ eq t>Site-Wide Tree, </if>
<if @mapped_trees.widget@>@mapped_trees.widget@, </if>
<if @mapped_trees.assign_single_p@ eq t>single, </if><else>multiple, </else>
<if @mapped_trees.require_category_p@ eq t>required) </if><else>optional) </else>
}
......@@ -103,6 +106,6 @@ template::list::create \
}
}
set create_url [export_vars -no_empty -base tree-form { locale }]
set create_url [export_vars -no_empty -base tree-form { locale object_id ctx_id }]
ad_return_template
......@@ -5,7 +5,7 @@
<querytext>
select t.tree_id, t.site_wide_p, m.subtree_category_id,
m.assign_single_p, m.require_category_p
m.assign_single_p, m.require_category_p, m.widget
from category_trees t, category_tree_map m
where m.object_id = :object_id
and m.tree_id = t.tree_id
......
......@@ -15,7 +15,7 @@ ad_page_contract {
url_vars:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_grant_permissions
array set tree [category_tree::get_data $tree_id $locale]
......
......@@ -10,7 +10,7 @@ ad_page_contract {
object_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
set package_id [ad_conn package_id]
permission::require_permission -object_id $package_id -privilege category_admin
......
......@@ -10,9 +10,10 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
db_transaction {
......@@ -24,4 +25,4 @@ db_transaction {
return
}
ad_returnredirect [export_vars -no_empty -base synonyms-view {category_id tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base synonyms-view {category_id tree_id locale object_id ctx_id}]
......@@ -10,6 +10,7 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -18,18 +19,20 @@ ad_page_contract {
cancel_url:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
set category_name [category::get_name $category_id $locale]
set page_title "Delete synonyms of category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
lappend context_bar [list [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id }] "Synonyms of $category_name"] "Delete synonyms"
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar [list [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id ctx_id}] "Synonyms of $category_name"] "Delete synonyms"
set delete_url [export_vars -no_empty -base synonym-delete-2 { synonym_id:multiple category_id tree_id locale object_id }]
set cancel_url [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id }]
set delete_url [export_vars -no_empty -base synonym-delete-2 { synonym_id:multiple category_id tree_id locale object_id ctx_id}]
set cancel_url [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id ctx_id}]
db_multirow synonyms get_synonyms_to_delete ""
......
......@@ -4,6 +4,4 @@
<property name="change_locale">f</property>
<property name="focus">synonym_form.name</property>
<blockquote>
<formtemplate id="synonym_form"></formtemplate>
</blockquote>
......@@ -10,12 +10,13 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
context_bar:onevalue
page_title:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
......@@ -28,13 +29,16 @@ if {[info exists synonym_id]} {
}
set page_title "$action category synonym of \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
lappend context_bar [list [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id }] "Synonyms of $category_name"] "$action synonym"
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar [list [export_vars -no_empty -base synonyms-view { category_id tree_id locale object_id ctx_id}] "Synonyms of $category_name"] "$action synonym"
set languages [lang::system::get_locale_options]
ad_form -name synonym_form -action synonym-form -export { category_id tree_id locale object_id } -form {
ad_form -name synonym_form -action synonym-form -export { category_id tree_id locale object_id ctx_id} -form {
{synonym_id:key(category_synonyms_id_seq)}
{name:text {label "Name"} {html {size 50 maxlength 200}}}
{language:text(select) {label "Language"} {options $languages}}
......@@ -43,7 +47,7 @@ ad_form -name synonym_form -action synonym-form -export { category_id tree_id lo
if {![empty_string_p [ad_conn locale]]} {
set language [ad_conn locale]
} else {
set language [ad_parameter DefaultLocale acs-lang "en_US"]
set language [parameter::get -parameter DefaultLocale -default en_US]
}
} -edit_request {
db_1row get_synonym ""
......@@ -52,7 +56,7 @@ ad_form -name synonym_form -action synonym-form -export { category_id tree_id lo
} -edit_data {
category_synonym::edit -name $name -locale $language -synonym_id $synonym_id
} -after_submit {
ad_returnredirect [export_vars -no_empty -base synonyms-view {category_id tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base synonyms-view {category_id tree_id locale object_id ctx_id}]
ad_script_abort
}
......
......@@ -10,20 +10,23 @@ ad_page_contract {
{locale ""}
object_id:integer,optional
orderby:optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
synonyms:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
set category_name [category::get_name $category_id $locale]
set page_title "Synonyms for category \"$tree_name :: $category_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Synonyms of $category_name"
......@@ -35,10 +38,10 @@ template::list::create \
-name synonyms \
-no_data "None" \
-key synonym_id \
-actions [list "Add synonym" [export_vars -no_empty -base synonym-form { category_id tree_id locale object_id }] "Add new synonym"] \
-actions [list "Add synonym" [export_vars -no_empty -base synonym-form { category_id tree_id locale object_id ctx_id}] "Add new synonym"] \
-bulk_actions {
"Delete" "synonym-delete" "Delete checked synonyms"
} -bulk_action_export_vars { category_id tree_id locale object_id
} -bulk_action_export_vars { category_id tree_id locale object_id ctx_id
} -orderby {
default_value language,asc
synonym_name {
......@@ -60,7 +63,7 @@ template::list::create \
edit {
sub_class narrow
display_template {
<img src="/resources/acs-subsite/Edit16.gif" height="16" width="16" alt="Edit" border="0">
<img src="/resources/acs-subsite/Edit16.gif" height="16" width="16" alt="Edit" style="border:0">
}
link_url_col edit_url
link_html {title "Edit this synonym"}
......@@ -76,7 +79,7 @@ template::list::create \
delete {
sub_class narrow
display_template {
<img src="/resources/acs-subsite/Delete16.gif" height="16" width="16" alt="Delete" border="0">
<img src="/resources/acs-subsite/Delete16.gif" height="16" width="16" alt="Delete" style="border:0">
}
link_url_col delete_url
link_html { title "Delete synonym" }
......@@ -88,8 +91,8 @@ db_multirow synonyms get_synonyms ""
multirow extend synonyms edit_url delete_url
multirow foreach synonyms {
set edit_url [export_vars -no_empty -base synonym-form { synonym_id category_id tree_id locale object_id }]
set delete_url [export_vars -no_empty -base synonym-delete { synonym_id category_id tree_id locale object_id }]
set edit_url [export_vars -no_empty -base synonym-form { synonym_id category_id tree_id locale object_id ctx_id}]
set delete_url [export_vars -no_empty -base synonym-delete { synonym_id category_id tree_id locale object_id ctx_id}]
}
ad_return_template
......@@ -9,12 +9,13 @@ ad_page_contract {
source_tree_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
set tree_id $target_tree_id
permission::require_permission -object_id $tree_id -privilege category_tree_write
category_tree::copy -source_tree $source_tree_id -dest_tree $target_tree_id
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
......@@ -9,6 +9,7 @@ ad_page_contract {
target_tree_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -16,7 +17,7 @@ ad_page_contract {
tree:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
set tree_id $source_tree_id
array set target_tree [category_tree::get_data $target_tree_id $locale]
......@@ -29,8 +30,10 @@ if {$target_tree(site_wide_p) == "f"} {
set tree_name [category_tree::get_name $tree_id $locale]
set page_title "Category Tree \"$tree_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
lappend context_bar [list [export_vars -no_empty -base tree-copy { {tree_id $target_tree_id} locale object_id }] "Copy tree"] "View \"$tree_name\""
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar [list [export_vars -no_empty -base tree-copy { {tree_id $target_tree_id} locale object_id ctx_id }] "Copy tree"] "View \"$tree_name\""
template::multirow create tree category_name deprecated_p level left_indent
......
......@@ -8,6 +8,7 @@ ad_page_contract {
tree_id:integer
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -16,14 +17,16 @@ ad_page_contract {
tree_id:onevalue
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set tree_name [category_tree::get_name $tree_id $locale]
set target_tree_id $tree_id
set page_title "Copy a tree into \"$tree_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Copy tree"
template::multirow create trees tree_id tree_name site_wide_p view_url copy_url
......@@ -33,8 +36,8 @@ db_foreach trees_select "" {
set source_tree_name [category_tree::get_name $source_tree_id $locale]
template::multirow append trees $source_tree_id $source_tree_name $site_wide_p \
[export_vars -no_empty -base tree-copy-view { source_tree_id target_tree_id locale object_id }] \
[export_vars -no_empty -base tree-copy-2 { source_tree_id target_tree_id locale object_id }]
[export_vars -no_empty -base tree-copy-view { source_tree_id target_tree_id locale object_id ctx_id }] \
[export_vars -no_empty -base tree-copy-2 { source_tree_id target_tree_id locale object_id ctx_id }]
}
}
......
......@@ -8,9 +8,10 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
set instance_list [category_tree::usage $tree_id]
......@@ -23,7 +24,7 @@ if {[llength $instance_list] > 0} {
category_tree::delete $tree_id
if {![info exists object_id]} {
ad_returnredirect ".?[export_vars -no_empty {locale}]"
ad_returnredirect ".?[export_vars -no_empty {locale ctx_id}]"
} else {
ad_returnredirect [export_vars -no_empty -base object-map {locale object_id}]
ad_returnredirect [export_vars -no_empty -base object-map {locale object_id ctx_id}]
}
......@@ -6,13 +6,13 @@
<p>
<table>
<tr><th>Tree Name</th><td>@tree_name@</td></tr>
<tr><th>Description</th><td> @tree_description@</td></tr>
<tr><th>Description</th><td>@tree_description@</td></tr>
</table>
</p>
<if @instances_using_p@ eq t>
This tree is still used by some modules. For a complete list, please go
<a href="tree-usage?@url_vars;noquote@">here</a>.
<a href="@usage_url@">here</a>.
</if>
<if @used_categories:rowcount@ gt 0>
......
......@@ -8,6 +8,7 @@ ad_page_contract {
tree_id:integer,notnull
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -20,7 +21,7 @@ ad_page_contract {
used_categories:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $tree_id -privilege category_tree_write
array set tree [category_tree::get_data $tree_id $locale]
......@@ -28,7 +29,9 @@ set tree_name $tree(tree_name)
set tree_description $tree(description)
set page_title "Delete Category Tree \"$tree_name\""
set context_bar [category::context_bar $tree_id $locale [value_if_exists object_id]]
set context_bar [category::context_bar $tree_id $locale \
[value_if_exists object_id] \
[value_if_exists ctx_id]]
lappend context_bar "Delete"
set instance_list [category_tree::usage $tree_id]
......@@ -39,15 +42,16 @@ if {[llength $instance_list] > 0} {
set instances_using_p f
}
set delete_url [export_vars -no_empty -base tree-delete-2 {tree_id locale object_id}]
set cancel_url [export_vars -no_empty -base tree-view {tree_id locale object_id}]
set delete_url [export_vars -no_empty -base tree-delete-2 {tree_id locale object_id ctx_id}]
set cancel_url [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
set usage_url [export_vars -no_empty -base tree-usage {tree_id ctx_id}]
template::multirow create used_categories category_id category_name view_url
db_foreach get_category_in_use "" {
set category_name [category::get_name $category_id $locale]
template::multirow append used_categories $category_id $category_name \
[export_vars -no_empty -base category-usage { category_id tree_id locale object_id }]
[export_vars -no_empty -base category-usage { category_id tree_id locale object_id ctx_id }]
}
template::multirow sort used_categories -dictionary category_name
......
......@@ -4,6 +4,4 @@
<property name="change_locale">f</property>
<property name="focus">tree_form.tree_name</property>
<blockquote>
<include src="/packages/categories/lib/tree-form" &="tree_id" &="locale">
</blockquote>
<include src="/packages/categories/lib/tree-form" &="tree_id" &="locale">
......@@ -7,6 +7,7 @@ ad_page_contract {
tree_id:integer,optional
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
} -properties {
context_bar:onevalue
page_title:onevalue
......@@ -21,8 +22,13 @@ if { ![ad_form_new_p -key tree_id] } {
}
if { [info exists object_id] } {
set context_bar [list [category::get_object_context $object_id] [list [export_vars -no_empty -base object-map {locale object_id}] "Category Management"]]
set context_bar [list \
[category::get_object_context $object_id] \
[list [export_vars -no_empty -base object-map {locale ctx_id object_id}] \
[_ categories.cadmin]]]
} else {
set context_bar [list [list ".?[export_vars -no_empty {locale}]" "Category Management"]]
set context_bar [list \
[list ".?[export_vars -no_empty {locale ctx_id}]" \
[_ categories.cadmin]]]
}
lappend context_bar $page_title
......@@ -4,6 +4,4 @@
<property name="change_locale">f</property>
<property name="focus">tree_map_form.assign_single_p</property>
<blockquote>
<formtemplate id="tree_map_form"></formtemplate>
</blockquote>
......@@ -14,9 +14,10 @@ ad_page_contract {
{locale ""}
object_id:integer,notnull
{edit_p 0}
ctx_id:integer,optional
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $object_id -privilege admin
array set tree [category_tree::get_data $tree_id $locale]
......@@ -25,38 +26,58 @@ if {$tree(site_wide_p) == "f"} {
permission::require_permission -object_id $tree_id -privilege category_tree_read
}
set context_bar [list [category::get_object_context $object_id] [list [export_vars -no_empty -base object-map {locale object_id}]" "Category Management"] "Mapping Parameters"]
set context_bar [list [category::get_object_context $object_id] [list "[export_vars -no_empty -base object-map {locale object_id ctx_id}]" [_ categories.cadmin]] "Mapping Parameters"]
if {$edit_p} {
# parameters are edited, so get old data
db_1row get_mapped_subtree_id ""
}
if {[empty_string_p $category_id]} {
if {$category_id eq ""} {
set page_title "Parameters of mapping to tree \"$tree_name\""
} else {
set category_name [category::get_name $category_id $locale]
set page_title "Parameters of mapping to subtree \"$tree_name :: $category_name\""
}
ad_form -name tree_map_form -action tree-map-2 -export { tree_id category_id locale object_id edit_p } -form {
{assign_single_p:text(radio) {label "Let users assign multiple categories?"} {options {{"Yes" f} {"No" t}}}}
ad_form -name tree_map_form -action tree-map-2 -export { tree_id category_id locale object_id edit_p ctx_id} -form {
{widget:text(radio) {label "Widget"} {options {
{"Select" select}
{"Multiselect - let users assign multiple categories" multiselect}
{"Radio" radio}
{"Checkbox - let users assign multiple categories" checkbox}
}}}
{require_category_p:text(radio) {label "Require users to assign at least one category?"} {options {{"Yes" t} {"No" f}}}}
} -on_request {
if {$edit_p} {
db_1row get_mapping_parameters ""
if { $widget eq "" } {
# this is pre-widget selection and we default to the same
# look and feel as before
if { $assign_single_p } {
set widget "select"
} else {
set widget "multiselect"
}
}
} else {
set assign_single_p f
# we default to the default before widgets could be selected
set widget multiselect
set require_category_p f
}
} -on_submit {
if { $widget eq "select" || $widget eq "radio" } {
set assign_single_p t
} else {
set assign_single_p f
}
if {$edit_p} {
category_tree::edit_mapping -tree_id $tree_id -object_id $object_id -assign_single_p $assign_single_p -require_category_p $require_category_p
category_tree::edit_mapping -tree_id $tree_id -object_id $object_id -assign_single_p $assign_single_p -require_category_p $require_category_p -widget $widget
} else {
category_tree::map -tree_id $tree_id -subtree_category_id $category_id -object_id $object_id -assign_single_p $assign_single_p -require_category_p $require_category_p
category_tree::map -tree_id $tree_id -subtree_category_id $category_id -object_id $object_id -assign_single_p $assign_single_p -require_category_p $require_category_p -widget $widget
}
} -after_submit {
ad_returnredirect [export_vars -no_empty -base object-map {locale object_id}]
ad_returnredirect [export_vars -no_empty -base object-map {locale object_id ctx_id}]
ad_script_abort
}
......
......@@ -16,7 +16,7 @@
<fullquery name="get_mapping_parameters">
<querytext>
select assign_single_p, require_category_p
select assign_single_p, require_category_p, widget
from category_tree_map
where tree_id = :tree_id
and object_id = :object_id
......
......@@ -8,6 +8,7 @@ ad_page_contract {
tree_id:integer
{locale ""}
object_id:integer,notnull
ctx_id:integer,optional
} -properties {
page_title:onevalue
context_bar:onevalue
......@@ -15,7 +16,7 @@ ad_page_contract {
tree:multirow
}
set user_id [ad_maybe_redirect_for_registration]
set user_id [auth::require_login]
permission::require_permission -object_id $object_id -privilege admin
array set tree_data [category_tree::get_data $tree_id $locale]
......@@ -26,7 +27,10 @@ if {$tree_data(site_wide_p) == "f"} {
set page_title "Select subtree of \"$tree_name\" to map"
set context_bar [list [category::get_object_context $object_id] [list [export_vars -no_empty -base object-map {locale object_id}] "Category Management"] "Map subtree"]
set context_bar [list \
[category::get_object_context $object_id] \
[list [export_vars -no_empty -base object-map {locale object_id ctx_id}] [_ categories.cadmin]] \
"Map subtree"]
template::multirow create tree category_id category_name level left_indent map_url
......@@ -34,8 +38,8 @@ foreach category [category_tree::get_tree -all $tree_id $locale] {
util_unlist $category category_id category_name deprecated_p level
template::multirow append tree $category_id $category_name $level \
[string repeat "&nbsp;" [expr ($level-1)*5]] \
[export_vars -no_empty -base tree-map-2 { category_id tree_id locale object_id }]
[string repeat "&nbsp;" [expr {($level-1)*5}]] \
[export_vars -no_empty -base tree-map-2 { category_id tree_id locale object_id ctx_id}]
}
template::list::create \
......
......@@ -9,6 +9,7 @@ ad_page_contract {
sort_key:array
{locale ""}
object_id:integer,optional
ctx_id:integer,optional
}
permission::require_permission -object_id $tree_id -privilege category_tree_write
......@@ -20,7 +21,7 @@ db_transaction {
set count 0
db_foreach get_tree "" {
incr count 10
if {[empty_string_p $parent_id]} {
if {$parent_id eq ""} {
# need this as an anchor for toplevel categories
set parent_id -1
}
......@@ -30,7 +31,7 @@ db_transaction {
lappend child($parent_id) [list $count $category_id 0 0]
}
}
set last_ind [expr ($count / 5) + 1]
set last_ind [expr {($count / 5) + 1}]
set count 1
set stack [list]
......@@ -54,7 +55,7 @@ db_transaction {
set stack [concat [lsort -integer -index 0 $child($act_category)] $stack]
} else {
## this category has no children, so it is done
lappend done_list [list $act_category $count [expr $count + 1]]
lappend done_list [list $act_category $count [expr {$count + 1}]]
incr count 1
}
incr count 1
......@@ -77,4 +78,4 @@ if {$count != $last_ind} {
return
}
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id}]
ad_returnredirect [export_vars -no_empty -base tree-view {tree_id locale object_id ctx_id}]
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment