diff --git a/lib/Subscribers/ImportExport/Export/Export.php b/lib/Subscribers/ImportExport/Export/Export.php index e8e8d38870..5afa628abe 100644 --- a/lib/Subscribers/ImportExport/Export/Export.php +++ b/lib/Subscribers/ImportExport/Export/Export.php @@ -19,21 +19,100 @@ class Export { $this->segments = $data['segments']; $this->subscribersWithoutSegment = array_search(0, $this->segments); $this->subscriberFields = $data['subscriberFields']; + $this->exportFile = $this->getExportFile($this->exportFormatOption); + $this->exportFileURL = $this->getExportFileURL($this->exportFile); $this->profilerStart = microtime(true); - $this->exportFile = sprintf( - Env::$temp_path . '/MailPoet_export_%s.%s', - substr(md5(time()), 0, 4), - $this->exportFormatOption + } + + function process() { + $subscribers = $this->getSubscribers(); + $subscriberCustomFields = $this->getSubscriberCustomFields(); + $formattedSubscriberFields = $this->formatSubscriberFields( + $this->subscriberFields, + $subscriberCustomFields ); - $this->exportFileURL = sprintf( - '%s/%s/%s', - Env::$plugin_url, - Env::$temp_name, - basename($this->exportFile) + try { + if($this->exportFormatOption === 'csv') { + $CSVFile = fopen($this->exportFile, 'w'); + $formatCSV = function ($row) { + return '"' . str_replace('"', '\"', $row) . '"'; + }; + // add UTF-8 BOM (3 bytes, hex EF BB BF) at the start of the file for + // Excel to automatically recognize the encoding + fwrite($CSVFile, chr(0xEF) . chr(0xBB) . chr(0xBF)); + if($this->groupBySegmentOption) { + $formattedSubscriberFields[] = __('List'); + } + fwrite( + $CSVFile, + implode( + ',', + array_map( + $formatCSV, + $formattedSubscriberFields + ) + ) . "\n" + ); + foreach ($subscribers as $subscriber) { + $row = $this->formatSubscriberData( + $subscriber, + $formattedSubscriberFields + ); + if($this->groupBySegmentOption) { + $row[] = ucwords($subscriber['segment_name']); + } + fwrite($CSVFile, implode(',', array_map($formatCSV, $row)) . "\n"); + } + fclose($CSVFile); + } else { + $writer = new XLSXWriter(); + $writer->setAuthor('MailPoet (www.mailpoet.com)'); + $headerRow = array($formattedSubscriberFields); + $lastSegment = false; + $rows = array(); + foreach ($subscribers as $subscriber) { + if($lastSegment && $lastSegment !== $subscriber['segment_name'] && + $this->groupBySegmentOption + ) { + $writer->writeSheet( + array_merge($headerRow, $rows), ucwords($lastSegment) + ); + $rows = array(); + } + // detect RTL language and set Excel to properly display the sheet + $RTLRegex = '/\p{Arabic}|\p{Hebrew}/u'; + if(!$writer->rtl && ( + preg_grep($RTLRegex, $subscriber) || + preg_grep($RTLRegex, $formattedSubscriberFields)) + ) { + $writer->rtl = true; + } + $rows[] = $this->formatSubscriberData( + $subscriber, + $formattedSubscriberFields + ); + $lastSegment = $subscriber['segment_name']; + } + $writer->writeSheet(array_merge($headerRow, $rows), 'MailPoet'); + $writer->writeToFile($this->exportFile); + } + } catch (Exception $e) { + return array( + 'result' => false, + 'error' => $e->getMessage() + ); + } + return array( + 'result' => true, + 'data' => array( + 'totalExported' => count($subscribers), + 'exportFileURL' => $this->exportFileURL + ), + 'profiler' => $this->timeExecution() ); } - - function process() { + + function getSubscribers() { $subscribers = Subscriber:: left_outer_join( SubscriberSegment::$_table, @@ -58,8 +137,9 @@ class Export { 'ELSE "' . __('Not In List') . '" END as segment_name' ) ->whereRaw( - SubscriberSegment::$_table . '.segment_id IN (' . rtrim(str_repeat('?,', count($this->segments)), ',') . ') OR ' . - SubscriberSegment::$_table . '.segment_id IS NULL ', + SubscriberSegment::$_table . '.segment_id IN (' . + rtrim(str_repeat('?,', count($this->segments)), ',') . ') ' . + 'OR ' . SubscriberSegment::$_table . '.segment_id IS NULL ', $this->segments ); } else { @@ -67,89 +147,66 @@ class Export { ->select(Segment::$_table . '.name', 'segment_name') ->whereIn(SubscriberSegment::$_table . '.segment_id', $this->segments); } - if(!$this->groupBySegmentOption) $subscribers = $subscribers->groupBy(Subscriber::$_table . '.id'); - if($this->exportConfirmedOption) $subscribers = $subscribers->where(Subscriber::$_table . '.status', 'confirmed'); - $subscribers = $subscribers->findArray(); - $subscriberCustomFields = Helpers::arrayColumn( + if(!$this->groupBySegmentOption) { + $subscribers = + $subscribers->groupBy(Subscriber::$_table . '.id'); + } + if($this->exportConfirmedOption) { + $subscribers = + $subscribers->where(Subscriber::$_table . '.status', 'confirmed'); + } + return $subscribers->findArray(); + } + + function getExportFileURL($file) { + return sprintf( + '%s/%s/%s', + Env::$plugin_url, + Env::$temp_name, + basename($file) + ); + } + + function getExportFile($format) { + return sprintf( + Env::$temp_path . '/MailPoet_export_%s.%s', + substr(md5(time()), 0, 4), + $format + ); + } + + function getSubscriberCustomFields() { + return Helpers::arrayColumn( CustomField::findArray(), 'name', 'id' ); - $formattedSubscriberFields = $this->formatSubscriberFields($this->subscriberFields, $subscriberCustomFields); - try { - if($this->exportFormatOption === 'csv') { - $CSVFile = fopen($this->exportFile, 'w'); - $formatCSV = function ($row) { - return '"' . str_replace('"', '\"', $row) . '"'; - }; - // add UTF-8 BOM (3 bytes, hex EF BB BF) at the start of the file for Excel to automatically recognize the encoding - fwrite($CSVFile, chr(0xEF) . chr(0xBB) . chr(0xBF)); - if($this->groupBySegmentOption) $formattedSubscriberFields[] = __('List'); - fwrite($CSVFile, implode(',', array_map($formatCSV, $formattedSubscriberFields)) . "\n"); - foreach ($subscribers as $subscriber) { - $row = array_map(function ($field) use ($subscriber, $subscriberCustomFields) { - return (isset($subscriberCustomFields[$field])) ? $subscriberCustomFields[$field] : $subscriber[$field]; - }, $this->subscriberFields); - if($this->groupBySegmentOption) { - $row[] = $subscriber['segment_name']; - } - fwrite($CSVFile, implode(',', array_map($formatCSV, $row)) . "\n"); - } - fclose($CSVFile); - } else { - $writer = new XLSXWriter(); - $writer->setAuthor('MailPoet (www.mailpoet.com)'); - $headerRow = array($formattedSubscriberFields); - $lastSegment = false; - $rows = array(); - foreach ($subscribers as $subscriber) { - if($lastSegment && $lastSegment !== $subscriber['segment_name'] && $this->groupBySegmentOption) { - $writer->writeSheet(array_merge($headerRow, $rows), ucwords($lastSegment)); - $rows = array(); - } - // detect RTL language and set Excel to properly display the sheet - $arabicRegex = '/\p{Arabic}|\p{Hebrew}/u'; - if(!$writer->rtl && ( - preg_grep($arabicRegex, $subscriber) || - preg_grep($arabicRegex, $formattedSubscriberFields)) - ) { - $writer->rtl = true; - } - $rows[] = array_map(function ($field) use ($subscriber, $subscriberCustomFields) { - return (isset($subscriberCustomFields[$field])) ? $subscriber[$subscriberCustomFields[$field]] : $subscriber[$field]; - }, $this->subscriberFields); - $lastSegment = $subscriber['segment_name']; - } - $writer->writeSheet(array_merge($headerRow, $rows), 'MailPoet'); - $writer->writeToFile($this->exportFile); - } - } catch (Exception $e) { - return array( - 'result' => false, - 'error' => $e->getMessage() - ); - } - return array( - 'result' => true, - 'data' => array( - 'totalExported' => count($subscribers), - 'exportFileURL' => $this->exportFileURL - ), - 'profiler' => $this->timeExecution() - ); } function formatSubscriberFields($subscriberFields, $subscriberCustomFields) { $bootStrapMenu = new BootStrapMenu(); $translatedFields = $bootStrapMenu->getSubscriberFields(); - return array_map(function ($field) use ($translatedFields, $subscriberCustomFields) { + return array_map(function ($field) use ( + $translatedFields, $subscriberCustomFields + ) { $field = (isset($translatedFields[$field])) ? ucfirst($translatedFields[$field]) : ucfirst($field); - return (isset($subscriberCustomFields[$field])) ? $subscriberCustomFields[$field] : $field; + return (isset($subscriberCustomFields[$field])) ? + $subscriberCustomFields[$field] : $field; }, $subscriberFields); } + function formatSubscriberData($subscriber, $subscriberCustomFields) { + return array_map(function ($field) use ( + $subscriber, $subscriberCustomFields + ) { + return (isset($subscriberCustomFields[$field])) ? + $subscriberCustomFields[$field] : + $subscriber[$field]; + }, $this->subscriberFields); + } + function timeExecution() { $profilerEnd = microtime(true); return ($profilerEnd - $this->profilerStart) / 60; diff --git a/lib/Subscribers/ImportExport/Import/Import.php b/lib/Subscribers/ImportExport/Import/Import.php index e90b81f7e7..4a7c4d683d 100644 --- a/lib/Subscribers/ImportExport/Import/Import.php +++ b/lib/Subscribers/ImportExport/Import/Import.php @@ -174,6 +174,11 @@ class Import { '1', 'true' ), + 'unconfirmed' => array( + 'unconfirmed', + 0, + "0" + ), 'unsubscribed' => array( 'unsubscribed', -1, @@ -183,12 +188,15 @@ class Import { ); $subscribersData['status'] = array_map(function ($state) use ($statuses) { if(in_array(strtolower($state), $statuses['subscribed'])) { - return 'confirmed'; + return 'subscribed'; } if(in_array(strtolower($state), $statuses['unsubscribed'])) { return 'unsubscribed'; } - return 'confirmed'; // make "subscribed" a default status + if(in_array(strtolower($state), $statuses['unconfirmed'])) { + return 'unconfirmed'; + } + return 'subscribed'; // make "subscribed" a default status }, $subscribersData['status']); return $subscribersData; } diff --git a/tests/unit/Subscribers/ImportExport/Export/ExportCest.php b/tests/unit/Subscribers/ImportExport/Export/ExportCest.php index 6b8267cb5d..c1c8e49f3a 100644 --- a/tests/unit/Subscribers/ImportExport/Export/ExportCest.php +++ b/tests/unit/Subscribers/ImportExport/Export/ExportCest.php @@ -1,6 +1,7 @@ JSONdata = json_decode(file_get_contents(dirname(__FILE__) . '/ExportTestData.json'), true); $this->subscribersData = array( - 'first_name' => array( - 'Adam', - 'Mary', - 'John', - 'Paul' + array( + 'first_name' => 'Adam', + 'last_name' => 'Smith', + 'email' => 'adam@smith.com', + 1 => 'Brazil' ), - 'last_name' => array( - 'Smith', - 'Jane', - 'Kookoo', - 'Newman' + array( + 'first_name' => 'Mary', + 'last_name' => 'Jane', + 'email' => 'mary@jane.com' ), - 'email' => array( - 'adam@smith.com', - 'mary@jane.com', - 'john@kookoo.com', - 'paul@newman.com' + array( + 'first_name' => 'John', + 'last_name' => 'Kookoo', + 'email' => 'john@kookoo.com' ), - 1 => array( - 'Brazil' + array( + 'first_name' => 'Paul', + 'last_name' => 'Newman', + 'email' => 'paul@newman.com' ) ); - $this->segments = array( + $this->customFieldsData = array( + array( + 'name' => 'Country', + 'type' => 'text' + ) + ); + $this->segmentsData = array( array( 'name' => 'Newspapers' ), @@ -41,9 +48,29 @@ class ExportCest { 'name' => 'Journals' ) ); + foreach ($this->subscribersData as $subscriber) { + $entity = Subscriber::create(); + $entity->hydrate($subscriber); + $entity->save(); + } + foreach ($this->segmentsData as $customField) { + $entity = Segment::create(); + $entity->hydrate($customField); + $entity->save(); + } + foreach ($this->customFieldsData as $customField) { + $entity = CustomField::create(); + $entity->hydrate($customField); + $entity->save(); + } $this->export = new Export($this->JSONdata); } + /* function _before() { + + }*/ + + function itCanConstruct() { expect($this->export->exportConfirmedOption) ->equals(false); @@ -52,8 +79,13 @@ class ExportCest { expect($this->export->groupBySegmentOption) ->equals(true); expect($this->export->segments) - ->equals(array(0, 1)); - expect($this->export->subscribersWithoutSegment) + ->equals( + array( + 0, + 1 + ) + ); + expect($this->export->subscribersWithoutSegment) ->equals(0); expect($this->export->subscriberFields) ->equals( @@ -65,14 +97,14 @@ class ExportCest { ); expect( preg_match( - '|'. - Env::$temp_path.'/MailPoet_export_[a-f0-9]{4}.'. + '|' . + Env::$temp_path . '/MailPoet_export_[a-f0-9]{4}.' . $this->export->exportFormatOption . '|', $this->export->exportFile) )->equals(1); expect( preg_match( - '|'. + '|' . Env::$plugin_url . '/' . Env::$temp_name . '/' . basename($this->export->exportFile) . @@ -81,6 +113,30 @@ class ExportCest { )->equals(1); } + function itCanGetSubscribers() { + + + } + + function itCanGetSubscriberCustomFields() { + $customFields = $this->export->getSubscriberCustomFields(); + expect($customFields)->equals( + array( + 1 => $this->customFieldsData[0]['name'] + ) + ); + } + + function itCanFormatSubscriberFields() { + $formattedSubscriberFields = $this->export->formatSubscriberFields( + $this->subscriberFields, + $this->export->getSubscriberCustomFields() + ); + + !d($formattedSubscriberFields);exit; + + } + function itCanProcess() { }