Extract unrelated date conversion functionality from date block

[MAILPOET-2665]
This commit is contained in:
Rostislav Wolny
2020-01-30 11:48:18 +01:00
committed by Jack Kitterhing
parent dc5a296133
commit 7d596e3407
5 changed files with 107 additions and 101 deletions

View File

@ -3,7 +3,6 @@
namespace MailPoet\Form\Block;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
class Date extends Base {
@ -176,85 +175,4 @@ class Date extends Base {
return $html;
}
public function convertDateToDatetime($date, $dateFormat) {
$datetime = false;
if ($dateFormat === 'datetime') {
$datetime = $date;
} else {
$parsedDate = explode('/', $date);
$parsedDateFormat = explode('/', $dateFormat);
$yearPosition = array_search('YYYY', $parsedDateFormat);
$monthPosition = array_search('MM', $parsedDateFormat);
$dayPosition = array_search('DD', $parsedDateFormat);
if (count($parsedDate) === 3) {
// create date from any combination of month, day and year
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => $parsedDate[$monthPosition],
'day' => $parsedDate[$dayPosition],
];
} else if (count($parsedDate) === 2) {
// create date from any combination of month and year
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => $parsedDate[$monthPosition],
'day' => '01',
];
} else if ($dateFormat === 'MM' && count($parsedDate) === 1) {
// create date from month
if ((int)$parsedDate[$monthPosition] === 0) {
$datetime = '';
$parsedDate = false;
} else {
$parsedDate = [
'month' => $parsedDate[$monthPosition],
'day' => '01',
'year' => date('Y'),
];
}
} else if ($dateFormat === 'YYYY' && count($parsedDate) === 1) {
// create date from year
if ((int)$parsedDate[$yearPosition] === 0) {
$datetime = '';
$parsedDate = false;
} else {
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => '01',
'day' => '01',
];
}
} else {
$parsedDate = false;
}
if ($parsedDate) {
$year = $parsedDate['year'];
$month = $parsedDate['month'];
$day = $parsedDate['day'];
// if all date parts are set to 0, date value is empty
if ((int)$year === 0 && (int)$month === 0 && (int)$day === 0) {
$datetime = '';
} else {
if ((int)$year === 0) $year = date('Y');
if ((int)$month === 0) $month = date('m');
if ((int)$day === 0) $day = date('d');
$datetime = sprintf(
'%s-%s-%s 00:00:00',
$year,
$month,
$day
);
}
}
}
if ($datetime !== false && !empty($datetime)) {
try {
$datetime = Carbon::parse($datetime)->toDateTimeString();
} catch (\Exception $e) {
$datetime = false;
}
}
return $datetime;
}
}

View File

@ -0,0 +1,88 @@
<?php
namespace MailPoet\Form\Util;
use MailPoetVendor\Carbon\Carbon;
class DateConverter {
public function convertDateToDatetime($date, $dateFormat) {
$datetime = false;
if ($dateFormat === 'datetime') {
$datetime = $date;
} else {
$parsedDate = explode('/', $date);
$parsedDateFormat = explode('/', $dateFormat);
$yearPosition = array_search('YYYY', $parsedDateFormat);
$monthPosition = array_search('MM', $parsedDateFormat);
$dayPosition = array_search('DD', $parsedDateFormat);
if (count($parsedDate) === 3) {
// create date from any combination of month, day and year
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => $parsedDate[$monthPosition],
'day' => $parsedDate[$dayPosition],
];
} else if (count($parsedDate) === 2) {
// create date from any combination of month and year
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => $parsedDate[$monthPosition],
'day' => '01',
];
} else if ($dateFormat === 'MM' && count($parsedDate) === 1) {
// create date from month
if ((int)$parsedDate[$monthPosition] === 0) {
$datetime = '';
$parsedDate = false;
} else {
$parsedDate = [
'month' => $parsedDate[$monthPosition],
'day' => '01',
'year' => date('Y'),
];
}
} else if ($dateFormat === 'YYYY' && count($parsedDate) === 1) {
// create date from year
if ((int)$parsedDate[$yearPosition] === 0) {
$datetime = '';
$parsedDate = false;
} else {
$parsedDate = [
'year' => $parsedDate[$yearPosition],
'month' => '01',
'day' => '01',
];
}
} else {
$parsedDate = false;
}
if ($parsedDate) {
$year = $parsedDate['year'];
$month = $parsedDate['month'];
$day = $parsedDate['day'];
// if all date parts are set to 0, date value is empty
if ((int)$year === 0 && (int)$month === 0 && (int)$day === 0) {
$datetime = '';
} else {
if ((int)$year === 0) $year = date('Y');
if ((int)$month === 0) $month = date('m');
if ((int)$day === 0) $day = date('d');
$datetime = sprintf(
'%s-%s-%s 00:00:00',
$year,
$month,
$day
);
}
}
}
if ($datetime !== false && !empty($datetime)) {
try {
$datetime = Carbon::parse($datetime)->toDateTimeString();
} catch (\Exception $e) {
$datetime = false;
}
}
return $datetime;
}
}

