Newer
Older
wordpress-ojs-pugin / includes / class-registration.php
<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class WP_OJS_SSO_Registration {

    private static $instance = null;

    public static function instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        if ( WP_OJS_SSO_Plugin::get_option( 'enable_registration_checkbox' ) ) {
            add_action( 'register_form', [ $this, 'render_fields' ] );
            add_filter( 'registration_errors', [ $this, 'validate' ], 10, 3 );
            add_action( 'user_register', [ $this, 'save' ] );
            add_action( 'login_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
        }
    }

    public function enqueue_scripts() {
        if ( ! isset( $_GET['action'] ) || 'register' !== $_GET['action'] ) {
            // Only on the registration page
            global $pagenow;
            if ( 'wp-login.php' !== $pagenow ) {
                return;
            }
        }
        wp_enqueue_script(
            'wp-ojs-sso-conditional',
            WP_OJS_SSO_URL . 'assets/js/conditional-fields.js',
            [],
            WP_OJS_SSO_VERSION,
            true
        );
        wp_enqueue_style(
            'wp-ojs-sso-registration',
            WP_OJS_SSO_URL . 'assets/css/admin-styles.css',
            [],
            WP_OJS_SSO_VERSION
        );
    }

    public function render_fields() {
        // Ensure the form supports file uploads
        echo '<script>document.getElementById("registerform").enctype="multipart/form-data";</script>';

        $checkbox_text = WP_OJS_SSO_Plugin::get_option(
            'registration_checkbox_text',
            __( 'I want to subscribe to the journal', 'wp-ojs-sso-bridge' )
        );
        $description = WP_OJS_SSO_Plugin::get_option(
            'registration_description',
            __( 'Your subscription will be activated after verification by an administrator.', 'wp-ojs-sso-bridge' )
        );

        $requested = ! empty( $_POST['ojs_subscription_requested'] );
        ?>
        <p id="ojs-subscribe-toggle">
            <label>
                <input type="checkbox" name="ojs_subscription_requested" id="ojs_subscription_requested" value="1"
                    <?php checked( $requested ); ?> />
                <?php echo esc_html( $checkbox_text ); ?>
            </label>
            <?php if ( $description ) : ?>
                <br/><span class="description"><?php echo wp_kses_post( $description ); ?></span>
            <?php endif; ?>
        </p>

        <div id="ojs-subscription-fields" style="<?php echo $requested ? '' : 'display:none;'; ?>">
            <p>
                <label for="first_name"><?php esc_html_e( 'First Name', 'wp-ojs-sso-bridge' ); ?> <span class="description">*</span></label><br/>
                <input type="text" name="first_name" id="first_name" class="input"
                    value="<?php echo esc_attr( $_POST['first_name'] ?? '' ); ?>" data-conditional-required="1" />
            </p>
            <p>
                <label for="last_name"><?php esc_html_e( 'Last Name', 'wp-ojs-sso-bridge' ); ?> <span class="description">*</span></label><br/>
                <input type="text" name="last_name" id="last_name" class="input"
                    value="<?php echo esc_attr( $_POST['last_name'] ?? '' ); ?>" data-conditional-required="1" />
            </p>

            <?php
            $fields = WP_OJS_SSO_Subscription_Fields::get_fields();
            foreach ( $fields as $key => $field ) {
                $value = sanitize_text_field( $_POST[ $key ] ?? '' );
                echo '<p>';
                WP_OJS_SSO_Subscription_Fields::render_field( $key, $field, $value );
                echo '</p>';
            }
            ?>
        </div>
        <?php
    }

    public function validate( $errors, $sanitized_user_login, $user_email ) {
        if ( empty( $_POST['ojs_subscription_requested'] ) ) {
            return $errors;
        }

        if ( empty( $_POST['first_name'] ) ) {
            $errors->add( 'first_name_error', __( '<strong>Error</strong>: First Name is required for subscription.', 'wp-ojs-sso-bridge' ) );
        }
        if ( empty( $_POST['last_name'] ) ) {
            $errors->add( 'last_name_error', __( '<strong>Error</strong>: Last Name is required for subscription.', 'wp-ojs-sso-bridge' ) );
        }

        $field_errors = WP_OJS_SSO_Subscription_Fields::validate( $_POST, $_FILES );
        foreach ( $field_errors as $code => $msg ) {
            $errors->add( $code . '_error', '<strong>' . esc_html__( 'Error', 'wp-ojs-sso-bridge' ) . '</strong>: ' . esc_html( $msg ) );
        }

        return $errors;
    }

    public function save( $user_id ) {
        if ( empty( $_POST['ojs_subscription_requested'] ) ) {
            return;
        }

        update_user_meta( $user_id, 'ojs_subscription_requested', '1' );
        WP_OJS_SSO_Subscription_Fields::save_fields( $user_id, $_POST );

        // Media uploads (certificato + bonifico)
        if ( ! empty( $_FILES['ojs_student_document']['name'] ) ) {
            WP_OJS_SSO_File_Upload::handle_upload( $user_id );
        }
        if ( ! empty( $_FILES['ojs_bonifico_receipt']['name'] ) && class_exists( 'WP_OJS_SSO_Subscription_Media' ) ) {
            WP_OJS_SSO_Subscription_Media::handle_upload( $user_id, 'ojs_bonifico_receipt', WP_OJS_SSO_Subscription_Media::KIND_BONIFICO );
        }

        // Notify admin
        if ( WP_OJS_SSO_Plugin::get_option( 'notify_admin_on_request' ) ) {
            $user = get_userdata( $user_id );
            $admin_email = get_option( 'admin_email' );
            $subject = sprintf(
                /* translators: %s: site name */
                __( '[%s] New journal subscription request', 'wp-ojs-sso-bridge' ),
                get_bloginfo( 'name' )
            );
            $body = sprintf(
                /* translators: 1: username, 2: email, 3: admin users URL */
                __( "User \"%1\$s\" (%2\$s) has requested a journal subscription.\n\nReview pending requests: %3\$s", 'wp-ojs-sso-bridge' ),
                $user->user_login,
                $user->user_email,
                admin_url( 'users.php?ojs_sub_filter=requested' )
            );
            wp_mail( $admin_email, $subject, $body );
        }
    }
}