From 6e4aabd3e4789a7210fd53a814374c2024e349b5 Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Thu, 3 Jan 2019 09:01:56 -0500 Subject: [PATCH] Setting and email notice for new member signup form. Implementing the setting for new member signup form. --- classes/data/settings/dataSettingsSignup.php | 164 +++++++++++++ models/admin/settings/signupform.php | 228 +++++++++++++++++++ models/front/members/newMemberForm.php | 96 +++++++- setup/validActions.php | 1 + views/admin/settings/header.html | 18 +- views/admin/settings/signupform.html | 100 ++++++++ views/front/members/newMemberForm.html | 2 +- views/front/members/ownerEmail.html | 29 +++ views/front/members/userEmail.html | 22 ++ 9 files changed, 647 insertions(+), 13 deletions(-) create mode 100755 classes/data/settings/dataSettingsSignup.php create mode 100644 models/admin/settings/signupform.php create mode 100755 views/admin/settings/signupform.html create mode 100644 views/front/members/ownerEmail.html create mode 100644 views/front/members/userEmail.html diff --git a/classes/data/settings/dataSettingsSignup.php b/classes/data/settings/dataSettingsSignup.php new file mode 100755 index 00000000..efca2a60 --- /dev/null +++ b/classes/data/settings/dataSettingsSignup.php @@ -0,0 +1,164 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataSettingsGeneral.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * GlmDataSettingsGeneral class + * + * PHP version 5 + * + * @category Data + * @package EventManagement + * @author Chuck Scott + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott + * Exp $ + */ +class GlmDataSettingsSignup extends GlmDataAbstract +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + /** + * Field definitions + * + * @var $ini + * @access public + */ + public $table; + + /** + * Field definitions + * + * 'type' is type of field as defined by the application + * text Regular text field + * pointer Pointer to an entry in another table + * 'filters' is the filter name for a particular filter ID in PHP filter + * functions + * See PHP filter_id() + * + * 'use' is when to use the field + * l = List + * g = Get + * n = New + * i = Insert + * e = Edit + * u = Update + * d = Delete + * a = All + * + * @var $ini + * @access public + */ + public $fields = false; + + /** + * Constructor + * + * @param object $d + * database connection + * + * @return void + * @access public + */ + function __construct ($wpdb, $config) + { + + // If this class is not being extended along with existing $wpdb and $config + if (!$this->wpdb) { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + } + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_PLUGIN_DB_PREFIX . 'settings_general'; + + /* + * Table Data Fields + */ + $this->fields = array( + + 'id' => array( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a' + ), + + 'new_member_intro' => array( + 'field' => 'new_member_intro', + 'type' => 'text', + 'use' => 'a' + ), + + 'new_member_thankyou' => array( + 'field' => 'new_member_thankyou', + 'type' => 'text', + 'use' => 'a' + ), + + 'new_member_notice_to' => array( + 'field' => 'new_member_notice_to', + 'type' => 'text', + 'use' => 'a' + ), + + 'new_member_notice_from' => array( + 'field' => 'new_member_notice_from', + 'type' => 'text', + 'use' => 'a' + ), + + 'new_member_notice_message' => array( + 'field' => 'new_member_notice_message', + 'type' => 'text', + 'use' => 'a' + ), + + 'new_member_type_default' => array( + 'field' => 'new_member_type_default', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_type', + 'p_field' => 'name', + 'p_orderby' => 'name', + 'required' => false, + 'force_list' => false, + 'use' => 'a' + ), + + ); + + } +} + +?> diff --git a/models/admin/settings/signupform.php b/models/admin/settings/signupform.php new file mode 100644 index 00000000..f377dce8 --- /dev/null +++ b/models/admin/settings/signupform.php @@ -0,0 +1,228 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +// Load Member Types data abstract +require_once GLM_MEMBERS_PLUGIN_CLASS_PATH . '/data/settings/dataSettingsSignup.php'; + +/* + * This class performs the work for the default action of the "Members" menu + * option, which is to display the members dashboard. + * + */ +class GlmMembersAdmin_settings_signupform extends GlmDataSettingsSignup +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + + /* + * Constructor + * + * This contructor sets up this model. At this time that only includes + * storing away the WordPress data object. + * + * @return object Class object + * + */ + public function __construct ($wpdb, $config) + { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + // Run constructor for members data class + parent::__construct(false, false); + + } + + /* + * Perform Model Action + * + * This method does the work for this model and returns any resulting data + * + * @return array Status and data array + * + * 'status' + * + * True if successfull and false if there was a fatal failure. + * + * 'menuItemRedirect' + * + * If not false, provides a menu item the controller should + * execute after this one. Normally if this is used, there would also be a + * modelRedirect value supplied as well. + * + * 'modelRedirect' + * + * If not false, provides an action the controller should execute after + * this one. + * + * '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. + * + */ + public function modelAction ($actionData = false) + { + + $settings_updated = false; + $settings_update_error = false; + $success = true; + $haveMemberTypes = false; + $memberTypes = false; + $couldNotDelete = false; + $error = false; + + // General settings are always stored in a record with ID=1. + $id = 1; + + // Determine if current user can edit configurations + if ( !current_user_can('glm_members_settings') ) { + return array( + 'status' => false, + 'menuItemRedirect' => 'error', + 'modelRedirect' => 'index', + 'view' => 'admin/error/index.html', + 'data' => array( + 'reason' => 'User does not have rights to make configuration changes.' + ) + ); + } + + // Check for submission option + $option = ''; + if ( isset( $_REQUEST[ 'option' ] ) && $_REQUEST[ 'option' ] == 'submit' ) { + $option = $_REQUEST['option']; + } + + switch ( $option ) { + + // Update General Settings and redisplay the form + case 'submit': + foreach ( $this->config[ 'addOns' ] as $a ) { + if ( isset( $a[ 'requiredPages' ] ) ) { + foreach ( $a[ 'requiredPages'] as $pageName => $pageData ) { + + $current_page_id_value = get_option( GLM_MEMBERS_PLUGIN_OPTION_PREFIX.$pageData[ 'underscored_title' ] ); + + // the static slug name used to create unique form field names + $page_title_field_name = 'glm_members_database_title_' . $this->requiredPages[ $a[ 'underscored_name'] ][ $pageName ][ 'static_name' ]; + $page_id_field_name = 'glm_members_database_id_' . $this->requiredPages[ $a[ 'underscored_name' ] ][ $pageName ][ 'static_name' ]; + + // the slug used to update the options table + $page_option_slug = GLM_MEMBERS_PLUGIN_OPTION_PREFIX.$pageData['underscored_title']; + + $current_page_title_value = $this->requiredPages[ $a[ 'underscored_name' ] ][ $pageName][ 'title' ]; + + if ( isset( $_POST[ $page_title_field_name ] ) && ! empty( $_POST[ $page_title_field_name ] ) ) { + $new_page_title_value = filter_var( $_POST[ $page_title_field_name ], FILTER_SANITIZE_STRING); + } else { + $title_error = true; + } + + // check to make sure the post value isn't empty and is numeric + if ( isset( $_POST[ $page_id_field_name ] ) && ! empty( $_POST[ $page_id_field_name ] ) && is_numeric( $_POST[ $page_id_field_name ] ) ) { + $new_page_id_value = filter_var( $_POST[ $page_id_field_name ], FILTER_SANITIZE_STRING ); + } else { + $id_error = true; + } + + // if the current page title matches the posted value, no need to update + if ( $current_page_title_value !== $new_page_title_value ) { + $args = array ( + 'ID' => $current_page_id_value, + 'post_title' => $new_page_title_value, + ); + wp_update_post( $args ); + } + + // ensure the new page id exists and isn't already the same as the current page ID value + if ( $current_page_id_value !== $new_page_id_value && get_post_status( $new_page_id_value ) ) { + update_option( $page_option_slug, $new_page_id_value ); + } + } + } + } + + // Update all general setttings + $generalSettings = $this->updateEntry( 1 ); + + if ( $generalSettings[ 'status' ] ) { + $settings_updated = true; + } else { + $settings_update_error = true; + } + + $generalSettings = $this->editEntry( $id ); + + break; + + // Default is to get the current settings and display the form + default: + + // Try to get the first (should be only) entry for general settings. + $generalSettings = $this->editEntry( $id ); + + break; + } + + if ( $settings_update_error ) { + $settings_updated = false; + } + + // Compile template data + $templateData = array( + 'reason' => '', + 'signupFormSettings' => $generalSettings, + 'settingsUpdated' => $settings_updated, + 'settingsUpdateError' => $settings_update_error, + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => true, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/settings/signupform.html', + 'data' => $templateData, + ); + + + } + + +} diff --git a/models/front/members/newMemberForm.php b/models/front/members/newMemberForm.php index 57fdce0c..08dff01e 100644 --- a/models/front/members/newMemberForm.php +++ b/models/front/members/newMemberForm.php @@ -163,8 +163,22 @@ class GlmMembersFront_members_newMemberForm // extends GlmDataBilling $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 ); + // Check for existing member with that name + $existingMember = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members + WHERE name = %s", + $member_name + ) + ); + if ( $existingMember ) { + $error = true; + $messages[] = $errors['email'] = "There's a member with that name already!"; + } + // Member type is based on the renewing_member field (invoice_types) - $member_type = 39; // TODO: This need a setting + $member_type = $this->config['settings']['new_member_type_default']; if ( $member_type === false ) { $error = true; $messages[] = 'An error occurred! member_type'; @@ -172,7 +186,6 @@ class GlmMembersFront_members_newMemberForm // extends GlmDataBilling // 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( @@ -219,7 +232,7 @@ class GlmMembersFront_members_newMemberForm // extends GlmDataBilling array( 'member' => $member_id, 'member_name' => $member_name, - 'status' => 10, + 'status' => 20, 'reference_name' => 'new member form', 'addr1' => $billing_addr1, 'city' => $billing_city_id, @@ -339,6 +352,19 @@ class GlmMembersFront_members_newMemberForm // extends GlmDataBilling $this->wpdb->query('ROLLBACK'); } else { $this->wpdb->query('COMMIT'); + $formData = array( + 'member_name' => $member_name, + 'member_fname' => $member_fname, + 'member_lname' => $member_lname, + 'addr1' => $billing_addr1, + 'city' => $billing_city, + 'state' => $billing_state, + 'zip' => $billing_zip, + 'phone' => $phone, + 'website' => $website, + 'email' => $memberContactEmail, + ); + $this->sendNotices( $formData ); $view = 'thankyou'; } break; @@ -373,6 +399,70 @@ class GlmMembersFront_members_newMemberForm // extends GlmDataBilling } + public function sendNotices( $formData ) + { + $smarty = new smartyTemplateSupport(); + $pendingList = GLM_MEMBERS_PLUGIN_ADMIN_URL . '?page=glm-members-admin-menu-members-list&glm_action=list&filterPending=true'; + $viewPath = GLM_MEMBERS_PLUGIN_PATH . '/views'; + $smarty->template->setTemplateDir( $viewPath ); + $smarty->templateAssign( 'title', 'New Member Signup' ); + $toEmail = $this->config['settings']['new_member_notice_to']; + $fromEmail = $this->config['settings']['new_member_notice_from']; + $emailNotification = $this->config['settings']['new_member_notice_message']; + $smarty->templateAssign( 'to_email', $toEmail ); + $smarty->templateAssign( 'from_email', $fromEmail ); + $smarty->templateAssign( 'emailNotification', $emailNotification ); + $smarty->templateAssign( 'pendingMembers', $pendingList ); + $smarty->templateAssign( 'member_data', $formData ); + + $userEmail = $formData['email']; + + $eventsList = GLM_MEMBERS_EVENTS_PLUGIN_ADMIN_URL . "?page=glm-members-admin-menu-events-index&glm_action=index"; + $smarty->templateAssign( 'items', $events ); + + // Add standard parameters + require GLM_MEMBERS_PLUGIN_SETUP_PATH.'/standardTemplateParams.php'; + + $viewFile = 'front/members/ownerEmail.html'; + $userEmailFile = 'front/members/userEmail.html'; + + // Generate output from model data and view + $htmlMessage = $smarty->template->fetch( $viewFile ); + $userMessage = $smarty->template->fetch( $userEmailFile ); + + function set_content_type() + { + return "text/html"; + } + + add_filter( 'wp_mail_content_type', 'set_content_type' ); + + $site_name = get_bloginfo( 'name' ); + $adminEmail = $toEmail; + $subject = 'New Member Form Submission'; + + $message = $htmlMessage; + $userBody = $userMessage; + + $header[] = "From: $site_name <$fromEmail>"; + $header[] = 'Reply-To:' . $userEmail; + + wp_mail( $adminEmail, $subject, $message, $header ); + + // send a copy to the user submitting the email, using different headers and email template file + $userHeader[] = "From: $site_name <$fromEmail>"; + $userHeader[] = 'Reply-To: No-Reply@gaslightmedia.com'; + + if ( wp_mail( $userEmail, $subject, $userBody, $userHeader ) ) { + + } else { + echo "Error: Message Not Sent"; + } + + // remove the filter to avoid conflicts + remove_filter( 'wp_mail_content_type', 'set_content_type' ); + } + public function getCityId( $city_name ) { // First try to get city id diff --git a/setup/validActions.php b/setup/validActions.php index 55e0ca88..ce6a7197 100644 --- a/setup/validActions.php +++ b/setup/validActions.php @@ -78,6 +78,7 @@ $glmMembersValidActions = array( 'regions' => 'glm-member-db', 'counties' => 'glm-member-db', 'amenities' => 'glm-member-db', + 'signupform' => 'glm-member-db', ), 'management' => array( 'index' => 'glm-member-db', // General Options diff --git a/views/admin/settings/header.html b/views/admin/settings/header.html index 713b88aa..2558929d 100644 --- a/views/admin/settings/header.html +++ b/views/admin/settings/header.html @@ -3,22 +3,22 @@

{$glmPluginName} Settings

diff --git a/views/admin/settings/signupform.html b/views/admin/settings/signupform.html new file mode 100755 index 00000000..f623056c --- /dev/null +++ b/views/admin/settings/signupform.html @@ -0,0 +1,100 @@ +{include file='admin/settings/header.html'} + +

New Member Signup Form Settings

+ +
+ + +
+ + +
+
+ + +
+
+ + + + + + +
+
+ + +
+ + +
+ + + +{include file='admin/footer.html'} diff --git a/views/front/members/newMemberForm.html b/views/front/members/newMemberForm.html index 64efa555..52466080 100644 --- a/views/front/members/newMemberForm.html +++ b/views/front/members/newMemberForm.html @@ -22,7 +22,7 @@
- +
diff --git a/views/front/members/ownerEmail.html b/views/front/members/ownerEmail.html new file mode 100644 index 00000000..441fa04e --- /dev/null +++ b/views/front/members/ownerEmail.html @@ -0,0 +1,29 @@ + + + + + + +

New Member Submission Notification

+ + {if $emailNotification} +
+

{$emailNotification}

+
+ {/if} + + + {foreach $member_data as $key => $val} + + + + + {/foreach} +
{$key}:{$val}
+ +
+

A new Member has been added to your Website from your "Add Your Business" page.

+

To approve it, please go to the pending member page in your admin.

+
+ + diff --git a/views/front/members/userEmail.html b/views/front/members/userEmail.html new file mode 100644 index 00000000..6726acdd --- /dev/null +++ b/views/front/members/userEmail.html @@ -0,0 +1,22 @@ + + + + + + +

New Member Submission Notification

+ + + {foreach $member_data as $key => $val} + + + + + {/foreach} +
{$key}:{$val}
+ +
+

Thank you for submitting your event, please allow up to 48 hours for the event to be reviewed.

+
+ + -- 2.17.1