converted import

This commit is contained in:
Jonathan Labreuille
2016-08-17 12:16:58 +02:00
parent 213bca8050
commit 9582e58dda
4 changed files with 214 additions and 248 deletions

View File

@@ -191,39 +191,33 @@ define(
mailChimpKeyVerifyButtonElement.click(function () { mailChimpKeyVerifyButtonElement.click(function () {
MailPoet.Modal.loading(true); MailPoet.Modal.loading(true);
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'ImportExport', endpoint: 'importExport',
action: 'getMailChimpLists', action: 'getMailChimpLists',
data: {api_key: mailChimpKeyInputElement.val()} data: {
}).done(function (response) { api_key: mailChimpKeyInputElement.val()
if (response.result === false) { }
MailPoet.Notice.hide(); }).always(function() {
MailPoet.Notice.error(response.errors); MailPoet.Modal.loading(false);
jQuery('.mailpoet_mailchimp-key-status') }).done(function(response) {
.removeClass() jQuery('.mailpoet_mailchimp-key-status')
.addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-error'); .html('')
.removeClass()
.addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok');
if (response.data.length === 0) {
jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists'));
mailChimpListsContainerElement.hide(); mailChimpListsContainerElement.hide();
toggleNextStepButton(mailChimpProcessButtonElement, 'off'); toggleNextStepButton(mailChimpProcessButtonElement, 'off');
} else { } else {
jQuery('.mailpoet_mailchimp-key-status') displayMailChimpLists(response.data);
.html('') }
.removeClass() }).fail(function(response) {
.addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok'); if (response.errors.length > 0) {
if (!response.data) { MailPoet.Notice.error(
jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists')); response.errors.map(function(error) { return error.message; }),
mailChimpListsContainerElement.hide(); { scroll: true }
toggleNextStepButton(mailChimpProcessButtonElement, 'off'); );
} else {
displayMailChimpLists(response.data);
}
} }
MailPoet.Modal.loading(false);
}).fail(function (error) {
MailPoet.Modal.loading(false);
MailPoet.Notice.error(
MailPoet.I18n.t('serverError') + error.statusText.toLowerCase() + '.'
);
}); });
MailPoet.Modal.loading(false);
}); });
mailChimpProcessButtonElement.click(function () { mailChimpProcessButtonElement.click(function () {
@@ -232,27 +226,24 @@ define(
} }
MailPoet.Modal.loading(true); MailPoet.Modal.loading(true);
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'ImportExport', endpoint: 'importExport',
action: 'getMailChimpSubscribers', action: 'getMailChimpSubscribers',
data: { data: {
api_key: mailChimpKeyInputElement.val(), api_key: mailChimpKeyInputElement.val(),
lists: mailChimpListsContainerElement.find('select').val() lists: mailChimpListsContainerElement.find('select').val()
} }
}).always(function(response) {
MailPoet.Modal.loading(false);
}).done(function (response) { }).done(function (response) {
if (response.result === true) { importData.step1 = response.data;
importData.step1 = response.data; router.navigate('step2', {trigger: true});
router.navigate('step2', {trigger: true});
}
else {
MailPoet.Notice.hide();
MailPoet.Notice.error(response.errors);
}
MailPoet.Modal.loading(false);
}).fail(function () { }).fail(function () {
MailPoet.Modal.loading(false); if (response.errors.length > 0) {
MailPoet.Notice.error( MailPoet.Notice.error(
MailPoet.I18n.t('serverError') + result.statusText.toLowerCase() + '.' response.errors.map(function(error) { return error.message; }),
); { scroll: true }
);
}
}); });
}); });
@@ -571,79 +562,54 @@ define(
}) })
} }
jQuery('.mailpoet_create_segment').click(function () { jQuery('.mailpoet_create_segment').click(function() {
MailPoet.Modal.popup({ MailPoet.Modal.popup({
title: MailPoet.I18n.t('addNewList'), title: MailPoet.I18n.t('addNewList'),
template: jQuery('#new_segment_template').html() template: jQuery('#new_segment_template').html()
}) })
jQuery('#new_segment_name').keypress(function (e) { jQuery('#new_segment_name').keypress(function(e) {
if (e.which == 13) { if (e.which == 13) {
jQuery('#new_segment_process').click(); jQuery('#new_segment_process').click();
} }
}); });
jQuery('#new_segment_process').click(function () { jQuery('#new_segment_process').click(function () {
var segmentName = jQuery('#new_segment_name').val().trim(), var segmentName = jQuery('#new_segment_name').val().trim();
segmentDescription = jQuery('#new_segment_description').val().trim(), var segmentDescription = jQuery('#new_segment_description').val().trim();
isDuplicateListName = ( jQuery.map(mailpoetSegments, function (el) {
if (el.name.toLowerCase() === segmentName.toLowerCase()) {
return true;
}
}).length && segmentName) ? true : false;
if (segmentName === '') {
jQuery('.mailpoet_validation_error[data-error="segment_name_required"]:hidden').show();
} else {
jQuery('.mailpoet_validation_error[data-error="segment_name_required"]:visible').hide();
}
if (isDuplicateListName) {
jQuery('.mailpoet_validation_error[data-error="segment_name_not_unique"]:hidden').show();
} else {
jQuery('.mailpoet_validation_error[data-error="segment_name_not_unique"]:visible').hide();
}
if (segmentName && !isDuplicateListName) {
jQuery('.mailpoet_validation_error[data-error="segment_name_required"]:visible').hide();
MailPoet.Ajax
.post({
endpoint: 'ImportExport',
action: 'addSegment',
data: {
name: segmentName,
description: segmentDescription
}
})
.done(function (response) {
if (response.result === true) {
mailpoetSegments.push({
'id': response.segment.id,
'name': response.segment.name
});
var selected_values = segmentSelectElement.val(); MailPoet.Ajax.post({
if (selected_values === null) { endpoint: 'ImportExport',
selected_values = [response.segment.id] action: 'addSegment',
} else { data: {
selected_values.push(response.segment.id); name: segmentName,
} description: segmentDescription
}
}).done(function(response) {
mailpoetSegments.push({
'id': response.data.id,
'name': response.data.name
});
enableSegmentSelection(mailpoetSegments); var selected_values = segmentSelectElement.val();
segmentSelectElement.val(selected_values).trigger('change'); if (selected_values === null) {
jQuery('.mailpoet_segments:hidden').show(); selected_values = [response.data.id]
jQuery('.mailpoet_no_segments:visible').hide(); } else {
MailPoet.Modal.close(); selected_values.push(response.data.id);
} }
else {
MailPoet.Modal.close(); enableSegmentSelection(mailpoetSegments);
MailPoet.Notice.error( segmentSelectElement.val(selected_values).trigger('change');
MailPoet.I18n.t('segmentCreateError') + response.message + '.' jQuery('.mailpoet_segments:hidden').show();
); jQuery('.mailpoet_no_segments:visible').hide();
} MailPoet.Modal.close();
}) }).fail(function(response) {
.fail(function (error) { if (response.errors.length > 0) {
MailPoet.Modal.close(); MailPoet.Notice.hide();
MailPoet.Notice.error( MailPoet.Notice.error(
MailPoet.I18n.t('serverError') + error.statusText.toLowerCase() + '.' response.errors.map(function(error) { return error.message; }),
); { positionAfter: '#new_segment_name' }
}); );
} }
});
}); });
jQuery('#new_segment_cancel').click(function () { jQuery('#new_segment_cancel').click(function () {
MailPoet.Modal.close(); MailPoet.Modal.close();
@@ -769,51 +735,49 @@ define(
action: 'save', action: 'save',
data: data data: data
}).done(function(response) { }).done(function(response) {
if(response.result === true) { var new_column_data = {
var new_column_data = { 'id': response.data.id,
'id': response.field.id, 'name': response.data.name,
'name': response.field.name, 'type': response.data.type,
'type': response.field.type, 'params': response.data.params,
'params': response.field.params, 'custom': true
'custom': true };
}; // if this is the first custom column, create an "optgroup"
// if this is the first custom column, create an "optgroup" if (mailpoetColumnsSelect2.length === 2) {
if (mailpoetColumnsSelect2.length === 2) { mailpoetColumnsSelect2.push({
mailpoetColumnsSelect2.push({ 'name': MailPoet.I18n.t('userColumns'),
'name': MailPoet.I18n.t('userColumns'), 'children': []
'children': [] });
});
}
mailpoetColumnsSelect2[2].children.push(new_column_data);
mailpoetColumns.push(new_column_data);
jQuery('select.mailpoet_subscribers_column_data_match')
.each(function () {
jQuery(this)
.html('')
.select2('destroy')
.select2({
data: mailpoetColumnsSelect2,
width: '15em',
templateResult: function (item) {
return item.name;
},
templateSelection: function (item) {
return item.name;
}
})
});
jQuery(selectElement).data('column-id', new_column_data.id);
jQuery(selectElement).data('validation-rule', false);
filterSubscribers();
// close popup
MailPoet.Modal.close();
} }
else { mailpoetColumnsSelect2[2].children.push(new_column_data);
if(response.errors.length > 0) { mailpoetColumns.push(new_column_data);
jQuery(response.errors).each(function(i, error) { jQuery('select.mailpoet_subscribers_column_data_match')
MailPoet.Notice.error(error, {positionAfter: '#field_name'}); .each(function () {
}); jQuery(this)
} .html('')
.select2('destroy')
.select2({
data: mailpoetColumnsSelect2,
width: '15em',
templateResult: function (item) {
return item.name;
},
templateSelection: function (item) {
return item.name;
}
})
});
jQuery(selectElement).data('column-id', new_column_data.id);
jQuery(selectElement).data('validation-rule', false);
filterSubscribers();
// close popup
MailPoet.Modal.close();
}).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ positionAfter: '#field_name' }
);
} }
}); });
return false; return false;
@@ -975,11 +939,11 @@ define(
nextStepButton.addClass(disabled); nextStepButton.addClass(disabled);
} }
previousStepButton.off().click(function () { previousStepButton.off().on('click', function () {
router.navigate('step1', {trigger: true}); router.navigate('step1', { trigger: true });
}); });
nextStepButton.off().click(function () { nextStepButton.off().on('click', function () {
if (jQuery(this).hasClass('button-disabled')) { if (jQuery(this).hasClass('button-disabled')) {
return; return;
} }
@@ -1019,37 +983,33 @@ define(
}); });
_.each(subscribers, function () { _.each(subscribers, function () {
queue.add(function (queue) { queue.add(function(queue) {
queue.pause(); queue.pause();
MailPoet.Ajax MailPoet.Ajax.post({
.post({ endpoint: 'ImportExport',
endpoint: 'ImportExport', action: 'processImport',
action: 'processImport', data: JSON.stringify({
data: JSON.stringify({ columns: columns,
columns: columns, subscribers: subscribers[batchNumber],
subscribers: subscribers[batchNumber], timestamp: timestamp,
timestamp: timestamp, segments: segmentSelectElement.val(),
segments: segmentSelectElement.val(), updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') ? true : false
updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') ? true : false
})
}) })
.done(function (response) { }).done(function(response) {
if (response.result === false) { importResults.created = response.data.created;
importResults.errors.push(response.errors); importResults.updated = response.data.updated;
} else { importResults.segments = response.data.segments;
importResults.created = response.data.created; importResults.added_to_segment_with_welcome_notification = response.data.added_to_segment_with_welcome_notification;
importResults.updated = response.data.updated; queue.run();
importResults.segments = response.data.segments; }).fail(function(response) {
importResults.added_to_segment_with_welcome_notification = response.data.added_to_segment_with_welcome_notification; MailPoet.Modal.loading(false);
} if (response.errors.length > 0) {
queue.run(); MailPoet.Notice.error(
}) response.errors.map(function(error) { return error.message; }),
.fail(function (error) { { scroll: true }
importResults.errors.push(
MailPoet.I18n.t('serverError') + error.statusText.toLowerCase() + '.'
); );
queue.run(); }
}); });
batchNumber++; batchNumber++;
}) })
}); });

View File

@@ -1,5 +1,7 @@
<?php <?php
namespace MailPoet\API\Endpoints; namespace MailPoet\API\Endpoints;
use \MailPoet\API\Endpoint as APIEndpoint;
use \MailPoet\API\Error as APIError;
use MailPoet\Subscribers\ImportExport\Import\MailChimp; use MailPoet\Subscribers\ImportExport\Import\MailChimp;
use MailPoet\Models\CustomField; use MailPoet\Models\CustomField;
@@ -7,42 +9,69 @@ use MailPoet\Models\Segment;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class ImportExport { class ImportExport extends APIEndpoint {
function getMailChimpLists($data) { function getMailChimpLists($data) {
$mailChimp = new MailChimp($data['api_key']); try {
return $mailChimp->getLists(); $mailChimp = new MailChimp($data['api_key']);
$lists = $mailChimp->getLists();
return $this->successResponse($lists);
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
function getMailChimpSubscribers($data) { function getMailChimpSubscribers($data) {
$mailChimp = new MailChimp($data['api_key']); try {
return $mailChimp->getSubscribers($data['lists']); $mailChimp = new MailChimp($data['api_key']);
$subscribers = $mailChimp->getSubscribers($data['lists']);
return $this->successResponse($subscribers);
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
function addSegment($data) { function addSegment($data) {
$segment = Segment::createOrUpdate($data); $segment = Segment::createOrUpdate($data);
return ( $errors = $segment->getErrors();
($segment->id) ?
array( if(!empty($errors)) {
'result' => true, return $this->errorResponse($errors);
'segment' => $segment->asArray() } else {
) : return $this->successResponse(
array( Segment::findOne($segment->id)->asArray()
'result' => false );
) }
);
} }
function processImport($data) { function processImport($data) {
$import = new \MailPoet\Subscribers\ImportExport\Import\Import( try {
json_decode($data, true) $import = new \MailPoet\Subscribers\ImportExport\Import\Import(
); json_decode($data, true)
return $import->process(); );
$process = $import->process();
return $this->successResponse($process);
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
function processExport($data) { function processExport($data) {
$export = new \MailPoet\Subscribers\ImportExport\Export\Export( try {
json_decode($data, true) $export = new \MailPoet\Subscribers\ImportExport\Export\Export(
); json_decode($data, true)
return $export->process(); );
$process = $export->process();
return $this->successResponse($process);
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
} }

View File

@@ -19,7 +19,6 @@ class Import {
public $subscribers_count; public $subscribers_count;
public $created_at; public $created_at;
public $updated_at; public $updated_at;
public $profiler_start;
public function __construct($data) { public function __construct($data) {
$this->subscribers_data = $this->transformSubscribersData( $this->subscribers_data = $this->transformSubscribersData(
@@ -40,7 +39,6 @@ class Import {
$this->subscribers_count = count(reset($this->subscribers_data)); $this->subscribers_count = count(reset($this->subscribers_data));
$this->created_at = date('Y-m-d H:i:s', (int)$data['timestamp']); $this->created_at = date('Y-m-d H:i:s', (int)$data['timestamp']);
$this->updated_at = date('Y-m-d H:i:s', (int)$data['timestamp'] + 1); $this->updated_at = date('Y-m-d H:i:s', (int)$data['timestamp'] + 1);
$this->profiler_start = microtime(true);
} }
function getSubscriberFieldsValidationRules($subscriber_fields) { function getSubscriberFieldsValidationRules($subscriber_fields) {
@@ -92,10 +90,7 @@ class Import {
} }
} }
} catch(\PDOException $e) { } catch(\PDOException $e) {
return array( throw new \Exception($e->getMessage());
'result' => false,
'errors' => array($e->getMessage())
);
} }
$import_factory = new ImportExportFactory('import'); $import_factory = new ImportExportFactory('import');
$segments = $import_factory->getSegments(); $segments = $import_factory->getSegments();
@@ -104,15 +99,11 @@ class Import {
Newsletter::getWelcomeNotificationsForSegments($this->segments) : Newsletter::getWelcomeNotificationsForSegments($this->segments) :
false; false;
return array( return array(
'result' => true, 'created' => count($created_subscribers),
'data' => array( 'updated' => count($updated_subscribers),
'created' => count($created_subscribers), 'segments' => $segments,
'updated' => count($updated_subscribers), 'added_to_segment_with_welcome_notification' =>
'segments' => $segments, ($welcome_notifications_in_segments) ? true : false
'added_to_segment_with_welcome_notification' =>
($welcome_notifications_in_segments) ? true : false
),
'profiler' => $this->timeExecution()
); );
} }
@@ -415,9 +406,4 @@ class Import {
); );
} }
} }
function timeExecution() {
$profiler_end = microtime(true);
return ($profiler_end - $this->profiler_start) / 60;
}
} }

View File

@@ -14,13 +14,13 @@ class MailChimp {
function getLists() { function getLists() {
if(!$this->api_key || !$this->data_center) { if(!$this->api_key || !$this->data_center) {
return $this->processError('API'); return $this->throwException('API');
} }
$connection = @fopen(sprintf($this->lists_url, $this->data_center, $this->api_key), 'r'); $connection = @fopen(sprintf($this->lists_url, $this->data_center, $this->api_key), 'r');
if(!$connection) { if(!$connection) {
return $this->processError('connection'); return $this->throwException('connection');
} else { } else {
$response = ''; $response = '';
while(!feof($connection)) { while(!feof($connection)) {
@@ -35,7 +35,7 @@ class MailChimp {
$response = json_decode($response); $response = json_decode($response);
if(!$response) { if(!$response) {
return $this->processError('API'); return $this->throwException('API');
} }
foreach($response->data as $list) { foreach($response->data as $list) {
@@ -45,19 +45,16 @@ class MailChimp {
); );
} }
return array( return $lists;
'result' => true,
'data' => $lists
);
} }
function getSubscribers($lists = array()) { function getSubscribers($lists = array()) {
if(!$this->api_key || !$this->data_center) { if(!$this->api_key || !$this->data_center) {
return $this->processError('API'); return $this->throwException('API');
} }
if(!$lists) { if(!$lists) {
return $this->processError('lists'); return $this->throwException('lists');
} }
$bytes_fetched = 0; $bytes_fetched = 0;
@@ -65,7 +62,7 @@ class MailChimp {
$url = sprintf($this->export_url, $this->data_center, $this->api_key, $list); $url = sprintf($this->export_url, $this->data_center, $this->api_key, $list);
$connection = @fopen($url, 'r'); $connection = @fopen($url, 'r');
if(!$connection) { if(!$connection) {
return $this->processError('connection'); return $this->throwException('connection');
} }
$i = 0; $i = 0;
$header = array(); $header = array();
@@ -76,13 +73,13 @@ class MailChimp {
if($i === 0) { if($i === 0) {
$header = $obj; $header = $obj;
if(is_object($header) && isset($header->error)) { if(is_object($header) && isset($header->error)) {
return $this->processError('lists'); return $this->throwException('lists');
} }
if(!isset($header_hash)) { if(!isset($header_hash)) {
$header_hash = md5(implode(',', $header)); $header_hash = md5(implode(',', $header));
} else { } else {
if(md5(implode(',', $header) !== $header_hash)) { if(md5(implode(',', $header) !== $header_hash)) {
return $this->processError('headers'); return $this->throwException('headers');
} }
} }
} else { } else {
@@ -92,25 +89,22 @@ class MailChimp {
} }
$bytes_fetched += strlen($buffer); $bytes_fetched += strlen($buffer);
if($bytes_fetched > $this->max_post_size) { if($bytes_fetched > $this->max_post_size) {
return $this->processError('size'); return $this->throwException('size');
} }
} }
fclose($connection); fclose($connection);
} }
if(!count($subscribers)) { if(!count($subscribers)) {
return $this->processError('subscribers'); return $this->throwException('subscribers');
} }
return array( return array(
'result' => true, 'subscribers' => $subscribers,
'data' => array( 'invalid' => false,
'subscribers' => $subscribers, 'duplicate' => false,
'invalid' => false, 'header' => $header,
'duplicate' => false, 'subscribersCount' => count($subscribers)
'header' => $header,
'subscribersCount' => count($subscribers)
)
); );
} }
@@ -125,7 +119,7 @@ class MailChimp {
return (preg_match('/[a-zA-Z0-9]{32}-[a-zA-Z0-9]{3,}/', $APIKey)) ? $APIKey : false; return (preg_match('/[a-zA-Z0-9]{32}-[a-zA-Z0-9]{3,}/', $APIKey)) ? $APIKey : false;
} }
function processError($error) { function throwException($error) {
switch($error) { switch($error) {
case 'API': case 'API':
$errorMessage = __('Invalid API Key.'); $errorMessage = __('Invalid API Key.');
@@ -146,9 +140,6 @@ class MailChimp {
$errorMessage = __('Did not find any valid lists'); $errorMessage = __('Did not find any valid lists');
break; break;
} }
return array( throw new \Exception($errorMessage);
'result' => false,
'errors' => array($errorMessage)
);
} }
} }