From 13b7cd0948e925246426f93eef50e5737ed3d985 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Wed, 3 Nov 2010 17:45:44 +0100 Subject: [PATCH 1/5] Adding MailingSubscribe registration plugin. --- .../Registration/Step/MailingSubscribe.pm | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 lib/WebGUI/Registration/Step/MailingSubscribe.pm diff --git a/lib/WebGUI/Registration/Step/MailingSubscribe.pm b/lib/WebGUI/Registration/Step/MailingSubscribe.pm new file mode 100644 index 0000000..a9205cc --- /dev/null +++ b/lib/WebGUI/Registration/Step/MailingSubscribe.pm @@ -0,0 +1,182 @@ +package WebGUI::Registration::Step::MailingSubscribe; + +use strict; + +use Tie::IxHash; +use List::MoreUtils qw{ uniq }; + + +use base qw{ WebGUI::Registration::Step }; + +#------------------------------------------------------------------- +sub getAvailableMailings { + my $self = shift; + my $session = $self->session; + + my $availableMailings = WebGUI::Asset->getRoot( $session )->getLineage( ['descendants'], { + returnObjects => 1, + isa => 'WebGUI::Asset::Wobject::NewsletterCollection', + } ); + + return $availableMailings; +} + +#------------------------------------------------------------------- +sub apply { + my $self = shift; + my $user = $self->registration->instance->user; + + my $subscribeTo = { + map { $_ => 1 } @{ $self->getConfigurationData->{ subscribeMailings } || [] } + }; + + my $availableMailings = $self->getAvailableMailings; + + my $sendNotification = 0; + foreach my $mailing ( @{ $availableMailings } ) { + next unless $mailing->isa( 'WebGUI::AssetAspect::Subscriber' ); + + if ( $subscribeTo->{ $mailing->getId } ) { + $mailing->subscribe( $user, $sendNotification ) unless $mailing->isSubscribed( $user ); + } + else { + $mailing->unsubscribe( $user, $sendNotification ) if $mailing->isSubscribed( $user ); + } + } + + return; +} + +##------------------------------------------------------------------- +#sub crud_definition { +# my $class = shift; +# my $session = shift; +# my $definition = $class->SUPER::crud_definition( $session ); +# my $i18n = WebGUI::International->new( $session, 'Registration_Step_Homepage' ); +# +# +# $definition->{ dynamic }->{ urlStorageField } = { +# fieldType => 'selectBox', +# label => 'Store homepage url in field', +# options => \%profileFields, +# }; +# +# return $definition; +#} + +#------------------------------------------------------------------- +sub getSummaryTemplateVars { + my $self = shift; + my $includeAdminControls = shift; + my $session = $self->session; + my @fields; + + # Fetch preferred homepage url + my $mailings = $self->getConfigurationData->{ subscribeMailings }; + + my @assets = + grep { defined $_ } + map { WebGUI::Asset->newByDynamicClass( $session, $_ ) } + @{ $mailings }; + + # Preferred homepage url + push @fields, { + field_label => 'Subscribe to mailings', + field_value => join( ', ', map { $_->getTitle } @assets ), +# field_formElement => WebGUI::Form::text( $session, { +# name => 'preferredHomepageUrl', +# value => $preferredHomepageUrl, +# }), + }; + + # Setup tmpl_var + my $var = { + field_loop => \@fields, + category_label => $self->get('title'), + category_edit_url => $self->changeStepDataUrl, + }; + + return ( $var ); +} + +#------------------------------------------------------------------- +sub getViewVars { + my $self = shift; + my $session = $self->session; + my $user = $self->registration->instance->user; + + my $var = $self->SUPER::getViewVars; + + my @subscribed; + tie my %options, 'Tie::IxHash'; + my $availableMailings = $self->getAvailableMailings; + foreach my $mailing ( sort { $a->getTitle cmp $b->getTitle } @{ $availableMailings } ) { + push @subscribed, $mailing->getId if $mailing->isSubscribed( $user ); + + $options{ $mailing->getId } = $mailing->getTitle; + }; + + my @subscribeMailings = ( + $self->session->form->checkList( 'subscribeMailings' ) + || @{ $self->getConfigurationData->{'subscribeMailings'} || [] } + || @subscribed + ); + + push @{ $var->{ field_loop } }, ( + { + field_label => 'Subscribe to mailings', + field_formElement => + WebGUI::Form::checkList($self->session, { + name => 'subscribeMailings', + options => \%options, + value => [ uniq @subscribeMailings ], + vertical=> 1, + }), +# field_subtext => 'Hier komt de subtext voor dit veld' + } + ); + + return $var; +} + +#------------------------------------------------------------------- +sub isComplete { + my $self = shift; + + return defined $self->getConfigurationData->{subscribeMailings}; +} + +#------------------------------------------------------------------- +sub onDeleteAccount { + my $self = shift; + my $doit = shift; + my $session = $self->session; + + $self->SUPER::onDeleteAccount( $doit ); + + return; +} + +#------------------------------------------------------------------- +sub updateFromFormPost { + my $self = shift; + my $session = $self->session; + + $self->SUPER::updateFromFormPost; + +# $self->update( { +# } ); +} + +#------------------------------------------------------------------- +sub processStepFormData { + my $self = shift; + my $session = $self->session; + + my @subscribeMailings = $session->form->checkList( 'subscribeMailings' ); + + $self->setConfigurationData( subscribeMailings => \@subscribeMailings ); + return []; +} + +1; From 1655d92642bbc068a5be6d38bd298eb0150c4b17 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Wed, 3 Nov 2010 17:52:52 +0100 Subject: [PATCH 2/5] Adding install script. --- sbin/install_newsletter.pl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 5a75065..89aa378 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -32,6 +32,7 @@ addTemplateColumnToNewsletterCollection( $session ); addRecentColumnToNewsletterCollection( $session ); renamespaceTemplates( $session ); addSpecialStateTable( $session ); +addRegistrationSteps( $session ); finish($session); @@ -273,6 +274,21 @@ EOSQL print "Done.\n"; } +#---------------------------------------------------------------------------- +sub addRegistrationSteps { + my $session = shift; + + print "\tAdding MailingSubscribe Registration Step to config..."; + + my %steps = map { $_ => 1 } @{ $session->config->get( 'registrationSteps' ) || [] }; + $steps{ 'WebGUI::Registration::Step::MailingSubscribe' } = 1; + + $session->config->set( 'registrationSteps', [ keys %steps ] ); + + print "Done.\n"; + +} + #---------------------------------------------------------------------------- sub start { my $webguiRoot = shift; From 370e2c91bf08a2cad84219a99c7d2274f4552d81 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Thu, 4 Nov 2010 13:52:15 +0100 Subject: [PATCH 3/5] Fix wrong array population. || operator works in scalar context! --- lib/WebGUI/Registration/Step/MailingSubscribe.pm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/WebGUI/Registration/Step/MailingSubscribe.pm b/lib/WebGUI/Registration/Step/MailingSubscribe.pm index a9205cc..ac45c06 100644 --- a/lib/WebGUI/Registration/Step/MailingSubscribe.pm +++ b/lib/WebGUI/Registration/Step/MailingSubscribe.pm @@ -116,11 +116,9 @@ sub getViewVars { $options{ $mailing->getId } = $mailing->getTitle; }; - my @subscribeMailings = ( - $self->session->form->checkList( 'subscribeMailings' ) - || @{ $self->getConfigurationData->{'subscribeMailings'} || [] } - || @subscribed - ); + my @subscribeMailings = $self->session->form->checkList( 'subscribeMailings' ); + @subscribeMailings = @{ $self->getConfigurationData->{'subscribeMailings'} || [] } unless @subscribeMailings; + @subscribeMailings = @subscribed unless @subscribeMailings; push @{ $var->{ field_loop } }, ( { From 87afa361f4e05c506008a393e1a150bb37d9fe73 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Thu, 4 Nov 2010 14:18:43 +0100 Subject: [PATCH 4/5] Generate sperate checkbox for each mailing. --- .../Registration/Step/MailingSubscribe.pm | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/lib/WebGUI/Registration/Step/MailingSubscribe.pm b/lib/WebGUI/Registration/Step/MailingSubscribe.pm index ac45c06..a3ebdf2 100644 --- a/lib/WebGUI/Registration/Step/MailingSubscribe.pm +++ b/lib/WebGUI/Registration/Step/MailingSubscribe.pm @@ -1,10 +1,12 @@ package WebGUI::Registration::Step::MailingSubscribe; use strict; +use warnings; use Tie::IxHash; use List::MoreUtils qw{ uniq }; +use WebGUI::Form::Checkbox; use base qw{ WebGUI::Registration::Step }; @@ -79,7 +81,6 @@ sub getSummaryTemplateVars { map { WebGUI::Asset->newByDynamicClass( $session, $_ ) } @{ $mailings }; - # Preferred homepage url push @fields, { field_label => 'Subscribe to mailings', field_value => join( ', ', map { $_->getTitle } @assets ), @@ -103,36 +104,48 @@ sub getSummaryTemplateVars { sub getViewVars { my $self = shift; my $session = $self->session; + my $form = $session->form; my $user = $self->registration->instance->user; + my $availableMailings = $self->getAvailableMailings; + + # Figure out what mailings to check in the form + my @subscribeMailings; + if ( $form->checkList( 'subscribeMailings' ) ) { + # The user just posted but made an error + @subscribeMailings = $form->checkList( 'subscribeMailings' ); + } + elsif ( exists $self->getConfigurationData->{'subscribeMailings'} ) { + # The step is being changed + @subscribeMailings = @{ $self->getConfigurationData->{'subscribeMailings'} || [] }; + } + else { + # The step hasn't been done yet. + @subscribeMailings = grep { $_->isSubscribed( $user ) } @{ $availableMailings }; + } + + # Create lookup table + my %isSubscribed = map { $_ => 1 } @subscribeMailings; + my $var = $self->SUPER::getViewVars; - my @subscribed; - tie my %options, 'Tie::IxHash'; - my $availableMailings = $self->getAvailableMailings; + # Add form elems in alphabetic order. foreach my $mailing ( sort { $a->getTitle cmp $b->getTitle } @{ $availableMailings } ) { - push @subscribed, $mailing->getId if $mailing->isSubscribed( $user ); - - $options{ $mailing->getId } = $mailing->getTitle; - }; + my $id = $mailing->getId; - my @subscribeMailings = $self->session->form->checkList( 'subscribeMailings' ); - @subscribeMailings = @{ $self->getConfigurationData->{'subscribeMailings'} || [] } unless @subscribeMailings; - @subscribeMailings = @subscribed unless @subscribeMailings; - - push @{ $var->{ field_loop } }, ( - { - field_label => 'Subscribe to mailings', - field_formElement => - WebGUI::Form::checkList($self->session, { - name => 'subscribeMailings', - options => \%options, - value => [ uniq @subscribeMailings ], - vertical=> 1, - }), -# field_subtext => 'Hier komt de subtext voor dit veld' - } - ); + push @{ $var->{ field_loop } }, ( + { + field_label => $mailing->getTitle, + field_formElement => + WebGUI::Form::checkbox( $session, { + name => 'subscribeMailings', + value => $id, + checked => $isSubscribed{ $id }, + label => 'Subscribe to this mailing', + }), + } + ); + } return $var; } From 837123de93a52b9f63fadf26aeab02ea6b31dd64 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Thu, 4 Nov 2010 14:27:52 +0100 Subject: [PATCH 5/5] Internationalize MailingSubscribe reg plugin --- lib/WebGUI/Registration/Step/MailingSubscribe.pm | 10 ++++------ .../Dutch/RegistrationStep_MailingSubscribe.pm | 15 +++++++++++++++ .../English/RegistrationStep_MailingSubscribe.pm | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 lib/WebGUI/i18n/Dutch/RegistrationStep_MailingSubscribe.pm create mode 100644 lib/WebGUI/i18n/English/RegistrationStep_MailingSubscribe.pm diff --git a/lib/WebGUI/Registration/Step/MailingSubscribe.pm b/lib/WebGUI/Registration/Step/MailingSubscribe.pm index a3ebdf2..deff855 100644 --- a/lib/WebGUI/Registration/Step/MailingSubscribe.pm +++ b/lib/WebGUI/Registration/Step/MailingSubscribe.pm @@ -71,6 +71,7 @@ sub getSummaryTemplateVars { my $self = shift; my $includeAdminControls = shift; my $session = $self->session; + my $i18n = WebGUI::International->new( $session, 'RegistrationStep_MailingSubscribe' ); my @fields; # Fetch preferred homepage url @@ -82,12 +83,8 @@ sub getSummaryTemplateVars { @{ $mailings }; push @fields, { - field_label => 'Subscribe to mailings', + field_label => $i18n->get( 'Subscribe to mailings' ), field_value => join( ', ', map { $_->getTitle } @assets ), -# field_formElement => WebGUI::Form::text( $session, { -# name => 'preferredHomepageUrl', -# value => $preferredHomepageUrl, -# }), }; # Setup tmpl_var @@ -106,6 +103,7 @@ sub getViewVars { my $session = $self->session; my $form = $session->form; my $user = $self->registration->instance->user; + my $i18n = WebGUI::International->new( $session, 'RegistrationStep_MailingSubscribe' ); my $availableMailings = $self->getAvailableMailings; @@ -141,7 +139,7 @@ sub getViewVars { name => 'subscribeMailings', value => $id, checked => $isSubscribed{ $id }, - label => 'Subscribe to this mailing', + label => $i18n->get( 'Subscribe to this mailing' ), }), } ); diff --git a/lib/WebGUI/i18n/Dutch/RegistrationStep_MailingSubscribe.pm b/lib/WebGUI/i18n/Dutch/RegistrationStep_MailingSubscribe.pm new file mode 100644 index 0000000..957d7f1 --- /dev/null +++ b/lib/WebGUI/i18n/Dutch/RegistrationStep_MailingSubscribe.pm @@ -0,0 +1,15 @@ +package WebGUI::i18n::Dutch::RegistrationStep_MailingSubscribe; + +use strict; + +our $I18N = { + 'Subscribe to mailings' => { + message => 'Abonneren op nieuwsbrieven', + }, + 'Subscribe to this mailing' => { + message => 'Abonneer op deze nieuwsbrief', + }, +}; + +1; + diff --git a/lib/WebGUI/i18n/English/RegistrationStep_MailingSubscribe.pm b/lib/WebGUI/i18n/English/RegistrationStep_MailingSubscribe.pm new file mode 100644 index 0000000..9b6df53 --- /dev/null +++ b/lib/WebGUI/i18n/English/RegistrationStep_MailingSubscribe.pm @@ -0,0 +1,15 @@ +package WebGUI::i18n::English::RegistrationStep_MailingSubscribe; + +use strict; + +our $I18N = { + 'Subscribe to mailings' => { + message => 'Subscribe to mailings', + }, + 'Subscribe to this mailing' => { + message => 'Subscribe to this mailing', + }, +}; + +1; +