Adding basic anonymous subscription.

This commit is contained in:
Martin Kamerbeek 2010-05-07 14:33:33 +02:00
parent c4115cc82a
commit 8fdeca68b5
3 changed files with 124 additions and 5 deletions

View file

@ -4,6 +4,7 @@ use strict;
use warnings;
use Class::C3;
use WebGUI::User::SpecialState;
use base qw{
WebGUI::AssetAspect::Mailable
@ -126,6 +127,39 @@ sub isSubscribed {
# $self->{_viewTemplate} = $template;
#}
#----------------------------------------------------------------------------
sub getSubscriptionForm {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' );
my $formHeader =
WebGUI::Form::formHeader( $session, { action => $self->getUrl } )
. WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } )
;
my $subscribeButton =
sprintf '<button type="submit" name="action" value="subscribe">%s</button>', $i18n->get('subscribe');
my $unsubscribeButton =
sprintf '<button type="submit" name="action" value="unsubscribe">%s</button>', $i18n->get('unsubscribe');
my $emailBox = WebGUI::Form::email( $session, { name => 'email', value => '' } );
my $formFooter = WebGUI::Form::formFooter( $session );
my $output = '';
if ( $session->user->isRegistered ) {
$output .= $subscribeButton if $self->canSubscribe;
$output .= $unsubscribeButton if $self->canUnsubscribe;
return unless $output;
return $formHeader . $output . $formFooter;
}
#### TODO: anonymousAllowed
else {
return $formHeader . $emailBox . $subscribeButton . $unsubscribeButton . $formFooter;
}
return;
}
#----------------------------------------------------------------------------
sub view {
my $self = shift;
@ -136,10 +170,11 @@ sub view {
my $issues = $self->getIssues;
return $output . "No issues yet" unless scalar @{ $issues };
$output .= $self->isSubscribed
? '<p><a href="' . $self->getUrl( 'func=unsubscribe' ) . '">Unsubscribe</a></p>'
: '<p><a href="' . $self->getUrl( 'func=subscribe' ) . '">Subscribe</a></p>'
;
$output .= $self->getSubscriptionForm;
# $output .= $self->isSubscribed
# ? '<p><a href="' . $self->getUrl( 'func=unsubscribe' ) . '">Unsubscribe</a></p>'
# : '<p><a href="' . $self->getUrl( 'func=subscribe' ) . '">Subscribe</a></p>'
# ;
$output .= '<p>Issues: <ul>';
$output .=
@ -188,6 +223,50 @@ sub unsubscribe {
return;
}
#----------------------------------------------------------------------------
sub www_processSubscription {
my $self = shift;
my $session = $self->session;
my $form = $session->form;
my $action = $form->get( 'action' );
return unless $action eq 'subscribe' || $action eq 'unsubscribe';
if ( $session->user->isRegistered ) {
if ( $action eq 'subscribe' && $self->canSubscribe ) {
$self->subscribe;
}
if ( $action eq 'unsubscribe' && $self->canUnsubscribe ) {
$self->unsubscribe;
}
}
# TODO: anonymousAllowed
else {
my $email = $form->email( 'email' );
return 'no email' unless $email;
my $emailUser = WebGUI::User::SpecialState->newByEmail( $session, $email );
if ( $action eq 'unsubscribe' && defined $emailUser ) {
$session->log->warn( 'unsub anon' );
$self->unsubscribe( $emailUser->getId );
}
if ( $action eq 'subscribe' ) {
if ( !defined $emailUser ) {
$emailUser = WebGUI::User::SpecialState->create( $session );
$emailUser->disable;
$emailUser->username( $emailUser->getId );
$emailUser->update( { email => $email } );
}
$emailUser->addSpecialState( 'Newsletter', $self->getId );
$session->log->warn( 'sub anon ' . $emailUser->username);
$self->subscribe( $emailUser->getId );
}
}
return;
}
#----------------------------------------------------------------------------
sub www_subscribe {
my $self = shift;

View file

@ -0,0 +1,35 @@
package WebGUI::User::SpecialState;
use strict;
use warnings;
use Carp;
use base 'WebGUI::User';
sub create {
my $class = shift;
my $session = shift;
my $self = $class->SUPER::create( $session, @_ );
return $self->new( $session, $self->getId );
}
sub addSpecialState {
my $self = shift;
my $state = shift || croak 'state is required';
my $id = shift;
return;
}
sub removeSpecialState {
my $self = shift;
my $state = shift || croak 'state is required';
my $id = shift;
return;
}
1;

View file

@ -3,7 +3,12 @@ package WebGUI::i18n::English::Asset_NewsletterCollection;
use strict;
our $I18N = {
'subscribe' => {
message => 'subscribe',
},
'unsubscribe' => {
message => 'unsubscribe',
},
};
1;