| 1 | # WidgetManager plugin for Movable Type |
|---|
| 2 | # Author: Byrne Reese, Six Apart (http://www.sixapart.com) |
|---|
| 3 | # Released under the Artistic License |
|---|
| 4 | # |
|---|
| 5 | # $Id$ |
|---|
| 6 | |
|---|
| 7 | package WidgetManager::Plugin; |
|---|
| 8 | |
|---|
| 9 | use strict; |
|---|
| 10 | |
|---|
| 11 | sub _hdlr_widget_manager { |
|---|
| 12 | my $ctx = shift; |
|---|
| 13 | my $args = shift; |
|---|
| 14 | |
|---|
| 15 | my $blog_id = $ctx->stash('blog_id'); |
|---|
| 16 | |
|---|
| 17 | my $plugin = MT->component('WidgetManager'); |
|---|
| 18 | my $modulesets = load_selected_modules($plugin, $blog_id); |
|---|
| 19 | |
|---|
| 20 | return '' unless $modulesets; |
|---|
| 21 | return '' unless $modulesets->{$args->{name}}; |
|---|
| 22 | |
|---|
| 23 | my @selected = split(/\s*,\s*/,$modulesets->{$args->{name}}); |
|---|
| 24 | |
|---|
| 25 | my $res = ""; |
|---|
| 26 | foreach my $mid (@selected) { |
|---|
| 27 | require MT::Template; |
|---|
| 28 | my $tmpl = MT::Template->load({ id => $mid, |
|---|
| 29 | blog_id => $blog_id }) |
|---|
| 30 | or return $ctx->error(MT->translate( |
|---|
| 31 | "Can't find included template widget '[_1]'", $mid )); |
|---|
| 32 | my $out = $ctx->tag('include', { widget => $tmpl->name }) |
|---|
| 33 | or return $ctx->error($ctx->errstr); |
|---|
| 34 | $res .= $out if defined $out; |
|---|
| 35 | } |
|---|
| 36 | return $res; |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | sub load_selected_modules { |
|---|
| 40 | my ($plugin, $blog_id) = @_; |
|---|
| 41 | my $config = $plugin->get_config_hash('blog:'.$blog_id); |
|---|
| 42 | return $config && $config->{modulesets} ? $config->{modulesets} : undef; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | sub clone_blog_widgemanagers { |
|---|
| 46 | my $cb = shift; |
|---|
| 47 | my (%params) = @_; |
|---|
| 48 | my $plugin = $cb->plugin; |
|---|
| 49 | |
|---|
| 50 | my $report = sub {}; |
|---|
| 51 | my $label = 'widgetmgr'; |
|---|
| 52 | |
|---|
| 53 | if (my $callback = $params{callback}) { |
|---|
| 54 | my $state; |
|---|
| 55 | $report = sub { |
|---|
| 56 | my $msg; |
|---|
| 57 | if ($state) { |
|---|
| 58 | $msg = $state . ' ' . (+shift); |
|---|
| 59 | } else { |
|---|
| 60 | $msg = $state = shift; |
|---|
| 61 | } |
|---|
| 62 | $callback->($msg, $label) |
|---|
| 63 | }; |
|---|
| 64 | } |
|---|
| 65 | |
|---|
| 66 | $report->($plugin->translate('Cloning Widgets for blog...')); |
|---|
| 67 | |
|---|
| 68 | my $modulesets = $plugin->load_selected_modules($params{old_blog_id}); |
|---|
| 69 | if ( ! $modulesets or ! keys %$modulesets ) { |
|---|
| 70 | return $report->($plugin->translate("[_1] records processed.", 0)); |
|---|
| 71 | } |
|---|
| 72 | |
|---|
| 73 | my @widgetmanagers; |
|---|
| 74 | foreach my $key (sort keys %$modulesets) { |
|---|
| 75 | # Collect the available widgets for this key. |
|---|
| 76 | my @w = (); |
|---|
| 77 | for my $w ( split /\s*,\s*/, $modulesets->{$key} ) { |
|---|
| 78 | push @w, $params{template_map}{$w} if $params{template_map}{$w}; |
|---|
| 79 | } |
|---|
| 80 | $modulesets->{$key} = join(',', @w); |
|---|
| 81 | } |
|---|
| 82 | |
|---|
| 83 | my $vars = { modulesets => $modulesets, installed => 1 }; |
|---|
| 84 | my $pdata_obj = $plugin->get_config_obj('blog:'.$params{new_blog_id}); |
|---|
| 85 | my $configuration = $pdata_obj->data() || {}; |
|---|
| 86 | $configuration->{$_} = $vars->{$_} for keys %$vars; |
|---|
| 87 | $pdata_obj->data($configuration); |
|---|
| 88 | $pdata_obj->save(); |
|---|
| 89 | |
|---|
| 90 | my $counter = scalar keys %$modulesets; |
|---|
| 91 | $report->($plugin->translate("[_1] records processed.", $counter)); |
|---|
| 92 | } |
|---|
| 93 | |
|---|
| 94 | sub remove_blog_widgetmanager { |
|---|
| 95 | my $cb = shift; |
|---|
| 96 | my $plugin = $cb->plugin; |
|---|
| 97 | |
|---|
| 98 | my @pdata_objs; |
|---|
| 99 | require MT::PluginData; |
|---|
| 100 | # post_remove_all |
|---|
| 101 | if (! ref($_[0]) and $_[0] eq 'MT::Blog') { |
|---|
| 102 | @pdata_objs = MT::PluginData->load({ plugin => $plugin->key}); |
|---|
| 103 | } |
|---|
| 104 | # post_remove |
|---|
| 105 | elsif (ref($_[0]) eq 'MT::Blog') { |
|---|
| 106 | @pdata_objs = |
|---|
| 107 | MT::PluginData->load({ plugin => $plugin->key, |
|---|
| 108 | key => 'configuration:blog:'.$_[0]->id }); |
|---|
| 109 | } |
|---|
| 110 | $_->remove foreach @pdata_objs; |
|---|
| 111 | } |
|---|
| 112 | |
|---|
| 113 | sub create_default_widgetsets { |
|---|
| 114 | my ($cb, $blog, $tmpl_list) = @_; |
|---|
| 115 | require WidgetManager::CMS; |
|---|
| 116 | WidgetManager::CMS::create_default_widgetsets($blog->id); |
|---|
| 117 | 1; |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | 1; |
|---|