woothemes/woocommerce

View on GitHub
includes/admin/settings/class-wc-settings-payment-gateways.php

Summary

Maintainability
C
1 day
Test Coverage
<?php // @codingStandardsIgnoreLine.
/**
 * WooCommerce Checkout Settings
 *
 * @package WooCommerce\Admin
 */

defined( 'ABSPATH' ) || exit;

if ( class_exists( 'WC_Settings_Payment_Gateways', false ) ) {
    return new WC_Settings_Payment_Gateways();
}

/**
 * WC_Settings_Payment_Gateways.
 */
class WC_Settings_Payment_Gateways extends WC_Settings_Page {

    /**
     * Constructor.
     */
    public function __construct() {
        $this->id    = 'checkout'; // @todo In future versions this may make more sense as 'payment' however to avoid breakage lets leave this alone until we refactor settings APIs in general.
        $this->label = _x( 'Payments', 'Settings tab label', 'woocommerce' );

        add_action( 'woocommerce_admin_field_payment_gateways', array( $this, 'payment_gateways_setting' ) );
        parent::__construct();
    }

    /**
     * Get sections.
     *
     * @return array
     */
    public function get_sections() {
        $sections = array(
            '' => __( 'Payment methods', 'woocommerce' ),
        );
        return apply_filters( 'woocommerce_get_sections_' . $this->id, $sections );
    }

    /**
     * Get settings array.
     *
     * @param string $current_section Section being shown.
     * @return array
     */
    public function get_settings( $current_section = '' ) {
        $settings = array();

        if ( '' === $current_section ) {
            $settings = apply_filters(
                'woocommerce_payment_gateways_settings',
                array(
                    array(
                        'title' => __( 'Payment methods', 'woocommerce' ),
                        'desc'  => __( 'Installed payment methods are listed below and can be sorted to control their display order on the frontend.', 'woocommerce' ),
                        'type'  => 'title',
                        'id'    => 'payment_gateways_options',
                    ),
                    array(
                        'type' => 'payment_gateways',
                    ),
                    array(
                        'type' => 'sectionend',
                        'id'   => 'payment_gateways_options',
                    ),
                )
            );
        }

        return apply_filters( 'woocommerce_get_settings_' . $this->id, $settings, $current_section );
    }

    /**
     * Output the settings.
     */
    public function output() {
        global $current_section;

        // Load gateways so we can show any global options they may have.
        $payment_gateways = WC()->payment_gateways->payment_gateways();

        if ( $current_section ) {
            foreach ( $payment_gateways as $gateway ) {
                if ( in_array( $current_section, array( $gateway->id, sanitize_title( get_class( $gateway ) ) ), true ) ) {
                    if ( isset( $_GET['toggle_enabled'] ) ) { // WPCS: input var ok, CSRF ok.
                        $enabled = $gateway->get_option( 'enabled' );

                        if ( $enabled ) {
                            $gateway->settings['enabled'] = wc_string_to_bool( $enabled ) ? 'no' : 'yes';
                        }
                    }
                    $gateway->admin_options();
                    break;
                }
            }
        }
        $settings = $this->get_settings( $current_section );
        WC_Admin_Settings::output_fields( $settings );
    }

