Extract unrelated date conversion functionality from date block
[MAILPOET-2665]
This commit is contained in:
committed by
Jack Kitterhing
parent
dc5a296133
commit
7d596e3407
@ -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;
|
||||
}
|
||||
}
|
||||
|
88
lib/Form/Util/DateConverter.php
Normal file
88
lib/Form/Util/DateConverter.php
Normal 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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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('');
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user