From 87318dd500e5b2e07b94a6ff158adbc48f69fae1 Mon Sep 17 00:00:00 2001 From: Philipp Stracker Date: Thu, 13 Feb 2025 19:38:44 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Allow=20toggling=20WC=20Gateways=20?= =?UTF-8?q?via=20PaymentSettings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Definition/PaymentMethodsDefinition.php | 2 +- .../src/Data/PaymentSettings.php | 102 +++++++++++++++--- 2 files changed, 90 insertions(+), 14 deletions(-) diff --git a/modules/ppcp-settings/src/Data/Definition/PaymentMethodsDefinition.php b/modules/ppcp-settings/src/Data/Definition/PaymentMethodsDefinition.php index f9ac675d5..7e031f035 100644 --- a/modules/ppcp-settings/src/Data/Definition/PaymentMethodsDefinition.php +++ b/modules/ppcp-settings/src/Data/Definition/PaymentMethodsDefinition.php @@ -97,7 +97,7 @@ class PaymentMethodsDefinition { return array( 'id' => $gateway_id, - 'enabled' => wc_string_to_bool( $gateway ? $gateway->enabled : '' ), + 'enabled' => $this->settings->is_method_enabled( $gateway_id ), 'title' => str_replace( '&', '&', $gateway_title ), 'description' => $gateway_description, 'icon' => $icon, diff --git a/modules/ppcp-settings/src/Data/PaymentSettings.php b/modules/ppcp-settings/src/Data/PaymentSettings.php index ffea3153d..891872805 100644 --- a/modules/ppcp-settings/src/Data/PaymentSettings.php +++ b/modules/ppcp-settings/src/Data/PaymentSettings.php @@ -9,6 +9,8 @@ declare( strict_types = 1 ); namespace WooCommerce\PayPalCommerce\Settings\Data; +use WC_Payment_Gateway; + /** * Class PaymentSettings */ @@ -21,12 +23,19 @@ class PaymentSettings extends AbstractDataModel { */ protected const OPTION_KEY = 'woocommerce-ppcp-data-payment'; + /** + * List of WC_Payment_Gateway instances that need to be saved. + * + * @var WC_Payment_Gateway[] + */ + private array $unsaved_gateways = array(); + /** * Get default values for the model. * * @return array */ - protected function get_defaults(): array { + protected function get_defaults() : array { return array( 'paypal_show_logo' => false, 'three_d_secure' => 'no-3d-secure', @@ -37,12 +46,79 @@ class PaymentSettings extends AbstractDataModel { ); } + /** + * Saves the model data to WordPress options. + */ + public function save() : void { + parent::save(); + + foreach ( $this->unsaved_gateways as $gateway_id => $gateway ) { + update_option( $gateway->get_option_key(), $gateway->settings ); + } + + $this->unsaved_gateways = array(); + } + + /** + * Enables or disables the defined payment method, if it exists. + * + * @param string $method_id ID of the payment method. + * @param bool $is_enabled Whether to enable the method. + */ + public function toggle_method_state( string $method_id, bool $is_enabled ) : void { + switch ( $method_id ) { + case 'venmo': + $this->set_venmo_enabled( $is_enabled ); + break; + + case 'pay-later': + $this->set_paylater_enabled( $is_enabled ); + break; + + default: + $gateway = WC()->payment_gateways()->payment_gateways()[ $method_id ] ?? null; + + if ( $gateway ) { + $gateway->enabled = wc_bool_to_string( $is_enabled ); + + $this->unsaved_gateways[ $gateway->id ] = $gateway; + } + } + } + + /** + * Checks, if the provided payment method is enabled. + * + * @param string $method_id ID of the payment method. + * @return bool True, if the method is enabled. False if it's disabled or not existing. + */ + public function is_method_enabled( string $method_id ) : bool { + switch ( $method_id ) { + case 'venmo': + $this->get_venmo_enabled(); + break; + + case 'pay-later': + $this->get_paylater_enabled(); + break; + + default: + $gateway = WC()->payment_gateways()->payment_gateways()[ $method_id ] ?? null; + + if ( $gateway ) { + return wc_string_to_bool( $gateway->enabled ); + } + } + + return false; + } + /** * Get PayPal show logo. * * @return bool */ - public function get_paypal_show_logo(): bool { + public function get_paypal_show_logo() : bool { return (bool) $this->data['paypal_show_logo']; } @@ -51,7 +127,7 @@ class PaymentSettings extends AbstractDataModel { * * @return string */ - public function get_three_d_secure(): string { + public function get_three_d_secure() : string { return $this->data['three_d_secure']; } @@ -60,7 +136,7 @@ class PaymentSettings extends AbstractDataModel { * * @return bool */ - public function get_fastlane_cardholder_name(): bool { + public function get_fastlane_cardholder_name() : bool { return (bool) $this->data['fastlane_cardholder_name']; } @@ -69,7 +145,7 @@ class PaymentSettings extends AbstractDataModel { * * @return bool */ - public function get_fastlane_display_watermark(): bool { + public function get_fastlane_display_watermark() : bool { return (bool) $this->data['fastlane_display_watermark']; } @@ -78,7 +154,7 @@ class PaymentSettings extends AbstractDataModel { * * @return bool */ - public function get_venmo_enabled(): bool { + public function get_venmo_enabled() : bool { return (bool) $this->data['venmo_enabled']; } @@ -87,7 +163,7 @@ class PaymentSettings extends AbstractDataModel { * * @return bool */ - public function get_paylater_enabled(): bool { + public function get_paylater_enabled() : bool { return (bool) $this->data['paylater_enabled']; } @@ -97,7 +173,7 @@ class PaymentSettings extends AbstractDataModel { * @param bool $value The value. * @return void */ - public function set_paypal_show_logo( bool $value ): void { + public function set_paypal_show_logo( bool $value ) : void { $this->data['paypal_show_logo'] = $value; } @@ -107,7 +183,7 @@ class PaymentSettings extends AbstractDataModel { * @param string $value The value. * @return void */ - public function set_three_d_secure( string $value ): void { + public function set_three_d_secure( string $value ) : void { $this->data['three_d_secure'] = $value; } @@ -117,7 +193,7 @@ class PaymentSettings extends AbstractDataModel { * @param bool $value The value. * @return void */ - public function set_fastlane_cardholder_name( bool $value ): void { + public function set_fastlane_cardholder_name( bool $value ) : void { $this->data['fastlane_cardholder_name'] = $value; } @@ -127,7 +203,7 @@ class PaymentSettings extends AbstractDataModel { * @param bool $value The value. * @return void */ - public function set_fastlane_display_watermark( bool $value ): void { + public function set_fastlane_display_watermark( bool $value ) : void { $this->data['fastlane_display_watermark'] = $value; } @@ -137,7 +213,7 @@ class PaymentSettings extends AbstractDataModel { * @param bool $value The value. * @return void */ - public function set_venmo_enabled( bool $value ): void { + public function set_venmo_enabled( bool $value ) : void { $this->data['venmo_enabled'] = $value; } @@ -147,7 +223,7 @@ class PaymentSettings extends AbstractDataModel { * @param bool $value The value. * @return void */ - public function set_paylater_enabled( bool $value ): void { + public function set_paylater_enabled( bool $value ) : void { $this->data['paylater_enabled'] = $value; } }