    /**
     * Output payment gateway settings.
     */
    public function payment_gateways_setting() {
        ?>
        <tr valign="top">
        <td class="wc_payment_gateways_wrapper" colspan="2">
            <table class="wc_gateways widefat" cellspacing="0" aria-describedby="payment_gateways_options-description">
                <thead>
                    <tr>
                        <?php
                        $default_columns = array(
                            'sort'        => '',
                            'name'        => __( 'Method', 'woocommerce' ),
                            'status'      => __( 'Enabled', 'woocommerce' ),
                            'description' => __( 'Description', 'woocommerce' ),
                            'action'      => '',
                        );

                        $columns = apply_filters( 'woocommerce_payment_gateways_setting_columns', $default_columns );

                        foreach ( $columns as $key => $column ) {
                            echo '<th class="' . esc_attr( $key ) . '">' . esc_html( $column ) . '</th>';
                        }
                        ?>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        foreach ( WC()->payment_gateways->payment_gateways() as $gateway ) {

                            echo '<tr data-gateway_id="' . esc_attr( $gateway->id ) . '">';

                            foreach ( $columns as $key => $column ) {
                                if ( ! array_key_exists( $key, $default_columns ) ) {
                                    do_action( 'woocommerce_payment_gateways_setting_column_' . $key, $gateway );
                                    continue;
                                }

                                $width = '';

                                if ( in_array( $key, array( 'sort', 'status', 'action' ), true ) ) {
                                    $width = '1%';
                                }

                                $method_title = $gateway->get_method_title() ? $gateway->get_method_title() : $gateway->get_title();
                                $custom_title = $gateway->get_title();

                                echo '<td class="' . esc_attr( $key ) . '" width="' . esc_attr( $width ) . '">';

                                switch ( $key ) {
                                    case 'sort':
                                        ?>
                                        <div class="wc-item-reorder-nav">
                                            <button type="button" class="wc-move-up" tabindex="0" aria-hidden="false" aria-label="<?php /* Translators: %s Payment gateway name. */ echo esc_attr( sprintf( __( 'Move the "%s" payment method up', 'woocommerce' ), $method_title ) ); ?>"><?php esc_html_e( 'Move up', 'woocommerce' ); ?></button>
                                            <button type="button" class="wc-move-down" tabindex="0" aria-hidden="false" aria-label="<?php /* Translators: %s Payment gateway name. */ echo esc_attr( sprintf( __( 'Move the "%s" payment method down', 'woocommerce' ), $method_title ) ); ?>"><?php esc_html_e( 'Move down', 'woocommerce' ); ?></button>
                                            <input type="hidden" name="gateway_order[]" value="<?php echo esc_attr( $gateway->id ); ?>" />
                                        </div>
                                        <?php
                                        break;
                                    case 'name':
                                        echo '<a href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . strtolower( $gateway->id ) ) ) . '" class="wc-payment-gateway-method-title">' . wp_kses_post( $method_title ) . '</a>';

                                        if ( $method_title !== $custom_title ) {
                                            echo '<span class="wc-payment-gateway-method-name">&nbsp;&ndash;&nbsp;' . wp_kses_post( $custom_title ) . '</span>';
                                        }
                                        break;
                                    case 'description':
                                        echo wp_kses_post( $gateway->get_method_description() );
                                        break;
                                    case 'action':
                                        if ( wc_string_to_bool( $gateway->enabled ) ) {
                                            /* Translators: %s Payment gateway name. */
                                            echo '<a class="button alignright" aria-label="' . esc_attr( sprintf( __( 'Manage the "%s" payment method', 'woocommerce' ), $method_title ) ) . '" href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . strtolower( $gateway->id ) ) ) . '">' . esc_html__( 'Manage', 'woocommerce' ) . '</a>';
                                        } else {
                                            /* Translators: %s Payment gateway name. */
                                            echo '<a class="button alignright" aria-label="' . esc_attr( sprintf( __( 'Set up the "%s" payment method', 'woocommerce' ), $method_title ) ) . '" href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . strtolower( $gateway->id ) ) ) . '">' . esc_html__( 'Set up', 'woocommerce' ) . '</a>';
                                        }
                                        break;
                                    case 'status':
                                        echo '<a class="wc-payment-gateway-method-toggle-enabled" href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . strtolower( $gateway->id ) ) ) . '">';
                                        if ( wc_string_to_bool( $gateway->enabled ) ) {
                                            /* Translators: %s Payment gateway name. */
                                            echo '<span class="woocommerce-input-toggle woocommerce-input-toggle--enabled" aria-label="' . esc_attr( sprintf( __( 'The "%s" payment method is currently enabled', 'woocommerce' ), $method_title ) ) . '">' . esc_attr__( 'Yes', 'woocommerce' ) . '</span>';
                                        } else {
                                            /* Translators: %s Payment gateway name. */
                                            echo '<span class="woocommerce-input-toggle woocommerce-input-toggle--disabled" aria-label="' . esc_attr( sprintf( __( 'The "%s" payment method is currently disabled', 'woocommerce' ), $method_title ) ) . '">' . esc_attr__( 'No', 'woocommerce' ) . '</span>';
                                        }
                                        echo '</a>';
                                        break;
                                }

                                echo '</td>';
                            }

                            echo '</tr>';
                        }
                        ?>
                    </tbody>
                </table>
            </td>
        </tr>
        <?php
    }

    /**
     * Save settings.
     */
    public function save() {
        global $current_section;

        $wc_payment_gateways = WC_Payment_Gateways::instance();

        // Save settings fields based on section.
        WC_Admin_Settings::save_fields( $this->get_settings( $current_section ) );

        if ( ! $current_section ) {
            // If section is empty, we're on the main settings page. This makes sure 'gateway ordering' is saved.
            $wc_payment_gateways->process_admin_options();
            $wc_payment_gateways->init();
        } else {
            // There is a section - this may be a gateway or custom section.
            foreach ( $wc_payment_gateways->payment_gateways() as $gateway ) {
                if ( in_array( $current_section, array( $gateway->id, sanitize_title( get_class( $gateway ) ) ), true ) ) {
                    do_action( 'woocommerce_update_options_payment_gateways_' . $gateway->id );
                    $wc_payment_gateways->init();
                }
            }

            do_action( 'woocommerce_update_options_' . $this->id . '_' . $current_section );
        }
    }
}

return new WC_Settings_Payment_Gateways();