From 60fbb75e591e288dee927a7813531056ba044b7c Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Wed, 27 Sep 2017 15:14:38 -0400 Subject: [PATCH] Setting up the event reg page so it reloads registrants If registrants are in the cart (loaded in session), then they'll output back under the class they were registered in. --- css/front.css | 13 ++-- js/frontRegApp.js | 66 +++++++++++++++++++-- js/models/front/account.js | 4 +- js/models/front/regClass.js | 4 ++ js/models/front/regEvent.js | 7 +++ js/models/front/regRequestRegistrant.js | 15 +++++ js/views/front/app.js | 15 ++++- js/views/front/regClass.js | 21 ++++++- models/admin/ajax/account.php | 14 ++++- models/admin/ajax/regFront.php | 5 +- models/admin/ajax/regFront/registrant.php | 23 +++---- models/front/registrations/registration.php | 59 +++++++++++++++++- views/front/registrations/registration.html | 40 +++++++------ 13 files changed, 237 insertions(+), 49 deletions(-) diff --git a/css/front.css b/css/front.css index 2b742cf..4b3a7d5 100644 --- a/css/front.css +++ b/css/front.css @@ -57,7 +57,6 @@ background-color: lightgrey; } .glm-reg-level-registrant span { - text-decoration: underline; padding: .3rem 1rem .3rem .2rem; } .glm-reg-compcode-entry { @@ -144,8 +143,14 @@ div.glm-reg-login h4 { .new-reg { background-color: white; border: 1px solid black; - padding: 30px; + padding: 2rem; position: absolute; - left: 10px; - top: 50px; + left: 1rem; + top: 3rem; + width: 30rem; +} +.new-reg .reg_fname, .new-reg .reg_lname { + width: 46%; + margin-right: 1rem; + float: left; } diff --git a/js/frontRegApp.js b/js/frontRegApp.js index 852b76e..92e61f9 100644 --- a/js/frontRegApp.js +++ b/js/frontRegApp.js @@ -5,8 +5,10 @@ app.Models.Front.Account = Backbone.Model.extend({ // Default registrant values defaults: { - name: 'AppAccount', id: '', + name: 'AppAccount', + fname: '', + lname: '', email: '', }, @@ -147,6 +149,10 @@ app.Models.Front.RegClass = Backbone.Model.extend({ this.registrants = new app.Collections.Front.RegRequestRegistrants( [] ); }, + setRegistrants: function( registrants ) { + this.registrants.reset( registrants ); + }, + }); // js/models/regEvent.js @@ -177,6 +183,13 @@ app.Models.Front.RegEvent = Backbone.Model.extend({ this.classes.reset( regClasses ); }, + setClassRegistrants: function( registrants ){ + for ( var i = 0; i < registrants.length; i++ ) { + var foundClass = this.classes.findWhere({ id: registrants[i].class_id }); + foundClass.registrants.create( registrants[i] ); + } + }, + }); // js/models/regRate.js @@ -226,6 +239,21 @@ app.Models.Front.RegRequestRegistrant = Backbone.Model.extend({ url: ajaxUrl+'&glm_action=regFront&collection=registrant', + validate: function( attribs, options ){ + if ( attribs.fname === undefined || attribs.fname === '' ) { + return 'First Name Required'; + } + if ( attribs.lname === undefined || attribs.lname === '' ) { + return 'Last Name Required'; + } + if ( attribs.email !== undefined && attribs.email !== '' ) { + var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; + if ( reg.test( attribs.email ) == false ) { + return 'Invalid Email Address'; + } + } + }, + // sync: function( method, model ){ // //console.log( 'sync in model' ); // // console.log( method ); @@ -420,8 +448,8 @@ app.Views.Front.App = Backbone.View.extend({ // Check to see if there's a login if ( loginAccount ) { jQuery('.glm-reg-account-login').hide(); - var accountView = new app.Views.Front.Account({ model: loginAccount }); - this.$el.append( accountView.render().el ); + this.accountView = new app.Views.Front.Account({ model: loginAccount }); + this.$el.append( this.accountView.render().el ); } this.$el.append( this.event.render().el ); return this; @@ -436,6 +464,11 @@ app.Views.Front.App = Backbone.View.extend({ continue: function(){ console.log( cart ); + // Confirm they are done and goto the next page + var isDone = confirm( 'Are you done?' ); + if ( isDone ) { + window.location.href = nextPageUrl; + } // Need to update the cart }, @@ -451,7 +484,9 @@ app.Views.Front.App = Backbone.View.extend({ console.log( msg ); // Here we can update. loginAccount = ''; + this.accountView.remove(); this.render(); + jQuery('#appLogin').show(); }) .fail(function(msg){ console.log('Fail:'); @@ -475,7 +510,9 @@ app.Views.Front.App = Backbone.View.extend({ // Create account model and assign to this.loginAccount loginAccount = new app.Models.Front.Account({ id: account.id, - email: account.email + email: account.email, + fname: account.fname, + lname: account.lname }); // Destroy the model and remove the view this.loginModel.destroy(); @@ -620,10 +657,12 @@ app.Views.Front.RegClass = Backbone.View.extend({ 'click .glm-add-account': 'addAccount', 'click .glm-add-new-account': 'addNewAccount', 'click .add-new-registrant': 'addNew', + 'click .add-new-registrant-cancel': 'cancelAddNew', }, addAccount: function(){ console.log( 'Add Account Called' ); + console.log( loginAccount ); // Check to make sure the loginAccount is not empty if ( loginAccount !== '' ) { var regRequest = cart.get( 'request' ); @@ -638,6 +677,8 @@ app.Views.Front.RegClass = Backbone.View.extend({ reg_class: this.model.get( 'id' ), reg_rate: this.model.get('reg_rate_id'), email: accountEmail, + fname: loginAccount.get('fname'), + lname: loginAccount.get('lname') }); } } @@ -647,7 +688,17 @@ app.Views.Front.RegClass = Backbone.View.extend({ var fname = this.$('.reg_fname').val().trim(); var lname = this.$('.reg_lname').val().trim(); var email = this.$('.reg_email').val().trim(); - console.log( 'email: ' + email + ' fname: ' + fname + ' lname: ' + lname ); + //console.log( 'email: ' + email + ' fname: ' + fname + ' lname: ' + lname ); + if ( fname === '' || lname === '' ) { + alert( 'First and Last name required!' ); + return; + } + if ( email === '' ) { + var confAnsw = confirm( 'You have no email address! Are you sure you want to add this registrant?' ); + if ( !confAnsw ) { + return; + } + } var regRequest = cart.get( 'request' ); this.model.registrants.create({ option: 'add', @@ -663,6 +714,11 @@ app.Views.Front.RegClass = Backbone.View.extend({ this.newRegAccountView.remove(); }, + cancelAddNew: function(){ + this.newRegAccount.destroy(); + this.newRegAccountView.remove(); + }, + addNewAccount: function(){ console.log( 'Add New Account Called' ); // Create the new Registrant View diff --git a/js/models/front/account.js b/js/models/front/account.js index d39327a..4603a2f 100644 --- a/js/models/front/account.js +++ b/js/models/front/account.js @@ -5,8 +5,10 @@ app.Models.Front.Account = Backbone.Model.extend({ // Default registrant values defaults: { - name: 'AppAccount', id: '', + name: 'AppAccount', + fname: '', + lname: '', email: '', }, diff --git a/js/models/front/regClass.js b/js/models/front/regClass.js index 515879f..b9a2649 100644 --- a/js/models/front/regClass.js +++ b/js/models/front/regClass.js @@ -22,4 +22,8 @@ app.Models.Front.RegClass = Backbone.Model.extend({ this.registrants = new app.Collections.Front.RegRequestRegistrants( [] ); }, + setRegistrants: function( registrants ) { + this.registrants.reset( registrants ); + }, + }); diff --git a/js/models/front/regEvent.js b/js/models/front/regEvent.js index 0799eda..eb73ebd 100644 --- a/js/models/front/regEvent.js +++ b/js/models/front/regEvent.js @@ -26,4 +26,11 @@ app.Models.Front.RegEvent = Backbone.Model.extend({ this.classes.reset( regClasses ); }, + setClassRegistrants: function( registrants ){ + for ( var i = 0; i < registrants.length; i++ ) { + var foundClass = this.classes.findWhere({ id: registrants[i].class_id }); + foundClass.registrants.create( registrants[i] ); + } + }, + }); diff --git a/js/models/front/regRequestRegistrant.js b/js/models/front/regRequestRegistrant.js index 31390ba..f00868c 100644 --- a/js/models/front/regRequestRegistrant.js +++ b/js/models/front/regRequestRegistrant.js @@ -21,6 +21,21 @@ app.Models.Front.RegRequestRegistrant = Backbone.Model.extend({ url: ajaxUrl+'&glm_action=regFront&collection=registrant', + validate: function( attribs, options ){ + if ( attribs.fname === undefined || attribs.fname === '' ) { + return 'First Name Required'; + } + if ( attribs.lname === undefined || attribs.lname === '' ) { + return 'Last Name Required'; + } + if ( attribs.email !== undefined && attribs.email !== '' ) { + var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; + if ( reg.test( attribs.email ) == false ) { + return 'Invalid Email Address'; + } + } + }, + // sync: function( method, model ){ // //console.log( 'sync in model' ); // // console.log( method ); diff --git a/js/views/front/app.js b/js/views/front/app.js index ed16e89..82a573f 100644 --- a/js/views/front/app.js +++ b/js/views/front/app.js @@ -17,8 +17,8 @@ app.Views.Front.App = Backbone.View.extend({ // Check to see if there's a login if ( loginAccount ) { jQuery('.glm-reg-account-login').hide(); - var accountView = new app.Views.Front.Account({ model: loginAccount }); - this.$el.append( accountView.render().el ); + this.accountView = new app.Views.Front.Account({ model: loginAccount }); + this.$el.append( this.accountView.render().el ); } this.$el.append( this.event.render().el ); return this; @@ -33,6 +33,11 @@ app.Views.Front.App = Backbone.View.extend({ continue: function(){ console.log( cart ); + // Confirm they are done and goto the next page + var isDone = confirm( 'Are you done?' ); + if ( isDone ) { + window.location.href = nextPageUrl; + } // Need to update the cart }, @@ -48,7 +53,9 @@ app.Views.Front.App = Backbone.View.extend({ console.log( msg ); // Here we can update. loginAccount = ''; + this.accountView.remove(); this.render(); + jQuery('#appLogin').show(); }) .fail(function(msg){ console.log('Fail:'); @@ -72,7 +79,9 @@ app.Views.Front.App = Backbone.View.extend({ // Create account model and assign to this.loginAccount loginAccount = new app.Models.Front.Account({ id: account.id, - email: account.email + email: account.email, + fname: account.fname, + lname: account.lname }); // Destroy the model and remove the view this.loginModel.destroy(); diff --git a/js/views/front/regClass.js b/js/views/front/regClass.js index eade028..c4198ff 100644 --- a/js/views/front/regClass.js +++ b/js/views/front/regClass.js @@ -43,10 +43,12 @@ app.Views.Front.RegClass = Backbone.View.extend({ 'click .glm-add-account': 'addAccount', 'click .glm-add-new-account': 'addNewAccount', 'click .add-new-registrant': 'addNew', + 'click .add-new-registrant-cancel': 'cancelAddNew', }, addAccount: function(){ console.log( 'Add Account Called' ); + console.log( loginAccount ); // Check to make sure the loginAccount is not empty if ( loginAccount !== '' ) { var regRequest = cart.get( 'request' ); @@ -61,6 +63,8 @@ app.Views.Front.RegClass = Backbone.View.extend({ reg_class: this.model.get( 'id' ), reg_rate: this.model.get('reg_rate_id'), email: accountEmail, + fname: loginAccount.get('fname'), + lname: loginAccount.get('lname') }); } } @@ -70,7 +74,17 @@ app.Views.Front.RegClass = Backbone.View.extend({ var fname = this.$('.reg_fname').val().trim(); var lname = this.$('.reg_lname').val().trim(); var email = this.$('.reg_email').val().trim(); - console.log( 'email: ' + email + ' fname: ' + fname + ' lname: ' + lname ); + //console.log( 'email: ' + email + ' fname: ' + fname + ' lname: ' + lname ); + if ( fname === '' || lname === '' ) { + alert( 'First and Last name required!' ); + return; + } + if ( email === '' ) { + var confAnsw = confirm( 'You have no email address! Are you sure you want to add this registrant?' ); + if ( !confAnsw ) { + return; + } + } var regRequest = cart.get( 'request' ); this.model.registrants.create({ option: 'add', @@ -86,6 +100,11 @@ app.Views.Front.RegClass = Backbone.View.extend({ this.newRegAccountView.remove(); }, + cancelAddNew: function(){ + this.newRegAccount.destroy(); + this.newRegAccountView.remove(); + }, + addNewAccount: function(){ console.log( 'Add New Account Called' ); // Create the new Registrant View diff --git a/models/admin/ajax/account.php b/models/admin/ajax/account.php index 3a13667..b68c9a1 100644 --- a/models/admin/ajax/account.php +++ b/models/admin/ajax/account.php @@ -106,7 +106,7 @@ class GlmMembersAdmin_ajax_account extends GLMDataRegistrationsAccount // Check accounts for ones that match $returnData = $this->wpdb->get_row( $this->wpdb->prepare( - "SELECT id,password + "SELECT id,password,fname,lname FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . "account WHERE email = %s", $username @@ -116,11 +116,19 @@ class GlmMembersAdmin_ajax_account extends GLMDataRegistrationsAccount $returnPassword = $returnData['password']; $returnId = $returnData['id']; if ( $returnPassword == crypt( $password, $returnPassword ) ) { - $return = array( 'valid' => true, 'email' => $username, 'id' => $returnId ); + $return = array( + 'valid' => true, + 'email' => $username, + 'id' => $returnId, + 'fname' => $returnData['fname'], + 'lname' => $returnData['lname'], + ); // Add the user to the php session $_SESSION['LoginAccount'] = array( 'id' => $returnId, - 'email' => $username + 'email' => $username, + 'fname' => $returnData['fname'], + 'lname' => $returnData['lname'], ); } else { $return = array( 'valid' => false ); diff --git a/models/admin/ajax/regFront.php b/models/admin/ajax/regFront.php index fac5d5d..c0c7f8c 100644 --- a/models/admin/ajax/regFront.php +++ b/models/admin/ajax/regFront.php @@ -79,9 +79,12 @@ class GlmMembersAdmin_ajax_regFront wp_die(); } - if ( !isset($_REQUEST['model']) && $_REQUEST['option'] === 'delete' ) { + if ( !isset($_REQUEST['model']) && isset($_REQUEST['option']) && $_REQUEST['option'] === 'delete' ) { $_REQUEST['model'] = json_encode($_REQUEST); } + if ( !isset($_REQUEST['model']) ) { + wp_die(); + } // Try to decode the JSON $modelData = json_decode(stripslashes($_REQUEST['model']), true); diff --git a/models/admin/ajax/regFront/registrant.php b/models/admin/ajax/regFront/registrant.php index 10faff8..e781b53 100644 --- a/models/admin/ajax/regFront/registrant.php +++ b/models/admin/ajax/regFront/registrant.php @@ -102,7 +102,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations if ( $modelData['reg_event'] ) { //return false; } - $regRegquestEventId = $this->wpdb->get_var( + $regRequestEventId = $this->wpdb->get_var( $this->wpdb->prepare( "SELECT id FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . "reg_request_event @@ -126,18 +126,18 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations '%d', // reg_time '%s', // event_datetime ); - if ( !$regRegquestEventId ) { + if ( !$regRequestEventId ) { $this->wpdb->insert( GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . 'reg_request_event', $data, $dataFormat ); - $regRegquestEventId = $this->wpdb->insert_id; + $regRequestEventId = $this->wpdb->insert_id; } else { $this->wpdb->update( GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . 'reg_request_event', $data, - array( 'id' => $regRegquestEventId ), + array( 'id' => $regRequestEventId ), $dataFormat, array( '%d' ) ); @@ -150,7 +150,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations WHERE reg_request_event = %d AND class = %d AND reg_request = %d", - $regRegquestEventId, + $regRequestEventId, $modelData['reg_class'], $modelData['reg_request'] ) @@ -161,7 +161,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], 'reg_request' => $modelData['reg_request'], - 'reg_request_event' => $regRegquestEventId, + 'reg_request_event' => $regRequestEventId, 'class' => $modelData['reg_class'], ); $dataFormat = array( @@ -218,7 +218,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], 'reg_request' => $modelData['reg_request'], - 'reg_request_event' => $regRegquestEventId, + 'reg_request_event' => $regRequestEventId, 'reg_request_class' => $regRequestClassId, 'rate' => $modelData['reg_rate'], 'rate_name' => $rate['name'], @@ -272,7 +272,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations } if ( !isset( $accountId ) ) { // We need to create an account for this one - $this->insert( + $this->wpdb->insert( GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . 'account', array( 'fname' => $modelData['fname'], @@ -294,11 +294,12 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations AND reg_request_event = %d AND reg_request_class = %d", $modelData['reg_request'], - $modelData['account'], - $regRegquestEventId, + $accountId, + $regRequestEventId, $regRequestClassId ) ); + $data = array( 'account' => $accountId, 'reg_event' => $modelData['reg_event'], @@ -306,7 +307,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], 'reg_request' => $modelData['reg_request'], - 'reg_request_event' => $regRegquestEventId, + 'reg_request_event' => $regRequestEventId, 'reg_request_class' => $regRequestClassId, 'reg_request_rate' => $regRequestRate, 'fname' => $modelData['fname'], diff --git a/models/front/registrations/registration.php b/models/front/registrations/registration.php index b21088d..32df2be 100644 --- a/models/front/registrations/registration.php +++ b/models/front/registrations/registration.php @@ -1,6 +1,6 @@ $_SESSION: ' . print_r( $_SESSION, true ) . ''; + switch ( $option ) { default: - + // Get the RegEvent entry $regEvent = $this->getEntry( $eventRegID ); //echo '
$regEvent: ' . print_r( $regEvent, true ) . '
'; @@ -175,6 +176,10 @@ $regClassJSON = '[' . implode( ',', $jsonClasses ) . ']'; $regCartJSON = json_encode( $cart ); + // Get terms into JSON + $termsJSON = json_encode( $this->config['terms'] ); + //echo '
$this->config[terms]: ' . print_r( $this->config['terms'], true ) . '
'; + // check to see if there's a user logged in if ( isset( $_SESSION['LoginAccount'] ) && filter_var( $_SESSION['LoginAccount']['id'], FILTER_VALIDATE_INT ) ) { $loginAccount = json_encode( $_SESSION['LoginAccount'], JSON_NUMERIC_CHECK ); @@ -183,6 +188,54 @@ //echo '
$_SESSION: ' . print_r( $_SESSION, true ) . '
'; + // If there's a cart then pull any registrants for it + // If there classes in the cart with rates and registrants they'll need + // be setup. + + //echo '
$cart: ' . print_r( $cart, true ) . '
'; + $registrants = array(); + //echo '
$cart[events]: ' . print_r( $cart['events'], true ) . '
'; + + if ( isset( $cart['events'] ) && is_array( $cart['events'] ) ) { + foreach ( $cart['events'] as $event ) { + if ( isset( $event['classes'] ) && is_array( $event['classes'] ) ) { + foreach ( $event['classes'] as $class ) { + if ( isset( $class['rates'] ) && is_array( $class['rates'] ) ) { + foreach ( $class['rates'] as $rate ) { + if ( isset( $rate['registrants'] ) && is_array( $rate['registrants'] ) ) { + foreach ( $rate['registrants'] as $registrant ) { + // Need to know the class id for the registrant + $classId = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT class + FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . "reg_request_class + WHERE id = %d", + $registrant['reg_request_class'] + ) + ); + // Also need to fetch the email + $email = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT email + FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . "account + WHERE id = %d", + $registrant['account'] + ) + ); + $registrant['class_id'] = $classId; + $registrant['email'] = $email; + $registrants[] = $registrant; + } + } + } + } + } + } + } + } + + //echo '
$registrants: ' . print_r( $registrants, true ) . '
'; + // Compile template data $templateData = array( 'entry' => $regEventSample, @@ -193,6 +246,8 @@ 'regRequestJSON' => $regRequestJSON, 'eventData' => $eventData, 'loginAccount' => $loginAccount, + 'termsJSON' => $termsJSON, + 'regJSON' => json_encode( $registrants, JSON_NUMERIC_CHECK ), ); // Return status, any suggested view, and any data to controller return array( diff --git a/views/front/registrations/registration.html b/views/front/registrations/registration.html index b9cf7da..aac27de 100644 --- a/views/front/registrations/registration.html +++ b/views/front/registrations/registration.html @@ -8,8 +8,8 @@ <% } %> Close Forgot Password - - + + {/literal} @@ -27,8 +27,8 @@

<%= descr %>

- <% if ( attendee_max > 0 ) { %> -

Maximum Registrants: <%- attendee_max %>

+ <% if ( attendees_max > 0 ) { %> +

Maximum Registrants: <%- attendees_max %>

<% } %>

<%= terms %>

@@ -41,7 +41,7 @@
- +
{/literal} @@ -57,42 +57,44 @@
<%- descr %>
Current Rate: <%= reg_rate_name %>
Base Price: <%= reg_rate_base_price %>
-
Per Registrant: <%= reg_rate_per_reg %>
+
Per {/literal}{$terms.reg_term_attendee_cap}{literal}: <%= reg_rate_per_reg %>
<% if ( loggedIn ) { %> <% } %> - -
- - - - -
+
- Registrants + {/literal}{$terms.reg_term_attendee_plur_cap}{literal}
{/literal} {* Template for registrant add form *}{literal} {/literal} {* Template for registrant *}{literal} {/literal}
+

{$terms.reg_term_registrations_name}

@@ -104,6 +106,7 @@ var appLoginUrl = '{$ajaxUrl}?action=glm_members_admin_ajax&glm_action=login'; var appAccountUrl = '{$ajaxUrl}?action=glm_members_admin_ajax&glm_action=account'; var ajaxUrl = '{$ajaxUrl}?action=glm_members_admin_ajax'; +var nextPageUrl = '{$thisUrl}?page=cart'; var app = { Models: { Front: {}, Admin: {} }, Collections: { Front: {}, Admin: {} }, @@ -123,6 +126,7 @@ jQuery(function($){ regEvent = new app.Models.Front.RegEvent; regEvent.set( {$regEventJSON} ); regEvent.setClasses( {$regClassesJSON} ); + regEvent.setClassRegistrants( {$regJSON} ); var glmApp = new app.Views.Front.App(); }); -- 2.17.1