<?php
/**
*
*/
class Loco_mvc_ViewParams extends ArrayObject implements JsonSerializable {
/**
* Default escape function for view type is HTML
* @param string $text
* @return string
*/
public function escape( $text ){
return htmlspecialchars( (string) $text, ENT_COMPAT, 'UTF-8' );
}
/**
* format integer as string date, including time according to user settings
* @param int $u unix timestamp
* @param string|null $f date format
* @return string
*/
public static function date_i18n( $u, $f = null ){
static $tf, $df, $tz;
if( is_null($f) ){
if( is_null($tf) ){
$tf = get_option('time_format') or $tf = 'g:i A';
$df = get_option('date_format') or $df= 'M jS Y';
}
$f = $df.' '.$tf;
}
// date_i18n was replaced with wp_date in WP 5.3
if( function_exists('wp_date') ){
return wp_date($f,$u);
}
// date_i18n expects timestamp to include offset
if( is_null($tz) ){
try {
$wp = get_option('timezone_string') or $wp = date_default_timezone_get();
$tz = new DateTimeZone($wp);
}
catch( Exception $e ){
$tz = new DateTimeZone('UTC');
}
}
$d = new DateTime(null,$tz);
$d->setTimestamp($u);
return date_i18n( $f, $u + $d->getOffset() );
}
/**
* Wrapper for sprintf so we can handle PHP 8 exceptions
* @param string $format
* @return string
*/
public static function format( $format, array $args ){
try {
return vsprintf($format,$args);
}
// Note that PHP8 will throw Error (not Exception), PHP 7 will trigger E_WARNING
catch( Error $e ){
Loco_error_AdminNotices::warn( $e->getMessage().' in vsprintf('.var_export($format,true).')' );
return '';
}
}
/**
* @internal
* @param string $p property name
* @return mixed
*/
public function __get( $p ){
return $this->offsetExists($p) ? $this->offsetGet($p) : null;
}
/**
* Test if a property exists, even if null
* @param string $p property name
* @return bool
*/
public function has( $p ){
return $this->offsetExists($p);
}
/**
* Print escaped property value
* @param string $p property key
* @return string empty string
*/
public function e( $p ){
$text = $this->__get($p);
echo $this->escape( $text );
return '';
}
/**
* Print property as string date, including time
* @param string $p property name
* @param string $f date format
* @return string empty string
*/
public function date( $p, $f = null ){
$u = (int) $this->__get($p);
if( $u > 0 ){
echo $this->escape( self::date_i18n($u,$f) );
}
return '';
}
/**
* Print property as a string-formatted number
* @param string $p property name
* @param int $dp optional decimal places
* @return string empty string
*/
public function n( $p, $dp = 0 ){
// number_format_i18n is pre-escaped for HTML
echo number_format_i18n( $this->__get($p), $dp );
return '';
}
/**
* Print property with passed formatting string
* e.g. $params->f('name', 'My name is %s' );
* @param string $p property name
* @param string $f formatting string
* @return string empty string
*/
public function f( $p, $f = '%s' ){
echo $this->escape( self::format( $f, [$this->__get($p)] ) );
return '';
}
/**
* Print property value for JavaScript
* @param string $p property name
* @return string empty string
*/
public function j( $p ){
echo json_encode($this->__get($p) );
return '';
}
/**
* @return array
*/
#[ReturnTypeWillChange]
public function jsonSerialize(){
return $this->getArrayCopy();
}
/**
* Fetch whole object as JSON
* @return string
*/
public function exportJson(){
return json_encode( $this->jsonSerialize() );
}
/**
* Merge parameters into ours
* @return Loco_mvc_ViewParams
*/
public function concat( ArrayObject $more ){
foreach( $more as $name => $value ){
$this[$name] = $value;
}
return $this;
}
/**
* Debugging function
* @codeCoverageIgnore
*/
public function dump(){
echo '<pre>',$this->escape( json_encode( $this->getArrayCopy(),JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE ) ),'</pre>';
}
/**
* @param callable $callback
* @return Loco_mvc_ViewParams
*/
public function sort( $callback ){
$raw = $this->getArrayCopy();
uasort( $raw, $callback );
$this->exchangeArray( $raw );
return $this;
}
}