MT::Revisable
About MT::Revisable interface
Movable Type 5 comes with a revision history framework built in. What does that mean? It means that a developer can easily use revision history for own objects.
The following methods are supported on any revisable object:
$obj->pack_revision()
Creates the hashref that will be stored as a particular revision of the object. By default, this hashref contains the values of the object’s normal and meta columns. The ”<package>::pack_revision” callback can be used to add values from the plugin to be stored with the revision.
$obj->unpack_revision($packed_obj)
The opposite of ”pack_revision”, takes the ”$packed_obj” hashref and unpacks it, setting the values of ”$obj” as needed. The ”<package>::unpack_revision” callback can be used for any other keys added to ”$packged_obj” that are not part of the normal or meta columns.
$obj->save_revision()
Called automatically when an object is saved from the MT web interface or posted via a 3rd party client (on a low priority api/cms_post_save callback). Saves a revision only if at least one revisioned column has changed.
$obj->load_revision(\%terms, \%args)
Loads revisions for the ”$obj”. Arguments work similarly to ”MT::Object->load”. Thus, one can simply do ”$obj->load_revision($rev_numer)” or pass terms and args. load_revision should return an/array of arrayref(s).
$obj->apply_revision(\%terms, \%args)
Rolls back to the state of the object at ”$obj-load_revision(\%terms, \%args)” and saves this action as a revision.
Manage revision history
Inheriting from the Revisable Interface
To make an object revisable, a developer do need only two actions.
- Their package inherits from the MTRevisable interface.
- Add ‘revisioned’ to any column.
Here is the sample code.
package My::Object::Model; use base qw ( MT::Object MT::Revisable ); __PACKAGE__->install_properties({ 'id' => 'integer not null auto_increment', 'text' => 'string(255) not null revisioned', # ... }); 1;
Using the MT::Revisable Interface
Then you get the methods in the Revisable interface on your model objects:
sub load_my_revision { my ( $obj_id, $rev_id ) = @_; my $obj = My::Object::Model->load( $obj_id ); my $rev = $obj->load_revision( { rev_number => $rev_id } ); # ... }