Changeset 2052
- Timestamp:
- 04/24/08 09:36:00 (19 months ago)
- Location:
- branches/release-36
- Files:
-
- 28 added
- 5 removed
- 9 modified
-
default_templates/about_this_page.mtml (added)
-
default_templates/archive_widgets_group.mtml (added)
-
default_templates/author_archive_list.mtml (added)
-
default_templates/calendar.mtml (added)
-
default_templates/category_archive_list.mtml (added)
-
default_templates/creative_commons.mtml (added)
-
default_templates/current_author_monthly_archive_list.mtml (added)
-
default_templates/current_category_monthly_archive_list.mtml (added)
-
default_templates/date_based_author_archives.mtml (added)
-
default_templates/date_based_category_archives.mtml (added)
-
default_templates/main_index_widgets_group.mtml (added)
-
default_templates/monthly_archive_dropdown.mtml (added)
-
default_templates/monthly_archive_list.mtml (added)
-
default_templates/pages_list.mtml (added)
-
default_templates/powered_by.mtml (added)
-
default_templates/recent_assets.mtml (added)
-
default_templates/recent_comments.mtml (added)
-
default_templates/recent_entries.mtml (added)
-
default_templates/search.mtml (added)
-
default_templates/signin.mtml (added)
-
default_templates/syndication.mtml (added)
-
default_templates/tag_cloud.mtml (added)
-
default_templates/technorati_search.mtml (added)
-
lib/MT/App/CMS.pm (modified) (5 diffs)
-
lib/MT/Blog.pm (modified) (1 diff)
-
lib/MT/CMS/Template.pm (modified) (4 diffs)
-
lib/MT/Core.pm (modified) (1 diff)
-
lib/MT/DefaultTemplates.pm (modified) (3 diffs)
-
lib/MT/Template.pm (modified) (3 diffs)
-
lib/MT/Template/ContextHandlers.pm (modified) (2 diffs)
-
lib/MT/Upgrade.pm (modified) (1 diff)
-
mt-static/css/widget.css (added)
-
mt-static/images/drop.gif (added)
-
mt-static/js/widget.js (added)
-
plugins/WidgetManager/WidgetManager.pl (modified) (2 diffs)
-
plugins/WidgetManager/default_widgets (deleted)
-
plugins/WidgetManager/lib/WidgetManager/CMS.pm (deleted)
-
plugins/WidgetManager/lib/WidgetManager/Plugin.pm (deleted)
-
plugins/WidgetManager/php (deleted)
-
plugins/WidgetManager/tmpl (deleted)
-
tmpl/cms/edit_widget.tmpl (added)
-
tmpl/cms/list_widget.tmpl (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/release-36/lib/MT/App/CMS.pm
r1982 r2052 53 53 54 54 ## Edit methods 55 'edit_role' => "${pkg}User::edit_role", 55 'edit_role' => "${pkg}User::edit_role", 56 'edit_widget' => "${pkg}Template::edit_widget", 56 57 57 58 ## Listing methods … … 59 60 'list_entry' => "${pkg}Entry::list", 60 61 'list_template' => "${pkg}Template::list", 62 'list_widget' => "${pkg}Template::list_widget", 61 63 'list_page' => "${pkg}Page::list", 62 64 'list_comment' => { … … 96 98 97 99 ## Save 98 'save_cat' => "${pkg}Category::save", 99 'save_entries' => "${pkg}Entry::save_entries", 100 'save_pages' => "${pkg}Page::save_pages", 101 'save_entry' => "${pkg}Entry::save", 102 'save_role' => "${pkg}User::save_role", 100 'save_cat' => "${pkg}Category::save", 101 'save_entries' => "${pkg}Entry::save_entries", 102 'save_pages' => "${pkg}Page::save_pages", 103 'save_entry' => "${pkg}Entry::save", 104 'save_role' => "${pkg}User::save_role", 105 'save_widget' => "${pkg}Template::save_widget", 103 106 104 107 ## Delete 105 108 'delete_entry' => "${pkg}Entry::delete", 109 'delete_widget' => "${pkg}Template::delete_widget", 106 110 107 111 ## List actions … … 1390 1394 system_permission => 'edit_templates', 1391 1395 }, 1396 'design:widgets' => { 1397 label => 'Widgets', 1398 mode => 'list_widget', 1399 order => 200, 1400 permission => 'edit_templates', 1401 view => "blog", 1402 }, 1392 1403 1393 1404 'prefs:general' => { … … 1696 1707 $pkg . 'post_save.template' => "${pfx}Template::post_save", 1697 1708 $pkg . 'post_delete.template' => "${pfx}Template::post_delete", 1709 'restore' => "${pfx}Template::restore_widgetmanagers", 1698 1710 1699 1711 # tags -
branches/release-36/lib/MT/Blog.pm
r2051 r2052 244 244 $obj->include_with_ssi(1) if $pub_opts->{include_with_ssi}; 245 245 } 246 if ( ( 'widgetset' eq $val->{type} ) 247 && ( exists $val->{widgets} ) ) { 248 my $modulesets = delete $val->{widgets}; 249 $obj->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog->id) ); 250 } 246 251 $obj->save; 247 252 if ($val->{mappings}) { -
branches/release-36/lib/MT/CMS/Template.pm
r2051 r2052 961 961 $val->{text} = $app->translate_templatized( $val->{text} ); 962 962 my $tmpl = MT::Template->new; 963 if ( ( 'widgetset' eq $val->{type} ) 964 && ( exists $val->{modulesets} ) ) { 965 my $modulesets = delete $val->{modulesets}; 966 $tmpl->modulesets( join ',', @$modulesets ); 967 } 963 968 $tmpl->set_values($val); 964 969 $tmpl->build_dynamic(0); … … 1724 1729 # we found that the previous template had not been 1725 1730 # altered, so replace it with new default template... 1731 if ( ( 'widgetset' eq $val->{type} ) 1732 && ( exists $val->{widgets} ) ) { 1733 my $modulesets = delete $val->{widgets}; 1734 $tmpl->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) ); 1735 } 1726 1736 $tmpl->text( $val->{text} ); 1727 1737 $tmpl->identifier( $val->{identifier} ); … … 1734 1744 # create this one... 1735 1745 my $tmpl = new MT::Template; 1746 if ( ( 'widgetset' eq $val->{type} ) 1747 && ( exists $val->{widgets} ) ) { 1748 my $modulesets = delete $val->{widgets}; 1749 $tmpl->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) ); 1750 } 1736 1751 $tmpl->build_dynamic(0); 1737 1752 $tmpl->set_values( … … 1979 1994 } 1980 1995 1996 sub save_widget { 1997 my $app = shift; 1998 my $q = $app->param; 1999 2000 $app->validate_magic() or return; 2001 my $author = $app->user; 2002 2003 my $id = $q->param('id'); 2004 2005 if ( !$author->is_superuser ) { 2006 $app->run_callbacks( 'cms_save_permission_filter.template', $app, $id ) 2007 || return $app->error( 2008 $app->translate( "Permission denied: [_1]", $app->errstr() ) ); 2009 } 2010 2011 my $filter_result = $app->run_callbacks( 'cms_save_filter.widgetset', $app ); 2012 2013 if ( !$filter_result ) { 2014 return edit_widget( $app, { error => $app->translate( "Save failed: [_1]", $app->errstr ) } ); 2015 } 2016 2017 my $class = $app->model('template'); 2018 my $obj; 2019 if ( $id ) { 2020 $obj = $class->load($id) 2021 or return $app->error($app->translate("Invalid ID [_1]", $id)); 2022 } 2023 else { 2024 $obj = $class->new; 2025 } 2026 2027 my $original = $obj->clone(); 2028 $obj->name($q->param('name')); 2029 $obj->type('widgetset'); 2030 $obj->blog_id( $q->param('blog_id') || 0 ); 2031 $obj->modulesets($q->param('modules')); 2032 2033 unless ( 2034 $app->run_callbacks( 'cms_pre_save.template', $app, $obj, $original ) ) 2035 { 2036 return edit_widget( $app, { error => $app->translate( "Save failed: [_1]", $app->errstr ) } ); 2037 } 2038 2039 $obj->save 2040 or return $app->error( 2041 $app->translate( "Saving object failed: [_1]", $obj->errstr ) ); 2042 2043 $app->run_callbacks( 'cms_post_save.template', $app, $obj, $original ) 2044 or return $app->error( $app->errstr() ); 2045 2046 $app->redirect( 2047 $app->uri( 2048 'mode' => 'edit_widget', 2049 args => 2050 { blog_id => $obj->blog_id, 'saved' => 1, rebuild => 1, id => $obj->id } 2051 ) 2052 ); 2053 } 2054 2055 sub edit_widget { 2056 my $app = shift; 2057 my (%opt) = @_; 2058 2059 my $q = $app->param(); 2060 my $id = scalar($q->param('id')) || $opt{id}; 2061 my $blog_id = scalar $q->param('blog_id') || 0; 2062 2063 my $tmpl_class = $app->model('template'); 2064 require MT::Promise; 2065 my $obj_promise = MT::Promise::delay( 2066 sub { 2067 return $tmpl_class->load($id) || undef; 2068 } 2069 ); 2070 2071 if ( !$app->user->is_superuser ) { 2072 $app->run_callbacks( 'cms_view_permission_filter.template', 2073 $app, $id, $obj_promise ) 2074 || return $app->error( 2075 $app->translate( "Permission denied: [_1]", $app->errstr() ) ); 2076 } 2077 2078 my $param = { 2079 blog_id => $blog_id, 2080 search_type => "template", 2081 search_label => MT::Template->class_label_plural, 2082 $id ? ( id => $id ) : (), 2083 exists($opt{rebuild}) ? ( rebuild => $opt{rebuild} ) : (), 2084 exists($opt{error}) ? ( error => $opt{error} ) : (), 2085 exists($opt{saved}) ? ( saved => $opt{saved} ) : () 2086 }; 2087 if ($blog_id) { 2088 my $blog = $app->blog; 2089 # include_system/include_cache are only applicable 2090 # to blog-level templates 2091 $param->{include_system} = $blog->include_system; 2092 $param->{include_cache} = $blog->include_cache; 2093 $param->{include_with_ssi} = 0; 2094 $param->{cache_path} = ''; 2095 $param->{cache_enabled} = 0; 2096 $param->{cache_expire_type} = 0; 2097 $param->{cache_expire_period} = ''; 2098 $param->{cache_expire_interval} = 0; 2099 $param->{ssi_type} = uc $blog->include_system; 2100 } 2101 2102 my $iter = $tmpl_class->load_iter( 2103 { type => 'widget', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 }, 2104 { sort => 'name', direction => 'ascend' } 2105 ); 2106 2107 my %all_widgets; 2108 while (my $m = $iter->()) { 2109 next unless $m; 2110 $all_widgets{ $m->id } = $m->name; 2111 } 2112 2113 my @inst_modules; 2114 my $wtmpl; 2115 if ( $id ) { 2116 $wtmpl = $obj_promise->force() 2117 or return $app->error( 2118 $app->translate( 2119 "Load failed: [_1]", 2120 $tmpl_class->errstr || $app->translate("(no reason given)") 2121 ) 2122 ); 2123 $param->{name} = $wtmpl->name; 2124 $param->{include_with_ssi} = $wtmpl->include_with_ssi 2125 if defined $wtmpl->include_with_ssi; 2126 $param->{cache_path} = $wtmpl->cache_path 2127 if defined $wtmpl->cache_path; 2128 $param->{cache_expire_type} = $wtmpl->cache_expire_type 2129 if defined $wtmpl->cache_expire_type; 2130 my ( $period, $interval ) = 2131 _get_schedule( $wtmpl->cache_expire_interval ); 2132 $param->{cache_expire_period} = $period if defined $period; 2133 $param->{cache_expire_interval} = $interval if defined $interval; 2134 my @events = split ',', $wtmpl->cache_expire_event; 2135 foreach my $name (@events) { 2136 $param->{ 'cache_expire_event_' . $name } = 1; 2137 } 2138 my $modulesets = $wtmpl->modulesets; 2139 if ( $modulesets ) { 2140 my @modules = split ',', $modulesets; 2141 foreach my $mid ( @modules ) { 2142 push @inst_modules, { id => $mid, name => $all_widgets{$mid} }; 2143 delete $all_widgets{$mid}; 2144 } 2145 } 2146 } 2147 $param->{installed} = \@inst_modules if @inst_modules; 2148 my @avail_modules = map { { id => $_, name => $all_widgets{$_} } } 2149 keys %all_widgets; 2150 $param->{available} = \@avail_modules; 2151 2152 my $res = $app->run_callbacks('cms_edit.widgetset', $app, $id, $wtmpl, $param); 2153 if (!$res) { 2154 return $app->error($app->callback_errstr()); 2155 } 2156 2157 $app->load_tmpl('edit_widget.tmpl', $param); 2158 } 2159 2160 sub list_widget { 2161 my $app = shift; 2162 my (%opt) = @_; 2163 my $q = $app->param; 2164 2165 my $perms = $app->blog ? $app->permissions : $app->user->permissions; 2166 return $app->return_to_dashboard( redirect => 1 ) 2167 unless $perms || $app->user->is_superuser; 2168 if ( $perms && !$perms->can_edit_templates ) { 2169 return $app->return_to_dashboard( permission => 1 ); 2170 } 2171 my $blog_id = $q->param('blog_id') || 0; 2172 2173 my $widget_loop = &build_template_table( $app, 2174 load_args => [ 2175 { type => 'widget', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 }, 2176 { sort => 'name', direction => 'ascend' } 2177 ], 2178 ); 2179 2180 my $param = { 2181 widget_table => $widget_loop, 2182 object_type => "widgetset", 2183 search_type => "template", 2184 search_label => MT::Template->class_label_plural, 2185 listing_screen => 1, 2186 screen_id => "list-widget-set", 2187 $blog_id ? ( blog_view => 1, blog_id => $blog_id ) : (), 2188 exists($opt{rebuild}) ? ( rebuild => $opt{rebuild} ) : (), 2189 exists($opt{error}) ? ( error => $opt{error} ) : (), 2190 exists($opt{deleted}) ? ( saved => $opt{deleted} ) : () 2191 }; 2192 2193 my $iter = $app->model('template')->load_iter( 2194 { type => 'widgetset', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 }, 2195 { sort => 'name', direction => 'ascend' } 2196 ); 2197 my @widgetmanagers; 2198 while ( my $widgetset = $iter->() ) { 2199 next unless $widgetset; 2200 my $ws = { 2201 id => $widgetset->id, 2202 widgetmanager => $widgetset->name, 2203 }; 2204 if ( my $modulesets = $widgetset->modulesets ) { 2205 $ws->{widgets} = $modulesets; 2206 my @names; 2207 foreach my $module ( split ',', $modulesets ) { 2208 my ( $widget ) = grep { $_->{id} eq $module } @$widget_loop; 2209 push @names, $widget->{name} if $widget; 2210 } 2211 $ws->{names} = join(', ', @names) if @names; 2212 } 2213 push @widgetmanagers, $ws; 2214 } 2215 $param->{object_loop} = \@widgetmanagers if @widgetmanagers; 2216 2217 $app->load_tmpl('list_widget.tmpl', $param); 2218 } 2219 2220 sub delete_widget { 2221 my $app = shift; 2222 my $q = $app->param; 2223 my $type = $q->param('_type'); 2224 2225 return $app->errtrans("Invalid request.") 2226 unless $type; 2227 2228 return $app->error( $app->translate("Invalid request.") ) 2229 if $app->request_method() ne 'POST'; 2230 2231 $app->validate_magic() or return; 2232 2233 my $tmpl_class = $app->model('template'); 2234 2235 for my $id ( $q->param('id') ) { 2236 next unless $id; # avoid 'empty' ids 2237 2238 my $obj = $tmpl_class->load($id); 2239 next unless $obj; 2240 $app->run_callbacks( 'cms_delete_permission_filter.template', 2241 $app, $obj ) 2242 || return $app->error( 2243 $app->translate( "Permission denied: [_1]", $app->errstr() ) ); 2244 2245 $obj->remove 2246 or return $app->errtrans( 2247 'Removing [_1] failed: [_2]', 2248 $app->translate('template'), 2249 $obj->errstr 2250 ); 2251 $app->run_callbacks( 'cms_post_delete.template', $app, $obj ); 2252 } 2253 $app->call_return; 2254 } 2255 2256 sub restore_widgetmanagers { 2257 my ($cb, $objects, $deferred, $errors, $callback) = @_; 2258 my @keys = grep { $_ =~ /^MT::Template#/ } keys( %$objects ); 2259 foreach my $key ( @keys ) { 2260 my $tmpl = $objects->{$key}; 2261 next unless 'widgetset' eq $tmpl->type; 2262 my $modulesets = $tmpl->modulesets; 2263 next unless $modulesets; 2264 $callback->( MT->translate( 'Restoring widget set [_1]... ', $tmpl->name ) ); 2265 2266 my @tmpl_ids = split ',', $modulesets; 2267 my @new_ids; 2268 foreach my $id ( @tmpl_ids ) { 2269 my $new_tmpl = $objects->{"MT::Template#$id"}; 2270 next unless $new_tmpl; 2271 push @new_ids, $new_tmpl->id; 2272 } 2273 if ( @new_ids ) { 2274 $tmpl->modulesets( join(',', @new_ids) ); 2275 $tmpl->save; 2276 $callback->( MT->translate("Done.") . "\n" ); 2277 } 2278 else { 2279 $callback->( MT->translate("Failed.") . "\n" ); 2280 } 2281 } 2282 1; 2283 } 2284 1981 2285 { 1982 2286 my @period_options = ( -
branches/release-36/lib/MT/Core.pm
r1947 r2052 713 713 content => qq{<mt:SetVarBlock name="variable">\n \$0\n</mt:SetVarBlock>\n}, 714 714 }, 715 'widget_manager' => { 716 trigger => 'widget', 717 label => 'Widget Set', 718 content => '<$mt:WidgetSet name="$0"$>', 719 }, 715 720 }, 716 721 }; -
branches/release-36/lib/MT/DefaultTemplates.pm
r1709 r2052 141 141 'trackbacks' => { 142 142 label => 'Trackbacks', 143 }, 144 }, 145 'widget' => { 146 'about_this_page' => { 147 fielname => 'about_this_page.mtml', 148 label => 'About This Page', 149 }, 150 'archive_widgets_group' => { 151 fielname => 'archive_widgets_group.mtml', 152 label => 'Archive Widgets Group', 153 }, 154 'author_archive_list' => { 155 fielname => 'author_archive_list.mtml', 156 label => 'Author Archives', 157 }, 158 'current_author_monthly_archive_list' => { 159 fielname => 'current_author_monthly_archive_list.mtml', 160 label => 'Current Author Monthly Archives', 161 }, 162 'calendar' => { 163 fielname => 'calendar.mtml', 164 label => 'Calendar', 165 }, 166 'category_archive_list' => { 167 fielname => 'category_archive_list.mtml', 168 label => 'Category Archives', 169 }, 170 'current_category_monthly_archive_list' => { 171 fielname => 'current_category_monthly_archive_list.mtml', 172 label => 'Current Category Monthly Archives', 173 }, 174 'creative_commons' => { 175 fielname => 'creative_commons.mtml', 176 label => 'Creative Commons', 177 }, 178 'main_index_widgets_group' => { 179 fielname => 'main_index_widgets_group.mtml', 180 label => 'Home Page Widgets Group', 181 }, 182 'monthly_archive_dropdown' => { 183 fielname => 'monthly_archive_dropdown.mtml', 184 label => 'Monthly Archives Dropdown', 185 }, 186 'monthly_archive_list' => { 187 fielname => 'monthly_archive_list.mtml', 188 label => 'Monthly Archives', 189 }, 190 'pages_list' => { 191 fielname => 'pages_list.mtml', 192 label => 'Page Listing', 193 }, 194 'recent_assets' => { 195 fielname => 'recent_assets.mtml', 196 label => 'Recent Assets', 197 }, 198 'powered_by' => { 199 fielname => 'powered_by.mtml', 200 label => 'Powered By', 201 }, 202 'recent_comments' => { 203 fielname => 'recent_comments.mtml', 204 label => 'Recent Comments', 205 }, 206 'recent_entries' => { 207 fielname => 'recent_entries.mtml', 208 label => 'Recent Entries', 209 }, 210 'search' => { 211 fielname => 'search.mtml', 212 label => 'Search', 213 }, 214 'signin' => { 215 fielname => 'signin.mtml', 216 label => 'Sign In', 217 }, 218 'syndication' => { 219 fielname => 'syndication.mtml', 220 label => 'Syndication', 221 }, 222 'tag_cloud' => { 223 fielname => 'tag_cloud.mtml', 224 label => 'Tag Cloud', 225 }, 226 'technorati_search' => { 227 fielname => 'technorati_search.mtml', 228 label => 'Technorati Search', 229 }, 230 'date_based_author_archives' => { 231 fielname => 'date_based_author_archives.mtml', 232 label => 'Date-Based Author Archives', 233 }, 234 'date_based_category_archives' => { 235 fielname => 'date_based_category_archives.mtml', 236 label => 'Date-Based Category Archives', 237 } 238 }, 239 'widgetset' => { 240 '2column_layout_sidebar' => { 241 order => 1000, 242 label => '2-column layout - Sidebar', 243 widgets => [ 244 'Search', 245 'About This Page', 246 'Home Page Widgets Group', 247 'Archive Widgets Group', 248 'Page Listing', 249 'Syndication', 250 'Powered By', 251 ], 252 }, 253 '3column_layout_primary_sidebar' => { 254 order => 1000, 255 label => '3-column layout - Primary Sidebar', 256 widgets => [ 257 'Archive Widgets Group', 258 'Page Listing', 259 'Syndication', 260 'Powered By', 261 ], 262 }, 263 '3column_layout_secondary_sidebar' => { 264 order => 1000, 265 label => '3-column layout - Secondary Sidebar', 266 widgets => [ 267 'Search', 268 'Home Page Widgets Group', 269 'About This Page', 270 ], 143 271 }, 144 272 }, … … 238 366 } 239 367 $tmpl->{set} = $type; # system, index, archive, etc. 368 $tmpl->{order} = 0 unless exists $tmpl->{order}; 240 369 241 370 $type = 'custom' if $type eq 'module'; … … 274 403 } 275 404 my @tmpls = (values(%tmpls), values(%global_tmpls)); 405 @tmpls = sort { $a->{order} <=> $b->{order} } @tmpls; 276 406 MT->run_callbacks('DefaultTemplateFilter' . ($set ? '.' . $set : ''), \@tmpls); 277 407 return \@tmpls; -
branches/release-36/lib/MT/Template.pm
r2049 r2052 44 44 'cache_expire_event' => 'string meta', 45 45 'cache_path' => 'string meta', 46 'modulesets' => 'string meta', 46 47 }, 47 48 indexes => { … … 283 284 } 284 285 286 sub widgets_to_modulesets { 287 my $pkg = shift; 288 my ( $widgets, $blog_id ) = @_; 289 return unless $widgets && @$widgets; 290 291 my @widgets = map { MT->translate( $_ ) } @$widgets; 292 293 my @wtmpls = $pkg->load( 294 { name => \@widgets, blog_id => $blog_id ? [ $blog_id, 0 ] : 0, type => 'widget' } 295 ); 296 my @wids; 297 foreach my $name ( @widgets ) { 298 my ( $widget ) = grep { $_->name eq $name } @wtmpls; 299 next unless $widget; 300 push @wids, $widget->id; 301 } 302 return join ',', @wids; 303 } 304 305 sub save_widgetset { 306 my $obj = shift; 307 308 my $ms = $obj->modulesets; 309 # build module list 310 my @inst; 311 if ( $ms && $ms =~ /;/ ) { 312 my @mods = split /;/, $ms; 313 for (@mods) { 314 # tmpl_id = column index . order in column ; 315 my ($id, $col) = /(\d+)=(\d+)\.(\d+)/; 316 push @inst, $id if $col && ( $col == 1 ); 317 } 318 $obj->modulesets( join ',', @inst ); 319 } 320 else { 321 @inst = split /,/, $obj->modulesets; 322 } 323 324 my @widgets = MT::Template->load( 325 { id => \@inst, type => 'widget', 326 blog_id => $obj->blog_id ? [ 0, $obj->blog_id ] : '0' }, 327 { fetchonly => [ 'id', 'name' ] } 328 ); 329 330 my $string_tmpl = '<mt:include widget="%s">'; 331 my $text = q(); 332 foreach my $wid (@inst) { 333 my ( $tmpl ) = grep { $_->id eq $wid } @widgets; 334 next unless $tmpl; 335 $text .= sprintf( $string_tmpl, $tmpl->name ); 336 } 337 $obj->text($text) if $text; 338 return $obj->SUPER::save; 339 } 340 285 341 sub save { 286 342 my $tmpl = shift; … … 289 345 && ($existing->type eq $tmpl->type)) { 290 346 return $tmpl->error(MT->translate('Template with the same name already exists in this blog.')); 347 } 348 349 if ( 'widgetset' eq $tmpl->type ) { 350 return $tmpl->save_widgetset(); 291 351 } 292 352 -
branches/release-36/lib/MT/Template/ContextHandlers.pm
r2049 r2052 361 361 Include => \&_hdlr_include, 362 362 Link => \&_hdlr_link, 363 WidgetManager => \&_hdlr_widget_manager, 364 WidgetSet => \&_hdlr_widget_manager, 363 365 364 366 ErrorMessage => \&_hdlr_error_message, … … 9000 9002 } 9001 9003 9004 sub _hdlr_widget_manager { 9005 my ( $ctx, $args ) = @_; 9006 my $tmpl_name = $args->{name} 9007 or return $ctx->error(MT->translate("name is required.")); 9008 my $blog_id = $args->{blog_id} || $ctx->{__stash}{blog_id} || 0; 9009 9010 require MT::Template; 9011 my $tmpl = MT::Template->load({ name => $tmpl_name, 9012 blog_id => $blog_id ? [ 0, $blog_id ] : 0, 9013 type => 'widgetset' }) 9014 or return $ctx->error(MT->translate("Specified WidgetSet not found.")); 9015 my $text = $tmpl->text; 9016 return $ctx->build($text) if $text; 9017 9018 my $modulesets = $tmpl->modulesets; 9019 return ''; # empty widgetset is not an error 9020 9021 my $string_tmpl = '<mt:include widget="%s">'; 9022 my @selected = split ','. $modulesets; 9023 foreach my $mid (@selected) { 9024 my $wtmpl = MT::Template->load($mid) 9025 or return $ctx->error(MT->translate( 9026 "Can't find included template widget '[_1]'", $mid )); 9027 $text .= sprintf( $string_tmpl, $wtmpl->name ); 9028 } 9029 return '' unless $text; 9030 return $ctx->build($text); 9031 } 9032 9002 9033 1; -
branches/release-36/lib/MT/Upgrade.pm
r2049 r2052 1948 1948 my $obj = MT::Template->new; 1949 1949 $obj->build_dynamic(0); 1950 if ( ( 'widgetset' eq $val->{type} ) 1951 && ( exists $val->{widgets} ) ) { 1952 my $modulesets = delete $val->{widgets}; 1953 $obj->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) ); 1954 } 1950 1955 foreach my $v (keys %$val) { 1951 1956 $obj->column($v, $val->{$v}) if $obj->has_column($v); -
branches/release-36/plugins/WidgetManager/WidgetManager.pl
r1713 r2052 15 15 use base qw( MT::Plugin ); 16 16 use constant DEBUG => 0; 17 our $VERSION = '1.0'; 17 use MT::Template; 18 use MT::Util qw( escape_unicode ); 19 use MT::I18N qw( encode_text ); 20 21 our $VERSION = '1.1'; 18 22 19 23 my $plugin = MT::Plugin::WidgetManager->new({ 20 id => 'WidgetManager', 21 name => 'Widget Manager', 22 description => q(<MT_TRANS phrase="Maintain your blog's widget content using a handy drag and drop interface.">), 23 version => $VERSION, 24 author_name => 'Six Apart', 25 key => 'widget-manager', 26 l10n_class => 'WidgetManager::L10N', 24 id => 'WidgetManager', 25 name => 'Widget Manager Upgrade Assistant', 26 description => q(<MT_TRANS phrase="Widget Manager version 1.1; This version of the plugin is to upgrade data from older version of Widget Manager that has been shipped with Movable Type to the Movable Type core schema. No other features are included. You can safely remove this plugin after installing/upgrading Movable Type.\">), 27 version => $VERSION, 28 schema_version => $VERSION, 29 author_name => 'Six Apart, Ltd.', 30 key => 'widget-manager', 31 l10n_class => 'WidgetManager::L10N', 27 32 }); 28 33 MT->add_plugin($plugin); … … 33 38 my $plugin = shift; 34 39 $plugin->registry({ 35 tags => { 36 help_url => sub { MT->translate('http://www.movabletype.org/documentation/appendices/tags/%t.html') }, 37 function => { 38 WidgetManager => '$WidgetManager::WidgetManager::Plugin::_hdlr_widget_manager', 39 WidgetSet => '$WidgetManager::WidgetManager::Plugin::_hdlr_widget_manager', 40 upgrade_functions => { 41 'upgrade_widgetmanagers_nv' => { 42 # this is to workaround absence of PluginSchemaVersion 43 code => \&upgrade_widgetmanagers, 40 44 }, 41 }, 42 callbacks => { 43 'clone_blog_widgets' => { 44 callback => 'MT::Blog::post_clone', 45 handler => '$WidgetManager::WidgetManager::Plugin::clone_blog_widgemanagers', 46 }, 47 'remove_blog_widgets' => { 48 callback => 'MT::Blog::post_remove', 49 handler => '$WidgetManager::WidgetManager::Plugin::remove_blog_widgetmanager', 50 }, 51 'DefaultTemplateFilter' => '$WidgetManager::MT::Plugin::WidgetManager::default_templates', 52 'MT::Blog::post_create_default_templates' => '$WidgetManager::WidgetManager::Plugin::create_default_widgetsets', 53 'restore' => '$WidgetManager::WidgetManager::Plugin::restore_widgetmanagers', 54 }, 55 applications => { 56 cms => { 57 methods => { 58 list_widget => '$WidgetManager::WidgetManager::CMS::list', 59 edit_widget => '$WidgetManager::WidgetManager::CMS::edit', 60 delete_widget => '$WidgetManager::WidgetManager::CMS::delete', 61 save_widget => '$WidgetManager::WidgetManager::CMS::save', 62 }, 63 menus => { 64 'design:widgets' => { 65 label => 'Widgets', 66 mode => 'list_widget', 67 order => 200, 68 permission => 'edit_templates', 69 view => "blog", 70 }, 71 }, 72 template_snippets => { 73 'widget_manager' => { 74 label => 'Widget Set', 75 content => '<$mt:WidgetSet name="$0"$>', 76 trigger => 'widget', 77 }, 78 }, 79 }, 45 'upgrade_widgetmanagers' => { 46 version_limit => 1.1, 47 code => \&upgrade_widgetmanagers, 48 } 80 49 }, 81 50 }); 51 return 1; 82 52 } 83 53 84 sub load_selected_modules { 85 require WidgetManager::Plugin; 86 WidgetManager::Plugin::load_selected_modules(@_); 87 } 54 sub _disable_widgetmanager { 55 my $switch = MT->config('PluginSwitch') || {}; 56 $switch->{$plugin->{plugin_sig}} = 0; 57 MT->config('PluginSwitch', $switch, 1); 58 MT->config->save_config(); 59 } 88 60 89 sub default_templates { 90 my $cb = shift; 91 my ($tmpl_list) = @_; 61 sub _translate_escape { 62 my $trans = $plugin->translate(@_); 63 return $trans if $MT::Upgrade::CLI; 64 $trans = MT::I18N::encode_text($trans, undef, 'utf-8'); 65 return MT::Util::escape_unicode($trans); 66 } 92 67 93 my $widgetmgr = MT::Plugin::WidgetManager->instance; 94 my $widget_tmpls = $widgetmgr->templates(MT->instance); 95 push @$tmpl_list, @$widget_tmpls; 96 } 68 sub upgrade_widgetmanagers { 69 my $upg = shift; 97 70 98 sub templates { 99 my $plugin = shift; 100 my ($app) = @_; 101 my $default_widget_templates; 102 103 use File::Spec; 104 my $widgets_dir = File::Spec->catfile($plugin->{full_path}, 'default_widgets'); 105 my $cfg_file = File::Spec->catfile($widgets_dir, 'widgets.cfg'); 106 107 local(*FH, $_, $/); 108 $/ = "\n"; 109 open FH, $cfg_file or 110 return $app->error(MT->translate( 111 "Error opening file '[_1]': [_2]", $cfg_file, "$!" )); 112 my $cfg = join('',<FH>); 113 eval "$cfg;"; 114 close FH; 115 116 my @tmpls; 117 require MT::Template; 118 foreach (@$default_widget_templates) { 119 open(TMPL, File::Spec->catfile($widgets_dir, $_->{template})) or die "Error: $!\n"; 120 while (my $line = <TMPL>) { 121 $_->{text} .= $line; 71 require MT::PluginData; 72 my $iter = MT::PluginData->load_iter( 73 { plugin => $plugin->key } 74 ); 75 while ( my $pd = $iter->() ) { 76 next unless $plugin->key eq $pd->plugin; 77 my ( $blog_id ) = $pd->key =~ /configuration:blog:(\d+)/; 78 next unless $blog_id; 79 my $config = $pd->data; 80 next unless $config; 81 my $modulesets = $config->{modulesets}; 82 next unless $modulesets; 83 foreach my $mod_key ( keys %$modulesets ) { 84 $upg->progress(_translate_escape('Moving storage of Widget Manager [_1]...', $mod_key)); 85 my $tmpl_ids = $modulesets->{$mod_key}; 86 my $tmpl = MT::Template->new; 87 $tmpl->blog_id($blog_id); 88 $tmpl->name($mod_key); 89 $tmpl->type('widgetset'); 90 $tmpl->build_dynamic(0); 91 $tmpl->rebuild_me(0); 92 $tmpl->modulesets($tmpl_ids); 93 $tmpl->save_widgetset 94 or $upg->progress(_translate_escape('Failed.')), next; 95 $upg->progress(_translate_escape('Done.')); 122 96 } 123 close TMPL; 124 my $tmpl = MT::Template->new; 125 $tmpl->{type} = 'widget'; 126 $tmpl->{name} = $plugin->translate($_->{label}); 127 $tmpl->{text} = $plugin->translate_templatized($_->{text}); 128 push @tmpls, $tmpl; 97 $pd->remove; 129 98 } 130 return \@tmpls;99 _disable_widgetmanager; 131 100 } 132 101
