diff --git a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
index 3680565..c5a6d32 100644
--- a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
+++ b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
@@ -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 '', $i18n->get('subscribe');
+ my $unsubscribeButton =
+ sprintf '', $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
- ? '
Unsubscribe
'
- : 'Subscribe
'
- ;
+ $output .= $self->getSubscriptionForm;
+# $output .= $self->isSubscribed
+# ? 'Unsubscribe
'
+# : 'Subscribe
'
+# ;
$output .= 'Issues:
';
$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;
diff --git a/lib/WebGUI/User/SpecialState.pm b/lib/WebGUI/User/SpecialState.pm
new file mode 100644
index 0000000..27dfd17
--- /dev/null
+++ b/lib/WebGUI/User/SpecialState.pm
@@ -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;
+
diff --git a/lib/WebGUI/i18n/English/Asset_NewsletterCollection.pm b/lib/WebGUI/i18n/English/Asset_NewsletterCollection.pm
index 121731d..3b392c4 100644
--- a/lib/WebGUI/i18n/English/Asset_NewsletterCollection.pm
+++ b/lib/WebGUI/i18n/English/Asset_NewsletterCollection.pm
@@ -3,7 +3,12 @@ package WebGUI::i18n::English::Asset_NewsletterCollection;
use strict;
our $I18N = {
-
+ 'subscribe' => {
+ message => 'subscribe',
+ },
+ 'unsubscribe' => {
+ message => 'unsubscribe',
+ },
};
1;