- Rebased master

- Cleaned up import & moved it under Subscribers menu
This commit is contained in:
MrCasual
2015-11-07 14:38:38 -05:00
parent 3f168d052f
commit b1ae07d38e
12 changed files with 546 additions and 316 deletions

View File

@@ -1,4 +1,5 @@
<?php namespace MailPoet\Import;
<?php
namespace MailPoet\Import;
use MailPoet\Models\CustomField;
use MailPoet\Models\Segment;
@@ -17,14 +18,20 @@ class BootstrapMenu {
's_email' => __('Email'),
's_first_name' => __('First name'),
's_last_name' => __('Last name'),
/* 's_confirmed_ip' => __('IP address'),
's_confirmed_at' => __('Subscription date'),*/
's_status' => __('Status')
/* 's_confirmed_ip' => __('IP address')
's_confirmed_at' => __('Subscription date')*/
);
}
function getSegments() {
return Segment::findArray();
return array_map(function ($segment) {
return array(
'id' => $segment['id'],
'name' => $segment['name'],
'subscriberCount' => $segment['subscribers']
);
}, Segment::filter('filterWithSubscriberCount')->findArray());
}
function getSubscriberCustomFields() {
@@ -84,12 +91,7 @@ class BootstrapMenu {
}
function bootstrap() {
$data['segments'] = array_map(function ($segment) {
return array(
'id' => $segment['id'],
'name' => $segment['name'],
);
}, $this->getSegments());
$data['segments'] = $this->segments;
$data['subscriberFields'] = array_merge(
$this->formatSubscriberFields(),

View File

@@ -1,7 +1,10 @@
<?php namespace MailPoet\Import;
<?php
namespace MailPoet\Import;
use MailPoet\Import\BootstrapMenu;
use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberCustomField;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Util\Helpers;
class Import {
@@ -23,42 +26,52 @@ class Import {
list($subscribersData, $subscriberFields) = $this->extendSubscribersAndFields(
$subscribersData, $subscriberFields
);
list($existingSubscribers, $newSubscribers) = $this->splitSubscribers(
$subscribersData
);
list($existingSubscribers, $newSubscribers) =
$this->filterExistingAndNewSubscribers($subscribersData);
$addedSubscribers = $updatedSubscribers = array();
if($newSubscribers) {
$addedSubscribers = $this->addOrUpdateSubscribers(
'create',
$newSubscribers,
$subscriberFields
);
}
if($existingSubscribers && $this->updateSubscribers) {
$updatedSubscribers = $this->addOrUpdateSubscribers(
'update',
$existingSubscribers,
$subscriberFields
);
if($addedSubscribers) {
$updatedSubscribers = array_diff_key(
$updatedSubscribers,
$addedSubscribers
try {
if($newSubscribers) {
$addedSubscribers = $this->addOrUpdateSubscribers(
'create',
$newSubscribers,
$subscriberFields
);
$this->addSubscribersToSegments(array_keys($addedSubscribers));
}
if($existingSubscribers && $this->updateSubscribers) {
$updatedSubscribers = $this->addOrUpdateSubscribers(
'update',
$existingSubscribers,
$subscriberFields
);
$this->addSubscribersToSegments(array_keys($updatedSubscribers));
if($addedSubscribers) {
// subtract added from updated subscribers when DB operation takes <1s
$updatedSubscribers = array_diff_key(
$updatedSubscribers,
$addedSubscribers
);
}
}
} catch (\PDOException $e) {
return array(
'result' => false,
'error' => $e->getMessage()
);
}
$segments = new BootstrapMenu();
return array(
'result' => true,
'data' => array(
'added' => count($addedSubscribers),
'updated' => count($updatedSubscribers),
'segments' => $segments->getSegments()
),
'profile' => $this->timeExecution()
);
}
function splitSubscribers($subscribersData) {
function filterExistingAndNewSubscribers($subscribersData) {
$existingRecords = array_filter(
array_map(function ($subscriberEmails) {
return Subscriber::selectMany(array('email'))
@@ -178,22 +191,18 @@ class Import {
$subscriberFields = str_replace('s_', '', $subscriberFields);
$currentTime = ($action === 'update') ? date('Y-m-d H:i:s') : $this->currentTime;
foreach (array_chunk($subscribers, 200) as $data) {
try {
if($action == 'create') {
Subscriber::createMultiple(
$subscriberFields,
$data
);
}
if($action == 'update') {
Subscriber::updateMultiple(
$subscriberFields,
$data,
$currentTime
);
}
} catch (\PDOException $e) {
throw new \Exception($e->getMessage());
if($action == 'create') {
Subscriber::createMultiple(
$subscriberFields,
$data
);
}
if($action == 'update') {
Subscriber::updateMultiple(
$subscriberFields,
$data,
$currentTime
);
}
}
$result = Helpers::arrayColumn( // return id=>email array of results
@@ -235,20 +244,22 @@ class Import {
}, $count, $subscribersData[$column]);
}, $this->subscriberCustomFields)[0];
foreach (array_chunk($subscribers, 200) as $data) {
try {
if($action === 'create') {
SubscriberCustomField::createMultiple(
$data
);
}
if($action === 'update') {
SubscriberCustomField::updateMultiple(
$data
);
}
} catch (\PDOException $e) {
throw new \Exception($e->getMessage());
if($action === 'create') {
SubscriberCustomField::createMultiple(
$data
);
}
if($action === 'update') {
SubscriberCustomField::updateMultiple(
$data
);
}
}
}
function addSubscribersToSegments($subscribers) {
foreach (array_chunk($subscribers, 200) as $data) {
SubscriberSegment::createMultiple($this->segments, $data);
}
}