hacking movable type

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

Upload: stefano-rodighiero

Post on 04-Jun-2015

23.972 views

Category:

Technology


3 download

DESCRIPTION

An introduction to plugin development for Movable Type

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]