Changeset 2052

Show
Ignore:
Timestamp:
04/24/08 09:36:00 (22 months ago)
Author:
fumiakiy
Message:

Integrated Widget Manager to the core. BugId:68750

Now a widgetset is another type of template. The widgets contained in a widgetset is stored in a meta field.

Location:
branches/release-36
Files:
28 added
5 removed
9 modified

Legend:

Unmodified
Added
Removed
  • branches/release-36/lib/MT/App/CMS.pm

    r1982 r2052  
    5353 
    5454        ## Edit methods 
    55         'edit_role'  => "${pkg}User::edit_role", 
     55        'edit_role'   => "${pkg}User::edit_role", 
     56        'edit_widget' => "${pkg}Template::edit_widget", 
    5657 
    5758        ## Listing methods 
     
    5960        'list_entry'    => "${pkg}Entry::list", 
    6061        'list_template' => "${pkg}Template::list", 
     62        'list_widget'   => "${pkg}Template::list_widget", 
    6163        'list_page'     => "${pkg}Page::list", 
    6264        'list_comment'  => { 
     
    9698 
    9799        ## 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", 
    103106 
    104107        ## Delete 
    105108        'delete_entry'   => "${pkg}Entry::delete", 
     109        'delete_widget'   => "${pkg}Template::delete_widget", 
    106110 
    107111        ## List actions 
     
    13901394            system_permission    => 'edit_templates', 
    13911395        }, 
     1396        'design:widgets'  => { 
     1397            label         => 'Widgets', 
     1398            mode          => 'list_widget', 
     1399            order         => 200, 
     1400            permission    => 'edit_templates', 
     1401            view          => "blog", 
     1402        }, 
    13921403 
    13931404        'prefs:general' => { 
     
    16961707            $pkg . 'post_save.template'   => "${pfx}Template::post_save", 
    16971708            $pkg . 'post_delete.template' => "${pfx}Template::post_delete", 
     1709            'restore' => "${pfx}Template::restore_widgetmanagers", 
    16981710 
    16991711            # tags 
  • branches/release-36/lib/MT/Blog.pm

    r2051 r2052  
    244244            $obj->include_with_ssi(1) if $pub_opts->{include_with_ssi}; 
    245245        } 
     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        } 
    246251        $obj->save; 
    247252        if ($val->{mappings}) { 
  • branches/release-36/lib/MT/CMS/Template.pm

    r2051 r2052  
    961961        $val->{text} = $app->translate_templatized( $val->{text} ); 
    962962        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        } 
    963968        $tmpl->set_values($val); 
    964969        $tmpl->build_dynamic(0); 
     
    17241729                # we found that the previous template had not been 
    17251730                # 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                } 
    17261736                $tmpl->text( $val->{text} ); 
    17271737                $tmpl->identifier( $val->{identifier} ); 
     
    17341744                # create this one... 
    17351745                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                } 
    17361751                $tmpl->build_dynamic(0); 
    17371752                $tmpl->set_values( 
     
    19791994} 
    19801995 
     1996sub 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 
     2055sub 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 
     2160sub 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 
     2220sub 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 
     2256sub 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 
    19812285{ 
    19822286    my @period_options = ( 
  • branches/release-36/lib/MT/Core.pm

    r1947 r2052  
    713713                content => qq{<mt:SetVarBlock name="variable">\n    \$0\n</mt:SetVarBlock>\n}, 
    714714            }, 
     715            'widget_manager' => { 
     716                trigger => 'widget', 
     717                label => 'Widget Set', 
     718                content => '<$mt:WidgetSet name="$0"$>', 
     719            }, 
    715720        }, 
    716721    }; 
  • branches/release-36/lib/MT/DefaultTemplates.pm

    r1709 r2052  
    141141            'trackbacks' => { 
    142142                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                ], 
    143271            }, 
    144272        }, 
     
    238366                } 
    239367                $tmpl->{set} = $type; # system, index, archive, etc. 
     368                $tmpl->{order} = 0 unless exists $tmpl->{order}; 
    240369 
    241370                $type = 'custom' if $type eq 'module'; 
     
    274403    } 
    275404    my @tmpls = (values(%tmpls), values(%global_tmpls)); 
     405    @tmpls = sort { $a->{order} <=> $b->{order} } @tmpls; 
    276406    MT->run_callbacks('DefaultTemplateFilter' . ($set ? '.' . $set : ''), \@tmpls); 
    277407    return \@tmpls; 
  • branches/release-36/lib/MT/Template.pm

    r2049 r2052  
    4444        'cache_expire_event' => 'string meta', 
    4545        'cache_path' => 'string meta', 
     46        'modulesets' => 'string meta', 
    4647    }, 
    4748    indexes => { 
     
    283284} 
    284285 
     286sub 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 
     305sub 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 
    285341sub save { 
    286342    my $tmpl = shift; 
     
    289345        && ($existing->type eq $tmpl->type)) { 
    290346        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(); 
    291351    } 
    292352 
  • branches/release-36/lib/MT/Template/ContextHandlers.pm

    r2049 r2052  
    361361            Include => \&_hdlr_include, 
    362362            Link => \&_hdlr_link, 
     363            WidgetManager => \&_hdlr_widget_manager, 
     364            WidgetSet => \&_hdlr_widget_manager, 
    363365 
    364366            ErrorMessage => \&_hdlr_error_message, 
     
    90009002} 
    90019003 
     9004sub _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 
    900290331; 
  • branches/release-36/lib/MT/Upgrade.pm

    r2049 r2052  
    19481948        my $obj = MT::Template->new; 
    19491949        $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        } 
    19501955        foreach my $v (keys %$val) { 
    19511956            $obj->column($v, $val->{$v}) if $obj->has_column($v); 
  • branches/release-36/plugins/WidgetManager/WidgetManager.pl

    r1713 r2052  
    1515use base qw( MT::Plugin ); 
    1616use constant DEBUG => 0; 
    17 our $VERSION = '1.0'; 
     17use MT::Template; 
     18use MT::Util qw( escape_unicode ); 
     19use MT::I18N qw( encode_text ); 
     20 
     21our $VERSION = '1.1'; 
    1822 
    1923my $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', 
    2732}); 
    2833MT->add_plugin($plugin); 
     
    3338    my $plugin = shift; 
    3439    $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, 
    4044            }, 
    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            } 
    8049        }, 
    8150    }); 
     51    return 1; 
    8252} 
    8353 
    84 sub load_selected_modules {  
    85     require WidgetManager::Plugin;  
    86     WidgetManager::Plugin::load_selected_modules(@_);  
    87 } 
     54sub _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}  
    8860 
    89 sub default_templates { 
    90     my $cb = shift; 
    91     my ($tmpl_list) = @_; 
     61sub _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}  
    9267 
    93     my $widgetmgr = MT::Plugin::WidgetManager->instance; 
    94     my $widget_tmpls = $widgetmgr->templates(MT->instance); 
    95     push @$tmpl_list, @$widget_tmpls; 
    96 } 
     68sub upgrade_widgetmanagers {  
     69    my $upg = shift;  
    9770 
    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.')); 
    12296        } 
    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; 
    12998    } 
    130     return \@tmpls; 
     99    _disable_widgetmanager; 
    131100} 
    132101