From 93d1f93f4769a0bd0e3fcb3c72ab0958e507af21 Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Thu, 13 Dec 2018 14:33:13 -0500 Subject: [PATCH] Adding shortcode for new member form Signup form for just member/contact. --- models/front/members/newMemberForm.php | 399 +++++++++++++++++++++++++ setup/shortcodes.php | 19 ++ setup/validActions.php | 1 + views/front/members/newMemberForm.html | 151 ++++++++++ views/front/members/thankyou.html | 4 + 5 files changed, 574 insertions(+) create mode 100644 models/front/members/newMemberForm.php create mode 100644 views/front/members/newMemberForm.html create mode 100644 views/front/members/thankyou.html diff --git a/models/front/members/newMemberForm.php b/models/front/members/newMemberForm.php new file mode 100644 index 00000000..57fdce0c --- /dev/null +++ b/models/front/members/newMemberForm.php @@ -0,0 +1,399 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release index.php,v 1.0 2014/10/31 19:31:47 cscott Exp $ + * @link http://dev.gaslightmedia.com/ + */ + +class GlmMembersFront_members_newMemberForm // extends GlmDataBilling +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + + /** + * Constructor + * + * This contructor performs the work for this model. This model returns + * an array containing the following. + * + * 'status' + * + * True if successfull and false if there was a fatal failure. + * + * 'view' + * + * A suggested view name that the contoller should use instead of the + * default view for this model or false to indicate that the default view + * should be used. + * + * 'data' + * + * Data that the model is returning for use in merging with the view to + * produce output. + * + * @wpdb object WordPress database object + * + * @return array Array containing status, suggested view, and any data + */ + public function __construct ($wpdb, $config) + { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + /* + * Run constructor for the Billing data class + * + * Note, the third parameter is a flag that indicates to the Contacts + * data class that it should flag a group of fields as 'view_only'. + */ + // parent::__construct(false, false, true); + + } + + public function modelAction( $actionData = false ) + { + // Initialize Variables Here + $option = ''; + $view = 'newMemberForm'; + $management = false; + $messages = array(); + $errors = array(); + $paymentSuccess = false; + $paymentError = false; + $error = false; + $invoiceHtml = ''; + + // Check to see if a user is logged in + // If they are then they should not see the Become a member form at all. + if ( isset( $this->config['loggedInUser'] ) + && isset( $this->config['loggedInUser']['contactUser'] ) + && isset( $this->config['loggedInUser']['contactUser']['ref_dest'] ) + ) { + $option = 'alreadyMember'; + } + + if ( isset( $_REQUEST['option'] ) ) { + $option = $_REQUEST['option']; + } + + switch ( $option ) { + case 'alreadyMember': + $view = 'alreadyAMember'; + break; + + case 'newMembership': + if ( $this->config['settings']['recaptcha_secret_key'] ) { + // Check the form for reCaptcha + $response = wp_remote_post( 'https://www.google.com/recaptcha/api/siteverify', array( + 'method' => 'POST', + 'timeout' => 45, + 'redirection' => 5, + 'httpversion' => '1.0', + 'blocking' => true, + 'headers' => array(), + 'body' => array( + 'secret' => $this->config['settings']['recaptcha_secret_key'], + 'response' => $_REQUEST['g-recaptcha-response'], + 'remoteip' => $_SERVER['REMOTE_ADDR'] + ), + 'cookies' => array() + ) ); + + $response_code = wp_remote_retrieve_response_code( $response ); + $api_response = json_decode( wp_remote_retrieve_body( $response ), true ); + if ( $api_response['success'] != true ) { + $error = true; + $messages[] = $errors['email'] = "Invalid Captcha value!"; + } + } + + // Need to see if the email address they're using is already setup as a contact. + // If it is then we need to give a message about it and not let them sign up again. + + $email_to_check = filter_var( $_REQUEST['email'], FILTER_VALIDATE_EMAIL ); + $verify_email = filter_var( $_REQUEST['email_verify'], FILTER_VALIDATE_EMAIL ); + if ( !$email_to_check ) { + $error = true; + $messages[] = $errors['email'] = "Not a valid Email!"; + } + if ( $email_to_check != $verify_email ) { + // Emails don't match give error message + $error = true; + $messages[] = $errors['email'] = "Emails don't match!"; + } + // Check for wordpress user with same email address + $wpUser = get_user_by( 'email', $email_to_check ); + if ( is_object( $wpUser ) && $wpUser->ID ) { + $error = true; + $messages[] = $errors['email'] = "There's a user with that email already!"; + } + $passwd = filter_var( $_REQUEST['password'], FILTER_SANITIZE_STRING ); + $confirm_passwd = filter_var( $_REQUEST['confirm_password'], FILTER_SANITIZE_STRING ); + if ( $passwd != $confirm_passwd ) { + $error = true; + $messages[] = $errors['password'] = "Passwords don't match!"; + } + // Process the main form + // 1. Setup the member + $member_fname = filter_var( $_REQUEST['fname'], FILTER_SANITIZE_STRING ); + $member_lname = filter_var( $_REQUEST['lname'], FILTER_SANITIZE_STRING ); + $member_name = filter_var( $_REQUEST['business_name'], FILTER_SANITIZE_STRING ); + // Member type is based on the renewing_member field (invoice_types) + $member_type = 39; // TODO: This need a setting + if ( $member_type === false ) { + $error = true; + $messages[] = 'An error occurred! member_type'; + } + // Start database transaction + $this->wpdb->show_errors(); + $this->wpdb->query('START TRANSACTION'); + // $access = $this->config['access_numb']['Full']; + $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members', + array( + 'access' => 40, // Not Moderated + 'member_type' => $member_type, + 'created' => date( 'Y-m-d' ), + 'name' => $member_name, + 'member_slug' => sanitize_title( $member_name ), + ), + array( + '%d',// access + '%d',// member_type + '%s',// created + '%s',// name + '%s',// member_slug + ) + ); + $member_id = $this->wpdb->insert_id; + if ( !$member_id ) { + $error = true; + $messages[] = 'An error occurred! member_id'; + } else { + $member = $this->wpdb->get_row( + $this->wpdb->prepare( + "SELECT * + FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members + WHERE id = %d", + $member_id + ) + ); + } + // 2. Setup the member_info + $billing_addr1 = filter_var( $_REQUEST['billing_addr1'] ); + $billing_city = filter_var( $_REQUEST['billing_city'] ); + $billing_city_id = $this->getCityId( $billing_city ); + $billing_state = filter_var( $_REQUEST['billing_state'] ); + $billing_zip = filter_var( $_REQUEST['billing_zip'] ); + $phone = filter_var( $_REQUEST['phone'] ); + $website = filter_var( $_REQUEST['website'] ); + $email_on_website = filter_var( $_REQUEST['email_on_website'] ); + + $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_info', + array( + 'member' => $member_id, + 'member_name' => $member_name, + 'status' => 10, + 'reference_name' => 'new member form', + 'addr1' => $billing_addr1, + 'city' => $billing_city_id, + 'state' => $billing_state, + 'zip' => $billing_zip, + 'phone' => $phone, + 'url' => $website, + 'email' => $email_on_website, + 'create_time' => date( 'Y-m-d' ), + ), + array( + '%d', // member + '%s', // member_name + '%d', // status + '%s', // reference_name + '%s', // addr1 + '%d', // city + '%s', // state + '%s', // zip + '%s', // phone + '%s', // url + '%s', // email + '%s', // create_time + ) + ); + $member_info_id = $this->wpdb->insert_id; + if ( !$member_info_id ) { + $error = true; + $messages[] = 'An error occurred! member_info_id'; + } else { + $member_info = $this->wpdb->get_row( + $this->wpdb->prepare( + "SELECT * + FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "member_info + WHERE id = %d", + $member_info_id + ) + ); + } + // 3. Setup the contact (and wpUser) + // Determine the Worpress Role to be used for contact import - Using Entity Manager right now + $contactRoleNumb = $this->config['contact_role_numb']['LogInContact']; + $wpRole = $this->config['contact_role_wordpress'][$contactRoleNumb]; + $memberContactEmail = filter_var( $_REQUEST['email'], FILTER_VALIDATE_EMAIL ); + $memberLogin = filter_var( $_REQUEST['username'] ); + $this->wpdb->insert( + GLM_MEMBERS_CONTACTS_PLUGIN_DB_PREFIX . 'contacts', + array( + 'active' => true, + 'primary_contact' => true, + 'access' => $this->config['access_numb']['Full'], + 'fname' => $member_fname, + 'lname' => $member_lname, + 'contact_type' => $this->config['contact_type_numb']['Personal'], + 'contact_role' => $contactRoleNumb, + 'email' => $memberContactEmail, + 'username' => $memberLogin, + 'notes' => 'Become Member Form.', + 'create_time' => date('Y-m-d H:i:s', time()), + 'ref_type' => $this->config['ref_type_numb']['Member'], + 'ref_dest' => $member_id, + ), + array( + '%d', // active + '%d', // primary_contact + '%d', // access + '%s', // fname + '%s', // lname + '%d', // contact_type + '%d', // contact_role + '%s', // email + '%s', // username + '%s', // notes + '%s', // create_time + '%d', // ref_type + '%d', // ref_dest + ) + ); + $newContactID = $this->wpdb->insert_id; + if ( $newContactID ) { + $new_contact = $this->wpdb->get_row( + $this->wpdb->prepare( + "SELECT * + FROM " . GLM_MEMBERS_CONTACTS_PLUGIN_DB_PREFIX . "contacts + WHERE id = %d", + $newContactID + ) + ); + } else { + $error = true; + $messages[] = 'An error occurred! newContactID'; + } + $memberPasswd = filter_var( $_REQUEST['password'] ); + $wpUserID = wp_insert_user( + array( + 'user_email' => $memberContactEmail, + 'user_login' => $memberLogin, + 'user_pass' => $memberPasswd, + 'first_name' => $member_fname, + 'last_name' => $member_lname, + 'role' => $wpRole + ) + ); + if (is_int($wpUserID) && $wpUserID > 0) { + // Store the contact ID and active status into user meta data. + update_user_meta($wpUserID, 'glmMembersContactID', $newContactID); + update_user_meta($wpUserID, 'glmMembersContactActive', true); + } else if ( is_wp_error( $wpUserID ) ) { + $error = true; + $messages[''] = $errors['username'] = 'An error occurred! ' . $wpUserID->get_error_message() . ''; + } else { + $error = true; + $messages[] = 'An error occurred! wpUserID'; + } + // Save or rollback + if ( $error ) { + $this->wpdb->query('ROLLBACK'); + } else { + $this->wpdb->query('COMMIT'); + $view = 'thankyou'; + } + break; + + default: + break; + + } + + wp_register_script( 'recaptcha', 'https://www.google.com/recaptcha/api.js' ); + wp_enqueue_script( 'recaptcha' ); + + // Compile template data + $templateData = array( + 'option' => $option, + 'billing_settings' => $this->config['billing_settings'], + 'messages' => $messages, + 'errors' => $errors, + 'paymentSuccess' => $paymentSuccess, + 'paymentError' => $paymentError, + 'states' => $this->config['states'], + 'invoiceHtml' => $invoiceHtml, + ); + + // Return status, any suggested view, and any data to controller. + return array( + 'status' => true, + 'modelRedirect' => false, + 'view' => 'front/members/'.$view.'.html', + 'data' => $templateData + ); + + } + + public function getCityId( $city_name ) + { + // First try to get city id + $city_id = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "cities + WHERE name = %s", + $city_name + ) + ); + if ( $city_id ) { + return $city_id; + } + $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX . 'cities', + array( 'name' => $city_name ), + array( '%s' ) + ); + return $this->wpdb->insert_id; + } + + +} diff --git a/setup/shortcodes.php b/setup/shortcodes.php index 350d72ab..c5d61bc0 100644 --- a/setup/shortcodes.php +++ b/setup/shortcodes.php @@ -221,6 +221,17 @@ if ( isset( $config['settings'] ) && $config['settings']['enable_members'] ) { 'alpha' => false, ), ), + 'glm-members-become-member-form' => array( + 'plugin' => GLM_MEMBERS_PLUGIN_SLUG, + 'menu' => 'members', + 'action' => 'newMemberForm', + 'table' => false, + 'attributes' => array( + 'template' => false, + 'payment' => false, + ), + + ), ); $glmMembersShortcodes = apply_filters( 'glm-custom-fields-shortcodes', $glmMembersShortcodes ); @@ -617,6 +628,14 @@ if ( isset( $config['settings'] ) && $config['settings']['enable_members'] ) { $_REQUEST[\'alpha\']. + ShortcodeAttributeDescription + + [glm-members-billing-become-member-form] +   + + Displays a Become Member Form. + + '; } else { $glmMembersShortcodes = array(); diff --git a/setup/validActions.php b/setup/validActions.php index ef985fca..55e0ca88 100644 --- a/setup/validActions.php +++ b/setup/validActions.php @@ -111,6 +111,7 @@ $glmMembersValidActions = array( 'featured' => 'glm-member-db', 'interactivemap' => 'glm-member-db', 'cityWeather' => 'glm-member-db', + 'newMemberForm' => 'glm-member-db', ), 'error' => array( 'index' => 'glm-member-db', diff --git a/views/front/members/newMemberForm.html b/views/front/members/newMemberForm.html new file mode 100644 index 00000000..64efa555 --- /dev/null +++ b/views/front/members/newMemberForm.html @@ -0,0 +1,151 @@ +{* This template is for New Member Form *} +

Become a Member

+
+ + {if $paymentSuccess}Payment Completed{/if} + {if $paymentError}Error With Payment{/if} + + {if $messages} + {foreach $messages as $message} +
{$message}
+ {/foreach} + {/if} + +
+ + +
+ Membership Information + + {if isset($errors.email) && $errors.email}
{$errors.email}
{/if} + +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ +
+
+ Account/Contact Information +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + {if isset($errors.username) && $errors.username}
{$errors.username}
{/if} + The password must be at least 8 characters and include at least one number, one letter, and at least one special character. (# . - _ , $ % & !) +
+
+
+
+ + +
+
+ + +
+
+ + {if isset($errors.password) && $errors.password}
{$errors.password}
{/if} + +
+ + + + + + + {if $settings.recaptcha_site_key} +
+ {/if} + + + +
+
+ + diff --git a/views/front/members/thankyou.html b/views/front/members/thankyou.html new file mode 100644 index 00000000..b07a5bb3 --- /dev/null +++ b/views/front/members/thankyou.html @@ -0,0 +1,4 @@ +{* Thank you page template *} +

Thank You

+

Your business Information has been successfully submitted. A representative will be contacting you shortly to follow up.

+ -- 2.17.1