View File

@ -2,7 +2,7 @@
namespace MailPoet\Models;
use MailPoet\Form\Block\Date;
use MailPoet\Form\Util\DateConverter;
use MailPoet\WP\Functions as WPFunctions;
/**
@ -116,7 +116,7 @@ class CustomField extends Model {
}
if (!empty($value)) {
$value = (new Date())->convertDateToDatetime($value, $dateFormat);
$value = (new DateConverter())->convertDateToDatetime($value, $dateFormat);
}
}

View File

@ -2,7 +2,7 @@
namespace MailPoet\Subscribers\ImportExport\Import;
use MailPoet\Form\Block\Date;
use MailPoet\Form\Util\DateConverter;
use MailPoet\Models\CustomField;
use MailPoet\Models\ModelValidator;
use MailPoet\Models\Newsletter;
@ -162,7 +162,7 @@ class Import {
$data = array_map(
function($index, $date) use($validationRule, &$invalidRecords) {
if (empty($date)) return $date;
$date = (new Date())->convertDateToDatetime($date, $validationRule);
$date = (new DateConverter())->convertDateToDatetime($date, $validationRule);
if (!$date) {
$invalidRecords[] = $index;
}

View File

@ -2,16 +2,16 @@
namespace MailPoet\Test\Form\Block;
use MailPoet\Form\Block\Date;
use MailPoet\Form\Util\DateConverter;
class DateTest extends \MailPoetUnitTest {
class DateConverterTest extends \MailPoetUnitTest {
/** @var Date */
private $date;
/** @var DateConverter */
private $dateConverter;
public function _before() {
parent::_before();
$this->date = new Date();
$this->dateConverter = new DateConverter();
}
public function testItCanConvertDateMonthYearFormatToDatetime() {
@ -22,7 +22,7 @@ class DateTest extends \MailPoetUnitTest {
'YYYY/DD/MM' => '2016/10/05',
];
foreach ($date as $dateFormat => $date) {
expect($this->date->convertDateToDatetime($date, $dateFormat))
expect($this->dateConverter->convertDateToDatetime($date, $dateFormat))
->equals('2016-05-10 00:00:00');
}
}
@ -33,37 +33,37 @@ class DateTest extends \MailPoetUnitTest {
'YYYY/MM' => '2016/05',
];
foreach ($date as $dateFormat => $date) {
expect($this->date->convertDATEToDatetime($date, $dateFormat))
expect($this->dateConverter->convertDateToDatetime($date, $dateFormat))
->equals('2016-05-01 00:00:00');
}
}
public function testItCanConvertMonthToDatetime() {
$currentYear = date('Y');
expect($this->date->convertDateToDatetime('05', 'MM'))
expect($this->dateConverter->convertDateToDatetime('05', 'MM'))
->equals(sprintf('%s-05-01 00:00:00', $currentYear));
}
public function testItCanConvertYearToDatetime() {
expect($this->date->convertDateToDatetime('2016', 'YYYY'))
expect($this->dateConverter->convertDateToDatetime('2016', 'YYYY'))
->equals('2016-01-01 00:00:00');
}
public function testItCanConvertDatetimeToDatetime() {
expect($this->date->convertDateToDatetime('2016-05-10 00:00:00', 'datetime'))
expect($this->dateConverter->convertDateToDatetime('2016-05-10 00:00:00', 'datetime'))
->equals('2016-05-10 00:00:00');
}
public function testItCanClearDate() {
expect($this->date->convertDateToDatetime('0/10/5', 'YYYY/MM/DD'))
expect($this->dateConverter->convertDateToDatetime('0/10/5', 'YYYY/MM/DD'))
->equals(date('Y') . '-10-05 00:00:00');
expect($this->date->convertDateToDatetime('0/0/5', 'YYYY/MM/DD'))
expect($this->dateConverter->convertDateToDatetime('0/0/5', 'YYYY/MM/DD'))
->equals(date('Y') . '-' . date('m') . '-05 00:00:00');
expect($this->date->convertDateToDatetime('0/0/0', 'YYYY/MM/DD'))
expect($this->dateConverter->convertDateToDatetime('0/0/0', 'YYYY/MM/DD'))
->equals('');
expect($this->date->convertDateToDatetime('0', 'YYYY'))
expect($this->dateConverter->convertDateToDatetime('0', 'YYYY'))
->equals('');
expect($this->date->convertDateToDatetime('0', 'MM'))
expect($this->dateConverter->convertDateToDatetime('0', 'MM'))
->equals('');
}
}