2026-03-27 15:53:29 +00:00

143 lines
4.6 KiB
PHP

<?php
/**
* Simply Schedule Appointments Twig Extension.
*
* @since 3.2.3
* @package Simply_Schedule_Appointments
*/
/**
* Simply Schedule Appointments Twig Extension.
*
* @since 3.2.3
*/
class SSA_Twig_Extension extends Twig\Extension\AbstractExtension {
public function getFilters() {
return [
new Twig\TwigFilter('date', array( $this, 'date_format_filter' ), array('needs_environment' => true) ),
new Twig\TwigFilter('internationalize', array( $this, 'internationalize_filter' ), array('needs_environment' => true) ),
new Twig\TwigFilter('link', array( $this, 'link' ), array('needs_environment' => true) ),
];
}
public function date_format_filter( Twig\Environment $env, $date, $format = null, $timezone = null, $locale = null ) {
if ( empty( $format ) ) {
// Let's use a smart default
$format = SSA_Utils::localize_default_date_strings( 'F j, Y g:i a' ) . ' (T)';
} else if ( $format === 'F d, Y g:ia (T)' || $format === 'F d Y, g:i a' ) {
// and localize the default string we use in our SSA template
$format = SSA_Utils::localize_default_date_strings( 'F j, Y g:i a' ) . ' (T)';
}
if(! empty( $locale ) ) {
// should it be handled here in the date filter? or in a different filter?
ssa()->translation->set_programmatic_locale( $locale );
}
// attempt to keep the syntax compatible with older versions of twig - may be loaded by other plugins
if ( version_compare( \Twig\Environment::VERSION, '3.9', '<' ) ) {
$formatted_date = twig_date_converter( $env, $date, $timezone )->format($format);
} else {
$formatted_date = $env->getExtension( \Twig\Extension\CoreExtension::class )->convertDate($date, $timezone)->format($format);
}
$formatted_date = SSA_Utils::translate_formatted_date( $formatted_date );
if(! empty( $locale ) ) {
ssa()->translation->set_programmatic_locale(null);
}
return $formatted_date;
// TODO: refactor below into a separate twig function that uses strftime formatting
// $timezone_string = false;
// if ( is_string( $timezone ) ) {
// $timezone_string = $timezone;
// } else if ( is_a( $timezone, 'DateTimeZone' ) ) {
// $timezone_string = $timezone->getName();
// }
// $wp_locale = get_locale();
// if ( ! empty( $format ) && $wp_locale != 'en_US' ) {
// $formatted_date = twig_date_format_filter( $env, $date, $format, $timezone );
// if ( ! empty( $timezone_string ) ) {
// $server_locale = setlocale( LC_ALL, 0 );
// $new_locale = setlocale( LC_ALL, $wp_locale );
// date_default_timezone_set( $timezone_string );
// $strftime_format = $this->get_strftime_format_for_date_format( $format );
// $formatted_date = strftime( $strftime_format, strtotime( $date ) );
// date_default_timezone_set( 'UTC' );
// setlocale( LC_ALL, $server_locale );
// } else {
// $formatted_date = date_i18n( $format, strtotime( $date ) );
// }
// }
}
public function internationalize_filter( Twig\Environment $env, $string, $locale = null) {
if(! empty( $locale ) ) {
ssa()->translation->set_programmatic_locale( $locale );
}
$translated_string = __( $string, 'simply-schedule-appointments' );
if(! empty( $locale ) ) {
ssa()->translation->set_programmatic_locale( null );
}
return $translated_string;
}
public function link( Twig\Environment $env, $string, $label ) {
return '<a href="'.$string.'">'.$label.'</a>';
}
/**
* Convert a date format to a strftime format
*
* Timezone conversion is done for unix. Windows users must exchange %z and %Z.
*
* Unsupported date formats : S, n, t, L, B, G, u, e, I, P, Z, c, r
* Unsupported strftime formats : %U, %W, %C, %g, %r, %R, %T, %X, %c, %D, %F, %x
*
* @param string $date_format a date format
* @return string
*/
public static function get_strftime_format_for_date_format( $date_format ) {
$caracs = array(
// Day - no strf eq : S
'd' => '%d', 'D' => '%a', 'j' => '%e', 'l' => '%A', 'N' => '%u', 'w' => '%w', 'z' => '%j',
// Week - no date eq : %U, %W
'W' => '%V',
// Month - no strf eq : n, t
'F' => '%B', 'm' => '%m', 'M' => '%b',
// Year - no strf eq : L; no date eq : %C, %g
'o' => '%G', 'Y' => '%Y', 'y' => '%y',
// Time - no strf eq : B, G, u; no date eq : %r, %R, %T, %X
'a' => '%P', 'A' => '%p', 'g' => '%l', 'h' => '%I', 'H' => '%H', 'i' => '%M', 's' => '%S',
// Time Pseudo Translation
'G' => '%H', // German uses G, %H is close
// Timezone - no strf eq : e, I, P, Z
'O' => '%z', 'T' => '%Z',
// Full Date / Time - no strf eq : c, r; no date eq : %c, %D, %F, %x
'U' => '%s'
);
return strtr( ( string ) $date_format, $caracs );
}
}