1
package MT::CMS::Category;
4
use MT::Util qw( encode_url encode_js );
8
my ($app, $id, $obj, $param) = @_;
10
my $blog = $app->blog;
13
$param->{nav_categories} = 1;
15
#$param{ "tab_" . ( $app->param('tab') || 'details' ) } = 1;
17
# $app->add_breadcrumb($app->translate('Categories'),
18
# $app->uri( 'mode' => 'list_cat',
19
# args => { blog_id => $obj->blog_id }));
20
# $app->add_breadcrumb($obj->label);
21
my $parent = $obj->parent_category;
22
my $site_url = $blog->site_url;
23
$site_url .= '/' unless $site_url =~ m!/$!;
24
$param->{path_prefix} =
25
$site_url . ( $parent ? $parent->publish_path : '' );
26
$param->{path_prefix} .= '/' unless $param->{path_prefix} =~ m!/$!;
27
require MT::Trackback;
28
my $tb = MT::Trackback->load( { category_id => $obj->id } );
31
my $list_pref = $app->list_pref('ping');
32
%$param = ( %$param, %$list_pref );
33
my $path = $app->config('CGIPath');
34
$path .= '/' unless $path =~ m!/$!;
36
my ($blog_domain) = $blog->archive_url =~ m|(.+://[^/]+)|;
37
$path = $blog_domain . $path;
40
my $script = $app->config('TrackbackScript');
42
$param->{tb_url} = $path . $script . '/' . $tb->id;
43
if ( $param->{tb_passphrase} = $tb->passphrase ) {
44
$param->{tb_url} .= '/' . encode_url( $param->{tb_passphrase} );
46
$app->load_list_actions( 'ping', $param->{ping_table}[0],
56
my $type = $q->param('_type') || 'category';
57
my $class = $app->model($type);
59
my $perms = $app->permissions;
62
if ( $type eq 'category' ) {
63
$entry_type = 'entry';
64
return $app->return_to_dashboard( redirect => 1 )
65
unless $perms && $perms->can_edit_categories;
67
elsif ( $type eq 'folder' ) {
69
return $app->return_to_dashboard( redirect => 1 )
70
unless $perms && $perms->can_manage_pages;
72
$entry_class = $app->model($entry_type);
73
my $blog_id = scalar $q->param('blog_id');
75
my $blog = MT::Blog->load($blog_id)
76
or return $app->errtrans("Invalid request.");
79
my $data = $app->_build_category_list(
82
new_cat_id => scalar $q->param('new_cat_id'),
85
if ( $blog->site_url =~ /\/$/ ) {
86
$param{blog_site_url} = $blog->site_url;
89
$param{blog_site_url} = $blog->site_url . '/';
91
$param{object_loop} = $param{category_loop} = $data;
92
$param{saved} = $q->param('saved');
93
$param{saved_deleted} = $q->param('saved_deleted');
94
$app->load_list_actions( $type, \%param );
96
#$param{nav_categories} = 1;
97
$param{sub_object_label} =
99
? $app->translate('Subfolder')
100
: $app->translate('Subcategory');
101
$param{object_label} = $class->class_label;
102
$param{object_label_plural} = $class->class_label_plural;
103
$param{object_type} = $type;
104
$param{entry_label_plural} = $entry_class->class_label_plural;
105
$param{entry_label} = $entry_class->class_label;
106
$param{search_label} = $param{entry_label_plural};
107
$param{search_type} = $entry_type;
112
$param{listing_screen} = 1;
113
$app->add_breadcrumb( $param{object_label_plural} );
115
$param{screen_class} = "list-${type}";
116
$param{screen_class} .= " list-category"
117
if $type eq 'folder'; # to piggyback on list-category styles
118
my $tmpl_file = 'list_' . $type . '.tmpl';
119
$app->load_tmpl( $tmpl_file, \%param );
125
my $perms = $app->permissions;
126
my $type = $q->param('_type');
127
my $class = $app->model($type)
128
or return $app->errtrans("Invalid request.");
130
if ( $type eq 'category' ) {
131
return $app->errtrans("Permission denied.")
132
unless $perms && $perms->can_edit_categories;
134
elsif ( $type eq 'folder' ) {
135
return $app->errtrans("Permission denied.")
136
unless $perms && $perms->can_manage_pages;
139
$app->validate_magic() or return;
141
my $blog_id = $q->param('blog_id');
143
if ( my $moved_cat_id = $q->param('move_cat_id') ) {
144
$cat = $class->load( $q->param('move_cat_id') )
146
move_category($app) or return;
149
for my $p ( $q->param ) {
150
my ($parent) = $p =~ /^category-new-parent-(\d+)$/;
151
next unless ( defined $parent );
153
my $label = $q->param($p);
154
$label =~ s/(^\s+|\s+$)//g;
155
next unless ( $label ne '' );
158
my $original = $cat->clone;
159
$cat->blog_id($blog_id);
161
$cat->author_id( $app->user->id );
162
$cat->parent($parent);
164
$app->run_callbacks( 'cms_pre_save.' . $type,
165
$app, $cat, $original )
166
|| return $app->errtrans( "Saving [_1] failed: [_2]", $type,
170
or return $app->error(
172
"Saving [_1] failed: [_2]",
177
# Now post-process it.
178
$app->run_callbacks( 'cms_post_save.' . $type,
179
$app, $cat, $original );
183
return $app->errtrans( "The [_1] must be given a name!", $type )
188
'mode' => 'list_cat',
193
new_cat_id => $cat->id
202
my $type = $q->param('_type') || 'category';
203
my $pkg = $app->model($type);
204
my $data = $app->_build_category_list(
205
blog_id => scalar $q->param('blog_id'),
209
$param{'category_loop'} = $data;
210
$app->add_breadcrumb( $app->translate( 'Add a [_1]', $pkg->class_label ) );
211
$param{object_type} = $type;
212
$param{object_label} = $pkg->class_label;
213
$app->load_tmpl( 'popup/category_add.tmpl', \%param );
216
sub category_do_add {
219
my $type = $q->param('_type') || 'category';
220
my $author = $app->user;
221
my $pkg = $app->model($type);
222
$app->validate_magic() or return;
223
my $name = $q->param('label')
224
or return $app->error( $app->translate("No label") );
225
$name =~ s/(^\s+|\s+$)//g;
226
return $app->errtrans("Category name cannot be blank.")
228
my $parent = $q->param('parent') || '0';
230
my $original = $cat->clone;
231
$cat->blog_id( scalar $q->param('blog_id') );
232
$cat->author_id( $app->user->id );
234
$cat->parent($parent);
236
if ( !$author->is_superuser ) {
237
$app->run_callbacks( 'cms_save_permission_filter.' . $type,
239
|| return $app->error(
240
$app->translate( "Permission denied: [_1]", $app->errstr() ) );
243
my $filter_result = $app->run_callbacks( 'cms_save_filter.' . $type, $app )
246
$app->run_callbacks( 'cms_pre_save.' . $type, $app, $cat, $original )
249
$cat->save or return $app->error( $cat->errstr );
251
# Now post-process it.
252
$app->run_callbacks( 'cms_post_save.' . $type, $app, $cat, $original )
256
$name = encode_js($name);
257
my %param = ( javascript => <<SCRIPT);
258
o.doAddCategoryItem('$name', '$id');
260
$app->load_tmpl( 'reload_opener.tmpl', \%param );
263
sub js_add_category {
265
unless ( $app->validate_magic ) {
266
return $app->json_error( $app->translate("Invalid request.") );
268
my $user = $app->user;
269
my $blog_id = $app->param('blog_id');
270
my $perms = $app->permissions;
271
my $type = $app->param('_type') || 'category';
272
my $class = $app->model($type);
274
return $app->json_error( $app->translate("Invalid request.") );
277
my $label = $app->param('label');
278
my $enc = $app->config->PublishCharset;
280
# XMLHttpRequest always send text in UTF-8... right?
281
if ( 'utf-8' ne lc($enc) ) {
282
$label = MT::I18N::encode_text( $label, 'utf-8', $enc );
284
my $basename = $app->param('basename');
285
if ( !defined($label) || ( $label =~ m/^\s*$/ ) ) {
286
return $app->json_error( $app->translate("Invalid request.") );
289
my $blog = $app->blog;
291
return $app->json_error( $app->translate("Invalid request.") );
295
if ( my $parent_id = $app->param('parent') ) {
296
if ( $parent_id != -1 ) { # special case for 'root' folder
297
$parent = $class->load( { id => $parent_id, blog_id => $blog_id } );
299
return $app->json_error( $app->translate("Invalid request.") );
304
my $obj = $class->new;
305
my $original = $obj->clone;
308
!$app->run_callbacks(
309
'cms_save_permission.' . $type,
310
$app, $obj, $original
314
return $app->json_error( $app->translate("Permission denied.") );
318
$obj->basename($basename) if $basename;
319
$obj->parent( $parent->id ) if $parent;
320
$obj->blog_id($blog_id);
321
$obj->author_id( $user->id );
322
$obj->created_by( $user->id );
325
!$app->run_callbacks( 'cms_pre_save.' . $type, $app, $obj, $original ) )
327
return $app->json_error( $app->errstr );
332
$app->run_callbacks( 'cms_post_save.' . $type, $app, $obj, $original );
334
return $app->json_result(
337
basename => $obj->basename
343
my ( $eh, $app, $id ) = @_;
344
my $perms = $app->permissions;
345
return $perms->can_edit_categories();
349
my ( $eh, $app, $id ) = @_;
350
my $perms = $app->permissions;
351
return $perms->can_edit_categories();
355
my ( $eh, $app, $obj ) = @_;
356
return 1 if $app->user->is_superuser();
357
my $perms = $app->permissions;
358
return $perms && $perms->can_edit_categories();
363
my ( $app, $obj ) = @_;
364
my $pkg = $app->model('category');
365
if ( defined( my $pass = $app->param('tb_passphrase') ) ) {
366
$obj->{__tb_passphrase} = $pass;
368
my @siblings = $pkg->load(
370
parent => $obj->parent,
371
blog_id => $obj->blog_id
374
foreach (@siblings) {
375
next if $obj->id && ( $_->id == $obj->id );
378
"The category name '[_1]' conflicts with another category. Top-level categories and sub-categories with the same parent must have unique names.",
381
) if $_->label eq $obj->label;
384
"The category basename '[_1]' conflicts with another category. Top-level categories and sub-categories with the same parent must have unique basenames.",
387
) if $_->basename eq $obj->basename;
394
my ( $app, $obj, $original ) = @_;
396
if ( !$original->id ) {
399
message => $app->translate(
400
"Category '[_1]' created by '[_2]'", $obj->label,
403
level => MT::Log::INFO(),
415
return $app->errtrans( "The name '[_1]' is too long!",
416
$app->param('label') )
417
if ( length( $app->param('label') ) > 100 );
422
my ( $eh, $app, $obj ) = @_;
426
message => $app->translate(
427
"Category '[_1]' (ID:[_2]) deleted by '[_3]'",
428
$obj->label, $obj->id, $app->user->name
430
level => MT::Log::INFO(),
439
my $type = $app->param('_type');
440
my $class = $app->model($type)
441
or return $app->errtrans("Invalid request.");
442
$app->validate_magic() or return;
444
my $cat = $class->load( $app->param('move_cat_id') )
446
my $new_parent = $app->param('move-radio');
448
return 1 if ( $new_parent == $cat->parent );
450
$cat->parent($new_parent);
451
my @siblings = $class->load(
453
parent => $cat->parent,
454
blog_id => $cat->blog_id
457
foreach (@siblings) {
459
# FIXME: Language should support both category / folder
460
return $app->errtrans(
461
"The category name '[_1]' conflicts with another category. Top-level categories and sub-categories with the same parent must have unique names.",
463
) if $_->label eq $cat->label;
467
or return $app->error(
468
$app->translate( "Saving category failed: [_1]", $cat->errstr ) );