diff --git a/lib/WebGUI/Registration/Step/MailingSubscribe.pm b/lib/WebGUI/Registration/Step/MailingSubscribe.pm new file mode 100644 index 0000000..deff855 --- /dev/null +++ b/lib/WebGUI/Registration/Step/MailingSubscribe.pm @@ -0,0 +1,191 @@ +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 }; + +#------------------------------------------------------------------- +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 $i18n = WebGUI::International->new( $session, 'RegistrationStep_MailingSubscribe' ); + my @fields; + + # Fetch preferred homepage url + my $mailings = $self->getConfigurationData->{ subscribeMailings }; + + my @assets = + grep { defined $_ } + map { WebGUI::Asset->newByDynamicClass( $session, $_ ) } + @{ $mailings }; + + push @fields, { + field_label => $i18n->get( 'Subscribe to mailings' ), + field_value => join( ', ', map { $_->getTitle } @assets ), + }; + + # 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 $form = $session->form; + my $user = $self->registration->instance->user; + my $i18n = WebGUI::International->new( $session, 'RegistrationStep_MailingSubscribe' ); + + 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; + + # Add form elems in alphabetic order. + foreach my $mailing ( sort { $a->getTitle cmp $b->getTitle } @{ $availableMailings } ) { + my $id = $mailing->getId; + + push @{ $var->{ field_loop } }, ( + { + field_label => $mailing->getTitle, + field_formElement => + WebGUI::Form::checkbox( $session, { + name => 'subscribeMailings', + value => $id, + checked => $isSubscribed{ $id }, + label => $i18n->get( 'Subscribe to this mailing' ), + }), + } + ); + } + + 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; 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; + diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 90b30c7..2d07aea 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -33,6 +33,7 @@ addRecentColumnToNewsletterCollection( $session ); renamespaceTemplates( $session ); addSpecialStateTable( $session ); addListNameColumn( $session ); +addRegistrationSteps( $session ); finish($session); @@ -290,6 +291,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;