From 218ebbbad6fad74dbaed85f7c9e53eab648a7460 Mon Sep 17 00:00:00 2001
From: Martin Kamerbeek
Date: Wed, 26 May 2010 18:24:17 +0200
Subject: [PATCH] Make NewslettCollaboration templatable, and add concept of
recent issues.
---
.../Asset/Wobject/NewsletterCollection.pm | 121 ++++++++++++------
lib/WebGUI/AssetAspect/Subscriber.pm | 32 +++--
sbin/install_newsletter.pl | 42 ++++++
.../root_import_personalnewsletter.wgpkg | Bin 2901 -> 3571 bytes
4 files changed, 147 insertions(+), 48 deletions(-)
diff --git a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
index 7ae8b26..547adf8 100644
--- a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
+++ b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm
@@ -21,6 +21,19 @@ sub definition {
my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' );
tie my %properties, 'Tie::IxHash', (
+ viewTemplateId => {
+ fieldType => 'template',
+ label => 'Template',
+ tab => 'display',
+ defaultValue => 'aYVYFpofaYvmRYoHwl3x4w',
+ namespace => 'NewsletterCollection',
+ },
+ recentIssueCount => {
+ fieldType => 'integer',
+ label => 'Number of recent issues',
+ tab => 'display',
+ defaultValue => 1,
+ },
);
push @{ $definition }, {
@@ -29,7 +42,7 @@ sub definition {
autoGenerateForms => 1,
tableName => 'NewsletterCollection',
className => 'WebGUI::Asset::Wobject::NewsletterCollection',
- properties => \%properties
+ properties => \%properties,
};
return $class->SUPER::definition( $session, $definition );
@@ -70,48 +83,82 @@ sub generateEmailContent {
return $issue->view;
}
-##----------------------------------------------------------------------------
-#sub prepareView {
-# my $self = shift;
-# $self->SUPER::prepareView();
-# my $template = WebGUI::Asset::Template->new( $self->session, $self->get("templateIdView") );
-# $template->prepare($self->getMetaDataAsTemplateVariables);
-# $self->{_viewTemplate} = $template;
-#}
+#----------------------------------------------------------------------------
+sub getAssetContent {
+ my $self = shift;
+ my $asset = shift;
+ my $var = $self->session->var;
+
+ my $adminOn = $var->isAdminOn;
+ $var->switchAdminOff;
+
+ $asset->prepareView;
+ my $content = $asset->view;
+
+ $var->switchAdminOn if $adminOn;
+
+ return $content;
+}
+
+#----------------------------------------------------------------------------
+sub prepareView {
+ my $self = shift;
+ my $session = $self->session;
+
+ $self->SUPER::prepareView;
+
+ my $template = WebGUI::Asset::Template->new( $session, $self->get('viewTemplateId') );
+ $template->prepare( $self->getMetaDataAsTemplateVariables );
+
+ $self->{ _viewTemplate } = $template;
+
+ return;
+}
+
+#----------------------------------------------------------------------------
+sub getViewVars {
+ my $self = shift;
+ my $session = $self->session;
+
+ my $var = $self->get;
+
+ my $issueCount = 0;
+ my ( @recentIssues, @olderIssues );
+ my $issues = $self->getIssues;
+ foreach my $issue ( @{ $issues } ) {
+ my $issueVar = $issue->get;
+ $issueVar->{ url } = $issue->getUrl;
+
+ $issueCount++;
+
+ if ( $issueCount <= $self->get('recentIssueCount') ) {
+ $issueVar->{ content } = $self->getAssetContent( $issue );
+
+ push @recentIssues, $issueVar;
+ }
+ else {
+ push @olderIssues, $issueVar;
+ }
+ }
+
+ $var->{ recent_issue_loop } = \@recentIssues;
+ $var->{ recent_issue_count } = scalar @recentIssues;
+ $var->{ older_issue_loop } = \@olderIssues;
+ $var->{ older_issue_count } = scalar @olderIssues;
+ $var->{ issue_count } = $issueCount;
+
+ $self->appendSubscriptionFormVars( $var );
+
+ return $var;
+}
#----------------------------------------------------------------------------
sub view {
my $self = shift;
- my $session = $self->session;
- my $output = $self->getToolbar if $session->var->isAdminOn;
+ my $var = $self->getViewVars;
- my $issues = $self->getIssues;
- return $output . "No issues yet" unless scalar @{ $issues };
-
- $output .= $self->getSubscriptionForm;
-# $output .= $self->isSubscribed
-# ? 'Unsubscribe
'
-# : 'Subscribe
'
-# ;
-
- $output .= 'Issues:
';
-
- $issues->[0]->prepareView;
- $output .= $issues->[0]->view;
-
- return $output;
+ return $self->processTemplate( $var, undef, $self->{_viewTemplate} );
}
1;
diff --git a/lib/WebGUI/AssetAspect/Subscriber.pm b/lib/WebGUI/AssetAspect/Subscriber.pm
index a830eb2..a51b347 100644
--- a/lib/WebGUI/AssetAspect/Subscriber.pm
+++ b/lib/WebGUI/AssetAspect/Subscriber.pm
@@ -151,11 +151,13 @@ sub isSubscribed {
}
#----------------------------------------------------------------------------
-sub getSubscriptionForm {
+sub appendSubscriptionFormVars {
my $self = shift;
+ my $var = shift || {};
my $session = $self->session;
my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' );
+ # Setup form controls
my $formHeader =
WebGUI::Form::formHeader( $session, { action => $self->getUrl } )
. WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } )
@@ -167,20 +169,28 @@ sub getSubscriptionForm {
my $emailBox = WebGUI::Form::email( $session, { name => 'email', value => '' } );
my $formFooter = WebGUI::Form::formFooter( $session );
- my $output = '';
+ # Compose default subscription form for current user
+ my $form = '';
if ( $session->user->isRegistered ) {
- $output .= $subscribeButton if $self->canSubscribe;
- $output .= $unsubscribeButton if $self->canUnsubscribe;
-
- return unless $output;
- return $formHeader . $output . $formFooter;
+ $form .= $subscribeButton if $self->canSubscribe;
+ $form .= $unsubscribeButton if $self->canUnsubscribe;
}
- #### TODO: anonymousAllowed
- else {
- return $formHeader . $emailBox . $subscribeButton . $unsubscribeButton . $formFooter;
+ elsif ( $self->get('allowAnonymousSubscription') ) {
+ $form = $emailBox . $subscribeButton . $unsubscribeButton;
}
- return;
+ # Setup tmpl_vars
+ $var->{ subscriptionForm_form } = "$formHeader $form $formFooter" if $form;
+ $var->{ subscriptionForm_header } = $formHeader;
+ $var->{ subscriptionForm_footer } = $formFooter;
+ $var->{ subscriptionForm_subscribeButton } = $subscribeButton;
+ $var->{ subscriptionForm_unsubscribeButton } = $unsubscribeButton;
+ $var->{ subscrittionForm_emailBox } = $emailBox;
+ $var->{ user_canSubscribe } = $self->canSubscribe;
+ $var->{ user_canUnsubscribe } = $self->canUnsubscribe;
+ $var->{ user_isRegistered } = $session->user->isRegistered;
+
+ return $var;
}
#----------------------------------------------------------------------------
diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl
index 5425b3b..896a920 100644
--- a/sbin/install_newsletter.pl
+++ b/sbin/install_newsletter.pl
@@ -28,6 +28,8 @@ installMailingTables( $session );
installNewsletterInAdminConsole( $session );
installNewsletterSettings( $session );
addPluginsToConfigFile( $session );
+addTemplateColumnToNewsletterCollection( $session );
+addRecentColumnToNewsletterCollection( $session );
finish($session);
@@ -106,6 +108,46 @@ EOSQL
print "Done.\n";
}
+#----------------------------------------------------------------------------
+sub addTemplateColumnToNewsletterCollection {
+ my $session = shift;
+ my $db = $session->db;
+ print "\tAdding view template column to NewletterCollection...";
+
+ my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'viewTemplateId' ] );
+
+ unless ( $hasColumn ) {
+ $db->write( 'alter table NewsletterCollection add column viewTemplateId char(22) binary not null default ?', [
+ 'aYVYFpofaYvmRYoHwl3x4w'
+ ] );
+ $db->write( 'update NewsletterCollection set viewTemplateId=?', [
+ 'aYVYFpofaYvmRYoHwl3x4w',
+ ] );
+ }
+
+ print "Done.\n";
+}
+
+#----------------------------------------------------------------------------
+sub addRecentColumnToNewsletterCollection {
+ my $session = shift;
+ my $db = $session->db;
+ print "\tAdding recent issues column to NewletterCollection...";
+
+ my $hasColumn = $db->quickScalar( 'show columns from NewsletterCollection where Field=?', [ 'recentIssueCount' ] );
+
+ unless ( $hasColumn ) {
+ $db->write( 'alter table NewsletterCollection add column recentIssueCount int(3) not null default ?', [
+ 1,
+ ] );
+ $db->write( 'update NewsletterCollection set recentIssueCount=?', [
+ 1
+ ] );
+ }
+
+ print "Done.\n";
+}
+
#----------------------------------------------------------------------------
sub installMailingTables {
my $session = shift;
diff --git a/sbin/packages/root_import_personalnewsletter.wgpkg b/sbin/packages/root_import_personalnewsletter.wgpkg
index 8e8e9c388913363bf2bca0f3cbcc4a0d69f63804..22cb124846daf4656eb85ef5f398167fd4fb7d7d 100644
GIT binary patch
literal 3571
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
literal 2901
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