# Media Manager Movable Type Plugin # # $Id: $ # # Copyright (C) 2005 Byrne Reese # package SidebarManager::App; use vars qw( $DEBUG ); use strict; @SidebarManager::App::ISA = qw( MT::App ); use MT::App; use MT::App::CMS; use MT::PluginData; use SidebarManager::Util; # # TODO # * Only install Sidebar Widgets ONCE - check for existence of widgets before # creating them. sub init { my $app = shift; my %param = @_; $app->SUPER::init(%param) or return; SidebarManager::Util::debug("Initializing Sidebar Manager"); $app->add_methods( 'list' => \&list, 'edit' => \&edit, 'delete' => \&delete, 'save' => \&save, ); $app->{default_mode} = 'list'; $app->{user_class} = 'MT::Author'; $app->{requires_login} = 1; $app->{mtscript_url} = ($app->{cfg}->AdminCGIPath ? $app->{cfg}->AdminCGIPath : $app->{cfg}->CGIPath) . $app->{cfg}->AdminScript; $app->{mmscript_url} = $app->path . $app->{cfg}->AdminScript; SidebarManager::Util::debug("Finished initializing Sidebar Manager."); $app; } sub init_tmpl { my $app = shift; SidebarManager::Util::debug("Initializing template file."," >"); SidebarManager::Util::debug("Calling MT::App::load_tmpl(".join(", ",@_).")"," >"); my $tmpl = $app->load_tmpl(@_); if (!$tmpl) { my $err = $app->translate("Loading template '[_1]' ". "failed: [_2]", $_[0], $@); SidebarManager::Util::debug($err," >"); return $app->error($err); } else { SidebarManager::Util::debug("Template file successfully loaded."," >"); } MT::App::CMS::is_authorized($app); if (my $perms = $app->{perms}) { $tmpl->param(can_post => $perms->can_post); $tmpl->param(can_upload => $perms->can_upload); $tmpl->param(can_edit_entries => $perms->can_post || $perms->can_edit_all_posts); $tmpl->param(can_search_replace => $perms->can_edit_all_posts); $tmpl->param(can_edit_templates => $perms->can_edit_templates); $tmpl->param(can_edit_authors => $perms->can_administer_blog); $tmpl->param(can_edit_config => $perms->can_edit_config); # FIXME: once we have edit_commenters permission $tmpl->param(can_edit_commenters => $perms->can_edit_config()); $tmpl->param(can_rebuild => $perms->can_rebuild); $tmpl->param(can_edit_categories => $perms->can_edit_categories); $tmpl->param(can_edit_notifications => $perms->can_edit_notifications); $tmpl->param(has_manage_label => $perms->can_edit_templates || $perms->can_administer_blog || $perms->can_edit_categories || $perms->can_edit_config); $tmpl->param(has_posting_label => $perms->can_post || $perms->can_edit_all_posts || $perms->can_upload); $tmpl->param(has_community_label => $perms->can_post || $perms->can_edit_config || $perms->can_edit_notifications || $perms->can_edit_all_posts); $tmpl->param(can_view_log => $perms->can_view_blog_log); } my $apppath = $app->{__path} || ""; my $spath = $app->{cfg}->StaticWebPath || $app->path."mt-static/"; $spath =~ s/\/*$/\//g; my $enc = $app->{cfg}->PublishCharset || $app->language_handle->encoding; $tmpl->param(plugin_name => "Sidebar Manager"); $tmpl->param(plugin_version => $MT::Plugin::SidebarManager::VERSION); $tmpl->param(plugin_author => "Byrne Reese"); $tmpl->param(mt_url => $app->{mtscript_url}); $tmpl->param(mtscript_url => $app->{mtscript_url}); $tmpl->param(mmscript_url => $app->{mmscript_url}); $tmpl->param(static_uri => $spath); $tmpl->param(script_url => File::Spec->catdir($apppath,"sidebar.cgi")); $tmpl->param(page_titles => [ reverse @{ $app->{breadcrumbs} } ]); $tmpl->param(nav_sidebar => 1); SidebarManager::Util::debug("MT Script URL: ".$tmpl->param('mtscript_url')," >"); SidebarManager::Util::debug("Finished initializing template file."," >"); return $tmpl; } sub save { SidebarManager::Util::debug("Calling save..."); my $app = shift; my $q = $app->{query}; my $blog_id = $q->param('blog_id'); my $str = build_module_list($q->param('modules')); SidebarManager::Util::debug("Saving modules to blog #".$blog_id.": $str"); # Load the current sidebar data my $current = $q->param('sidebar'); if ($current eq "New Sidebar") { $current = $q->param('name'); } my $modulesets = SidebarManager::Plugin::load_selected_modules($blog_id); $modulesets = {} unless $modulesets; # delete old set delete $modulesets->{$q->param('sidebar')}; # add it back with a potential new name $modulesets->{$q->param('name')} = $str; require MT::PluginData; my $data = MT::PluginData->load({ plugin => 'sidebar-manager', key => $blog_id }); unless ($data) { $data = MT::PluginData->new; $data->plugin('sidebar-manager'); $data->key($blog_id); } $data->data( \$modulesets ); $data->save or die $data->errstr; $app->{rebuild} = 1; $app->list(); } sub delete { SidebarManager::Util::debug("Calling delete..."); my $app = shift; my $q = $app->{query}; my $blog_id = $q->param('blog_id'); my $modulesets = SidebarManager::Plugin::load_selected_modules($blog_id); $modulesets = {} unless $modulesets; my @ids = $q->param('id'); foreach my $key (@ids) { delete $modulesets->{$key}; } require MT::PluginData; my $data = MT::PluginData->load({ plugin => 'sidebar-manager', key => $blog_id }); $data->data( \$modulesets ); $data->save or die $data->errstr; $app->{deleted} = 1; $app->list(); } sub edit { SidebarManager::Util::debug("Calling edit..."); my $app = shift; my $q = $app->{query}; my $blog_id = $q->param('blog_id'); my $tmpl = $app->init_tmpl('edit.tmpl'); $tmpl->param('blog_id' => $blog_id); $app->add_breadcrumb($app->translate("Main Menu"),$app->{mtscript_url}); $app->add_breadcrumb($app->translate("Sidebar Manager"),"?__mode=list&blog_id=".$blog_id); $app->add_breadcrumb($q->param('name')); my $modulesets = SidebarManager::Plugin::load_selected_modules($blog_id); my @names = sort keys %$modulesets; my $sidebar = $q->param('sidebar') || $names[0] || ""; my @selected = split(",",$modulesets->{$sidebar}); my %constraints; $constraints{blog_id} = $blog_id; $constraints{type} = 'custom'; my %options; $options{sort} = 'name'; $options{direction} = 'ascend'; require MT::Template; my $iter = MT::Template->load_iter( \%constraints, \%options ); my @avail_modules; my @inst_modules; while (my $m = $iter->()) { my $name = $m->name(); if ($name =~ s/^Sidebar: ?//) { push @avail_modules, { id => $m->id(), name => $name, selected => in_array($m->id,@selected), }; } } foreach my $mid (@selected) { for (my $i = 0; $i <= $#avail_modules; $i++) { if ($avail_modules[$i]->{id} == $mid) { SidebarManager::Util::debug("Moving $mid to list of installed modules"); push @inst_modules,$avail_modules[$i]; splice(@avail_modules,$i,1); } } } if ($sidebar eq "New Sidebar") { $sidebar = $q->param('name'); } $tmpl->param(available => \@avail_modules); $tmpl->param(installed => \@inst_modules); $tmpl->param(name => $sidebar); $app->{breadcrumbs}[-1]{is_last} = 1; $tmpl->param(breadcrumbs => $app->{breadcrumbs}); $tmpl->param(plugin_version => $MT::Plugin::SidebarManager::VERSION); $tmpl->param(rebuild => $app->{rebuild}); $app->l10n_filter($tmpl->output); } sub list { SidebarManager::Util::debug("Calling list..."); my $app = shift; my $q = $app->{query}; my $blog_id = $q->param('blog_id'); my $tmpl = $app->init_tmpl('list.tmpl'); $tmpl->param('blog_id' => $blog_id); $app->add_breadcrumb($app->translate("Main Menu"),$app->{mtscript_url}); $app->add_breadcrumb($app->translate("Sidebar Manager")); my $data = MT::PluginData->load({ plugin => 'sidebar-manager', key => 'installed:'.$blog_id }); if (!$data) { $app->install_default_modules(); } my $modulesets = SidebarManager::Plugin::load_selected_modules($blog_id); my (%constraints, %options); $constraints{blog_id} = $blog_id; $constraints{type} = 'custom'; $options{sort} = 'name'; $options{direction} = 'ascend'; require MT::Template; my $iter = MT::Template->load_iter( \%constraints, \%options ); my %avail; while (my $m = $iter->()) { my $name = $m->name(); if ($name =~ s/^Sidebar: ?//) { $avail{$m->id()} = $name; } } my @names = sort keys %$modulesets; my $sidebar = $q->param('sidebar') || $names[0] || ""; my @sidebars; my @keys = sort keys %$modulesets; foreach my $key (@keys) { my $names = join(", ",map { $avail{$_} } split(",",$modulesets->{$key})); push @sidebars,{ sidebar => $key, names => $names, widgets => $modulesets->{$key} }; } if ($sidebar eq "New Sidebar") { $sidebar = $q->param('name'); } $tmpl->param(sidebars => \@sidebars); $app->{breadcrumbs}[-1]{is_last} = 1; $tmpl->param(breadcrumbs => $app->{breadcrumbs}); $tmpl->param(plugin_version => $MT::Plugin::SidebarManager::VERSION); $tmpl->param(rebuild => $app->{rebuild}); $tmpl->param(deleted => $app->{deleted}); $app->l10n_filter($tmpl->output); } sub build_module_list { my ($str) = @_; my @mods = split(";",$str); my @inst; foreach my $m (@mods) { my ($id,$col,$ord) = ($m =~ /(\d+)=(\d+)\.(\d+)/); if ($col == 1) { push @inst,$id; } } return join(",",@inst); } sub in_array { my ($needle,@haystack) = @_; foreach my $e (@haystack) { if ($e eq $needle) { return 1; } } return 0; } sub install_default_modules { my $app = shift; my $blog_id = $app->blog->id; my @preinstalled; my $tmpl; require MT::Template; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Calendar')); $tmpl->text($app->translate_templatized(<

