Top Banner
Hacking Movable Type Italian Perl Workshop 2006 Stefano Rodighiero - [email protected]
40

Hacking Movable Type

Jun 04, 2015

Download

Technology

An introduction to plugin development for Movable Type
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Hacking Movable Type

Hacking Movable Type

Italian Perl Workshop 2006

Stefano Rodighiero - [email protected]

Page 2: Hacking Movable Type

“Movable Type 3.2 is the premier weblog publishing

platform for businesses, organizations, developers,

and web designers”

Page 3: Hacking Movable Type

MT

Articoli,

template

________

________

________

Le funzioni di MT

Page 4: Hacking Movable Type

Le funzioni di MT<MTEntries> <$MTEntryTrackbackData$>...<a id="a<$MTEntryID pad="1"$>"></a><div class="entry" id="entry-<$MTEntryID$>"> <h3 class="entry-header"><$MTEntryTitle$></h3> <div class="entry-content"> <div class="entry-body"> <$MTEntryBody$> <MTEntryIfExtended> ... </div> </div></div></MTEntries>

Page 5: Hacking Movable Type

Le caratteristiche di MT

• Interfaccia web completa ma affidabile

• Sistema di gestione degli autori (con abbozzo di gestione di ruoli e permessi)

• Sistema potente per la gestione dei template

Page 6: Hacking Movable Type

Inoltre...

Page 7: Hacking Movable Type

MT dal punto di vista del programmatore

• Espone una API sofisticata e documentata

• Incoraggia lo sviluppo di plug-in per estenderne le funzionalità

• È scritto in Perl :-)

Page 8: Hacking Movable Type

MT

Articoli,

template

________

________

________

Plugin

Estendere MT

Page 9: Hacking Movable Type

Esempi di realizzazioni

Page 10: Hacking Movable Type

Esempi di realizzazioni

Page 11: Hacking Movable Type

maketitle.plmy $plugin;

require MT::Plugin;

$plugin = MT::Plugin->new( { name => 'Maketitle', description => q{Costruisce titoli grafici}, doc_link => '',} );

MT->add_plugin($plugin);

Page 12: Hacking Movable Type
Page 13: Hacking Movable Type

maketitle.pl /2

# ... continua

MT::Template::Context->add_tag( MakeGraphicTitle => \&make_graphic_title );

Page 14: Hacking Movable Type

maketitle.pl /2

...<center> <$MTMakeGraphicTitle$></center>...

nel template...

Page 15: Hacking Movable Type

maketitle.pl /2sub make_graphic_title{ my $context = shift; my $params = shift;

my $entry = $context->stash('entry');

my $title = $entry->title(); my $dirified_title = dirify( $title ); ... return qq{<img src="$imageurl">};}

Page 16: Hacking Movable Type

maketitle.pl /2

...<center> <img src=”...”></center>...

nel file HTML risultante...

Page 17: Hacking Movable Type

statwatch

Page 18: Hacking Movable Type

statwatch

schemas mysql.dump

tmpl

list.tmpl

swfooter.tmpl

swheader.tmpl

view.tmpl

statwatch

Page 19: Hacking Movable Type

statwatch

lib

Stats.pm

StatWatch Visit.pm

StatWatch.pm

StatWatchConfig.pm

statvisit.cgi

statwatch.cgi

statwatch.pl

statwatch

Page 20: Hacking Movable Type

...

MT::Template::Context->add_tag('Stats' => sub{&staturl});

