Fixed bug where generate mailing would generate two mailings before even saving the form.
This commit is contained in:
parent
ed0398a2c0
commit
87139a7498
2 changed files with 113 additions and 45 deletions
|
|
@ -40,7 +40,7 @@ sub cancel {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
$self->update( {
|
$self->update( {
|
||||||
state => 'idle',
|
state => 'idle',
|
||||||
sendDate => undef,
|
sendDate => undef,
|
||||||
} );
|
} );
|
||||||
|
|
@ -65,7 +65,7 @@ sub crud_definition {
|
||||||
assetId => {
|
assetId => {
|
||||||
fieldType => 'guid',
|
fieldType => 'guid',
|
||||||
},
|
},
|
||||||
|
|
||||||
issueId => {
|
issueId => {
|
||||||
fieldType => 'guid',
|
fieldType => 'guid',
|
||||||
},
|
},
|
||||||
|
|
@ -83,7 +83,7 @@ sub crud_definition {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
$definition->{ properties } = {
|
$definition->{ properties } = {
|
||||||
%{ $definition->{ properties } || {} },
|
%{ $definition->{ properties } || {} },
|
||||||
%properties,
|
%properties,
|
||||||
};
|
};
|
||||||
|
|
@ -94,7 +94,7 @@ sub crud_definition {
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
sub delete {
|
sub delete {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
$self->deleteQueuedEmails;
|
$self->deleteQueuedEmails;
|
||||||
|
|
||||||
return $self->SUPER::delete;
|
return $self->SUPER::delete;
|
||||||
|
|
@ -103,12 +103,12 @@ sub delete {
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
sub deleteQueuedEmails {
|
sub deleteQueuedEmails {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $it = $self->getQueuedEmailIterator;
|
my $it = $self->getQueuedEmailIterator;
|
||||||
while ( my $email = $it->() ) {
|
while ( my $email = $it->() ) {
|
||||||
$email->delete;
|
$email->delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
$it = $self->getQueuedTestEmailIterator;
|
$it = $self->getQueuedTestEmailIterator;
|
||||||
while ( my $email = $it->() ) {
|
while ( my $email = $it->() ) {
|
||||||
$email->delete;
|
$email->delete;
|
||||||
|
|
@ -180,8 +180,8 @@ sub getStatusLine {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $db = $self->session->db;
|
my $db = $self->session->db;
|
||||||
|
|
||||||
my $sth = $db->read(
|
my $sth = $db->read(
|
||||||
'select status, isTest, count( status ) as cnt from Mailing_email where mailingId=? group by status,isTest',
|
'select status, isTest, count( status ) as cnt from Mailing_email where mailingId=? group by status,isTest',
|
||||||
[
|
[
|
||||||
$self->getId,
|
$self->getId,
|
||||||
],
|
],
|
||||||
|
|
@ -260,7 +260,7 @@ sub queue {
|
||||||
$state,
|
$state,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
$self->queueEmails( $self->getAsset->getRecipients );
|
$self->queueEmails( $self->getAsset->getRecipients );
|
||||||
|
|
||||||
$self->update( {
|
$self->update( {
|
||||||
|
|
@ -285,7 +285,7 @@ sub queueEmails {
|
||||||
recipientEmail => undef,
|
recipientEmail => undef,
|
||||||
isTest => 0,
|
isTest => 0,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -334,7 +334,7 @@ sub send {
|
||||||
$state,
|
$state,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
$self->update( { state => 'sending' } );
|
$self->update( { state => 'sending' } );
|
||||||
my $complete = $self->sendQueuedEmails( $timeLimit );
|
my $complete = $self->sendQueuedEmails( $timeLimit );
|
||||||
|
|
||||||
|
|
@ -361,7 +361,7 @@ sub sendQueuedEmails {
|
||||||
|
|
||||||
$email->send;
|
$email->send;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -380,7 +380,7 @@ sub www_cancel {
|
||||||
$i18n->get('cancel mailing success'),
|
$i18n->get('cancel mailing success'),
|
||||||
$i18n->get('cancel mailing'),
|
$i18n->get('cancel mailing'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return $self->renderInConsole(
|
return $self->renderInConsole(
|
||||||
$i18n->get('cancel mailing failure'),
|
$i18n->get('cancel mailing failure'),
|
||||||
|
|
@ -415,13 +415,13 @@ sub www_delete {
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
sub www_edit {
|
sub www_edit {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
|
||||||
return $session->privilege->insufficient unless $self->admin->canManage;
|
return $session->privilege->insufficient unless $self->admin->canManage;
|
||||||
|
|
||||||
my $f = WebGUI::HTMLForm->new( $session );
|
my $f = $self->getEditForm;
|
||||||
$f->hidden(
|
$f->hidden(
|
||||||
name => 'newsletter',
|
name => 'newsletter',
|
||||||
value => 'mailing',
|
value => 'mailing',
|
||||||
|
|
@ -435,6 +435,16 @@ sub www_edit {
|
||||||
value => $self->getId,
|
value => $self->getId,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return $self->renderInConsole( $f->print, $i18n->get('configure mailing') );
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
sub getEditForm {
|
||||||
|
my $self = shift;
|
||||||
|
my $session = $self->session;
|
||||||
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
my $f = WebGUI::HTMLForm->new( $session );
|
||||||
|
|
||||||
my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
|
my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
|
||||||
my $configuration = $self->get('configuration') || {};
|
my $configuration = $self->get('configuration') || {};
|
||||||
while ( my( $name, $properties ) = each %fields ) {
|
while ( my( $name, $properties ) = each %fields ) {
|
||||||
|
|
@ -444,7 +454,7 @@ sub www_edit {
|
||||||
my $formField = WebGUI::Form::DynamicField->new( $session, %{ $properties } );
|
my $formField = WebGUI::Form::DynamicField->new( $session, %{ $properties } );
|
||||||
my $element = $formField->toHtml; # Works around a bug in WG::Form::Template in < 7.9.8
|
my $element = $formField->toHtml; # Works around a bug in WG::Form::Template in < 7.9.8
|
||||||
my $readonly = $formField->getValueAsHtml; # where getValueAsHtml wouldn't set the correct options hashref
|
my $readonly = $formField->getValueAsHtml; # where getValueAsHtml wouldn't set the correct options hashref
|
||||||
|
|
||||||
my $html = $self->admin->canOverride || $properties->{ managerCanEdit }
|
my $html = $self->admin->canOverride || $properties->{ managerCanEdit }
|
||||||
? $element
|
? $element
|
||||||
: $readonly
|
: $readonly
|
||||||
|
|
@ -458,12 +468,12 @@ sub www_edit {
|
||||||
|
|
||||||
$f->submit( value => $i18n->get( 'generate mailing' ) );
|
$f->submit( value => $i18n->get( 'generate mailing' ) );
|
||||||
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
||||||
$f->button(
|
$f->button(
|
||||||
value => $i18n->get( 'cancel' ),
|
value => $i18n->get( 'cancel' ),
|
||||||
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
||||||
);
|
);
|
||||||
|
|
||||||
return $self->renderInConsole( $f->print, $i18n->get('configure mailing') );
|
return $f;
|
||||||
}
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
@ -486,7 +496,7 @@ sub www_previewEmail {
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
my ( $form, $url ) = $session->quick( 'form', 'url' );
|
my ( $form, $url ) = $session->quick( 'form', 'url' );
|
||||||
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
|
||||||
return $session->privilege->insufficient unless $self->admin->canManage;
|
return $session->privilege->insufficient unless $self->admin->canManage;
|
||||||
|
|
||||||
my $asset = $self->getAsset;
|
my $asset = $self->getAsset;
|
||||||
|
|
@ -494,7 +504,7 @@ sub www_previewEmail {
|
||||||
my $manageUrl = $url->page('newsletter=manage');
|
my $manageUrl = $url->page('newsletter=manage');
|
||||||
my $subject = $asset->getSubject( $self->get('configuration') );
|
my $subject = $asset->getSubject( $self->get('configuration') );
|
||||||
|
|
||||||
my $userSelection =
|
my $userSelection =
|
||||||
qq{
|
qq{
|
||||||
<p><a href="$manageUrl">Terug naar de mailing manager.</a></p>
|
<p><a href="$manageUrl">Terug naar de mailing manager.</a></p>
|
||||||
<label for="acElem">Kies een gebruiker:</label>
|
<label for="acElem">Kies een gebruiker:</label>
|
||||||
|
|
@ -516,11 +526,11 @@ sub www_previewEmail {
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- Individual YUI CSS files -->
|
<!-- Individual YUI CSS files -->
|
||||||
<link rel="stylesheet" type="text/css" href="/extras/yui/build/autocomplete/assets/skins/sam/autocomplete.css">
|
<link rel="stylesheet" type="text/css" href="/extras/yui/build/autocomplete/assets/skins/sam/autocomplete.css">
|
||||||
<!-- Individual YUI JS files -->
|
<!-- Individual YUI JS files -->
|
||||||
<script type="text/javascript" src="/extras/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script>
|
<script type="text/javascript" src="/extras/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script>
|
||||||
<script type="text/javascript" src="/extras/yui/build/datasource/datasource-min.js"></script>
|
<script type="text/javascript" src="/extras/yui/build/datasource/datasource-min.js"></script>
|
||||||
<script type="text/javascript" src="/extras/yui/build/autocomplete/autocomplete-min.js"></script>
|
<script type="text/javascript" src="/extras/yui/build/autocomplete/autocomplete-min.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$js
|
$js
|
||||||
|
|
@ -544,8 +554,8 @@ sub getAutoCompleteJS {
|
||||||
my $contentBase = $url->page( "newsletter=mailing;func=previewContent;id=".$self->getId );
|
my $contentBase = $url->page( "newsletter=mailing;func=previewContent;id=".$self->getId );
|
||||||
|
|
||||||
my $data = to_json( [
|
my $data = to_json( [
|
||||||
map { {
|
map { {
|
||||||
id => $_->getId,
|
id => $_->getId,
|
||||||
name => $_->username . " (" . $_->get('email') . ")",
|
name => $_->username . " (" . $_->get('email') . ")",
|
||||||
} }
|
} }
|
||||||
grep { defined $_ }
|
grep { defined $_ }
|
||||||
|
|
@ -594,7 +604,7 @@ sub www_editSave {
|
||||||
return $session->privilege->insufficient unless $self->admin->canManage;
|
return $session->privilege->insufficient unless $self->admin->canManage;
|
||||||
|
|
||||||
my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
|
my %fields = %{ $self->getAsset->getMailingProperties( $self ) };
|
||||||
my $configuration = {};
|
my $configuration = {};
|
||||||
while ( my( $name, $properties ) = each %fields ) {
|
while ( my( $name, $properties ) = each %fields ) {
|
||||||
if ( $self->admin->canOverride || $properties->{ managerCanEdit } ) {
|
if ( $self->admin->canOverride || $properties->{ managerCanEdit } ) {
|
||||||
my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } );
|
my $value = $form->process( $name, $properties->{ fieldType }, $properties->{ defaultValue } );
|
||||||
|
|
@ -605,7 +615,7 @@ sub www_editSave {
|
||||||
$configuration->{ $name } = $properties->{ defaultValue } || $properties->{ value };
|
$configuration->{ $name } = $properties->{ defaultValue } || $properties->{ value };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#### TODO: Add error checking and required fields?
|
#### TODO: Add error checking and required fields?
|
||||||
$self->update( { configuration => $configuration } );
|
$self->update( { configuration => $configuration } );
|
||||||
|
|
||||||
|
|
@ -644,7 +654,7 @@ sub www_sendBatch {
|
||||||
extras => qq{class="forwardButton"},
|
extras => qq{class="forwardButton"},
|
||||||
);
|
);
|
||||||
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
||||||
$f->button(
|
$f->button(
|
||||||
value => $i18n->get( 'cancel' ),
|
value => $i18n->get( 'cancel' ),
|
||||||
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
||||||
);
|
);
|
||||||
|
|
@ -687,13 +697,13 @@ sub www_sendBatchConfirm {
|
||||||
my $scheduled = $form->dateTime( 'sendDate' );
|
my $scheduled = $form->dateTime( 'sendDate' );
|
||||||
|
|
||||||
return $self->www_sendBatch unless $scheduled;
|
return $self->www_sendBatch unless $scheduled;
|
||||||
|
|
||||||
my $asset = WebGUI::Asset->newByDynamicClass( $session, $self->get('assetId') );
|
my $asset = WebGUI::Asset->newByDynamicClass( $session, $self->get('assetId') );
|
||||||
croak "Cannot instaciate asset " . $self->get('assetId') unless $asset;
|
croak "Cannot instaciate asset " . $self->get('assetId') unless $asset;
|
||||||
|
|
||||||
$self->schedule( $scheduled );
|
$self->schedule( $scheduled );
|
||||||
|
|
||||||
return $self->renderInConsole(
|
return $self->renderInConsole(
|
||||||
sprintf( $i18n->get('schedule mailing success'),
|
sprintf( $i18n->get('schedule mailing success'),
|
||||||
$session->datetime->epochToHuman( $scheduled ),
|
$session->datetime->epochToHuman( $scheduled ),
|
||||||
$session->url->page('newsletter=manage'),
|
$session->url->page('newsletter=manage'),
|
||||||
|
|
@ -747,12 +757,12 @@ sub www_sendTestEmails {
|
||||||
multiple=> 1,
|
multiple=> 1,
|
||||||
options => \%options,
|
options => \%options,
|
||||||
);
|
);
|
||||||
$f->submit(
|
$f->submit(
|
||||||
value => $i18n->get('send test mails'),
|
value => $i18n->get('send test mails'),
|
||||||
extras => qq{class="forwardButton"},
|
extras => qq{class="forwardButton"},
|
||||||
);
|
);
|
||||||
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
my $cancelUrl = $session->url->page( 'newsletter=manage' );
|
||||||
$f->button(
|
$f->button(
|
||||||
value => $i18n->get( 'cancel' ),
|
value => $i18n->get( 'cancel' ),
|
||||||
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
extras => qq{onclick="window.location='$cancelUrl'" class="backwardButton"},
|
||||||
);
|
);
|
||||||
|
|
@ -774,7 +784,7 @@ sub www_sendTestEmailsConfirm {
|
||||||
|
|
||||||
$self->queueTestEmails( $to, \@userIds );
|
$self->queueTestEmails( $to, \@userIds );
|
||||||
|
|
||||||
return $self->renderInConsole(
|
return $self->renderInConsole(
|
||||||
sprintf( $i18n->get('send test mail success'),
|
sprintf( $i18n->get('send test mail success'),
|
||||||
scalar( @userIds ),
|
scalar( @userIds ),
|
||||||
$to,
|
$to,
|
||||||
|
|
|
||||||
|
|
@ -96,9 +96,10 @@ sub www_createMailing {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
my $form = $session->form;
|
my $form = $session->form;
|
||||||
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
|
||||||
return $session->privilege->insufficient unless $self->canManage;
|
return $session->privilege->insufficient unless $self->canManage;
|
||||||
|
|
||||||
my $assetId = $form->guid( 'assetId' );
|
my $assetId = $form->guid( 'assetId' );
|
||||||
my $issueId = $form->guid( 'issueId' );
|
my $issueId = $form->guid( 'issueId' );
|
||||||
|
|
||||||
|
|
@ -117,13 +118,70 @@ sub www_createMailing {
|
||||||
|
|
||||||
# All ok, create mailing.
|
# All ok, create mailing.
|
||||||
require WebGUI::Mailing;
|
require WebGUI::Mailing;
|
||||||
my $mailing = WebGUI::Mailing->create( $session, {
|
my $mailing = WebGUI::Mailing->create( $session, {
|
||||||
assetId => $assetId,
|
assetId => $assetId,
|
||||||
issueId => $issueId,
|
issueId => $issueId,
|
||||||
state => 'idle',
|
state => 'idle',
|
||||||
} );
|
} );
|
||||||
|
|
||||||
return $mailing->www_edit;
|
my $f = $mailing->getEditForm;
|
||||||
|
$f->hidden(
|
||||||
|
name => 'newsletter',
|
||||||
|
value => 'manage',
|
||||||
|
);
|
||||||
|
$f->hidden(
|
||||||
|
name => 'func',
|
||||||
|
value => 'createMailingSave',
|
||||||
|
);
|
||||||
|
$f->hidden(
|
||||||
|
name => 'assetId',
|
||||||
|
value => $assetId,
|
||||||
|
);
|
||||||
|
$f->hidden(
|
||||||
|
name => 'issueId',
|
||||||
|
value => $issueId,
|
||||||
|
);
|
||||||
|
|
||||||
|
my $output = $mailing->renderInConsole( $f->print, $i18n->get('configure mailing') );
|
||||||
|
$mailing->delete;
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
sub www_createMailingSave {
|
||||||
|
my $self = shift;
|
||||||
|
my $session = $self->session;
|
||||||
|
my $form = $session->form;
|
||||||
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
|
||||||
|
return $session->privilege->insufficient unless $self->canManage;
|
||||||
|
|
||||||
|
my $assetId = $form->guid( 'assetId' );
|
||||||
|
my $issueId = $form->guid( 'issueId' );
|
||||||
|
|
||||||
|
# Sanity check: does assetId exist?
|
||||||
|
my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId )
|
||||||
|
|| return "Error: Asset [$assetId] could not be instanciated";
|
||||||
|
|
||||||
|
# Sanity check: is asset mailable?
|
||||||
|
unless ( $asset->isa( 'WebGUI::AssetAspect::Mailable' ) ) {
|
||||||
|
return "Error: Asset [$assetId] is not Mailable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sanity check: does issue exist?
|
||||||
|
my $issue = WebGUI::Asset->newByDynamicClass( $session, $issueId )
|
||||||
|
|| return "Error: issue [$issueId] for asset [$assetId] could not be instanciated.";
|
||||||
|
|
||||||
|
# All ok, create mailing.
|
||||||
|
require WebGUI::Mailing;
|
||||||
|
my $mailing = WebGUI::Mailing->create( $session, {
|
||||||
|
assetId => $assetId,
|
||||||
|
issueId => $issueId,
|
||||||
|
state => 'idle',
|
||||||
|
} );
|
||||||
|
|
||||||
|
return $mailing->www_editSave;
|
||||||
}
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
@ -193,7 +251,7 @@ sub www_settingsSave {
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
|
|
||||||
return $session->privilege->insufficient unless $self->isAdmin;
|
return $session->privilege->insufficient unless $self->isAdmin;
|
||||||
|
|
||||||
my ($setting, $form) = $session->quick( 'setting', 'form' );
|
my ($setting, $form) = $session->quick( 'setting', 'form' );
|
||||||
|
|
||||||
$setting->set( 'newsletterReturnDomain', $form->get('newsletterReturnDomain') );
|
$setting->set( 'newsletterReturnDomain', $form->get('newsletterReturnDomain') );
|
||||||
|
|
@ -215,7 +273,7 @@ sub www_view {
|
||||||
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
my $i18n = WebGUI::International->new( $session, 'MailingManager' );
|
||||||
|
|
||||||
return $session->privilege->insufficient unless $self->canManage;
|
return $session->privilege->insufficient unless $self->canManage;
|
||||||
|
|
||||||
return $self->www_settings unless $self->configurationComplete;
|
return $self->www_settings unless $self->configurationComplete;
|
||||||
|
|
||||||
my $mailableAssets = $self->getMailables;
|
my $mailableAssets = $self->getMailables;
|
||||||
|
|
@ -235,14 +293,14 @@ sub www_view {
|
||||||
push @mailings, $mailing->getViewVars;
|
push @mailings, $mailing->getViewVars;
|
||||||
};
|
};
|
||||||
|
|
||||||
push @issues, {
|
push @issues, {
|
||||||
%{ $issue->get },
|
%{ $issue->get },
|
||||||
url => $issue->getUrl,
|
url => $issue->getUrl,
|
||||||
createMailingUrl => $url->page("newsletter=manage;func=createMailing;assetId=$assetId;issueId=$issueId"),
|
createMailingUrl => $url->page("newsletter=manage;func=createMailing;assetId=$assetId;issueId=$issueId"),
|
||||||
editUrl => $issue->getUrl( 'func=edit' ),
|
editUrl => $issue->getUrl( 'func=edit' ),
|
||||||
mailing_loop => \@mailings,
|
mailing_loop => \@mailings,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
push @newsletterLoop, {
|
push @newsletterLoop, {
|
||||||
%{ $asset->get },
|
%{ $asset->get },
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue