For the forgot password feature.
* version from this plugin.
*/
define('GLM_MEMBERS_ITINERARY_PLUGIN_VERSION', '0.0.1');
-define('GLM_MEMBERS_ITINERARY_PLUGIN_DB_VERSION', '0.0.2');
+define('GLM_MEMBERS_ITINERARY_PLUGIN_DB_VERSION', '0.0.3');
// This is the minimum version of the GLM Members DB plugin require for this plugin.
define('GLM_MEMBERS_ITINERARY_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.8.0');
{
$status = true;
$view = 'list.html';
- $members = array();
$option = 'list';
- $form_contents = '';
+ $formContents = '';
$userLoggedIn = false;
+ $createSuccess = false;
+ $members =
$membersWithEmails =
$memberEmails =
$states =
- $membersNoEmails = array();
+ $membersNoEmails =
+ $formErrors = array();
if ( isset( $_SESSION['travel-list'] ) ) {
foreach ( $_SESSION['travel-list'] as $item ) {
switch ( $option ) {
case 'addAccount':
- // Add the account
- // Unless email already exists
- // echo '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
- $password = md5( filter_var( $_REQUEST['password'], FILTER_SANITIZE_STRING ) );
- $this->wpdb->insert(
- GLM_MEMBERS_ITINERARY_PLUGIN_DB_PREFIX . 'user',
- array(
- 'fname' => filter_var( $_REQUEST['fname'], FILTER_SANITIZE_STRING ),
- 'lname' => filter_var( $_REQUEST['lname'], FILTER_SANITIZE_STRING ),
- 'addr1' => filter_var( $_REQUEST['addr1'], FILTER_SANITIZE_STRING ),
- 'addr2' => filter_var( $_REQUEST['addr2'], FILTER_SANITIZE_STRING ),
- 'city' => filter_var( $_REQUEST['city'], FILTER_SANITIZE_STRING ),
- 'state' => filter_var( $_REQUEST['state'], FILTER_SANITIZE_STRING ),
- 'zip' => filter_var( $_REQUEST['zip'], FILTER_SANITIZE_STRING ),
- 'email' => filter_var( $_REQUEST['email'], FILTER_VALIDATE_EMAIL ),
- 'password' => $password,
- ),
- array(
- '%s', // fname
- '%s', // lname
- '%s', // addr1
- '%s', // addr2
- '%s', // city
- '%s', // state
- '%s', // zip
- '%s', // email
- '%s', // password
+
+ // Check that the email and verify email matches.
+ $email = filter_var( $_REQUEST['email'], FILTER_SANITIZE_STRING );
+ $verifyEmail = filter_var( $_REQUEST['verify_email'], FILTER_SANITIZE_STRING );
+ if ( $email != $verifyEmail ) {
+ $formErrors['verify_email'] = true;
+ $createSuccess = false;
+ }
+ $password = filter_var( $_REQUEST['password'], FILTER_SANITIZE_STRING );
+ $verifyPassword = filter_var( $_REQUEST['verify_password'], FILTER_SANITIZE_STRING );
+ if ( $password != $verifyPassword ) {
+ $formErrors['verify_password'] = true;
+ $createSuccess = false;
+ }
+ // Check if the email already exists.
+ $currentEmailUsed = $this->wpdb->get_var(
+ $this->wpdb->prepare(
+ "SELECT id
+ FROM " . GLM_MEMBERS_ITINERARY_PLUGIN_DB_PREFIX . "user
+ WHERE email = %s",
+ $email
)
);
+ if ( $currentEmailUsed ) {
+ $formErrors['email'] = true;
+ }
+
+ if ( !$formErrors ) {
+ // Add the account
+ // Unless email already exists
+ // echo '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
+ $password = md5( filter_var( $_REQUEST['password'], FILTER_SANITIZE_STRING ) );
+ $this->wpdb->insert(
+ GLM_MEMBERS_ITINERARY_PLUGIN_DB_PREFIX . 'user',
+ array(
+ 'fname' => filter_var( $_REQUEST['fname'], FILTER_SANITIZE_STRING ),
+ 'lname' => filter_var( $_REQUEST['lname'], FILTER_SANITIZE_STRING ),
+ 'addr1' => filter_var( $_REQUEST['addr1'], FILTER_SANITIZE_STRING ),
+ 'addr2' => filter_var( $_REQUEST['addr2'], FILTER_SANITIZE_STRING ),
+ 'city' => filter_var( $_REQUEST['city'], FILTER_SANITIZE_STRING ),
+ 'state' => filter_var( $_REQUEST['state'], FILTER_SANITIZE_STRING ),
+ 'zip' => filter_var( $_REQUEST['zip'], FILTER_SANITIZE_STRING ),
+ 'email' => filter_var( $_REQUEST['email'], FILTER_VALIDATE_EMAIL ),
+ 'password' => $password,
+ ),
+ array(
+ '%s', // fname
+ '%s', // lname
+ '%s', // addr1
+ '%s', // addr2
+ '%s', // city
+ '%s', // state
+ '%s', // zip
+ '%s', // email
+ '%s', // password
+ )
+ );
+ $authUserId = $this->wpdb->insert_id;
+ if ( $authUserId ) {
+ $createSuccess = true;
+
+ // Now add the session.
+ $_SESSION['itinerary-auth'] = $authUserId;
+ } else {
+ // Form error no account added.
+ }
+ } else {
+ $states = $this->config['states'];
+ }
$view = 'create.html';
break;
case 'create':
case 'forgot':
$view = 'forgot.html';
break;
+ case 'reset':
+ // Search for the email.
+ // If not found then say something about not finding the account and link to the new account form.
+ // If found then send the email reset.
+ $email = filter_var( $_REQUEST['username'], FILTER_VALIDATE_EMAIL );
+ if ( $email ) {
+ $emailFound = $this->wpdb->get_var(
+ $this->wpdb->prepare(
+ "SELECT id
+ FROM " . GLM_MEMBERS_ITINERARY_PLUGIN_DB_PREFIX . "user
+ WHERE email = %s",
+ $email
+ )
+ );
+ if ( $emailFound ) {
+ // Setup the email message.
+ // Create the md5 reset token.
+ // Send email.
+ }
+ } else {
+ // No email given
+ }
+ break;
case 'moreinfo':
// Need to create two list one with emails and one without.
foreach ( $members as $member ) {
$_GET['member_emails'] = implode( ',', $memberEmwails );
$form_id = $this->config['settings']['send_itinerary_form_id'];
if ( isset( $form_id ) && filter_var( $form_id, FILTER_VALIDATE_INT ) ) {
- $form_contents = do_shortcode( '[gravityform id="' . $form_id . '" title="false" description="false"]' );
+ $formContents = do_shortcode( '[gravityform id="' . $form_id . '" title="false" description="false"]' );
}
} else {
- $form_contents = '';
+ $formContents = '';
}
break;
case 'list':
'members' => $members,
'membersWithEmails' => $membersWithEmails,
'membersNoEmails' => $membersNoEmails,
- 'formContents' => $form_contents,
+ 'formContents' => $formContents,
'states' => $states,
'userLoggedIn' => $userLoggedIn,
+ 'formErrors' => $formErrors,
+ 'createSuccess' => $createSuccess,
);
error_reporting(E_ALL ^ E_NOTICE);
+++ /dev/null
--- Gaslight Media Staff Add On
--- File Created: 2018-10-24
--- Database Version: 0.0.1
--- Database Creation Script
---
--- To permit each query below to be executed separately,
--- all queries must be separated by a line with four dashes
-
--- Itinerary Session
-CREATE TABLE {prefix}session (
- id INT NOT NULL AUTO_INCREMENT,
- ref_type INT NOT NULL, -- Reference Type (see plugin.ini for ref_types)
- ref_dest INT NOT NULL, -- Id from the Reference
- contact_type INT NOT NULL, -- Contact Type (see plugin.ini for contact_types)
- contact_dest INT NOT NULL, -- Id of the Contact Type
- page_url TEXT NOT NULL, -- Page url when this was added.
- PRIMARY KEY (id),
- INDEX(ref_dest),
- INDEX(contact_dest)
-);
-
-----
-
--- Itinerary User
-CREATE TABLE {prefix}user (
- id INT NOT NULL AUTO_INCREMENT,
- fname TINYTEXT NULL,
- lname TINYTEXT NULL,
- addr1 TINYTEXT NULL,
- addr2 TINYTEXT NULL,
- city TINYTEXT NULL,
- state TINYTEXT NULL,
- zip TINYTEXT NULL,
- email TINYTEXT NULL,
- phone TINYTEXT NULL,
- fax TINYTEXT NULL,
- password TINYTEXT NULL,
- PRIMARY KEY (id),
- INDEX(email(20))
-);
-
-----
-
--- Management
-CREATE TABLE {prefix}management (
- id INT NOT NULL AUTO_INCREMENT,
- send_itinerary_form_id INT NULL,
- itinerary_page INT NULL,
- itinerary_page_content TEXT NULL,
- add_label TINYTEXT NULL,
- view_label TINYTEXT NULL,
- PRIMARY KEY (id)
-);
-
-----
-
--- Add record to management table
-INSERT INTO {prefix}management (id, add_label, view_label) VALUES (1, 'Add to Trip Planner', 'View Trip Planner');
--- /dev/null
+-- Gaslight Media Staff Add On
+-- File Created: 2018-10-24
+-- Database Version: 0.0.1
+-- Database Creation Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+
+-- Itinerary Session
+CREATE TABLE {prefix}session (
+ id INT NOT NULL AUTO_INCREMENT,
+ ref_type INT NOT NULL, -- Reference Type (see plugin.ini for ref_types)
+ ref_dest INT NOT NULL, -- Id from the Reference
+ contact_type INT NOT NULL, -- Contact Type (see plugin.ini for contact_types)
+ contact_dest INT NOT NULL, -- Id of the Contact Type
+ page_url TEXT NOT NULL, -- Page url when this was added.
+ PRIMARY KEY (id),
+ INDEX(ref_dest),
+ INDEX(contact_dest)
+);
+
+----
+
+-- Itinerary User
+CREATE TABLE {prefix}user (
+ id INT NOT NULL AUTO_INCREMENT,
+ fname TINYTEXT NULL,
+ lname TINYTEXT NULL,
+ addr1 TINYTEXT NULL,
+ addr2 TINYTEXT NULL,
+ city TINYTEXT NULL,
+ state TINYTEXT NULL,
+ zip TINYTEXT NULL,
+ email TINYTEXT NULL,
+ phone TINYTEXT NULL,
+ fax TINYTEXT NULL,
+ password TINYTEXT NULL,
+ reset_token TINYTEXT NULL,
+ PRIMARY KEY (id),
+ INDEX(email(20))
+);
+
+----
+
+-- Management
+CREATE TABLE {prefix}management (
+ id INT NOT NULL AUTO_INCREMENT,
+ send_itinerary_form_id INT NULL,
+ itinerary_page INT NULL,
+ itinerary_page_content TEXT NULL,
+ add_label TINYTEXT NULL,
+ view_label TINYTEXT NULL,
+ PRIMARY KEY (id)
+);
+
+----
+
+-- Add record to management table
+INSERT INTO {prefix}management (id, add_label, view_label) VALUES (1, 'Add to Trip Planner', 'View Trip Planner');
$glmMembersItineraryDbVersions = array(
'0.0.1' => array('version' => '0.0.1', 'tables' => 3, 'date' => '10/31/2018'),
'0.0.2' => array('version' => '0.0.2', 'tables' => 3, 'date' => '11/13/2018'),
+ '0.0.3' => array('version' => '0.0.3', 'tables' => 3, 'date' => '11/16/2018'),
);
--- /dev/null
+-- Gaslight Media Members Database - Itinerary Add-On
+-- File Created: 2018-11-13
+-- Database Version: 0.0.2
+-- Database Update From Previous Version Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashses
+
+
+-- Add Form Id for Itinerary
+ALTER TABLE {prefix}user ADD COLUMN reset_token TINYTEXT NULL;
+
{* Create Account Form *}
-<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
+<h2>Create an Account to Save your Trip Planner</h2>
-<!-- Compiled and minified CSS -->
-<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
+{if !$createSuccess}
+ {if $formErrors}<div class="glm-required">Form was not submitted. Please check form for any errors!</div>{/if}
+ <div class="glm-row">
+ <form class="glm-columns glm-medium-12" action="{$hisUrl}" method="post">
+ <input type="hidden" name="option" value="addAccount" />
-<!-- Compiled and minified JavaScript -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
-
-
-<h1>Create an Account to Save your Trip Planner</h1>
-
-<div class="row">
- <form class="col s12" action="{$hisUrl}" method="post">
- <input type="hidden" name="option" value="addAccount" />
-
- <div class="row">
- <div class="input-field col s6">
- <input id="fname" name="fname" type="text" />
- <label for="fname">First Name </label>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="fname">First Name </label>
+ <input id="fname" name="fname" type="text" value="{$smarty.request.fname|escape}" />
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="lname">Last Name </label>
+ <input id="lname" name="lname" type="text" value="{$smarty.request.lname|escape}" />
+ </div>
</div>
- <div class="input-field col s6">
- <input id="lname" name="lname" type="text" />
- <label for="lname">Last Name </label>
- </div>
- </div>
- <div class="row">
- <div class="input-field col s6">
- <input id="addr1" name="addr1" type="text" />
- <label for="addr1">Address 1 </label>
- </div>
- <div class="input-field col s6">
- <input id="addr2" name="addr2" type="text" />
- <label for="addr2">Address 2 </label>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="addr1">Address 1 </label>
+ <input id="addr1" name="addr1" type="text" value="{$smarty.request.addr1|escape}" />
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="addr2">Address 2 </label>
+ <input id="addr2" name="addr2" type="text" value="{$smarty.request.addr2|escape}" />
+ </div>
</div>
- </div>
- <div class="row">
- <div class="input-field col s4">
- <input id="city" name="city" type="text" />
- <label for="city">City </label>
- </div>
- <div class="input-field col s4">
- <select id="state" name="state">
- <option value="">Select a State</option>
- {foreach $states as $state_abbr => $state_name}
- <option value="{$state_abbr}">{$state_name}</option>
- {/foreach}
- </select>
- <label for="state">State </label>
- </div>
- <div class="input-field col s4">
- <input id="vip" name="zip" type="text" />
- <label for="zip">Zip </label>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-small-12 glm-medium-4">
+ <label for="city">City </label>
+ <input id="city" name="city" type="text" value="{$smarty.request.city|escape}" />
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-4">
+ <label for="state">State </label>
+ <select id="state" name="state">
+ <option value="">Select a State</option>
+ {foreach $states as $state_abbr => $state_name}
+ <option value="{$state_abbr}"{if $smarty.request.state == $state_abbr} selected{/if}>{$state_name}</option>
+ {/foreach}
+ </select>
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-4">
+ <label for="zip">Zip </label>
+ <input id="vip" name="zip" type="text" value="{$smarty.request.zip|escape}" />
+ </div>
</div>
- </div>
- <div class="row">
- <div class="input-field col s6">
- <input id="email" type="email" name="email" required class="validate" />
- <label for="email">Email </label>
- <span class="helper-text" data-error="Not a valid email address!" data-success="Valid Email"></span>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="email" class="glm-required">Email </label>
+ <input id="email" type="email" name="email" value="{$smarty.request.email|escape}" required />
+ {if $formErrors.email}<small class="glm-required">There's already an account with that email!</small>{/if}
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="email" class="glm-required">Verify Email </label>
+ <input id="email" type="email" name="verify_email" value="{$smarty.request.verify_email|escape}" required />
+ {if $formErrors.verify_email}<small class="glm-required">Does not match!</small>{/if}
+ </div>
</div>
- <div class="input-field col s6">
- <input id="password" type="password" name="password" required class="validate" />
- <label for="password">Password </label>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="password" class="glm-required">Password </label>
+ <input id="password" type="password" name="password" value="{$smarty.request.password|escape}" required />
+ </div>
+ <div class="input-field glm-columns glm-small-12 glm-medium-6">
+ <label for="password" class="glm-required">Verify Password </label>
+ <input id="password" type="password" name="verify_password" value="{$smarty.request.verify_password|escape}" required />
+ {if $formErrors.verify_password}<small class="glm-required">Does not match!</small>{/if}
+ </div>
</div>
- </div>
- <div class="row">
- <div class="input-field col s12">
- <button class="btn waves-effect waves-light" type="submit" name="action"> Create Account
- <i class="material-icons right">send</i>
- </button>
+ <div class="glm-row">
+ <div class="input-field glm-columns glm-medium-12">
+ <button class="button" type="submit" name="action"> Create Account
+ </button>
+ </div>
</div>
- </div>
- </form>
-</div>
+ </form>
+ </div>
+{else}
+ Success message here...
+ <p><a href="{$thisUrl}">Go to Trip Planner</a></p>
+{/if}
<script>
jQuery(document).ready(function($){
- $('#state').formSelect();
+ // $('#state').formSelect();
});
</script>
--- /dev/null
+<h2>Password Recovery</h2>
+
+<div class="glm_row">
+
+ <form action="{$thisUrl}" method="post">
+ <p>Enter your email address.</p>
+ <input type="hidden" name="option" value="reset" />
+ <div class="glm-columns glm-small-12 glm-medium-4">
+ <label for="email" class="glm-required"> Email </label>
+ <input type="email" id="email" name="email" />
+ <input type="submit" value="Password Recovery" class="button" />
+ </div>
+ </form>
+
+</div>
<p>{$settings.itinerary_page_content}</p>
-<div style="width: 100%; padding: 20px;">
+<div class="glm_row">
{if !$userLoggedIn}
<form action="{$thisUrl}" method="post">
<input type="hidden" name="option" value="login" />
- <div style="width: 30%; float: left; padding: 5px;">
+ <div class="glm-columns glm-small-12 glm-medium-4">
<h2>Sign In:</h2>
- <input type="text" name="username" />
- <input type="password" name="password" />
+ <label for="username" class="glm-required"> Email </label>
+ <input type="text" id="username" name="username" />
+ <label for="password" class="glm-required"> Password </label>
+ <input type="password" id="password" name="password" />
<input type="submit" value="Log in" class="button" />
<a href="{$thisUrl}?option=forgot">Forgot your Password?</a>
</div>
</form>
- <div style="width: 30%; float: left; padding: 5px;">
+ <div class="glm-columns glm-small-12 glm-medium-4">
<h2>If you do not have an account</h2>
<a href="{$thisUrl}?option=create"> Create Account </a><br>
By creating an account, you'll be able to save your list for later.
{/if}
{if $members}
- <div style="width: 30%; float: left; padding: 5px;">
+ <div class="glm-columns glm-small-12 glm-medium-4">
<ul>
<li> <a href="{$thisUrl}?option=moreinfo">Get more info</a> </li>
<li> <a href="#" class="list-print" data-areaToPrint="PrintArea">Print this list</a> </li>
- <li> <a href="#">View Map</a> </li>
+ <!-- <li> <a href="#">View Map</a> </li> -->
<li> <a href="#">Help</a> </li>
</ul>
</div>
{/if}
</div>
+<div class="glm_row">
+ <div class="glm-columns glm-small-12" style="text-align: right;">
+ <button id="toggle-map-view">Hide Map</button>
+ </div>
+</div>
<br clear="all">
{if $members}
</div>
{/foreach}
</div>
-<script src="{$jsUrl}/PrintArea/jquery.PrintArea.js" type="text/JavaScript" language="javascript"></script>
+<script src="{$jsUrl}/PrintArea/jquery.PrintArea.js"></script>
<script>
jQuery(document).ready(function($){
$(".list-print").click(function(){
});
});
+ $('#toggle-map-view').on('click', function(){
+ $('#glm-locationMap-container').toggleClass('glm-hidden');
+ });
+
/*
* Leaflet Map
* API reference: https://leafletjs.com/reference-1.3.2.html