diff --git a/uninstall.php b/uninstall.php new file mode 100644 index 0000000..144627d --- /dev/null +++ b/uninstall.php @@ -0,0 +1,12 @@ +plugin_uninstall(); + +?> diff --git a/wp-ffpc-abstract.php b/wp-ffpc-abstract.php new file mode 100644 index 0000000..b615918 --- /dev/null +++ b/wp-ffpc-abstract.php @@ -0,0 +1,534 @@ +plugin_constant = $plugin_constant; + + $this->plugin_url = $this->replace_if_ssl ( WP_PLUGIN_URL ) . '/' . $this->plugin_constant . '/'; + $this->plugin_dir = WP_PLUGIN_DIR. '/' . $this->plugin_constant . '/'; + $this->plugin_file = $this->plugin_constant . '/' . $this->plugin_constant . '.php'; + $this->plugin_version = $plugin_version; + $this->plugin_name = $plugin_name; + $this->defaults = $defaults; + $this->plugin_settings_page = $this->plugin_constant .'-settings'; + $this->donation_link = $donation_link; + $this->button_save = $this->plugin_constant . '-save'; + $this->button_delete = $this->plugin_constant . '-delete'; + $this->broadcast_message = self::broadcast_url . $this->plugin_constant . '.message'; + $this->donation_business_name = 'PeterMolnar_WordPressPlugins_' . $this->plugin_constant . '_HU'; + $this->donation_item_name = $this->plugin_name; + + /* we need network wide plugin check functions */ + if ( ! function_exists( 'is_plugin_active_for_network' ) ) + require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); + + /* check if plugin is network-activated */ + if ( @is_plugin_active_for_network ( $this->plugin_file ) ) { + $this->network = true; + $this->settings_slug = 'settings.php'; + } + else { + $this->settings_slug = 'options-general.php'; + } + + /* set the settings page link string */ + $this->settings_link = $this->settings_slug . '?page=' . $this->plugin_settings_page; + + /* initialize plugin, plugin specific init functions */ + $this->plugin_init(); + + /* get the options */ + $this->plugin_options_read(); + + /* setup plugin, plugin specific setup functions that need options */ + $this->plugin_setup(); + + /* add admin styling */ + if( is_admin() ) { + /* jquery ui tabs is provided by WordPress */ + wp_enqueue_script ( "jquery-ui-tabs" ); + wp_enqueue_script ( "jquery-ui-slider" ); + + /* additional admin styling */ + $css_handle = $this->plugin_constant . '-admin-css'; + $css_file = $this->plugin_constant . '-admin.css'; + if ( @file_exists ( $this->plugin_dir . $css_file ) ) + { + $css_src = $this->plugin_url . $css_file; + wp_register_style( $css_handle, $css_src, false, false, 'all' ); + wp_enqueue_style( $css_handle ); + } + } + + register_activation_hook( $this->plugin_file , array( $this , 'plugin_activate') ); + register_deactivation_hook( $this->plugin_file , array( $this , 'plugin_deactivate') ); + register_uninstall_hook( $this->plugin_file , array( $this , 'plugin_uninstall') ); + + /* register settings pages */ + if ( $this->network ) + add_filter( "network_admin_plugin_action_links_" . $this->plugin_file, array( $this, 'plugin_settings_link' ) ); + else + add_filter( "plugin_action_links_" . $this->plugin_file, array( $this, 'plugin_settings_link' ) ); + + /* register admin init, catches $_POST and adds submenu to admin menu */ + if ( $this->network ) + add_action('network_admin_menu', array( $this , 'plugin_admin_init') ); + else + add_action('admin_menu', array( $this , 'plugin_admin_init') ); + } + + /** + * activation hook function, to be extended + */ + abstract function plugin_activate(); + + /** + * deactivation hook function, to be extended + */ + abstract function plugin_deactivate (); + + /** + * uninstall hook function, to be extended + */ + abstract function plugin_uninstall(); + + /** + * first init hook function, to be extended, before options were read + */ + abstract function plugin_init(); + + /** + * second init hook function, to be extended, after options were read + */ + abstract function plugin_setup(); + + + /** + * admin panel, the HTML usually + */ + abstract function plugin_admin_panel(); + + /** + * admin init: save/delete setting, add admin panel call hook + */ + public function plugin_admin_init() { + + /* save parameter updates, if there are any */ + if ( isset( $_POST[ $this->button_save ] ) ) { + $this->plugin_options_save(); + $this->status = 1; + header( "Location: ". $this->settings_link . self::slug_save ); + } + + /* delete parameters if requested */ + if ( isset( $_POST[ $this->button_delete ] ) ) { + $this->plugin_options_delete(); + $this->status = 2; + header( "Location: ". $this->settings_link . self::slug_delete ); + } + + /* load additional moves */ + $this->plugin_hook_admin_init(); + + /* get broadcast message, if available */ + $this->broadcast_message = @file_get_contents( $this->broadcast_message ); + + /* add submenu to settings pages */ + add_submenu_page( $this->settings_slug, $this->plugin_name . __( ' options' , $this->plugin_constant ), $this->plugin_name, $this->capability, $this->plugin_settings_page, array ( $this , 'plugin_admin_panel' ) ); + } + + /** + * to be extended + * + */ + abstract function plugin_hook_admin_init(); + + /** + * callback function to add settings link to plugins page + * + * @param array $links Current links to add ours to + * + */ + public function plugin_settings_link ( $links ) { + $settings_link = '' . __( 'Settings', $this->plugin_constant ) . ''; + array_unshift( $links, $settings_link ); + return $links; + } + + /** + * deletes saved options from database + */ + protected function plugin_options_delete () { + /* get the currently saved options */ + if ( $this->network ) + delete_site_option( $this->plugin_constant ); + else + delete_option( $this->plugin_constant ); + + /* additional moves */ + $this->plugin_hook_options_delete(); + } + + /** + * hook to add functionality into plugin_options_read + */ + abstract function plugin_hook_options_delete (); + + /** + * reads options stored in database and reads merges them with default values + */ + protected function plugin_options_read () { + /* get the currently saved options */ + if ( $this->network ) + $options = get_site_option( $this->plugin_constant ); + else + $options = get_option( $this->plugin_constant ); + + /* this is the point to make any migrations from previous versions */ + $this->plugin_hook_options_migrate( $options ); + + /* map missing values from default */ + foreach ( $this->defaults as $key => $default ) + if ( !@array_key_exists ( $key, $options ) ) + $options[$key] = $default; + + /* removed unused keys, rare, but possible */ + foreach ( array_keys ( $options ) as $key ) + if ( !@array_key_exists( $key, $this->defaults ) ) + unset ( $options[$key] ); + + /* any additional read hook */ + $this->plugin_hook_options_read( $options ); + + $this->options = $options; + } + + /** + * hook to add functionality into plugin_options_read + */ + abstract function plugin_hook_options_read ( &$options ); + + /** + * hook for parameter migration + */ + abstract function plugin_hook_options_migrate( &$options ); + + /** + * used on update and to save current options to database + * + * @param boolean $activating [optional] true on activation hook + * + */ + protected function plugin_options_save ( $activating = false ) { + + /* only try to update defaults if it's not activation hook, $_POST is not empty and the post + is ours */ + if ( !$activating && !empty ( $_POST ) && isset( $_POST[ $this->button_save ] ) ) { + /* we'll only update those that exist in the defaults array */ + $options = $this->defaults; + + foreach ( $options as $key => $default ) + { + /* $_POST element is available */ + if ( !empty( $_POST[$key] ) ) { + $update = $_POST[$key]; + + /* get rid of slashes in strings, just in case */ + if ( is_string ( $update ) ) + $update = stripslashes($update); + + $options[$key] = $update; + } + /* empty $_POST element: when HTML form posted, empty checkboxes a 0 input + values will not be part of the $_POST array, thus we need to check + if this is the situation by checking the types of the elements, + since a missing value means update from an integer to 0 + */ + elseif ( empty( $_POST[$key] ) && ( is_bool ( $default ) || is_int( $default ) ) ) { + $options[$key] = 0; + } + } + + /* update the options array */ + $this->options = $options; + } + + /* set plugin version */ + $this->options['version'] = $this->plugin_version; + + /* call hook function for additional moves before saving the values */ + $this->plugin_hook_options_save( $activating ); + + /* save options to database */ + if ( $this->network ) + update_site_option( $this->plugin_constant , $this->options ); + else + update_option( $this->plugin_constant , $this->options ); + } + + /** + * hook to add functionality into plugin_options_save + */ + abstract function plugin_hook_options_save ( $activating ); + + /** + * sends message to sysog + * + * @param string $message message to add besides basic info + * @param int $log_level [optional] Level of log, info by default + * + */ + protected function log ( $message, $log_level = LOG_INFO ) { + + if ( @is_array( $message ) || @is_object ( $message ) ) + $message = serialize($message); + + if (! $this->config['log'] ) + return false; + + switch ( $log_level ) { + case LOG_ERR : + if ( function_exists( 'syslog' ) ) + syslog( $log_level , self::plugin_constant . $message ); + /* error level is real problem, needs to be displayed on the admin panel */ + throw new Exception ( $message ); + break; + default: + if ( function_exists( 'syslog' ) && $this->config['debug'] ) + syslog( $log_level , self::plugin_constant . $message ); + break; + } + + } + + /** + * replaces http:// with https:// in an url if server is currently running on https + * + * @param string $url URL to check + * + * @return string URL with correct protocol + * + */ + protected function replace_if_ssl ( $url ) { + if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) + $_SERVER['HTTPS'] = 'on'; + + if ( isset($_SERVER['HTTPS']) && (( strtolower($_SERVER['HTTPS']) == 'on' ) || ( $_SERVER['HTTPS'] == '1' ) )) + $url = str_replace ( 'http://' , 'https://' , $url ); + + return $url; + } + + /** + * function to easily print a variable + * + * @param mixed $var Variable to dump + * @param boolean $ret Return text instead of printing if true + * + */ + protected function print_var ( $var , $ret = false ) { + if ( @is_array ( $var ) || @is_object( $var ) || @is_bool( $var ) ) + $var = var_export ( $var, true ); + + if ( $ret ) + return $var; + else + echo $var; + } + + /** + * print value of an element from defaults array + * + * @param mixed $e Element index of $this->defaults array + * + */ + protected function print_default ( $e ) { + _e('Default : ', $this->plugin_constant); + $select = 'select_' . $e; + if ( @is_array ( $this->$select ) ) { + $x = $this->$select; + $this->print_var ( $x[ $this->defaults[ $e ] ] ); + } + else { + $this->print_var ( $this->defaults[ $e ] ); + } + } + + /** + * select options field processor + * + * @param elements + * array to build + $name ) { + //$disabled .= ( @array_key_exists( $valid[ $value ] ) && $valid[ $value ] == false ) ? ' disabled="disabled"' : ''; + $opt .= '