<\$MTDate format="%B %Y"\$>

">
"> "> "> "> "> "> ">
<\$MTCalendarDay\$> <\$MTCalendarDay\$>  
END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Search')); $tmpl->text($app->translate_templatized(<


" />
END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Technorati Search')); $tmpl->text($app->translate_templatized(<


" />

»

END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Recent Posts')); $tmpl->text($app->translate_templatized(<

END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Monthly Archive')); $tmpl->text($app->translate_templatized(< END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Category Archive')); $tmpl->text($app->translate_templatized(<

END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Subscribe')); $tmpl->text($app->translate_templatized(<

[]
END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; $tmpl = MT::Template->new; $tmpl->blog_id($blog_id); $tmpl->type('custom'); $tmpl->name('Sidebar: ' . $app->translate('Creative Commons')); $tmpl->text($app->translate_templatized(<
Creative Commons License
.
END_TMPL $tmpl->save; push @preinstalled, $tmpl->id; require MT::PluginData; my $data = MT::PluginData->load({ plugin => 'sidebar-manager', key => 'installed:'.$blog_id }); unless ($data) { $data = MT::PluginData->new; $data->plugin('sidebar-manager'); $data->key('installed:'.$blog_id); } my $foo = 1; $data->data( \$foo ); $data->save or die $data->errstr; # Now that the plugin is installed for this blog, create a first sidebar # with all modules pre-installed. my $modulesets = {}; $modulesets->{$app->translate('First Sidebar')} = join (",", @preinstalled); $data = MT::PluginData->new; $data->plugin('sidebar-manager'); $data->key($blog_id); $data->data( \$modulesets ); $data->save or die $data->errstr; } 1;