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

175 lines
6.4 KiB
PHP

<?php
/**
* The concrete command that save settings.
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.Command
*/
class Ai1ec_Command_Save_Settings extends Ai1ec_Command_Save_Abstract {
/* (non-PHPdoc)
* @see Ai1ec_Command::do_execute()
*/
public function do_execute() {
$settings = $this->_registry->get( 'model.settings' );
$options = $settings->get_options();
$_POST['default_tags_categories'] = (
isset( $_POST['default_tags_categories_default_categories'] ) ||
isset( $_POST['default_tags_categories_default_tags'] )
);
// set some a variable to true to trigger the saving.
$_POST['enabled_views'] = true;
// let other plugin modify the post
$_POST = apply_filters( 'ai1ec_before_save_settings', $_POST );
foreach ( $options as $name => $data ) {
$value = null;
if ( isset( $_POST[$name] ) ) {
// if a validator is pecified, use it.
if ( isset( $data['renderer']['validator'] ) ) {
$validator = $this->_registry->get(
'validator.' . $data['renderer']['validator'],
$_POST[$name]
);
try {
$value = $validator->validate();
} catch ( Ai1ec_Value_Not_Valid_Exception $e ) {
// don't save
continue;
}
} else {
switch ( $data['type'] ) {
case 'bool':
$value = true;
break;
case 'int':
$value = (int)$_POST[$name];
break;
case 'string':
$value = (string)$_POST[$name];
break;
case 'array':
$method = '_handle_saving_' . $name;
$value = null;
if ( method_exists( $this, $method ) ) {
$value = $this->$method();
}
$value = apply_filters(
'ai1ec' . $method,
$value,
$_REQUEST
);
break;
case 'mixed':
$method = '_handle_saving_' . $name;
$value = null;
if ( method_exists( $this, $method ) ) {
$value = $this->$method( $_POST[$name] );
}
$value = apply_filters(
'ai1ec' . $method,
$value,
$_REQUEST
);
break;
case 'wp_option': // set the corresponding WP option
$this->_registry->get( 'model.option' )
->set( $name, $_POST[$name], true );
$value = (string)$_POST[$name];
}
}
} else {
if ( isset( $data['type'] ) && 'bool' === $data['type'] ) {
$value = false;
}
}
if ( null !== $value ) {
$settings->set( $name, stripslashes_deep( $value ) );
}
}
$new_options = $settings->get_options();
// let extension manipulate things if needed.
do_action( 'ai1ec_settings_updated', $options, $new_options );
$settings->persist();
$api = $this->_registry->get( 'model.api.api-registration' );
$api->check_settings( true );
return array(
'url' => ai1ec_admin_url(
'edit.php?post_type=ai1ec_event&page=all-in-one-event-calendar-settings'
),
'query_args' => array(
'updated' => 1
)
);
}
/**
* Handle saving enabled_views.
*
* @return array
*/
protected function _handle_saving_enabled_views() {
$settings = $this->_registry->get( 'model.settings' );
$enabled_views = $settings->get( 'enabled_views' );
foreach ( $enabled_views as $view => &$options ) {
$options['enabled'] = isset( $_POST['view_' . $view . '_enabled'] );
$options['default'] = isset( $_POST['default_calendar_view'] )
? $_POST['default_calendar_view'] === $view
: false;
$options['enabled_mobile'] =
isset( $_POST['view_' . $view . '_enabled_mobile'] );
$options['default_mobile'] =
isset( $_POST['default_calendar_view_mobile'] ) &&
$_POST['default_calendar_view_mobile'] === $view;
}
return $enabled_views;
}
/**
* Handle saving default_tag_categories option
*
* @return array
*/
protected function _handle_saving_default_tags_categories() {
return array(
'tags' => isset( $_POST['default_tags_categories_default_tags'] ) ?
$_POST['default_tags_categories_default_tags'] :
array(),
'categories' => isset( $_POST['default_tags_categories_default_categories'] ) ?
$_POST['default_tags_categories_default_categories'] :
array(),
);
}
/**
* Creates the calendar page if a string is passed.
*
* @param int|string $calendar_page
*
* @return int
*/
protected function _handle_saving_calendar_page_id( $calendar_page ) {
if (
! is_numeric( $calendar_page ) &&
preg_match( '#^__auto_page:(.*?)$#', $calendar_page, $matches )
) {
return wp_insert_post(
array(
'post_title' => $matches[1],
'post_type' => 'page',
'post_status' => 'publish',
'comment_status' => 'closed'
)
);
} else {
return (int)$calendar_page;
}
}
}