171 lines
4.5 KiB
PHP
171 lines
4.5 KiB
PHP
<?php
|
|
/**
|
|
* WooCommerce Payments Currency Switcher Widget
|
|
*
|
|
* @package WooCommerce\Payments
|
|
*/
|
|
|
|
namespace WCPay\MultiCurrency;
|
|
|
|
use WC_Widget;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Currency Switcher Widget Class
|
|
*/
|
|
class CurrencySwitcherWidget extends WC_Widget {
|
|
|
|
const DEFAULT_SETTINGS = [
|
|
'title' => '',
|
|
'symbol' => true,
|
|
'flag' => false,
|
|
];
|
|
|
|
/**
|
|
* Compatibility instance.
|
|
*
|
|
* @var Compatibility
|
|
*/
|
|
protected $compatibility;
|
|
|
|
/**
|
|
* Multi-Currency instance.
|
|
*
|
|
* @var MultiCurrency
|
|
*/
|
|
protected $multi_currency;
|
|
|
|
/**
|
|
* Register widget with WordPress.
|
|
*
|
|
* @param MultiCurrency $multi_currency The MultiCurrency instance.
|
|
* @param Compatibility $compatibility The Compatibility instance.
|
|
*/
|
|
public function __construct( MultiCurrency $multi_currency, Compatibility $compatibility ) {
|
|
$this->multi_currency = $multi_currency;
|
|
$this->compatibility = $compatibility;
|
|
|
|
$this->widget_id = 'currency_switcher_widget';
|
|
$this->widget_name = __( 'Currency Switcher Widget', 'woocommerce-payments' );
|
|
$this->widget_description = __( 'Let your customers switch between your enabled currencies', 'woocommerce-payments' );
|
|
$this->settings = [
|
|
'title' => [
|
|
'type' => 'text',
|
|
'std' => '',
|
|
'label' => __( 'Title', 'woocommerce-payments' ),
|
|
],
|
|
'symbol' => [
|
|
'type' => 'checkbox',
|
|
'std' => true,
|
|
'label' => __( 'Display currency symbols', 'woocommerce-payments' ),
|
|
],
|
|
'flag' => [
|
|
'type' => 'checkbox',
|
|
'std' => false,
|
|
'label' => __( 'Display flags in supported devices', 'woocommerce-payments' ),
|
|
],
|
|
];
|
|
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* Front-end display of widget.
|
|
*
|
|
* @param array $args Widget arguments.
|
|
* @param array $instance Saved values from database.
|
|
*/
|
|
public function widget( $args, $instance ) {
|
|
if ( $this->compatibility->should_disable_currency_switching() ) {
|
|
return;
|
|
}
|
|
|
|
$enabled_currencies = $this->multi_currency->get_enabled_currencies();
|
|
|
|
if ( 1 === count( $enabled_currencies ) ) {
|
|
return;
|
|
}
|
|
|
|
$instance = wp_parse_args(
|
|
$instance,
|
|
self::DEFAULT_SETTINGS
|
|
);
|
|
|
|
$title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
|
|
|
|
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
if ( ! empty( $title ) ) {
|
|
echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
}
|
|
|
|
?>
|
|
<form>
|
|
<?php $this->output_get_params(); ?>
|
|
<select
|
|
name="currency"
|
|
aria-label="<?php echo esc_attr( $title ); ?>"
|
|
onchange="this.form.submit()"
|
|
>
|
|
<?php
|
|
foreach ( $enabled_currencies as $currency ) {
|
|
$this->display_currency_option( $currency, $instance['symbol'], $instance['flag'] );
|
|
}
|
|
?>
|
|
</select>
|
|
</form>
|
|
<?php
|
|
|
|
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
}
|
|
|
|
/**
|
|
* Create an <option> element with provided currency. With symbol and flag if requested.
|
|
*
|
|
* @param Currency $currency Currency to use for <option> element.
|
|
* @param boolean $with_symbol Whether to show the currency symbol.
|
|
* @param boolean $with_flag Whether to show the currency flag.
|
|
*
|
|
* @return void Displays HTML of currency <option>
|
|
*/
|
|
private function display_currency_option( Currency $currency, bool $with_symbol, bool $with_flag ) {
|
|
$code = $currency->get_code();
|
|
$same_symbol = html_entity_decode( $currency->get_symbol() ) === $code;
|
|
$text = $code;
|
|
$selected = $this->multi_currency->get_selected_currency()->code === $code ? ' selected' : '';
|
|
|
|
if ( $with_symbol && ! $same_symbol ) {
|
|
$text = $currency->get_symbol() . ' ' . $text;
|
|
}
|
|
if ( $with_flag ) {
|
|
$text = $currency->get_flag() . ' ' . $text;
|
|
}
|
|
|
|
echo "<option value=\"$code\"$selected>$text</option>"; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
}
|
|
|
|
/**
|
|
* Output hidden inputs for every $_GET param.
|
|
* This prevent the switcher form to remove them on submit.
|
|
*
|
|
* @return void
|
|
*/
|
|
private function output_get_params() {
|
|
// phpcs:disable WordPress.Security.NonceVerification
|
|
if ( empty( $_GET ) ) {
|
|
return;
|
|
}
|
|
$params = explode( '&', urldecode( http_build_query( $_GET ) ) );
|
|
foreach ( $params as $param ) {
|
|
$name_value = explode( '=', $param );
|
|
$name = $name_value[0];
|
|
$value = $name_value[1];
|
|
if ( 'currency' === $name ) {
|
|
continue;
|
|
}
|
|
echo '<input type="hidden" name="' . esc_attr( $name ) . '" value="' . esc_attr( $value ) . '" />';
|
|
}
|
|
// phpcs:enable WordPress.Security.NonceVerification
|
|
}
|
|
}
|