sub staturl { my $ctx = shift; my $blog = $ctx->stash('blog');

my $cfg = MT::ConfigMgr->instance; my $script = '<script type="text/javascript"> '.'<!-- '. qq|document.write('<img src="| . $cfg->CGIPath . "plugins/statwatch/statvisit.cgi?blog_id=" . $blog->id ... |.'// -->'.' </script>'; return $script;}

1;

statwatch.pl

Page 21: Hacking Movable Type

statwatch

lib

Stats.pm

StatWatch Visit.pm

StatWatch.pm

StatWatchConfig.pm

statvisit.cgi

statwatch.cgi

statwatch.pl

statwatch

Page 22: Hacking Movable Type

# StatWatch - lib/StatWatch/Visit.pm # Nick O'Neill (http://www.raquo.net/statwatch/)

package StatWatch::Visit;use strict;

use MT::App;@StatWatch::Visit::ISA = qw( MT::App );

use Stats;my $VERSION = '1.2';my $DEBUG = 0;

Visit.pm

Page 23: Hacking Movable Type

MT::App

MT::App::CMS MT::App::Comments MT::App::Search

MT

MT::ErrorHandler

MT::Plugin

Page 24: Hacking Movable Type

sub init { my $app = shift; $app->SUPER::init(@_) or return; $app->add_methods( visit => \&visit, ); $app->{default_mode} = 'visit'; $app->{user_class} = 'MT::Author';

$app->{charset} = $app->{cfg}->PublishCharset; my $q = $app->{query};

$app;}

Visit.pm /2

Page 25: Hacking Movable Type

sub visit { my $app = shift; my $q = $app->{query}; my $blog_id; if ($blog_id = $q->param('blog_id')) { require MT::Blog; my $blog = MT::Blog->load({ id => $blog_id }) or die "Error loading blog from blog_id $blog_id";

my $stats = Stats->new;

# ...

Visit.pm /2

Page 26: Hacking Movable Type

statwatch

lib

Stats.pm

StatWatch Visit.pm

StatWatch.pm

StatWatchConfig.pm

statvisit.cgi

statwatch.cgi

statwatch.pl

statwatch

Page 27: Hacking Movable Type

package Stats;use strict;

use MT::Object;@Stats::ISA = qw( MT::Object );__PACKAGE__->install_properties({ columns => [ 'id', 'blog_id', 'url', 'referrer', 'ip', ], indexes => { ip => 1, blog_id => 1, created_on => 1, }, audit => 1, datasource => 'stats', primary_key => 'id',});

1;

Visit.pm /2

Page 28: Hacking Movable Type

MT::ObjectDriver

MT::ObjectDriver::DBI MT::ObjectDriver::DBM

MT::Object

MT::Entry MT::Author MT::Config

MT::ErrorHandler

Page 29: Hacking Movable Type

# ...

$stats->ip($app->remote_ip); $stats->referrer($referrer); $stats->blog_id($blog_id); $stats->url($url); &compileStats($blog_id,$app->remote_ip);

$stats->save or die "Saving stats failed: ", $stats->errstr; } else { die "No blog id"; }}

Visit.pm /2

Page 30: Hacking Movable Type

statwatch

lib

Stats.pm

StatWatch Visit.pm

StatWatch.pm

StatWatchConfig.pm

statvisit.cgi

statwatch.cgi

statwatch.pl

statwatch

Page 31: Hacking Movable Type

sub init { my $app = shift; $app->SUPER::init(@_) or return; $app->add_methods( list => \&list, view => \&view, ); $app->{default_mode} = 'list'; $app->{user_class} = 'MT::Author';

$app->{requires_login} = 1; $app->{charset} = $app->{cfg}->PublishCharset; my $q = $app->{query};

$app;}

Visit.pm /2

Page 32: Hacking Movable Type

sub list { my $app = shift; my %param; my $q = $app->{query}; $param{debug} = ($DEBUG || $q->param('debug')); $param{setup} = $q->param('setup');

( $param{script_url} , $param{statwatch_base_url} , $param{statwatch_url} , my $static_uri) = parse_cfg();

require MT::PluginData; unless (MT::PluginData->load({ plugin => 'statwatch', key => 'setup_'.$VERSION })) { &setup; $app->redirect($param{statwatch_url}."?setup=1"); }

require MT::Blog; my @blogs = MT::Blog->load; my $data = []; ...

Visit.pm /2

Page 33: Hacking Movable Type

... ### Listing the blogs on the main page ### for my $blog (@blogs) { if (Stats->count({ blog_id => $blog->id })) { # [... colleziona i dati da mostrare ...] # Row it my $row = { ... }; push @$data, $row; } } $param{blog_loop} = $data; $param{gen_time} = " | ".$now." seconds";

$param{version} = $VERSION; $app->build_page('tmpl/list.tmpl', \%param);}

Visit.pm /2

Page 34: Hacking Movable Type

Riepilogo?

• Inserire nuovi tag speciale all’interno dei template

• Aggiungere pannelli (applicazioni)

• ...

Page 35: Hacking Movable Type

BigPAPI

• Big Plugin API

• Permette di agganciarsi all’interfaccia esistente di MT, estendendo le funzionalità dei pannelli esistenti

Page 36: Hacking Movable Type

Perchè?

Page 37: Hacking Movable Type

RightFieldsMT->add_callback( 'bigpapi::template::edit_entry::top', 9, $rightfields, \&edit_entry_template );

MT->add_callback( 'bigpapi::param::edit_entry', 9, $rightfields, \&edit_entry_param );

MT->add_callback( 'bigpapi::param::preview_entry', 9, $rightfields, \&preview_entry_param);

Page 38: Hacking Movable Type

RightFields

Page 39: Hacking Movable Type

Approfondimenti

• Six Apart Developer Wikihttp://www.lifewiki.net/sixapart/

• Seedmagazine.com — Lookin’ Goodhttp://o2b.net/archives/seedmagazine

• Beyond the bloghttp://a.wholelottanothing.org/features/2003/07/beyond_the_blog

• http://del.icio.us/slr/movabletype :-)

Page 40: Hacking Movable Type

Grazie :)

Stefano [email protected]