@@ -0,0 +1,269 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Checks configurations and notifies admin.
|
||||
*
|
||||
* @author Time.ly Network Inc.
|
||||
* @since 2.0
|
||||
*
|
||||
* @package AI1EC
|
||||
* @subpackage AI1EC.Lib
|
||||
*/
|
||||
class Ai1ec_Environment_Checks extends Ai1ec_Base {
|
||||
|
||||
const CORE_NAME = 'all-in-one-event-calendar/all-in-one-event-calendar.php';
|
||||
|
||||
/**
|
||||
* List of dependencies.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_addons = array(
|
||||
'all-in-one-event-calendar-extended-views/all-in-one-event-calendar-extended-views.php' => '1.1.3',
|
||||
'all-in-one-event-calendar-super-widget/all-in-one-event-calendar-super-widget.php' => '1.1.0',
|
||||
'all-in-one-event-calendar-featured-events/all-in-one-event-calendar-featured-events.php' => '1.0.5',
|
||||
'all-in-one-event-calendar-frontend-submissions/all-in-one-event-calendar-frontend-submissions.php' => '1.1.3',
|
||||
);
|
||||
|
||||
/**
|
||||
* Runs checks for necessary config options.
|
||||
*
|
||||
* @return void Method does not return.
|
||||
*/
|
||||
public function run_checks() {
|
||||
$role = get_role( 'administrator' );
|
||||
$current_user = get_userdata( get_current_user_id() );
|
||||
if (
|
||||
! is_object( $role ) ||
|
||||
! is_object( $current_user ) ||
|
||||
! $role->has_cap( 'manage_ai1ec_options' ) ||
|
||||
(
|
||||
defined( 'DOING_AJAX' ) &&
|
||||
DOING_AJAX
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
do_action( 'ai1ec_env_check' );
|
||||
global $plugin_page;
|
||||
$settings = $this->_registry->get( 'model.settings' );
|
||||
$option = $this->_registry->get( 'model.option' );
|
||||
$notification = $this->_registry->get( 'notification.admin' );
|
||||
$created_calendar_page = false;
|
||||
|
||||
// check if is set calendar page
|
||||
if ( ! $settings->get( 'calendar_page_id' ) ) {
|
||||
$calendar_page_id = wp_insert_post(
|
||||
array(
|
||||
'post_title' => 'Calendar',
|
||||
'post_type' => 'page',
|
||||
'post_status' => 'publish',
|
||||
'comment_status' => 'closed'
|
||||
)
|
||||
);
|
||||
$settings->set( 'calendar_page_id', $calendar_page_id );
|
||||
$created_calendar_page = true;
|
||||
}
|
||||
if (
|
||||
$plugin_page !== AI1EC_PLUGIN_NAME . '-settings' &&
|
||||
$created_calendar_page
|
||||
) {
|
||||
if (
|
||||
$current_user->has_cap( 'manage_ai1ec_options' )
|
||||
) {
|
||||
$msg = sprintf(
|
||||
Ai1ec_I18n::__( 'The plugin is successfully installed! <a href="%s">Add some events</a> and see them on your <a href="%s">Calendar page</a>.<br />Visit the <a href="%s">Settings page</a> to configure the plugin and get most of it.' ),
|
||||
'post-new.php?post_type=ai1ec_event',
|
||||
get_page_link( $calendar_page_id ),
|
||||
ai1ec_admin_url( AI1EC_SETTINGS_BASE_URL )
|
||||
);
|
||||
$notification->store(
|
||||
$msg,
|
||||
'updated',
|
||||
2,
|
||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN )
|
||||
);
|
||||
} else {
|
||||
$msg = Ai1ec_I18n::__(
|
||||
'The plugin is installed, but has not been configured. Please log in as an Administrator to set it up.'
|
||||
);
|
||||
$notification->store(
|
||||
$msg,
|
||||
'updated',
|
||||
2,
|
||||
array( Ai1ec_Notification_Admin::RCPT_ALL )
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Tell user to sign in to API in order to use Feeds
|
||||
$ics_current_db_version = $option->get( Ai1ecIcsConnectorPlugin::ICS_OPTION_DB_VERSION );
|
||||
if ( $ics_current_db_version != null && $ics_current_db_version != '' ) {
|
||||
$rows = $this->_registry->get( 'dbi.dbi' )->select(
|
||||
'ai1ec_event_feeds',
|
||||
array( 'feed_id' )
|
||||
);
|
||||
$api_reg = $this->_registry->get( 'model.api.api-registration' );
|
||||
$is_signed = $api_reg->is_signed();
|
||||
|
||||
if ( 0 < count( $rows ) && ! $is_signed ) {
|
||||
$msg = Ai1ec_I18n::__(
|
||||
'<b>ACTION REQUIRED!</b> Please, <a href="edit.php?post_type=ai1ec_event&page=all-in-one-event-calendar-settings">sign</a> into Timely Network to continue syncing your imported events.'
|
||||
);
|
||||
$notification->store(
|
||||
$msg,
|
||||
'error',
|
||||
0,
|
||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Check for needed PHP extensions.
|
||||
if (
|
||||
! function_exists( 'iconv' ) &&
|
||||
! $option->get( 'ai1ec_iconv_notification' )
|
||||
) {
|
||||
$msg = Ai1ec_I18n::__(
|
||||
'PHP extension "iconv" needed for All-In-One-Event-Calendar is missing. Please, check your PHP configuration.<br />'
|
||||
);
|
||||
$notification->store(
|
||||
$msg,
|
||||
'error',
|
||||
0,
|
||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
||||
true
|
||||
);
|
||||
$option->set( 'ai1ec_iconv_notification', true );
|
||||
}
|
||||
if (
|
||||
! function_exists( 'mb_check_encoding' ) &&
|
||||
! $option->get( 'ai1ec_mbstring_notification' )
|
||||
) {
|
||||
$msg = Ai1ec_I18n::__(
|
||||
'PHP extension "mbstring" needed for All-In-One-Event-Calendar is missing. Please, check your PHP configuration.<br />'
|
||||
);
|
||||
$notification->store(
|
||||
$msg,
|
||||
'error',
|
||||
0,
|
||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
||||
true
|
||||
);
|
||||
$option->set( 'ai1ec_mbstring_notification', true );
|
||||
}
|
||||
global $wp_rewrite;
|
||||
$option = $this->_registry->get( 'model.option' );
|
||||
$rewrite = $option->get( 'ai1ec_force_flush_rewrite_rules' );
|
||||
if (
|
||||
! $rewrite ||
|
||||
! is_object( $wp_rewrite ) ||
|
||||
! isset( $wp_rewrite->rules ) ||
|
||||
! is_array ( $wp_rewrite->rules ) ||
|
||||
0 === count( $wp_rewrite->rules )
|
||||
) {
|
||||
return;
|
||||
}
|
||||
$this->_registry->get( 'rewrite.helper' )->flush_rewrite_rules();
|
||||
$option->set( 'ai1ec_force_flush_rewrite_rules', false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for add-on versions.
|
||||
*
|
||||
* @param string $plugin Plugin name.
|
||||
*
|
||||
* @return void Method does not return.
|
||||
*/
|
||||
public function check_addons_activation( $plugin ) {
|
||||
switch ( $plugin ) {
|
||||
case self::CORE_NAME:
|
||||
$this->_check_active_addons();
|
||||
break;
|
||||
default:
|
||||
$min_version = isset( $this->_addons[$plugin] )
|
||||
? $this->_addons[$plugin]
|
||||
: null;
|
||||
if ( null !== $min_version ) {
|
||||
$this->_plugin_activation( $plugin, $min_version );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Launches after bulk update.
|
||||
*
|
||||
* @param bool $result Input filter value.
|
||||
*
|
||||
* @return bool Output filter value.
|
||||
*/
|
||||
public function check_bulk_addons_activation( $result ) {
|
||||
$this->_check_active_addons( true );
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks all Time.ly addons.
|
||||
*
|
||||
* @param bool $silent Whether to perform silent plugin deactivation or not.
|
||||
*
|
||||
* @return void Method does not return.
|
||||
*/
|
||||
protected function _check_active_addons( $silent = false ) {
|
||||
foreach ( $this->_addons as $addon => $version ) {
|
||||
if ( is_plugin_active( $addon ) ) {
|
||||
$this->_plugin_activation( $addon, $version, true, $silent );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs Extended Views version check.
|
||||
*
|
||||
* @param string $addon Addon identifier.
|
||||
* @param string $min_version Minimum required version.
|
||||
* @param bool $core If set to true Core deactivates active and
|
||||
* outdated addons when it is activated. If set
|
||||
* false it means that addon activation process
|
||||
* called this method and it's enough to throw
|
||||
* and exception and allow exception handler
|
||||
* to deactivate addon with proper notices.
|
||||
* @param bool $silent Whether to perform silent plugin deactivation
|
||||
* or not.
|
||||
*
|
||||
* @return void Method does not return.
|
||||
*
|
||||
* @throws Ai1ec_Bootstrap_Exception
|
||||
* @throws Ai1ec_Outdated_Addon_Exception
|
||||
*/
|
||||
protected function _plugin_activation(
|
||||
$addon,
|
||||
$min_version,
|
||||
$core = false,
|
||||
$silent = false
|
||||
) {
|
||||
$ev_data = get_plugin_data(
|
||||
WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $addon
|
||||
);
|
||||
if ( ! isset( $ev_data['Version'] ) ) {
|
||||
return;
|
||||
}
|
||||
$version = $ev_data['Version'];
|
||||
if ( -1 === version_compare( $version, $min_version ) ) {
|
||||
$msg1 = Ai1ec_I18n::__( 'The add-on <strong>%s</strong> must be updated to at least version %s to maintain compatibility with the core calendar.' );
|
||||
$msg2 = Ai1ec_I18n::__( 'If you do not see update notices below, ensure you have properly <a href="https://time.ly/document/user-guide/getting-started/license-keys/" target="_blank">entered your licence keys</a>. Alternatively, navigate to <a href="https://time.ly/your-account/">your account</a> to download the latest version of the add-on(s) and <a href="https://time.ly/document/user-guide/troubleshooting/perform-manual-upgrade/">update manually</a>. Please <a href="https://time.ly/forums/">post in the forum</a> if you have trouble. We are happy to help.' );
|
||||
|
||||
$message = sprintf(
|
||||
'<span class="highlight" style="margin: 0 -6px; padding: 4px 6px">' .
|
||||
$msg1 . '</span></p><p>' . $msg2,
|
||||
$ev_data['Name'],
|
||||
$min_version
|
||||
);
|
||||
$this->_registry->get( 'calendar.updates' )->clear_transients();
|
||||
throw new Ai1ec_Outdated_Addon_Exception( $message, $addon );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* The exception thrown when value doesn't pass validation.
|
||||
*
|
||||
* @author Time.ly Network Inc.
|
||||
* @since 2.2
|
||||
*
|
||||
* @package AI1EC
|
||||
* @subpackage AI1EC.Lib
|
||||
*/
|
||||
class Ai1ec_Outdated_Addon_Exception extends Ai1ec_Exception {
|
||||
|
||||
protected $_addon;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $message Exception message.
|
||||
* @param string $addon Addon to disable.
|
||||
*
|
||||
* @return void Method does not return.
|
||||
*/
|
||||
public function __construct( $message, $addon ) {
|
||||
parent::__construct( $message );
|
||||
$this->_addon = $addon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns addon name.
|
||||
*
|
||||
* @return string Addon name.
|
||||
*/
|
||||
public function plugin_to_disable() {
|
||||
return $this->_addon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overrides __toString() to avoid stack trace.
|
||||
*
|
||||
* @return string Empty string.
|
||||
*/
|
||||
public function __toString() {
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Ai1ec_Exception::get_redirect_url()
|
||||
*/
|
||||
public function get_redirect_url() {
|
||||
return ai1ec_admin_url( 'plugins.php' );
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Ai1ec_Exception::display_backtrace()
|
||||
*/
|
||||
public function display_backtrace(){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user