Merge pull request #798 from mailpoet/form_segments_fix
Filter lists that can be subscribed to using any particular form [MAILPOET-777]
This commit is contained in:
@ -71,6 +71,7 @@ class Subscribers extends APIEndpoint {
|
|||||||
? (array)$data['segments']
|
? (array)$data['segments']
|
||||||
: array()
|
: array()
|
||||||
);
|
);
|
||||||
|
$segment_ids = $form->filterSegments($segment_ids);
|
||||||
unset($data['segments']);
|
unset($data['segments']);
|
||||||
|
|
||||||
if(empty($segment_ids)) {
|
if(empty($segment_ids)) {
|
||||||
@ -97,6 +98,7 @@ class Subscribers extends APIEndpoint {
|
|||||||
|
|
||||||
$form = $form->asArray();
|
$form = $form->asArray();
|
||||||
|
|
||||||
|
if(!empty($form['settings']['on_success'])) {
|
||||||
if($form['settings']['on_success'] === 'page') {
|
if($form['settings']['on_success'] === 'page') {
|
||||||
// redirect to a page on a success, pass the page url in the meta
|
// redirect to a page on a success, pass the page url in the meta
|
||||||
$meta['redirect_url'] = get_permalink($form['settings']['success_page']);
|
$meta['redirect_url'] = get_permalink($form['settings']['success_page']);
|
||||||
@ -104,6 +106,7 @@ class Subscribers extends APIEndpoint {
|
|||||||
$meta['redirect_url'] = $form['settings']['success_url'];
|
$meta['redirect_url'] = $form['settings']['success_url'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $this->successResponse(
|
return $this->successResponse(
|
||||||
Subscriber::findOne($subscriber->id)->asArray(),
|
Subscriber::findOne($subscriber->id)->asArray(),
|
||||||
|
@ -65,6 +65,23 @@ class Form extends Model {
|
|||||||
return $fields ?: false;
|
return $fields ?: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filterSegments(array $segment_ids = array()) {
|
||||||
|
$form = $this->asArray();
|
||||||
|
if(empty($form['settings']['segments'])) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($form['settings']['segments_selected_by'])
|
||||||
|
&& $form['settings']['segments_selected_by'] == 'user'
|
||||||
|
) {
|
||||||
|
$segment_ids = array_intersect($segment_ids, $form['settings']['segments']);
|
||||||
|
} else {
|
||||||
|
$segment_ids = $form['settings']['segments'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $segment_ids;
|
||||||
|
}
|
||||||
|
|
||||||
static function search($orm, $search = '') {
|
static function search($orm, $search = '') {
|
||||||
return $orm->whereLike('name', '%'.$search.'%');
|
return $orm->whereLike('name', '%'.$search.'%');
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,14 @@ class SubscribersTest extends MailPoetTest {
|
|||||||
|
|
||||||
$this->form = Form::createOrUpdate(array(
|
$this->form = Form::createOrUpdate(array(
|
||||||
'name' => 'My Form',
|
'name' => 'My Form',
|
||||||
'body' => Fixtures::get('form_body_template')
|
'body' => Fixtures::get('form_body_template'),
|
||||||
|
'settings' => array(
|
||||||
|
'segments_selected_by' => 'user',
|
||||||
|
'segments' => array(
|
||||||
|
$this->segment_1->id,
|
||||||
|
$this->segment_2->id
|
||||||
|
)
|
||||||
|
)
|
||||||
));
|
));
|
||||||
|
|
||||||
// setup mailer
|
// setup mailer
|
||||||
@ -393,7 +400,7 @@ class SubscribersTest extends MailPoetTest {
|
|||||||
expect($response->errors[0]['message'])->equals('Please specify a valid form ID.');
|
expect($response->errors[0]['message'])->equals('Please specify a valid form ID.');
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItCannotSubscribeWithoutSegments() {
|
function testItCannotSubscribeWithoutSegmentsIfTheyAreSelectedByUser() {
|
||||||
$router = new Subscribers();
|
$router = new Subscribers();
|
||||||
$response = $router->subscribe(array(
|
$response = $router->subscribe(array(
|
||||||
'email' => 'toto@mailpoet.com',
|
'email' => 'toto@mailpoet.com',
|
||||||
@ -415,6 +422,45 @@ class SubscribersTest extends MailPoetTest {
|
|||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItCanSubscribeWithoutSegmentsIfTheyAreSelectedByAdmin() {
|
||||||
|
$form = $this->form->asArray();
|
||||||
|
$form['settings']['segments_selected_by'] = 'admin';
|
||||||
|
$this->form->settings = $form['settings'];
|
||||||
|
$this->form->save();
|
||||||
|
|
||||||
|
$router = new Subscribers();
|
||||||
|
$response = $router->subscribe(array(
|
||||||
|
'email' => 'toto@mailpoet.com',
|
||||||
|
'form_id' => $this->form->id
|
||||||
|
// no segments specified
|
||||||
|
));
|
||||||
|
|
||||||
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
|
$subscriber = Subscriber::findOne($response->data['id']);
|
||||||
|
$subscriber_segments = $subscriber->segments()->findArray();
|
||||||
|
expect($subscriber_segments)->count(2);
|
||||||
|
expect($subscriber_segments[0]['id'])->equals($form['settings']['segments'][0]);
|
||||||
|
expect($subscriber_segments[1]['id'])->equals($form['settings']['segments'][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCannotSubscribeIfFormHasNoSegmentsDefined() {
|
||||||
|
$form = $this->form->asArray();
|
||||||
|
$form['settings']['segments_selected_by'] = 'admin';
|
||||||
|
unset($form['settings']['segments']);
|
||||||
|
$this->form->settings = $form['settings'];
|
||||||
|
$this->form->save();
|
||||||
|
|
||||||
|
$router = new Subscribers();
|
||||||
|
$response = $router->subscribe(array(
|
||||||
|
'email' => 'toto@mailpoet.com',
|
||||||
|
'form_id' => $this->form->id,
|
||||||
|
'segments' => array($this->segment_1->id, $this->segment_2->id)
|
||||||
|
));
|
||||||
|
|
||||||
|
expect($response->status)->equals(APIResponse::STATUS_BAD_REQUEST);
|
||||||
|
expect($response->errors[0]['message'])->equals('Please select a list.');
|
||||||
|
}
|
||||||
|
|
||||||
function testItCanFilterOutNonFormFieldsWhenSubscribing() {
|
function testItCanFilterOutNonFormFieldsWhenSubscribing() {
|
||||||
$router = new Subscribers();
|
$router = new Subscribers();
|
||||||
$response = $router->subscribe(array(
|
$response = $router->subscribe(array(
|
||||||
@ -429,10 +475,9 @@ class SubscribersTest extends MailPoetTest {
|
|||||||
'bogus' => 'hahaha'
|
'bogus' => 'hahaha'
|
||||||
));
|
));
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
$subscriber = Subscriber::findOne($response->data['id']);
|
expect($response->data['first_name'])->equals('aaa');
|
||||||
expect($subscriber->first_name)->equals('aaa');
|
expect($response->data['last_name'])->isEmpty();
|
||||||
expect($subscriber->last_name)->isEmpty();
|
expect(isset($response->data['bogus']))->false();
|
||||||
expect(isset($subscriber->bogus))->false();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItCannotMassSubscribe() {
|
function testItCannotMassSubscribe() {
|
||||||
|
@ -18,11 +18,6 @@
|
|||||||
<input type="hidden" name="endpoint" value="subscribers" />
|
<input type="hidden" name="endpoint" value="subscribers" />
|
||||||
<input type="hidden" name="method" value="subscribe" />
|
<input type="hidden" name="method" value="subscribe" />
|
||||||
|
|
||||||
<% if not(form.settings.segments_selected_by == 'user') %>
|
|
||||||
<% for segment in form.settings.segments %>
|
|
||||||
<input type="hidden" name="segments[]" value="<%= segment %>" />
|
|
||||||
<% endfor %>
|
|
||||||
<% endif %>
|
|
||||||
<%= html | raw %>
|
<%= html | raw %>
|
||||||
<div class="mailpoet_message">
|
<div class="mailpoet_message">
|
||||||
<p
|
<p
|
||||||
|
Reference in New Issue
Block a user