- Updates date conversion method
- Uses Moment to parse dates in UI - Updates Custom Field model to utilize date conversion method - Adds unit test
This commit is contained in:
@ -127,37 +127,12 @@ define([
|
||||
return;
|
||||
}
|
||||
|
||||
const dateType = this.props.field.params.date_type;
|
||||
const dateParts = value.split('-');
|
||||
let year = '';
|
||||
let month = '';
|
||||
let day = '';
|
||||
|
||||
switch(dateType) {
|
||||
case 'year_month_day':
|
||||
year = ~~(dateParts[0]);
|
||||
month = ~~(dateParts[1]);
|
||||
day = ~~(dateParts[2]);
|
||||
break;
|
||||
|
||||
case 'year_month':
|
||||
year = ~~(dateParts[0]);
|
||||
month = ~~(dateParts[1]);
|
||||
break;
|
||||
|
||||
case 'month':
|
||||
month = ~~(dateParts[0]);
|
||||
break;
|
||||
|
||||
case 'year':
|
||||
year = ~~(dateParts[0]);
|
||||
break;
|
||||
}
|
||||
const dateTime = Moment(value);
|
||||
|
||||
this.setState({
|
||||
year: year,
|
||||
month: month,
|
||||
day: day
|
||||
year: dateTime.format('YYYY'),
|
||||
month: dateTime.format('M'),
|
||||
day: dateTime.format('D')
|
||||
});
|
||||
}
|
||||
formatValue() {
|
||||
@ -228,7 +203,7 @@ define([
|
||||
|
||||
const fields = dateSelects.map(type => {
|
||||
switch(type) {
|
||||
case 'yyyy':
|
||||
case 'YYYY':
|
||||
return (<FormFieldDateYear
|
||||
onValueChange={ this.onValueChange.bind(this) }
|
||||
ref={ 'year' }
|
||||
@ -239,7 +214,7 @@ define([
|
||||
/>);
|
||||
break;
|
||||
|
||||
case 'mm':
|
||||
case 'MM':
|
||||
return (<FormFieldDateMonth
|
||||
onValueChange={ this.onValueChange.bind(this) }
|
||||
ref={ 'month' }
|
||||
@ -251,7 +226,7 @@ define([
|
||||
/>);
|
||||
break;
|
||||
|
||||
case 'dd':
|
||||
case 'DD':
|
||||
return (<FormFieldDateDay
|
||||
onValueChange={ this.onValueChange.bind(this) }
|
||||
ref={ 'day' }
|
||||
|
@ -67,19 +67,19 @@ class Date extends Base {
|
||||
}
|
||||
|
||||
foreach($date_selectors as $date_selector) {
|
||||
if($date_selector === 'dd') {
|
||||
if($date_selector === 'DD') {
|
||||
$block['selected'] = $day;
|
||||
$html .= '<select class="mailpoet_date_day" ';
|
||||
$html .= 'name="'.$field_name.'[day]" placeholder="'.__('Day').'">';
|
||||
$html .= static::getDays($block);
|
||||
$html .= '</select>';
|
||||
} else if($date_selector === 'mm') {
|
||||
} else if($date_selector === 'MM') {
|
||||
$block['selected'] = $month;
|
||||
$html .= '<select class="mailpoet_date_month" ';
|
||||
$html .= 'name="'.$field_name.'[month]" placeholder="'.__('Month').'">';
|
||||
$html .= static::getMonths($block);
|
||||
$html .= '</select>';
|
||||
} else if($date_selector === 'yyyy') {
|
||||
} else if($date_selector === 'YYYY') {
|
||||
$block['selected'] = $year;
|
||||
$html .= '<select class="mailpoet_date_year" ';
|
||||
$html .= 'name="'.$field_name.'[year]" placeholder="'.__('Year').'">';
|
||||
@ -102,10 +102,10 @@ class Date extends Base {
|
||||
|
||||
static function getDateFormats() {
|
||||
return array(
|
||||
'year_month_day' => array('mm/dd/yyyy', 'dd/mm/yyyy', 'yyyy/mm/dd'),
|
||||
'year_month' => array('mm/yyyy', 'yyyy/mm'),
|
||||
'year' => array('yyyy'),
|
||||
'month' => array('mm')
|
||||
'year_month_day' => array('MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY/MM/DD'),
|
||||
'year_month' => array('MM/YYYY', 'YYYY/MM'),
|
||||
'year' => array('YYYY'),
|
||||
'month' => array('MM')
|
||||
);
|
||||
}
|
||||
static function getMonthNames() {
|
||||
@ -195,49 +195,64 @@ class Date extends Base {
|
||||
return $html;
|
||||
}
|
||||
|
||||
static function validateDate($date, $date_format) {
|
||||
static function convertDateToDatetime($date, $date_format) {
|
||||
$datetime = false;
|
||||
if ($date_format === 'datetime') {
|
||||
$datetime = $date;
|
||||
}
|
||||
else {
|
||||
$parsed_date = explode('/', $date);
|
||||
if($date_format === 'mm/dd/yyyy' && count($parsed_date) === 3) {
|
||||
$parsed_date_format = explode('/', $date_format);
|
||||
$year_position = array_search('YYYY', $parsed_date_format);
|
||||
$month_position = array_search('MM', $parsed_date_format);
|
||||
$day_position = array_search('DD', $parsed_date_format);
|
||||
if(count($parsed_date) === 3) {
|
||||
// create date from any combination of mm, dd and yyyy
|
||||
$parsed_date = array(
|
||||
'mm' => $parsed_date[0],
|
||||
'dd' => $parsed_date[1],
|
||||
'yyyy' => $parsed_date[2]
|
||||
'year' => $parsed_date[$year_position],
|
||||
'month' => $parsed_date[$month_position],
|
||||
'day' => $parsed_date[$day_position]
|
||||
);
|
||||
} else if($date_format === 'mm/yyyy' && count($parsed_date) === 2) {
|
||||
} else if(count($parsed_date) === 2) {
|
||||
// create date from any combination of mm and dd
|
||||
$parsed_date = array(
|
||||
'mm' => $parsed_date[0],
|
||||
'dd' => '01',
|
||||
'yyyy' => $parsed_date[1]
|
||||
'year' => $parsed_date[$year_position],
|
||||
'month' => $parsed_date[$month_position],
|
||||
'day' => '01'
|
||||
);
|
||||
} else if($date_format === 'mm' && count($parsed_date) === 1) {
|
||||
} else if($date_format === 'MM' && count($parsed_date) === 1) {
|
||||
// create date from mm
|
||||
$parsed_date = array(
|
||||
'mm' => $parsed_date[0],
|
||||
'dd' => '01',
|
||||
'yyyy' => date('Y')
|
||||
'month' => $parsed_date[$month_position],
|
||||
'day' => '01',
|
||||
'year' => date('Y')
|
||||
);
|
||||
} else if($date_format === 'dd' && count($parsed_date) === 1) {
|
||||
} else if($date_format === 'YYYY' && count($parsed_date) === 1) {
|
||||
// create date from dd
|
||||
$parsed_date = array(
|
||||
'mm' => '01',
|
||||
'dd' => $parsed_date[0],
|
||||
'yyyy' => date('Y')
|
||||
'year' => $parsed_date[$year_position],
|
||||
'month' => '01',
|
||||
'day' => '01'
|
||||
);
|
||||
} else {
|
||||
$parsed_date = false;
|
||||
$date = false;
|
||||
}
|
||||
if($parsed_date) {
|
||||
try {
|
||||
$date = sprintf(
|
||||
$datetime = sprintf(
|
||||
'%s-%s-%s 00:00:00',
|
||||
$parsed_date['yyyy'],
|
||||
$parsed_date['mm'],
|
||||
$parsed_date['dd']
|
||||
$parsed_date['year'],
|
||||
$parsed_date['month'],
|
||||
$parsed_date['day']
|
||||
);
|
||||
$date = Carbon::parse($date)->toDateTimeString();
|
||||
}
|
||||
}
|
||||
if($datetime) {
|
||||
try {
|
||||
$datetime = Carbon::parse($datetime)->toDateTimeString();
|
||||
} catch(\Exception $e) {
|
||||
$date = false;
|
||||
$datetime = false;
|
||||
}
|
||||
}
|
||||
return $date;
|
||||
return $datetime;
|
||||
}
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
<?php
|
||||
namespace MailPoet\Models;
|
||||
|
||||
use MailPoet\Form\Block\Date;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
class CustomField extends Model {
|
||||
@ -43,28 +45,27 @@ class CustomField extends Model {
|
||||
// format custom field data depending on type
|
||||
if(is_array($value) && $this->type === 'date' ) {
|
||||
$custom_field_data = $this->asArray();
|
||||
|
||||
$date_format = $custom_field_data['params']['date_format'];
|
||||
$date_type = (isset($custom_field_data['params']['date_type'])
|
||||
? $custom_field_data['params']['date_type']
|
||||
: 'year_month_day'
|
||||
);
|
||||
$date_parts = explode('_', $date_type);
|
||||
|
||||
switch($date_type) {
|
||||
case 'year_month_day':
|
||||
$value = sprintf(
|
||||
'%04d-%02d-%02d',
|
||||
$value['year'],
|
||||
'%s/%s/%s',
|
||||
$value['month'],
|
||||
$value['day']
|
||||
$value['day'],
|
||||
$value['year']
|
||||
);
|
||||
break;
|
||||
|
||||
case 'year_month':
|
||||
$value = sprintf(
|
||||
'%04d-%02d',
|
||||
$value['year'],
|
||||
$value['month']
|
||||
'%s/%s',
|
||||
$value['month'],
|
||||
$value['year']
|
||||
);
|
||||
break;
|
||||
|
||||
@ -73,12 +74,23 @@ class CustomField extends Model {
|
||||
$value = '';
|
||||
} else {
|
||||
$value = sprintf(
|
||||
'%02d',
|
||||
'%s',
|
||||
$value['month']
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'day':
|
||||
if((int)$value['day'] === 0) {
|
||||
$value = '';
|
||||
} else {
|
||||
$value = sprintf(
|
||||
'%s',
|
||||
$value['day']
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'year':
|
||||
if((int)$value['year'] === 0) {
|
||||
$value = '';
|
||||
@ -90,6 +102,10 @@ class CustomField extends Model {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!empty($value)) {
|
||||
$value = Date::convertDateToDatetime($value, $date_format);
|
||||
}
|
||||
}
|
||||
|
||||
return $value;
|
||||
|
45
tests/unit/Form/Block/DateTest.php
Normal file
45
tests/unit/Form/Block/DateTest.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
use MailPoet\Form\Block\Date;
|
||||
|
||||
class DateTest extends MailPoetTest {
|
||||
function testItCanConvertDateMonthYearFormatToDatetime() {
|
||||
$date = array(
|
||||
'MM/DD/YYYY' => '05/10/2016',
|
||||
'DD/MM/YYYY' => '10/05/2016',
|
||||
'YYYY/MM/DD' => '2016/05/10',
|
||||
'YYYY/DD/MM' => '2016/10/05'
|
||||
);
|
||||
foreach($date as $date_format => $date) {
|
||||
expect(Date::convertDateToDatetime($date, $date_format))
|
||||
->equals('2016-05-10 00:00:00');
|
||||
}
|
||||
}
|
||||
|
||||
function testItCanConvertMonthYearFormatToDatetime() {
|
||||
$date = array(
|
||||
'MM/YYYY' => '05/2016',
|
||||
'YYYY/MM' => '2016/05'
|
||||
);
|
||||
foreach($date as $date_format => $date) {
|
||||
expect(Date::convertDATEToDatetime($date, $date_format))
|
||||
->equals('2016-05-01 00:00:00');
|
||||
}
|
||||
}
|
||||
|
||||
function testItCanConvertMonthToDatetime() {
|
||||
expect(Date::convertDateToDatetime('05', 'MM'))
|
||||
->equals('2016-05-01 00:00:00');
|
||||
}
|
||||
|
||||
function testItCanConvertYearToDatetime() {
|
||||
expect(Date::convertDateToDatetime('2016', 'YYYY'))
|
||||
->equals('2016-01-01 00:00:00');
|
||||
}
|
||||
|
||||
function testItCanConvertDatetimeToDatetime() {
|
||||
expect(Date::convertDateToDatetime('2016-05-10 00:00:00', 'datetime'))
|
||||
->equals('2016-05-10 00:00:00');
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user