| Jifty-Plugin-Comment documentation | Contained in the Jifty-Plugin-Comment distribution. |
Jifty::Plugin::Comment - Add comments to any record
Setup the config.yml
Plugins:
- Comment:
# Set this if you want spam checking by Net::Akismet
Akismet:
Key: 1234567890a
Url: http://example.com
# Set this if you want to customize the HTML scrubbing of comments
Scrubber:
message: "Comments may only contain <strong>, <em>, and <a> tags."
allow:
- strong
- em
- a
default:
- 0
-
'*': 0
href: !!perl/regexp:
REGEXP: '^(?!(?:java)?script)'
MODIFIERS: i
Setup a model that has comments:
package App::Model::Fooble;
use Jifty::DBI::Schema;
use App::Record schema {
column scribble => type is 'text';
column wobble => type is 'int';
};
use Jifty::Plugin::Comment::Mixin::Model::Commented;
sub allow_owner_update_delete {
my $self = shift;
my ($right, %args) = @_;
if ($right eq 'create') {
return 'allow' ;#if $self->current_user->id;
}
if ($right eq 'update' || $right eq 'delete') {
return 'allow' if $self->current_user->id;
}
if ($right eq 'read') {
return 'allow';
}
return 'deny';
};
App::Model::FoobleComment->add_trigger( name => 'before_access', callback => \&allow_owner_update_delete);
App::Model::Comment->add_trigger( name => 'before_access', callback => \&allow_owner_update_delete);
Setup a view for creating, viewing, and managing the comments:
# assuming $fooble here isa App::Action::UpdateFooble object
template 'fooble/view' => page {
my $fooble = get 'fooble';
render_action $fooble, undef, { render_mode => 'read' };
render_region
name => 'fooble-comments',
path => '__comment/list_and_add',
defaults => {
comment_upon => $fooble->record->for_commenting,
initial_title => 'Re: '.substr($fooble->scribble, 0, 20).'...',
},
;
};
This plugin allows you to attach comments to any model. You do this using the three steps listed in the synopsis. For variations on these steps, see the other classes that handle the individual parts.
To set up a commented model, you will need to do the following:
Called during initialization. This will setup the Net::Akismet object if it is configured and available.
This returns an instance of HTML::Scrubber that is used to clean up HTML submitted in comments.
Right now the module depends directly upon HTML::Scrubber to do the work of cleaning up the text. You might want to use something else to do this. It also provides no mechanism for customizing any other aspect of the formatting. For example, your application might want to use Markdown, or BBCode, or just turn line breaks in the BR-tags, or anything else to format the comment text.
In the future, I'd like to consider something like Text::Pipe or a similar API to allow these formats to be customized more easily.
Andrew Sterling Hanenkamp, <hanenkamp@cpan.org>
Copyright 2007 Boomer Consulting, Inc. All Rights Reserved.
This program is free software and may be modified and distributed under the same terms as Perl itself.
| Jifty-Plugin-Comment documentation | Contained in the Jifty-Plugin-Comment distribution. |
use strict; use warnings; package Jifty::Plugin::Comment; use base qw/ Jifty::Plugin /; our $VERSION = '1.00'; __PACKAGE__->mk_accessors( qw/ akismet scrubber scrub_message / ); use HTML::Scrubber;
sub init { my $self = shift; $self->_init_akismet(@_); $self->_init_scrubber(@_); } sub _init_akismet { my $self = shift; my %args = @_; # Stop now if we don't have the Akismet thing return unless defined $args{Akismet}; # Check for the Akismet options my $key = $args{Akismet}{Key}; my $url = $args{Akismet}{Url}; # Don't go forward unless we have a key and a URL configured return unless $key and $url; # Try to load Akismet first... eval "use Net::Akismet"; if ($@) { Jifty->log->error("Failed to load Net::Akismet. Your comments will not be checked for link spam and the like. $@"); return; } # Now get our object my $akismet = Net::Akismet->new( KEY => $key, URL => $url ); unless ($akismet) { Jifty->log->error("Failed to verify your Akismet key. Your comments will not be checked for link spam and the like."); return; } $self->akismet($akismet); } sub _init_scrubber { my $self = shift; my %args = @_; my $scrubber_args = $args{Scrubber}; if (not defined $scrubber_args) { $scrubber_args = { message => 'Comments may only contain <strong>, <em>, and <a> tags.' .' Anything else will be removed.', allow => [ qw/ strong em a / ], default => [ 0, { '*' => 0, 'href' => qr{^(?!(?:java)?script)}i } ], }; } my $scrub_message = delete $scrubber_args->{message}; $scrub_message = 'The text you have given will be cleaned up.' unless $scrub_message; $self->scrub_message($scrub_message); my $scrubber = HTML::Scrubber->new( %$scrubber_args ); $self->scrubber($scrubber); }
1;