all-in-one-event-calendar/lib/compatibility/check.php
2017-11-09 17:36:04 +01:00

133 lines
4.4 KiB
PHP

<?php
/**
* Theme backward compatibility check.
*
* @author Time.ly Network Inc.
* @since 2.2
*
* @package AI1EC
* @subpackage AI1EC.Lib.Compatibility
*/
class Ai1ec_Compatibility_Check extends Ai1ec_Base {
/**
* @var null|bool Calculated response.
*/
protected $_use_backward_compatibility = null;
/**
* Returns whether calendar is using backward compatibility or not.
*
* @return bool|null Result
*
* @throws Ai1ec_Bootstrap_Exception
*/
public function use_backward_compatibility() {
if ( null === $this->_use_backward_compatibility ) {
$this->_use_backward_compatibility = (
AI1EC_THEME_COMPATIBILITY_FER &&
! $this->_registry->get(
'model.settings'
)->get( 'ai1ec_use_frontend_rendering', false )
);
}
return $this->_use_backward_compatibility;
}
/**
* Observes settings changes.
*
* If setting ai1ec_use_frontend_rendering is changed and set to true
* perfoms theme check.
*
* Checks if Date format was changed, and update dates to the new format
*
* @param array $old_options Old options array.
* @param array $new_options New options array.
*
* @return void Method does not return.
*
* @throws Ai1ec_Bootstrap_Exception
*/
public function ai1ec_settings_observer( $old_options, $new_options ) {
// Date format change checker
$old_date_format_value = isset( $old_options['input_date_format'] )
? $old_options['input_date_format']['value']
: null;
$new_date_format_value = isset( $new_options['input_date_format'] )
? $new_options['input_date_format']['value']
: null;
if (
null !== $old_date_format_value&&
null !== $new_date_format_value &&
$old_date_format_value !== $new_date_format_value
) {
// Get "Default calendar start date"
$exact_date = isset( $old_options['exact_date'] )
? $old_options['exact_date']['value']
: '';
if ( '' !== $exact_date ) {
$date_system = $this->_registry->get( 'date.system' );
// Change "Default calendar start date" format
$new_exact_date = $date_system->convert_date_format(
$exact_date,
$old_date_format_value,
$new_date_format_value
);
// Save new value
$settings = $this->_registry->get( 'model.settings' );
$settings->set( 'exact_date', $new_exact_date );
}
}
// Frontend rendering checker
$old_value = isset( $old_options['ai1ec_use_frontend_rendering'] )
? (bool)$old_options['ai1ec_use_frontend_rendering']['value']
: null;
$new_value = isset( $new_options['ai1ec_use_frontend_rendering'] )
? (bool)$new_options['ai1ec_use_frontend_rendering']['value']
: null;
if (
$old_value === $new_value ||
! $new_value
) {
return;
}
if ( $this->is_current_theme_outside_core() ) {
$this->_registry->get( 'notification.admin' )->store(
Ai1ec_I18n::__( 'You have turned on Frontend Rendering and you are using a custom calendar theme. If your theme does not support Frontend Rendering, your calendar may not work correctly.' ),
'error',
0,
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
true
);
}
}
/**
* Returns whether current calendar theme is located under core directory
* or not.
*
* @return bool Result
*
* @throws Ai1ec_Bootstrap_Exception
*/
public function is_current_theme_outside_core() {
$option = $this->_registry->get( 'model.option' );
$cur_theme = $option->get( 'ai1ec_current_theme', array() );
$theme_root = dirname( AI1EC_DEFAULT_THEME_ROOT );
return (
isset( $cur_theme['theme_root'] ) &&
(
$theme_root !== dirname( $cur_theme['theme_root'] ) &&
false === strpos(
$cur_theme['theme_root'],
'all-in-one-event-calendar-saas-theme'
)
)
);
}
}