Skip to content

Commit

Permalink
Update CMB2_Display_Text_Date_Timezone to parse values from json/seri…
Browse files Browse the repository at this point in the history
…alized

Updates one use of unserialize to a safe version

Also cleans up the method and makes things a bit less "clever"
  • Loading branch information
jtsternberg committed Mar 29, 2024
1 parent 320074f commit 332afbf
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 22 deletions.
25 changes: 13 additions & 12 deletions includes/CMB2_Field_Display.php
Original file line number Diff line number Diff line change
Expand Up @@ -318,25 +318,26 @@ class CMB2_Display_Text_Date_Timezone extends CMB2_Field_Display {
* @since 2.2.2
*/
protected function _display() {
$field = $this->field;

if ( empty( $this->value ) ) {
return;
}

$datetime = maybe_unserialize( $this->value );
$this->value = $tzstring = '';

if ( $datetime && $datetime instanceof DateTime ) {
$tz = $datetime->getTimezone();
$tzstring = $tz->getName();
$this->value = $datetime->getTimestamp();
$datetime = CMB2_Utils::get_datetime_from_value( $this->value );
if ( ! $datetime || ! $datetime instanceof DateTime ) {
return;
}

$date = $this->field->get_timestamp_format( 'date_format', $this->value );
$time = $this->field->get_timestamp_format( 'time_format', $this->value );
$date = $datetime->format( stripslashes( $this->field->args( 'date_format' ) ) );
$time = $datetime->format( stripslashes( $this->field->args( 'time_format' ) ) );
$timezone = $datetime->getTimezone()->getName();

echo $date, ( $time ? ' ' . $time : '' ), ( $tzstring ? ', ' . $tzstring : '' );
echo $date;
if ( $time ) {
echo ' ' . $time;
}
if ( $timezone ) {
echo ', ' . $timezone;
}
}
}

Expand Down
30 changes: 20 additions & 10 deletions tests/test-cmb-types-display.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,23 +101,33 @@ public function test_text_datetime_timestamp_timezone() {
return;
}

$time = time();
$test_value = new DateTime();
$tz = new DateTimeZone( 'America/New_York' );
$test_value->setTimezone( $tz );
$test_value->setTime( $test_value->format( 'H' ), $test_value->format( 'i' ), '00' );

$sanitizer = new CMB2_Sanitize( $this->get_field_object( 'text_datetime_timestamp_timezone' ), array(
$time = $test_value->getTimestamp();
$expected = json_encode( $test_value );

$object = $this->get_field_object( 'text_datetime_timestamp_timezone' );
$sanitizer_args = array(
'date' => date( 'm/d/Y', $time ),
'time' => date( 'h:i A', $time ),
'timezone' => date( 'e', $time ),
) );
'timezone' => $tz->getName(),
);

$saved_value = $sanitizer->text_datetime_timestamp_timezone();
$sanitizer = new CMB2_Sanitize( $object, $sanitizer_args );

$datetime = unserialize( $saved_value );
$tz = $datetime->getTimezone();
$tzstring = $tz->getName();
$saved_value = $sanitizer->text_datetime_timestamp_timezone();

$expected = date( 'm/d/Y h:i A', $time ) . ', ' . $tzstring;
$this->assertSame( $expected, $saved_value );

$this->assertDisplayFieldMatches( 'text_datetime_timestamp_timezone', $saved_value, $expected );
$expected = $test_value->format( 'm/d/Y h:i A' ) . ', ' . $tz->getName();
$this->assertDisplayFieldMatches(
'text_datetime_timestamp_timezone',
$saved_value,
$expected
);
}

public function test_select_timezone() {
Expand Down

0 comments on commit 332afbf

Please sign in to comment.