From bc97078f1b9bd2530b0c84444d45ff335b0ee3ef Mon Sep 17 00:00:00 2001 From: Matty Date: Wed, 7 Sep 2011 11:39:40 +0200 Subject: [PATCH] Added first pass at settings form API functions in base Payment Gateway class --- classes/gateways/gateway.class.php | 217 +++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) diff --git a/classes/gateways/gateway.class.php b/classes/gateways/gateway.class.php index b1c8df38d6d..5d4fc167926 100644 --- a/classes/gateways/gateway.class.php +++ b/classes/gateways/gateway.class.php @@ -21,6 +21,13 @@ class woocommerce_payment_gateway { var $icon; var $description; + var $plugin_id = 'woocommerce_'; + var $settings = array(); + + var $form_fields = array(); + var $errors = array(); + var $sanitized_fields = array(); + function is_available() { if ($this->enabled=="yes") : @@ -48,4 +55,214 @@ class woocommerce_payment_gateway { function process_payment() {} function validate_fields() { return true; } + + function init_form_fields () { return __( 'This function needs to be overridden by your payment gateway class.', 'woothemes' ); } + + /** + * Admin Panel Options Processing + * - Saves the options to the DB + * + * @since 1.0.0 + */ + public function process_admin_options() { + // TO DO: NONCE SECURITY CHECK + + $this->validate_settings_fields(); + + if ( count( $this->errors ) > 0 ) { + $this->display_errors(); + } else { + update_option( $this->plugin_id . $this->id . '_settings', $this->sanitized_fields ); + } + } + + /** + * Display admin error messages. + * + * @since 1.0.0 + */ + function display_errors() { + // TO DO - Generate errors HTML. + } // End display_errors() + + /** + * Initialise Gateway Settings + * + * Store all settings in a single database entry + * and make sure the $settings array is either the default + * or the settings stored in the database. + * + * @since 1.0.0 + * @uses get_option(), add_option() + */ + + function init_settings () { + if ( ! is_array( $this->settings ) ) { return; } + + $settings = array(); + $existing_settings = get_option( $this->plugin_id . $this->id . '_settings' ); + + $defaults = array(); + + foreach ( $this->form_fields as $k => $v ) { + if ( isset( $v['default'] ) ) { + $defaults[$k] = $v['default']; + } else { + $defaults[$k] = ''; + } + } + + if ( ! $existing_settings ) { + $existing_settings = $defaults; + } else { + // Prevent "undefined index" errors. + foreach ( $existing_settings as $k => $v ) { + if ( ! isset( $existing_settings[$k] ) ) { + $existing_settings[$k] = $v; + } + } + } + + $this->settings = $existing_settings; + + if ( isset( $this->settings['enabled'] ) && ( $this->settings['enabled'] == 'yes' ) ) { $this->enabled = 'yes'; } + } // End init_settings() + + /** + * Generate Settings HTML. + * + * Generate the HTML for the fields on the "settings" screen. + * + * @since 1.0.0 + * @uses method_exists() + */ + + function generate_settings_html () { + $html = ''; + foreach ( $this->form_fields as $k => $v ) { + if ( ! isset( $v['type'] ) || ( $v['type'] == '' ) ) { $v['type'] == 'text'; } // Default to "text" field type. + + if ( method_exists( $this, 'generate_' . $v['type'] . '_html' ) ) { + $html .= $this->{'generate_' . $v['type'] . '_html'}( $k, $v ); + } + } + + echo $html; + } // End generate_settings_html() + + /** + * Generate Text Input HTML. + * + * @since 1.0.0 + * @return $html string + */ + + function generate_text_html ( $key, $data ) { + $html = ''; + + if ( isset( $data['title'] ) && $data['title'] != '' ) { $title = $data['title']; } + + $html .= '' . "\n"; + $html .= '' . $title . '' . "\n"; + $html .= '' . "\n"; + $html .= '
' . $title . '' . "\n"; + $html .= '
'; + $html .= '' . "\n"; + $html .= '' . "\n"; + + return $html; + } // End generate_checkbox_html() + + /** + * Generate Checkbox HTML. + * + * @since 1.0.0 + * @return $html string + */ + + function generate_checkbox_html ( $key, $data ) { + $html = ''; + + if ( isset( $data['title'] ) && $data['title'] != '' ) { $title = $data['title']; } + + $html .= '' . "\n"; + $html .= '' . $title . '' . "\n"; + $html .= '' . "\n"; + $html .= '
' . $title . '' . "\n"; + $html .= '
' . "\n"; + if ( isset( $data['description'] ) && $data['description'] != '' ) { $html .= '' . $data['description'] . '' . "\n"; } + $html .= '
'; + $html .= '' . "\n"; + $html .= '' . "\n"; + + return $html; + } // End generate_checkbox_html() + + /** + * Validate Settings Field Data. + * + * Validate the data on the "Settings" form. + * + * @since 1.0.0 + * @uses method_exists() + */ + + function validate_settings_fields () { + // TO DO: NONCE SECURITY CHECK + + foreach ( $this->form_fields as $k => $v ) { + if ( ! isset( $v['type'] ) || ( $v['type'] == '' ) ) { $v['type'] == 'text'; } // Default to "text" field type. + + if ( method_exists( $this, 'validate_' . $v['type'] . '_field' ) ) { + $field = $this->{'validate_' . $v['type'] . '_field'}( $k ); + $this->sanitized_fields[$k] = $field; + } else { + $this->sanitized_fields[$k] = $this->settings[$k]; + } + } + } // End validate_settings_fields() + + /** + * Validate Checkbox Field. + * + * If not set, return "no", otherwise return "yes". + * + * @since 1.0.0 + * @return $status string + */ + + function validate_checkbox_field ( $key ) { + // TO DO: NONCE SECURITY CHECK + + $status = 'no'; + if ( isset( $_POST[$this->plugin_id . $this->id . '_' . $key] ) && ( 1 == $_POST[$this->plugin_id . $this->id . '_' . $key] ) ) { + $status = 'yes'; + } + + return $status; + } // End validate_checkbox_field() + + /** + * Validate Text Field. + * + * Make sure the data is escaped correctly, etc. + * + * @since 1.0.0 + * @return $text string + */ + + function validate_text_field ( $key ) { + // TO DO: NONCE SECURITY CHECK + $text = $this->settings[$key]; + + if ( isset( $_POST[$this->plugin_id . $this->id . '_' . $key] ) && ( '' != $_POST[$this->plugin_id . $this->id . '_' . $key] ) ) { + $text = esc_attr( woocommerce_clean( $_POST[$this->plugin_id . $this->id . '_' . $key] ) ); + } + + return $text; + } // End validate_text_field() } \ No newline at end of file