From d9acc9530f8813fa838cabd5d0b4a093b39d4537 Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Fri, 6 Feb 2015 16:35:53 -0500 Subject: [PATCH] A bunch more work done. --- activate.php | 33 +- classes/data/dataAccommodationTypes.php | 11 +- classes/data/dataAmenities.php | 164 ++++++ classes/data/dataCategories.php | 4 +- classes/data/dataCities.php | 2 +- classes/data/dataMemberInfo.php | 321 ++++++++++++ classes/data/dataMemberTypes.php | 2 +- classes/data/dataMembers.php | 50 +- classes/data/dataRegions.php | 2 +- classes/glmPluginSupport.php | 51 ++ config/plugin.ini | 64 ++- controllers/admin.php | 70 ++- controllers/front.php | 10 +- css/admin.css | 73 ++- deactivate.php | 2 +- defines.php | 26 +- index.php | 16 +- js/geolocation-edit/.svn/all-wcprops | 17 + js/geolocation-edit/.svn/entries | 96 ++++ .../jquery.geolocation.edit.0.0.9.js.svn-base | 239 +++++++++ ...ery.geolocation.edit.min.0.0.9.js.svn-base | 5 + .../Copy of jquery.geolocation.edit.0.0.11.js | 245 +++++++++ .../jquery.geolocation.edit.0.0.11.js | 10 + .../jquery.geolocation.edit.min.0.0.11.js | 5 + lib/GlmDataAbstract/DataAbstract.php | 322 ++++++------ lib/GlmDataAbstract/documentation.txt | 4 + lib/smartyTemplateSupport.php | 10 +- misc/databaseScripts/create_database_V0.1.sql | 412 ++++++++------- misc/databaseScripts/drop_database_V0.1.sql | 39 +- .../Plugin_Directory_Structure.odg | Bin 0 -> 34990 bytes misc/documentation/Plugin_program_flow.odg | Bin 0 -> 18642 bytes ...a1e104c26a275acc180da0.file.index.html.php | 60 ++- ...23ae1a70b66cefbd681db.file.header.html.php | 10 +- ...40ebc45e387f5f95c45e90.file.index.html.php | 201 +++++--- ...046a296066e9f8eceedae.file.member.html.php | 14 +- ...bc6c9474f73121a83d59b.file.header.html.php | 10 +- ...44e61950c851e98e8906d49.file.list.html.php | 66 ++- ...5e8bedbedd434341aeca9.file.header.html.php | 35 +- models/admin/configure/accommodationTypes.php | 4 +- models/admin/configure/amenities.php | 203 ++++++++ models/admin/configure/categories.php | 5 +- models/admin/configure/cities.php | 2 +- models/admin/configure/development.php | 222 ++++++++ models/admin/configure/memberTypes.php | 2 +- models/admin/configure/regions.php | 2 +- models/admin/member/index.php | 115 +++-- models/admin/member/memberInfo.php | 310 ++++++++++++ models/admin/members/index.php | 60 ++- models/admin/members/list.php | 27 +- views/admin/configure/accommodationTypes.html | 2 +- views/admin/configure/amenities.html | 146 ++++++ views/admin/configure/categories.html | 12 +- views/admin/configure/cities.html | 2 +- views/admin/configure/development.html | 25 + views/admin/configure/header.html | 2 + views/admin/configure/memberTypes.html | 2 +- views/admin/configure/regions.html | 2 +- views/admin/member/header.html | 14 +- views/admin/member/index.html | 150 ++++-- views/admin/member/memberInfo.html | 477 ++++++++++++++++++ views/admin/members/header.html | 2 +- views/admin/members/index.html | 38 +- views/admin/members/list.html | 49 +- 63 files changed, 3821 insertions(+), 755 deletions(-) create mode 100644 classes/data/dataAmenities.php create mode 100644 classes/data/dataMemberInfo.php create mode 100644 js/geolocation-edit/.svn/all-wcprops create mode 100644 js/geolocation-edit/.svn/entries create mode 100644 js/geolocation-edit/.svn/text-base/jquery.geolocation.edit.0.0.9.js.svn-base create mode 100644 js/geolocation-edit/.svn/text-base/jquery.geolocation.edit.min.0.0.9.js.svn-base create mode 100644 js/geolocation-edit/Copy of jquery.geolocation.edit.0.0.11.js create mode 100644 js/geolocation-edit/jquery.geolocation.edit.0.0.11.js create mode 100644 js/geolocation-edit/jquery.geolocation.edit.min.0.0.11.js create mode 100755 misc/documentation/Plugin_Directory_Structure.odg create mode 100755 misc/documentation/Plugin_program_flow.odg create mode 100644 models/admin/configure/amenities.php create mode 100644 models/admin/configure/development.php create mode 100644 models/admin/member/memberInfo.php create mode 100644 views/admin/configure/amenities.html create mode 100644 views/admin/configure/development.html create mode 100644 views/admin/member/memberInfo.html diff --git a/activate.php b/activate.php index e16009a7..295a6b70 100644 --- a/activate.php +++ b/activate.php @@ -15,7 +15,7 @@ */ // Load glmPluginSupport class -require_once (GLM_MEMBERS_PLUGIN_DIR . '/classes/glmPluginSupport.php'); +require_once (GLM_MEMBERS_PLUGIN_PATH . '/classes/glmPluginSupport.php'); /* * This class performs all necessary additional work when this @@ -41,7 +41,7 @@ class glmMembersPluginActivate extends glmPluginSupport * @var $Versions * @access private */ - private $dbVersions = array( + public $dbVersions = array( '0.1' => array('version' => '0.1', 'tables' => 24) ); @@ -56,9 +56,12 @@ class glmMembersPluginActivate extends glmPluginSupport /* * Constructor * + * Note that the $noDatabaseCheck is used to access the database versions + * without triggering a database check. + * * Performs all the work for this model */ - public function __construct ($wpdb) + public function __construct ($wpdb, $config, $noDatabaseCheck = false) { // This line is for dropping the currrent database version for testing // delete_option('glmMembersDatabaseDbVersion'); @@ -72,24 +75,28 @@ class glmMembersPluginActivate extends glmPluginSupport // Save WordPress Database object $this->wpdb = $wpdb; + // Save plugin configuration object + $this->config = $config; - $this->checkErrorScrape(); + if (!$noDatabaseCheck) { - // Check the database - if (!$this->checkDatabase()) { + $this->checkErrorScrape(); - // There was some kind of dataase failure, so die to prevent WordPress from marking plugin as activated. - die(); + // Check the database + if (!$this->checkDatabase()) { - } + // There was some kind of dataase failure, so die to prevent WordPress from marking plugin as activated. + die(); - // Add user capabilties - // $this->addRoleCapability('glm_members_edit', false); + } - // Set current plugin version - update_option('glmMembersDatbasePluginVersion', GLM_MEMBERS_PLUGIN_VERSION); + // Add user capabilties + // $this->addRoleCapability('glm_members_edit', false); + // Set current plugin version + update_option('glmMembersDatbasePluginVersion', GLM_MEMBERS_PLUGIN_VERSION); + } } /* diff --git a/classes/data/dataAccommodationTypes.php b/classes/data/dataAccommodationTypes.php index 76b76330..9038339b 100644 --- a/classes/data/dataAccommodationTypes.php +++ b/classes/data/dataAccommodationTypes.php @@ -26,7 +26,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataAccommodationTypes extends GlmDataAbstract +class GlmDataAccommodationTypes extends GlmDataAbstract { /** @@ -112,15 +112,6 @@ abstract class GlmDataAccommodationTypes extends GlmDataAbstract 'use' => 'a' ), - // Facility Type - 'facility_type' => array ( - 'field' => 'facility_type', - 'type' => 'list', - 'list' => $this->config['facility_type'], - 'required' => true, - 'use' => 'a' - ), - // Name 'name' => array( 'field' => 'name', diff --git a/classes/data/dataAmenities.php b/classes/data/dataAmenities.php new file mode 100644 index 00000000..25321dd2 --- /dev/null +++ b/classes/data/dataAmenities.php @@ -0,0 +1,164 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMemberType.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * EventManagementDataAmenities 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 $ + * @link http://www.visitgreatlakesbay.org/ + */ +class GlmDataAmenities 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) + { + parent::__construct($wpdb, $config); + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenities'; + + /* + * Table Data Fields + */ + $this->fields = array( + + 'id' => array( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a' + ), + + // Facility Type + 'facility_type' => array ( + 'field' => 'facility_type', + 'type' => 'list', + 'list' => $this->config['facility_type'], + 'required' => true, + 'use' => 'a' + ), + + // Name + 'name' => array( + 'field' => 'name', + 'type' => 'text', + 'required' => true, + 'unique' => true, + 'use' => 'a' + ), + + // Uses Value + 'uses_value' => array( + 'field' => 'uses_value', + 'type' => 'checkbox', + 'use' => 'a' + ), + + // Description + 'descr' => array( + 'field' => 'descr', + 'type' => 'text', + 'use' => 'a' + ), + + // Short Description + 'short_descr' => array( + 'field' => 'short_descr', + 'type' => 'text', + 'use' => 'a' + ) + + + ); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($this->fields, 'DataBlock', 'Table Fields: '.$this->table); + } + + } +} + +?> \ No newline at end of file diff --git a/classes/data/dataCategories.php b/classes/data/dataCategories.php index 66c8ee5d..530525f3 100644 --- a/classes/data/dataCategories.php +++ b/classes/data/dataCategories.php @@ -26,7 +26,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataCategories extends GlmDataAbstract +class GlmDataCategories extends GlmDataAbstract { /** @@ -129,7 +129,7 @@ abstract class GlmDataCategories extends GlmDataAbstract 'p_field' => 'name', 'p_orderby' => 'name', 'p_blank' => true, - + 'force_list' => true, 'required' => false, 'use' => 'a' ), diff --git a/classes/data/dataCities.php b/classes/data/dataCities.php index ca27415a..7e4717d8 100644 --- a/classes/data/dataCities.php +++ b/classes/data/dataCities.php @@ -26,7 +26,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataCities extends GlmDataAbstract +class GlmDataCities extends GlmDataAbstract { /** diff --git a/classes/data/dataMemberInfo.php b/classes/data/dataMemberInfo.php new file mode 100644 index 00000000..3a63cbef --- /dev/null +++ b/classes/data/dataMemberInfo.php @@ -0,0 +1,321 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMemberInfo.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * EventManagementDataMemberInfo class + * + * PHP version 5 + * + * @category Data + * @package GLM Members Database Plugin + * @author Chuck Scott + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMemberInfo.php,v 1.0 2011/01/25 19:31:47 cscott + * Exp $ + * @link http://www.visitgreatlakesbay.org/ + */ +class GlmDataMemberInfo 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) { + + parent::__construct ( $wpdb, $config ); + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_info'; + + /* + * Table Data Fields + */ + $this->fields = array ( + + 'id' => array ( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a' + ), + + // Member Pointer + 'member' => array ( + 'field' => 'member', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members', + 'p_field' => 'name', + 'p_orderby' => 'name', + 'p_blank' => true, + 'required' => true, + 'use' => 'a' + ), + + // Status + 'status' => array ( + 'field' => 'status', + 'type' => 'list', + 'list' => $this->config['status'], + 'required' => true, + 'default' => $this->config['status_numb']['Pending'], + 'use' => 'a' + ), + + // Create Time + 'create_time' => array ( + 'field' => 'create_time', + 'type' => 'date', + 'required' => true, + 'default' => 'now', + 'use' => 'a' + ), + + // Last Modify Time + 'modify_time' => array ( + 'field' => 'modify_time', + 'type' => 'date', + 'required' => true, + 'default' => 'now', + 'use' => 'a' + ), + + // Description + 'descr' => array( + 'field' => 'descr', + 'type' => 'text', + 'required' => true, + 'use' => 'a' + ), + + // Short description + 'short_descr' => array ( + 'field' => 'short_descr', + 'type' => 'text', + 'required' => true, + 'use' => 'a' + ), + + // Address Line 1 + 'addr1' => array ( + 'field' => 'addr1', + 'type' => 'text', + 'use' => 'a' + ), + + // Address Line 2 + 'addr2' => array ( + 'field' => 'addr2', + 'type' => 'text', + 'use' => 'a' + ), + + // City + 'city' => array ( + 'field' => 'city', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_PLUGIN_DB_PREFIX . 'cities', + 'p_field' => 'name', + 'p_orderby' => 'name', + 'p_blank' => true, + 'required' => true, + 'force_list' => true, + 'use' => 'a' + ), + + // State + 'state' => array ( + 'field' => 'state', + 'type' => 'list', + 'list' => $this->config['states'], + 'required' => true, + 'default' => 'MI', + 'use' => 'a' + ), + + // ZIP / Postal Code + 'zip' => array ( + 'field' => 'zip', + 'type' => 'text', + 'use' => 'a' + ), + + // Country + 'country' => array ( + 'field' => 'country', + 'type' => 'list', + 'list' => $this->config['countries'], + 'required' => true, + 'default' => 'US', + 'use' => 'a' + ), + + // Latitude + 'lat' => array( + 'field' => 'lat', + 'type' => 'float', + 'default' => 45, + 'use' => 'a' + ), + + // Longitude + 'lon' => array( + 'field' => 'lon', + 'type' => 'float', + 'default' => -84, + 'use' => 'a' + ), + + // Region + 'region' => array ( + 'field' => 'region', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_PLUGIN_DB_PREFIX . 'regions', + 'p_field' => 'name', + 'p_orderby' => 'name', + 'p_blank' => true, + 'use' => 'a' + ), + + // Phone + 'phone' => array( + 'field' => 'phone', + 'type' => 'phone', + 'use' => 'a' + ), + + // Toll Free + 'toll_free' => array( + 'field' => 'toll_free', + 'type' => 'phone', + 'use' => 'a' + ), + + // URL + 'url' => array( + 'field' => 'url', + 'type' => 'text', + 'use' => 'a' + ), + + // Logo + 'logo' => array( + 'field' => 'logo', + 'type' => 'image', + 'use' => 'a' + ), + + // Credit Cards Accepted - multi-pick + 'cc_type' => array( + 'field' => 'cc_type', + 'type' => 'bitmap', + 'bitmap' => $this->config['credit_card'], + 'default' => 0, // no cards selected + 'use' => 'a' + ), + + // Notes + 'notes' => array ( + 'field' => 'notes', + 'type' => 'text', + 'use' => 'a' + ), + + // Create time + 'create_time' => array ( + 'field' => 'create_time', + 'type' => 'time', + 'required' => true, + 'use' => 'a' + ), + + // Modify time + 'modify_time' => array ( + 'field' => 'modify_time', + 'type' => 'time', + 'required' => true, + 'use' => 'a' + ) + + ); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($this->fields, 'DataBlock', 'Table Fields: '.$this->table); + } + + + + } +} + +?> \ No newline at end of file diff --git a/classes/data/dataMemberTypes.php b/classes/data/dataMemberTypes.php index 6d0dde42..a5938758 100644 --- a/classes/data/dataMemberTypes.php +++ b/classes/data/dataMemberTypes.php @@ -26,7 +26,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataMemberTypes extends GlmDataAbstract +class GlmDataMemberTypes extends GlmDataAbstract { /** diff --git a/classes/data/dataMembers.php b/classes/data/dataMembers.php index e3484b90..f600858e 100644 --- a/classes/data/dataMembers.php +++ b/classes/data/dataMembers.php @@ -25,7 +25,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataMembers extends GlmDataAbstract { +class GlmDataMembers extends GlmDataAbstract { /** * WordPress Database Object @@ -111,12 +111,13 @@ abstract class GlmDataMembers extends GlmDataAbstract { ), // Status - 'status' => array ( - 'field' => 'status', + 'access' => array ( + 'field' => 'access', 'type' => 'list', - 'list' => $this->config['status'], + 'list' => $this->config['memb_access'], + 'l_blank' => true, 'required' => true, - 'default' => $this->config['status_numb']['Pending'], + 'force_list' => true, 'use' => 'a' ), @@ -129,6 +130,7 @@ abstract class GlmDataMembers extends GlmDataAbstract { 'p_orderby' => 'name', 'p_blank' => true, 'required' => true, + 'force_list' => true, 'use' => 'a' ), @@ -141,44 +143,14 @@ abstract class GlmDataMembers extends GlmDataAbstract { 'use' => 'a' ), - // Description - 'descr' => array( - 'field' => 'descr', - 'type' => 'text', + // Date created + 'created' => array ( + 'field' => 'created', + 'type' => 'date', 'required' => true, 'use' => 'a' - ), - - // Short description - 'short_descr' => array ( - 'field' => 'short_descr', - 'type' => 'text', - 'required' => true, - 'use' => 'a' - ), - - // Address Line 1 - 'addr1' => array ( - 'field' => 'addr1', - 'type' => 'text', - 'use' => 'a' - ), - - // Address Line 2 - 'addr2' => array ( - 'field' => 'addr2', - 'type' => 'text', - 'use' => 'a' - ), - - // Address Line 1 - 'addr1' => array ( - 'field' => 'addr1', - 'type' => 'text', - 'use' => 'a' ) - ); if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { diff --git a/classes/data/dataRegions.php b/classes/data/dataRegions.php index df9a5022..5ed060f3 100644 --- a/classes/data/dataRegions.php +++ b/classes/data/dataRegions.php @@ -26,7 +26,7 @@ * Exp $ * @link http://www.visitgreatlakesbay.org/ */ -abstract class GlmDataRegions extends GlmDataAbstract +class GlmDataRegions extends GlmDataAbstract { /** diff --git a/classes/glmPluginSupport.php b/classes/glmPluginSupport.php index b7f94416..ec9c511a 100644 --- a/classes/glmPluginSupport.php +++ b/classes/glmPluginSupport.php @@ -113,6 +113,57 @@ class GlmPluginSupport } + /* + * Sort a database result array (from DataAbstract.php) by parent, child relationships + * + * @param array $array Array to be sorted + * @param string $name Name of array element that represents the text to sort on + * @param string $parent Name of the array element that represents the parent ID to sort on + * + * @return array Sorted array + */ + public static function sortParentChild($array, $name = 'name', $parent = 'parent') + { + + if (!is_array($array) || count($array) == 0) { + return false; + } + + // Do a sort by custom function with it included in the call + // This lets me directly use $name and $parent in the sort function + uasort($array, function ($a, $b) use ($name, $parent) { + + // If there's a parent, append the name of this entry to the parent + // The '~~~' simply keeps appended strings from any chance of a match with something else + if ($a[$parent]['value']) { + $aVal = $a[$parent]['name'].'~~~'.$a['name']; + } else { + // Otheriwse just use the name. + $aVal = $a['name']; + } + + // Same for b value + if ($b[$parent]['value']) { + $bVal = $b[$parent]['name'].'~~~'.$b['name']; + } else { + $bVal = $b['name']; + } + + if ($aVal > $bVal) { + return 1; + } + + if ($aVal < $bVal) { + return -1; + } + + return 0; + + }); + + return $array; + } + } diff --git a/config/plugin.ini b/config/plugin.ini index 914cc452..b92fd9cb 100644 --- a/config/plugin.ini +++ b/config/plugin.ini @@ -10,17 +10,31 @@ ; ; Entry Status Types ; -status[10] = 'Active' -status[20] = 'Inactive' +status[10] = 'Inactive' +status[20] = 'Active' status[30] = 'Pending Review' status[40] = 'Archived' -status_numb['None'] = 0 -status_numb['Active'] = 10 -status_numb['Inactive'] = 20 +status_numb['Inactive'] = 10 +status_numb['Active'] = 20 status_numb['Pending'] = 30 status_numb['Archived'] = 40 +; +; Member Access Levels +; +memb_access[10] = 'Inactive' +memb_access[20] = 'Active, No Memb Access' +memb_access[30] = 'Active, Moderated' +memb_access[40] = 'Active, Full Access' +memb_access[90] = 'Archived' + +memb_access_numb['Inactive'] = 10 +memb_access_numb['NoAccess'] = 20 +memb_access_numb['Moderated'] = 30 +memb_access_numb['Full'] = 40 +memb_access_numb['Archived'] = 90 + ; ; Entity Reference Type ; @@ -45,13 +59,11 @@ ref_type_numb['Contact'] = 70 ; ; Facility Type ; -facility_type[0] = 'None' facility_type[10] = 'Hotel - Motel' facility_type[20] = 'Bed and Breakfast' facility_type[30] = 'Restaurant' facility_type[40] = 'Golf' -facility_type_numb['None'] = 0 facility_type_numb['HotelMotel'] = 10 facility_type_numb['BedAndBreakfast'] = 20 facility_type_numb['Restaurant'] = 30 @@ -102,14 +114,38 @@ payment_type_numb['CreditCard'] = 40 payment_type_numb['DebitCard'] = 50 payment_type_numb['PayPal'] = 60 +; +; Credit Cards +; numbers are an exponent of 2 that represent the bit position +; in a bitmap - so it starts with 0 +; +credit_card[0] = 'Visa' +credit_card[1] = 'MasterCard' +credit_card[2] = 'American Express' +credit_card[3] = 'Discover' +credit_card[4] = 'Diners Club' + +credit_card_numb['Visa'] = 0 +credit_card_numb['MasterCard'] = 1 +credit_card_numb['American Express'] = 2 +credit_card_numb['Discover'] = 3 +credit_card_numb['Diners Club'] = 4 + +; Credit Card validation strings (regular expression) +credit_card_verify[0] = '^4.{15}$|^4.{12}$' +credit_card_verify[1] = '^5[1-5].{14}$' +credit_card_verify[2] = '^3[47].{13}$' +credit_card_verify[3] = '^6011.{12}$' +credit_card_verify[4] = '^30[0-5].{11}$|^3[68].{12}$' + ; Days of the week - numbers are an exponent of 2 that represent the bit position -days[0] = "Sunday" -days[1] = "Monday" -days[2] = "Tuesday" -days[3] = "Wednesday" -days[4] = "Thursday" -days[5] = "Friday" -days[6] = "Saturday" +days[0] = 'Sunday' +days[1] = 'Monday' +days[2] = 'Tuesday' +days[3] = 'Wednesday' +days[4] = 'Thursday' +days[5] = 'Friday' +days[6] = 'Saturday' ; ; Common Terms/Phrases diff --git a/controllers/admin.php b/controllers/admin.php index 5347f073..329259de 100644 --- a/controllers/admin.php +++ b/controllers/admin.php @@ -34,7 +34,7 @@ $GLOBALS['glmMembersAdminValidActions'] = array( ), 'member' => array( 'index', // Member Dashboard - 'member', + 'memberInfo', 'locations', 'facilities', 'activities', @@ -47,7 +47,9 @@ $GLOBALS['glmMembersAdminValidActions'] = array( 'categories', 'cities', 'regions', - 'accommodationTypes' + 'accommodationTypes', + 'amenities', + 'development' ), 'error' => array( 'index', @@ -56,7 +58,7 @@ $GLOBALS['glmMembersAdminValidActions'] = array( ); // Load glmPluginSupport class -require_once (GLM_MEMBERS_PLUGIN_DIR . '/classes/glmPluginSupport.php'); +require_once (GLM_MEMBERS_PLUGIN_PATH . '/classes/glmPluginSupport.php'); /** * Admin Controller Class @@ -222,7 +224,7 @@ class glmMembersAdmin extends GlmPluginSupport wp_register_script('glm-members-admin-js', GLM_MEMBERS_PLUGIN_URL . 'js/admin.js', array( - 'jquery' + 'jquery' )); wp_enqueue_script('glm-members-admin-js'); @@ -246,6 +248,10 @@ class glmMembersAdmin extends GlmPluginSupport * when building * its Dashboard menus. * + * add menu function reference + * add_menu_page( $page_title, $menu_title, $capability, $menu_slub, $function, $icon_url, $position) + * add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function) + * * (no prameters) * * @return void @@ -255,20 +261,42 @@ class glmMembersAdmin extends GlmPluginSupport { // Add a new main menu item for management and display of Members - add_menu_page('Members', 'Members', 'read', + add_menu_page('Members', 'Member DB', 'read', 'glm-members-admin-menu-members', array( $this, 'glmMembersAdminMenuMembers' + ), false, '20.2375'); + + /* + * Add a submenu for the "Members" section + * Note that this uses the main menu item's slug for both the parent and menu slug + * to create a sub-menu with a title different from the main menu totle + */ + add_submenu_page('glm-members-admin-menu-members', 'Members', + 'Members', 'glm_members_member', 'glm-members-admin-menu-members', + array( + $this, + 'glmMembersAdminMenuMembers' + )); + + // Add a submenu for TESTING + add_submenu_page('glm-members-admin-menu-members', 'Member List', + '  Member List', 'glm_members_member', 'glm-members-admin-menu-members-list', + array( + $this, + 'glmMembersAdminMenuMembersList' )); + // Add a submenu for the "Member" section add_submenu_page('glm-members-admin-menu-members', 'Member Information', - 'Member', 'glm_members_member', 'glm-members-admin-menu-member', + 'Member Data', 'glm_members_member', 'glm-members-admin-menu-member', array( $this, 'glmMembersAdminMenuMember' )); + // Add a submenu for the "Configure" section add_submenu_page('glm-members-admin-menu-members', 'Configure Members Database', 'Configure', 'glm_members_configure', 'glm-members-admin-menu-configure', @@ -297,6 +325,12 @@ class glmMembersAdmin extends GlmPluginSupport $this->controller('members'); } + // A test third-level admin menu + public function glmMembersAdminMenuMembersList() + { + $this->controller('members', 'list'); + } + // Add Sub Menu Items public function glmMembersAdminMenuMember () { @@ -358,7 +392,7 @@ class glmMembersAdmin extends GlmPluginSupport * @return void * @access public */ - public function controller ($menuItem) + public function controller ($menuItem, $action = false) { $errorMsg = ''; @@ -382,17 +416,22 @@ class glmMembersAdmin extends GlmPluginSupport $this->addNotice('
'.print_r($this->config,1).'
', 'DataBlock', 'Configuration Settings'); $this->addNotice("
".print_r($_REQUEST,1)."
", 'DataBlock', "Request Data"); + if (isset($_FILES)) { + $this->addNotice("
".print_r($_FILES,1)."
", 'DataBlock', "Request Files Data"); + } } /* * Determine model to execute */ - // Default action is "index" - $action = 'index'; + // Default action is "index" if an action wasn't specified in the controller call + if (!$action) { + $action = 'index'; + } - // Get any requested "action" from a form submission modify path/name - // accordingly + // Get any requested "action" from a form submission and modify path/name + // accordingly. This modifies the previously set $action. if (isset($_REQUEST['glm_action']) && $_REQUEST['glm_action'] != '') { $a = sanitize_text_field($_REQUEST['glm_action']); if ($a != '') { @@ -443,7 +482,7 @@ class glmMembersAdmin extends GlmPluginSupport */ // Build model and path and class names - $modelName = GLM_MEMBERS_PLUGIN_DIR . '/models/admin/' . $menuItem . + $modelName = GLM_MEMBERS_PLUGIN_PATH . '/models/admin/' . $menuItem . '/' . $action . '.php'; $className = 'GlmMembersAdmin_' . $menuItem . '_' . $action; @@ -512,7 +551,7 @@ class glmMembersAdmin extends GlmPluginSupport } // Check for invalid or missing view file - if (!$view || !is_file(GLM_MEMBERS_PLUGIN_DIR . '/views/'.$view)) { + if (!$view || !is_file(GLM_MEMBERS_PLUGIN_PATH . '/views/'.$view)) { if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { $this->addNotice("Error in Admin Controller: Requested View file doesn't exist - ".$view, 'Alert'); @@ -556,12 +595,13 @@ class glmMembersAdmin extends GlmPluginSupport */ // Load Smarty Template support - require (GLM_MEMBERS_PLUGIN_DIR . '/lib/smartyTemplateSupport.php'); + require (GLM_MEMBERS_PLUGIN_PATH . '/lib/smartyTemplateSupport.php'); $smarty = new smartyTemplateSupport(); // Add standard template parameters $smarty->templateAssign ( 'adminDebug', GLM_MEMBERS_PLUGIN_ADMIN_DEBUG); - $smarty->templateAssign ( 'thisURL', GLM_MEMBERS_PLUGIN_CURRENT_BASE_URL ); + $smarty->templateAssign ( 'baseURL', GLM_MEMBERS_PLUGIN_BASE_URL); + $smarty->templateAssign ( 'thisURL', GLM_MEMBERS_PLUGIN_CURRENT_URL ); $smarty->templateAssign ( 'thisPage', $_REQUEST['page']); $smarty->templateAssign ( 'glmPluginName', GLM_MEMBERS_PLUGIN_NAME ); $smarty->templateAssign ( 'thisYear', date ( 'Y' ) ); diff --git a/controllers/front.php b/controllers/front.php index ff08b322..86110213 100644 --- a/controllers/front.php +++ b/controllers/front.php @@ -36,7 +36,7 @@ $GLOBALS['glmMembersFrontValidActions'] = array( ); // Load glmPluginSupport class -require_once (GLM_MEMBERS_PLUGIN_DIR . '/classes/glmPluginSupport.php'); +require_once (GLM_MEMBERS_PLUGIN_PATH . '/classes/glmPluginSupport.php'); /* * This class controls which models are use for front-end functionality @@ -250,7 +250,7 @@ class glmMembersFront extends GlmPluginSupport */ // Build model and path and class names - $modelName = GLM_MEMBERS_PLUGIN_DIR . '/models/front/' . $menuItem . + $modelName = GLM_MEMBERS_PLUGIN_PATH . '/models/front/' . $menuItem . '/' . $action . '.php'; $className = 'GlmMembersFront_' . $menuItem . '_' . $action; @@ -313,7 +313,7 @@ class glmMembersFront extends GlmPluginSupport // Check for invalid or missing view file if (! $view || ! is_file( - GLM_MEMBERS_PLUGIN_DIR . '/views/' . $view)) { + GLM_MEMBERS_PLUGIN_PATH . '/views/' . $view)) { $modelRedirect = true; $menuItem = 'error'; $action = 'index'; @@ -353,12 +353,12 @@ class glmMembersFront extends GlmPluginSupport */ // Load Smarty Template support - require (GLM_MEMBERS_PLUGIN_DIR . '/lib/smartyTemplateSupport.php'); + require (GLM_MEMBERS_PLUGIN_PATH . '/lib/smartyTemplateSupport.php'); $smarty = new smartyTemplateSupport(); // Add standard parameters $smarty->templateAssign ( 'adminDebug', GLM_MEMBERS_PLUGIN_ADMIN_DEBUG); - $smarty->templateAssign ( 'thisURL', GLM_MEMBERS_PLUGIN_CURRENT_BASE_URL ); + $smarty->templateAssign ( 'thisURL', GLM_MEMBERS_PLUGIN_CURRENT_URL ); $smarty->templateAssign ( 'thisPage', $_REQUEST['page']); $smarty->templateAssign ( 'glmPluginName', GLM_MEMBERS_PLUGIN_NAME ); $smarty->templateAssign ( 'thisYear', date ( 'Y' ) ); diff --git a/css/admin.css b/css/admin.css index 420ff1fd..1eb60434 100644 --- a/css/admin.css +++ b/css/admin.css @@ -19,6 +19,12 @@ .glm-right { float: right; } +.glm-left { + float: left; +} +.glm-indent { + padding-left: 2em; +} .glm-copyright { text-align: center; @@ -31,6 +37,11 @@ padding: 1em; background-color: #fff; } +.glm-item-container { + border: 1px #ccc solid; + padding: .2em; + background: #f8f8f8; +} /* Admin Tabs */ .nav-tab { @@ -56,28 +67,39 @@ /* Admin Forms */ .glm-form-bad-input { background: #FFaBa9; + padding: .2em; } .glm-form-text-input { width: 90%; } +.glm-form-text-input-short { + width: 10em; +} .glm-form-textarea { width: 90%; } /* Admin table additions */ .glm-admin-table { - border: 3px #ddd solid !important; + width: 95%; + margin-bottom: 5px; } -.glm-admin-table thead th{ - border-bottom: 3px #ddd solid !important; - font-size: 15px; - font-weight: bold; -} -.glm-table-fieldname { +.glm-admin-table th { text-align: left; vertical-align: top; white-space: nowrap; padding-right: 1em; + padding-bottom: .4em; + width: 10px; /* used to keep header fields on a line with td's to as narrow as they can be without breaking the text */ +} +.glm-admin-table td { + text-align: left; + vertical-align: top; + padding-bottom: .4em; +} +.glm-admin-table thead th{ + font-size: 15px; + font-weight: bold; } /* Overlay dialog box */ @@ -94,6 +116,43 @@ display: none; } +/* Dynamic Select Active Values Box */ +.glm-dynSelect-box { + border: 2px #ddd solid; + min-height: 2.5em; + min-width: 100px; + float: left; + background: #fff; + margin: .2em; +} +.glm-dynSelect-item { + border: 2px #ddd solid; + border-radius: 5px; + background: #eee; + float: left; + padding: .2em; + margin: .4em; +} +.glm-dynSelect-delete { + font-weight: bold; + font-size: 1.1em; + color: #bbb; + border-left: 2px #ccc solid; + padding-left: .5em; + margin-left: .5em; +} +.glm-dynSelect-delete:hover { + font-size: 1.1em; + color: #000; +} + +/* Map Edit */ +.glm-map-edit { + width:320px; + height:200px; + border: 2px black solid; +} + /* Debug Window */ #glm-debug-header { font-weight: bold; diff --git a/deactivate.php b/deactivate.php index 0bb72bd1..4d832d4e 100644 --- a/deactivate.php +++ b/deactivate.php @@ -15,7 +15,7 @@ */ // Load glmPluginSupport class -require_once (GLM_MEMBERS_PLUGIN_DIR . '/classes/glmPluginSupport.php'); +require_once (GLM_MEMBERS_PLUGIN_PATH . '/classes/glmPluginSupport.php'); /* * This class performs all necessary additional work when this diff --git a/defines.php b/defines.php index e93d3a2c..e43ccb8f 100644 --- a/defines.php +++ b/defines.php @@ -5,12 +5,8 @@ * Set standard defined parameters */ -// Determine current http/https protocol -$pageProtocol = 'http'; -if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') { - $pageProtocol = 'https'; -} -define('GLM_MEMBERS_PLUGIN_HTTP_PROTOCOL', $pageProtocol); +define('GLM_MEMBERS_PLUGIN_NAME', 'Gaslight Media Members Database'); +define('GLM_MEMBERS_PLUGIN_DIR', 'glm-members-db'); // Debug Options define('GLM_MEMBERS_PLUGIN_ADMIN_DEBUG', true); @@ -18,21 +14,29 @@ define('GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE', true); define('GLM_MEMBERS_PLUGIN_FRONT_DEBUG', true); define('GLM_MEMBERS_PLUGIN_FRONT_DEBUG_VERBOSE', true); +// Determine current http/https protocol +$pageProtocol = 'http'; +if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') { + $pageProtocol = 'https'; +} +define('GLM_MEMBERS_PLUGIN_HTTP_PROTOCOL', $pageProtocol); + // Plugin Versions define('GLM_MEMBERS_PLUGIN_VERSION', 0.1); define('GLM_MEMBERS_PLUGIN_DB_VERSION', 0.1); // URLs define('GLM_MEMBERS_PLUGIN_URL', plugin_dir_url(__FILE__)); + $pageUri = explode('?', $_SERVER['REQUEST_URI']); // Bust this up to access URL path and script name only -define('GLM_MEMBERS_PLUGIN_CURRENT_BASE_URL', $pageProtocol.'://'.$_SERVER['SERVER_NAME'].$pageUri[0]); +define('GLM_MEMBERS_PLUGIN_BASE_URL', WP_PLUGIN_URL.'/'.GLM_MEMBERS_PLUGIN_DIR); +define('GLM_MEMBERS_PLUGIN_CURRENT_URL', $pageProtocol.'://'.$_SERVER['SERVER_NAME'].$pageUri[0]); // Directories -define('GLM_MEMBERS_PLUGIN_NAME', 'Gaslight Media Members Database'); -define('GLM_MEMBERS_PLUGIN_DIR', dirname(__FILE__)); +define('GLM_MEMBERS_PLUGIN_PATH', dirname(__FILE__)); define('GLM_MEMBERS_PLUGIN_DB_SCRIPTS', dirname(__FILE__).'/misc/databaseScripts'); -define('GLM_MEMBERS_PLUGIN_CLASS_DIR', GLM_MEMBERS_PLUGIN_DIR.'/classes'); -define('GLM_MEMBERS_PLUGIN_LIB_DIR', GLM_MEMBERS_PLUGIN_DIR.'/lib'); +define('GLM_MEMBERS_PLUGIN_CLASS_PATH', GLM_MEMBERS_PLUGIN_PATH.'/classes'); +define('GLM_MEMBERS_PLUGIN_LIB_PATH', GLM_MEMBERS_PLUGIN_PATH.'/lib'); // Database table prefixes global $wpdb; diff --git a/index.php b/index.php index 161518d0..64baf5e2 100644 --- a/index.php +++ b/index.php @@ -43,13 +43,13 @@ require_once('defines.php'); // Get plugin configuration - Just use common section for now, we'll deal with others later -$configData = parse_ini_file(GLM_MEMBERS_PLUGIN_DIR.'/config/plugin.ini', true); +$configData = parse_ini_file(GLM_MEMBERS_PLUGIN_PATH.'/config/plugin.ini', true); $config = $configData['common']; // Get additional configuration data -$stateData = parse_ini_file(GLM_MEMBERS_PLUGIN_DIR.'/config/states.ini'); +$stateData = parse_ini_file(GLM_MEMBERS_PLUGIN_PATH.'/config/states.ini'); $config['states'] = $stateData['states']; -$countryData = parse_ini_file(GLM_MEMBERS_PLUGIN_DIR.'/config/countries.ini'); +$countryData = parse_ini_file(GLM_MEMBERS_PLUGIN_PATH.'/config/countries.ini'); $config['countries'] = $countryData['countries']; // Try to set the DB version option to false (new plugin) - If it's already set this won't do anything. @@ -197,7 +197,7 @@ add_option('glmMembersDatabaseDbVersion', false); function glmMembersPluginActivate () { global $wpdb; - require_once (GLM_MEMBERS_PLUGIN_DIR . '/activate.php'); + require_once (GLM_MEMBERS_PLUGIN_PATH . '/activate.php'); new glmMembersPluginActivate($wpdb); } register_activation_hook(__FILE__, 'glmMembersPluginActivate'); @@ -206,7 +206,7 @@ register_activation_hook(__FILE__, 'glmMembersPluginActivate'); function glmMembersPluginDeactivate () { global $wpdb; - require_once (GLM_MEMBERS_PLUGIN_DIR . '/deactivate.php'); + require_once (GLM_MEMBERS_PLUGIN_PATH . '/deactivate.php'); $x = new glmMembersPluginDeactivate($wpdb); return false; } @@ -221,7 +221,7 @@ register_deactivation_hook(__FILE__, 'glmMembersPluginDeactivate'); */ // Load data abstract -require_once(GLM_MEMBERS_PLUGIN_LIB_DIR.'/GlmDataAbstract/DataAbstract.php'); +require_once(GLM_MEMBERS_PLUGIN_LIB_PATH.'/GlmDataAbstract/DataAbstract.php'); /* * @@ -234,10 +234,10 @@ if (isset($_REQUEST['glmDebugWindow']) && $_REQUEST['glmDebugWindow'] == true) { glmMembersAdminNotices(true); exit; } elseif (is_admin()) { - require_once (GLM_MEMBERS_PLUGIN_DIR . '/controllers/admin.php'); + require_once (GLM_MEMBERS_PLUGIN_PATH . '/controllers/admin.php'); new glmMembersAdmin($wpdb, $config); } else { - require_once (GLM_MEMBERS_PLUGIN_DIR . '/controllers/front.php'); + require_once (GLM_MEMBERS_PLUGIN_PATH . '/controllers/front.php'); new glmMembersFront($wpdb, $config); } diff --git a/js/geolocation-edit/.svn/all-wcprops b/js/geolocation-edit/.svn/all-wcprops new file mode 100644 index 00000000..e7b0b7c6 --- /dev/null +++ b/js/geolocation-edit/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 54 +/svn/!svn/ver/16469/CommonApps/Public/geolocation-edit +END +jquery.geolocation.edit.0.0.9.js +K 25 +svn:wc:ra_dav:version-url +V 87 +/svn/!svn/ver/16469/CommonApps/Public/geolocation-edit/jquery.geolocation.edit.0.0.9.js +END +jquery.geolocation.edit.min.0.0.9.js +K 25 +svn:wc:ra_dav:version-url +V 91 +/svn/!svn/ver/16469/CommonApps/Public/geolocation-edit/jquery.geolocation.edit.min.0.0.9.js +END diff --git a/js/geolocation-edit/.svn/entries b/js/geolocation-edit/.svn/entries new file mode 100644 index 00000000..8acfef80 --- /dev/null +++ b/js/geolocation-edit/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +22275 +http://cvs2.gaslightmedia.com/svn/CommonApps/Public/geolocation-edit +http://cvs2.gaslightmedia.com/svn + + + +2013-05-30T18:34:24.204349Z +16469 +cscott + + + + + + + + + + + + + + +a51af99c-7783-4ee7-b607-eba6a9487a3a + +jquery.geolocation.edit.0.0.9.js +file + + + + +2014-09-04T18:56:23.889900Z +153c4f4f804859076e3858fdf6956005 +2013-05-30T18:34:24.204349Z +16469 +cscott + + + + + + + + + + + + + + + + + + + + + +5417 + +jquery.geolocation.edit.min.0.0.9.js +file + + + + +2014-09-04T18:56:23.889900Z +a8fe8b4e6ccf1a6f471eac5baea62c7f +2013-05-30T18:34:24.204349Z +16469 +cscott + + + + + + + + + + + + + + + + + + + + + +2678 + diff --git a/js/geolocation-edit/.svn/text-base/jquery.geolocation.edit.0.0.9.js.svn-base b/js/geolocation-edit/.svn/text-base/jquery.geolocation.edit.0.0.9.js.svn-base new file mode 100644 index 00000000..17b3c5ea --- /dev/null +++ b/js/geolocation-edit/.svn/text-base/jquery.geolocation.edit.0.0.9.js.svn-base @@ -0,0 +1,239 @@ +/** + * jQuery geolocation.edit plugin + * Copyright (c) 2012 Milos Popovic + * + * Freely distributable under the MIT license. + * + * @version 0.0.8 (2013-02-08) + * @see http://github.com/miloss/jquery-geolocation-edit + */ + +(function ($) { + var inits + , methods = {} + , loadScript; + + // Queued initializations + inits = []; + + + // Plugin methods + // -------------- + + /** + * Main execution method + * @param {Object} options Passed plugin options + */ + methods.main = function (options) { + var selector = this + , opts + , llat, llng, llocation + , i, addrlen; + + // Check for required fields + if (typeof options.lat === 'undefined' || typeof options.lng === 'undefined') { + $.error( "Please provide 'lat' and 'lng' options for jQuery.geolocate" ); + return; + } + + // If GoogleMaps not loaded - push init to queue and go on + if (typeof google === 'undefined' || typeof google.maps === 'undefined') { + inits.push(function () { + $(selector).geolocate(options); + }); + loadScript(); + return; + } + + // 1. Create options for map init + // extend default options + opts = $.extend(true, { + address: [], + changeOnEdit: false, + mapOptions: { + zoom: 14, + mapTypeId: google.maps.MapTypeId.ROADMAP, + mapTypeControl: false, + streetViewControl: false + }, + markerOptions: { + draggable:true, + animation: google.maps.Animation.DROP + }, + geoCallback: function(){} + }, options); + + $(this).data('opts', opts); + + // 2. Init map and marker - per coordinates + llat = parseFloat( $( opts.lat ).val() ); + llng = parseFloat( $( opts.lng ).val() ); + + if ( !isNaN(llat) && !isNaN(llng) ) { + llocation = new google.maps.LatLng(llat, llng); + $(this).geolocate({}, 'initMap', llocation); + } + + // 3. Bind fields actions - coordinates (future?) + if ( opts.changeOnEdit ) { + $( opts.lat ).change(function () { /* ... */ }); + $( opts.lng ).change(function () { /* ... */ }); + } + + // 4. Bind field actions - address + addrlen = opts.address.length; + if (addrlen > 0) { + for (i=0; i +// Freely distributable under the MIT license. +// see: http://github.com/miloss/jquery-geolocation-edit +(function(a){var g,e={},h;g=[];e.main=function(b){var c=this,d,f,e;if("undefined"===typeof b.lat||"undefined"===typeof b.lng)a.error("Please provide 'lat' and 'lng' options for jQuery.geolocate");else if("undefined"===typeof google||"undefined"===typeof google.maps)g.push(function(){a(c).geolocate(b)}),h();else if(d=a.extend(!0,{address:[],changeOnEdit:!1,mapOptions:{zoom:14,mapTypeId:google.maps.MapTypeId.ROADMAP,mapTypeControl:!1,streetViewControl:!1},markerOptions:{draggable:!0,animation:google.maps.Animation.DROP}, geoCallback:function(){}},b),a(this).data("opts",d),f=parseFloat(a(d.lat).val()),e=parseFloat(a(d.lng).val()),!isNaN(f)&&!isNaN(e)&&(f=new google.maps.LatLng(f,e),a(this).geolocate({},"initMap",f)),d.changeOnEdit&&(a(d.lat).change(function(){}),a(d.lng).change(function(){})),e=d.address.length,0 + * + * Freely distributable under the MIT license. + * + * @version 0.0.11 (2014-06-01) + * @see http://github.com/miloss/jquery-geolocation-edit + */ + +(function ($) { + var inits + , methods + , loadScript; + + // Queued initializations + inits = []; + // Methods container object + methods = {}; + + + // Plugin methods + // -------------- + + /** + * Main execution method + * @param {Object} options Passed plugin options + */ + methods.main = function (options) { + var selector = this + , opts + , llat, llng, llocation + , i, addrlen; + + // Check for required fields + if (typeof options.lat === "undefined" || + typeof options.lng === "undefined") { + $.error("Please provide 'lat' and 'lng' options for jQuery.geolocate"); + return; + } + + // If GoogleMaps not loaded - push init to queue and go on + if (typeof google === "undefined" || + typeof google.maps === "undefined") { + inits.push(function () { + $(selector).geolocate(options); + }); + loadScript(); + return; + } + + // Extend default options + opts = $.extend(true, { + address: [], + changeOnEdit: false, + mapOptions: { + zoom: 14, + mapTypeId: google.maps.MapTypeId.ROADMAP, + mapTypeControl: false, + streetViewControl: false + }, + markerOptions: { + draggable:true, + animation: google.maps.Animation.DROP + }, + geoCallback: function(){} + }, options); + + $(this).data('opts', opts); + + // Init map and marker - per coordinates + llat = parseFloat( $( opts.lat ).val() ); + llng = parseFloat( $( opts.lng ).val() ); + if (isNaN(llat)) { + llat = 0; + } + if (isNaN(llng)) { + llng = 0; + } + + llocation = new google.maps.LatLng(llat, llng); + $(this).geolocate({}, 'initMap', llocation); + + // Bind actions - coordinates fields (future?) + if ( opts.changeOnEdit ) { + $( opts.lat ).change(function () { /* ... */ }); + $( opts.lng ).change(function () { /* ... */ }); + } + + // Bind actions - address field + addrlen = opts.address.length; + if (addrlen > 0) { + for (i=0; i + * + * Freely distributable under the MIT license. + * + * @version 0.0.11 (2014-06-01) + * @see http://github.com/miloss/jquery-geolocation-edit + */ + diff --git a/js/geolocation-edit/jquery.geolocation.edit.min.0.0.11.js b/js/geolocation-edit/jquery.geolocation.edit.min.0.0.11.js new file mode 100644 index 00000000..2464b096 --- /dev/null +++ b/js/geolocation-edit/jquery.geolocation.edit.min.0.0.11.js @@ -0,0 +1,5 @@ +// jQuery geolocation.edit plugin v0.0.11 (2014-06-01) +// Copyright (c) 2012 Milos Popovic +// Freely distributable under the MIT license. +// see: http://github.com/miloss/jquery-geolocation-edit +(function(a){var h,g,k;h=[];g={main:function(c){var b=this,d,f,e;if("undefined"===typeof c.lat||"undefined"===typeof c.lng)a.error("Please provide 'lat' and 'lng' options for jQuery.geolocate");else if("undefined"===typeof google||"undefined"===typeof google.maps)h.push(function(){a(b).geolocate(c)}),k();else if(d=a.extend(!0,{address:[],changeOnEdit:!1,mapOptions:{zoom:14,mapTypeId:google.maps.MapTypeId.ROADMAP,mapTypeControl:!1,streetViewControl:!1},markerOptions:{draggable:!0,animation:google.maps.Animation.DROP}, geoCallback:function(){}},c),a(this).data("opts",d),f=parseFloat(a(d.lat).val()),e=parseFloat(a(d.lng).val()),isNaN(f)&&(f=0),isNaN(e)&&(e=0),f=new google.maps.LatLng(f,e),a(this).geolocate({},"initMap",f),d.changeOnEdit&&(a(d.lat).change(function(){}),a(d.lng).change(function(){})),e=d.address.length,0inputFieldStatus = false; $this->inputErrorReason = 'Input is less than the minimum permitted value of '.$f['minValue'].'.'; return $in; } - if ($f['maxValue'] && $in > $f['maxValue']) { + if (isset($f['maxValue']) && $f['maxValue'] && $in > $f['maxValue']) { $this->inputFieldStatus = false; $this->inputErrorReason = 'Input is greater than the maximum permitted value of '.$f['maxValue'].'.'; return $in; @@ -250,7 +250,7 @@ abstract class GlmDataAbstract function floatOutput($f, $d) { // if a format is specified - if ($f['output_format']) { + if (isset($f['output_format']) && $f['output_format']) { $d = sprintf('%'.$f['output_format'].'f', ($d - 0)); } @@ -266,7 +266,7 @@ abstract class GlmDataAbstract } // if a format is specified - if ($f['output_format']) { + if (isset($f['output_format']) && $f['output_format'] != '') { $in = sprintf('%'.$f['output_format'].'f', ($in - 0)); } @@ -278,7 +278,7 @@ abstract class GlmDataAbstract $in = $_REQUEST[$as]; // Check for required field - if ($f['required'] && trim($in) == '') { + if (isset($f['required']) && $f['required'] && trim($in) == '') { $this->inputFieldStatus = false; $this->inputErrorReason = 'Required input not provided.'; return $in; @@ -294,12 +294,12 @@ abstract class GlmDataAbstract $in = $in - 0; // Check min/max limits - if ($f['minValue'] && $in < $f['minValue']) { + if (isset($f['minValue']) && $f['minValue'] && $in < $f['minValue']) { $this->inputFieldStatus = false; $this->inputErrorReason = 'Input is less than the minimum permitted value of '.$f['minValue'].'.'; return $in; } - if ($f['maxValue'] && $in > $f['maxValue']) { + if (isset($f['maxValue']) && $f['maxValue'] && $in > $f['maxValue']) { $this->inputFieldStatus = false; $this->inputErrorReason = 'Input is greater than the maximum permitted value of '.$f['maxValue'].'.'; return $in; @@ -334,7 +334,7 @@ abstract class GlmDataAbstract } // if a format is specified - if ($f['output_format']) { + if (isset($f['output_format']) && $f['output_format']) { $in = sprintf('%'.$f['output_format'].'f', ($in - 0)); } @@ -545,49 +545,7 @@ abstract class GlmDataAbstract */ function pointerField($f) { - - // Get ID field of other table - default to 'id' - $p_id = 'id'; - if(isset($f['p_id'])) { - $p_id = $f['p_id']; - } - - // Check if there's a specified WHERE clause - $where = $p_id." = T.".$f['field']; - if (isset($f['p_where']) && $f['p_where']) { - $where = $f['p_where']; - } - - // Check if there's an addional FROM tables - $from = ''; - if (isset($f['p_from']) && $f['p_from']) { - $from = ', '.$f['p_from']; - } - - // Check if the results from this pointer is to be summed - $field_val = $f['p_field']; - if (isset($f['p_sum']) && $f['p_sum']) { - $field_val = 'COALESCE(sum('.$field_val.'), 0) '; - } - - // Check for "as" option - $as = $f['field']; - if (isset($f['as']) && $f['as'] != '') { - $as = $f['as']; - } - - $field = " - COALESCE( - ( - SELECT ".$field_val." - FROM ".$f['p_table']." - $from - WHERE $where - ), null - ) AS $as - "; - - return $field; + return 'T.'.$f['field']; } function pointerOptions($f) { @@ -613,19 +571,12 @@ abstract class GlmDataAbstract function pointerOutput($f, $d, $forEdit = false, $id = false, $idfield = 'id') { - // If the operation is Edit then we need to also get the options for select (unless it's p_static) - if ($forEdit && !(isset($f['p_static']) && $f['p_static'] === true)) { + // If 'force_list' or $forEdit also get the options for select, unless 'p_static' + $alwaysList = (isset($f['force_list']) && $f['force_list']); + $pStatic = (isset($f['p_static']) && $f['p_static']); + if (($alwaysList || $forEdit) && !$pStatic ) { - // Get current value of pointer - if ($id) { - $sql = " - SELECT ".$f['field']." AS id - FROM ".$this->table." - WHERE $idfield = $id - "; - $p_data = $this->wpdb->get_row($sql, ARRAY_A); - $p_value = $p_data['id']; - } + $p_value = $d; // Get pointer options from specified table $order_by = $f['p_field']; @@ -748,15 +699,20 @@ abstract class GlmDataAbstract "; $p_list = $this->wpdb->get_results($sql, ARRAY_A); + // Get field name + $as = $f['field']; + if (isset($f['as']) && $f['as'] != '') { + $as = $f['as']; + } + // If this is not a "new", then do these things if ($op != 'n') { - // Pointers are treated as integers except that there's no min/max - - $in = $_REQUEST[$as]; + // Get selected - Pointers are treated as integers except that there's no min/max + $in = $_REQUEST[$as]-0; // Check for required field - if ($f['required'] && trim($in) == '') { + if (isset($f['required']) && $f['required'] && trim($in) == '') { $this->inputFieldStatus = false; $this->inputErrorReason = 'Required input not provided.'; // return $in; @@ -832,7 +788,7 @@ abstract class GlmDataAbstract } else { // Only worry about no options if the field is required. - if ($f['required']) { + if (isset($f['required']) && $f['required']) { // There were no results from the $this->inputFieldStatus = false; $this->inputErrorReason = 'No options were available for this pick list.'; @@ -874,10 +830,10 @@ abstract class GlmDataAbstract } // if $op $r = array( - 'value' => $in, + 'value' => $in, 'name' => $selected_name, 'nameEsc' => addslashes($selected_name), - 'list' => $pick_list + 'list' => $pick_list ); return $r; @@ -910,6 +866,18 @@ abstract class GlmDataAbstract // Build list array $list = array(); + + // If list should have a blank entry + if (isset($f['l_blank']) && $f['l_blank']) { + $list[null] = array( + 'name' => '', + 'nameEsc' => '', + 'value' => null, + 'default' => false + ); + } + + // Add list entries while (list($k, $v) = each($f['list'])) { $list[$k] = array( 'name' => $v, @@ -936,7 +904,8 @@ abstract class GlmDataAbstract ); // if the list is not required, dump it now. (List, Get, Delete, Confirm delete) - if (in_array($op, array('l', 'g', 'd', 'c'))) { + $forceList = (isset($f['force_list']) && $f['force_list']); + if (!$forceList && !$forEdit && in_array($op, array('l', 'g', 'd', 'c'))) { $r['list'] = false; } @@ -955,6 +924,18 @@ abstract class GlmDataAbstract // Build list array $list = array(); + + // If list should have a blank entry + if (isset($f['l_blank']) && $f['l_blank']) { + $list[null] = array( + 'name' => '', + 'nameEsc' => '', + 'value' => null, + 'default' => false + ); + } + + // Add list entries while (list($k, $v) = each($f['list'])) { $list[$k] = array( 'name' => $v, @@ -1090,7 +1071,7 @@ abstract class GlmDataAbstract if ($op == 'n' && isset($f['default'])) { $in = $f['default']; // Otherwise, create bitmap from input selection - multi-pick - } elseif (is_array($_REQUEST[$as]) && count($_REQUEST[$as]) > 0) { + } elseif (isset($_REQUEST[$as]) && is_array($_REQUEST[$as]) && count($_REQUEST[$as]) > 0) { foreach ($_REQUEST[$as] as $bit) { // Make sure it's a number that's less than 32 - Using integer (32 bits?) if ($bit == ($bit-0) && $bit < 32) { @@ -1597,12 +1578,12 @@ abstract class GlmDataAbstract if (isset($f['minValue']) && ($f['minValue']-0) > 0) { $min = $f['minValue']-0; } else { - $min = strtotime('-6 months'); + $min = strtotime('10 years'); } if (isset($f['maxValue']) && ($f['maxValue']-0) > 0) { $max = $f['maxValue']-0; } else { - $max = strtotime('+24 months'); + $max = strtotime('+10 years'); } // Get time stamp for retrieved data @@ -1654,12 +1635,12 @@ abstract class GlmDataAbstract if (isset($f['minValue']) && ($f['minValue']-0) > 0) { $min = $f['minValue']-0; } else { - $min = strtotime('-6 months'); + $min = strtotime('-10 years'); } if (isset($f['maxValue']) && ($f['maxValue']-0) > 0) { $max = $f['maxValue']-0; } else { - $max = strtotime('+24 months'); + $max = strtotime('+ years'); } // Build picklists for date input @@ -1667,35 +1648,36 @@ abstract class GlmDataAbstract // If this is setup for a new entry, then just return default value if ($op == 'n') { + $in = time(); // Assume current time + + // Check for a specified default if (isset($f['default']) && $f['default'] != false) { $in = ($f['default']); } - // Otherwise we should be getting input from the user - } else { + // Otherwise we should be getting input from the user + } else { $this->inputErrorReason = false; - - // Check for pick-list date input $in_type = false; + $in = false; + + // If we're getting separate month, day, year if (isset($_REQUEST[$as.'_month'])) { // Looks like we have picklist input $in = strtotime($_REQUEST[$as.'_month'].'/'.$_REQUEST[$as.'_day'].'/'.$_REQUEST[$as.'_year']); $in_type = 'pick'; + // Look for plain text input } elseif (isset($_REQUEST[$as])) { - - // Looks like it's plain text input $in = strtotime($_REQUEST[$as]); - $in_type = 'text'; - } // check if the input time was invalid - if ($f['required'] && $in == false) { + if (isset($f['required']) && $f['required'] && $in == false) { $this->inputErrorReason = 'Date supplied is invalid.'; $this->inputFieldStatus = false; $in = time(); @@ -1708,7 +1690,7 @@ abstract class GlmDataAbstract // Use default format unless there's a date format spec? $format = ('m/d/Y'); - if ($f['format']) { + if (isset($f['format']) && $f['format']) { $format = $f['format']; } @@ -1718,10 +1700,10 @@ abstract class GlmDataAbstract $this->inputErrorReason = 'Required date not supplied.'; $this->inputFieldStatus = false; // Check for valid date range - } elseif ($f['minValue'] && $in < $f['minValue']) { + } elseif (isset($f['minValue']) && $f['minValue'] && $in < $f['minValue']) { $this->inputErrorReason = 'Date earlier than permitted ('.date($format, $f['minValue']).').'; $this->inputFieldStatus = false; - } elseif ($f['maxValue'] && $in > $f['maxValue']) { + } elseif (isset($f['maxValue']) && $f['maxValue'] && $in > $f['maxValue']) { $this->inputErrorReason = 'Date later than permitted ('.date($format, $f['maxValue']).').'; $this->inputFieldStatus = false; } @@ -1734,6 +1716,9 @@ abstract class GlmDataAbstract $text_date = ''; } + // Create MYSQL compatible date input + $sqlDate = date('Y-m-d', $in); + // If the field validated and it's supposed to be unique if ($this->inputFieldStatus && $this->inputFieldStatus && isset($f['unique']) && $f['unique']) { @@ -1744,7 +1729,7 @@ abstract class GlmDataAbstract FROM " .$this->table." WHERE " - .$f['field']." = '$text_date'; + .$f['field']." = '$sqlDate'; "; // If there's an ID field, then this must be an update rather than an insert @@ -1784,9 +1769,15 @@ abstract class GlmDataAbstract } function dateStore($in, $f) { + // Check if there's no date then supply null if ($in['date'] != '') { - return "'".addslashes($in['date'])."'"; + + // Create MYSQL compatible date input + $sqlDate = date('Y-m-d', strtotime($in['date'])); + + return "'$sqlDate'"; + } else { return "null"; } @@ -1807,17 +1798,14 @@ abstract class GlmDataAbstract 'default' => false ); } - $min_list = array( - 0 => array('name' => '00', value => 0, 'default' => false), - 15 => array('name' => '15', value => 15, 'default' => false), - 30 => array('name' => '30', value => 30, 'default' => false), - 45 => array('name' => '45', value => 45, 'default' => false) - ); + $min_list = array(); + for ($m=0 ; $m<60 ; $m++) { + $min_list[$m] = array('name' => ($m < 10 ? '0' : '').$m, 'value' => $m, 'default' => false); + } $ampm_list = array( - 'A' => array('name' => 'AM', value => 'A', 'default' => false), - 'P' => array('name' => 'PM', value => 'P', 'default' => false) + 'A' => array('name' => 'AM', 'value' => 'A', 'default' => false), + 'P' => array('name' => 'PM', 'value' => 'P', 'default' => false) ); - $time_list = array( 'hour' => $hour_list, 'min' => $min_list, @@ -1859,8 +1847,7 @@ abstract class GlmDataAbstract $hour -= 12; } - // We're doing only 15 min intervals so force to that - $min = (floor($t[1] / 15) * 15); + $min = $t[1]; $time_list['hour'][$hour]['default'] = true; $time_list['min'][$min]['default'] = true; @@ -1945,9 +1932,6 @@ abstract class GlmDataAbstract // We have a time value so set Hours Pick $time_list['hour'][$hour]['default'] = true; - - // We're doing only 15 min intervals so force to that - $min = (floor($min / 15) * 15); $time_list['min'][$min]['default'] = true; if ($ampm == 'PM') { @@ -2041,8 +2025,8 @@ abstract class GlmDataAbstract $current_img = false; // Setup Image server access - require_once IMAGE_SERVER_ABSTRACT; - $imServer = new ImageServerAbstract(); +// require_once IMAGE_SERVER_ABSTRACT; +// $imServer = new ImageServerAbstract(); // Check if there's an existing image if ($id != false) { @@ -2067,19 +2051,22 @@ abstract class GlmDataAbstract // Is there a new image being uploaded $new = false; - if (is_array($_FILES[$as.'_new']) && $_FILES[$as.'_new']['tmp_name'] != '') { + if (isset($_FILES[$as.'_new']) && is_array($_FILES[$as.'_new']) && $_FILES[$as.'_new']['tmp_name'] != '') { $new = true; } // If there a request to delete an existing image or a new image and there's a current image - if (($_REQUEST[$as."_delete"] == 'on' || $new) && $current_img != false) { - $imServer->imageDelete($current_img); + if (isset($_REQUEST[$as."_delete"]) && ($_REQUEST[$as."_delete"] == 'on' || $new) && $current_img != false) { +// $imServer->imageDelete($current_img); $current_img = ''; } // If there's a new image, try to store that one if ($new) { - $current_img = $imServer->imageUpload($as.'_new'); + +// $current_img = $imServer->imageUpload($as.'_new'); + + } return $current_img; @@ -2381,11 +2368,11 @@ abstract class GlmDataAbstract $this->select .= $sep.$field; // If the field has an "AS" specifier, use that as the field name - $as = $v['field']; + $as = trim($v['field']); $asFieldUsed = false; if (isset($v['as']) && $v['as'] != false && trim($v['as']) != '') { - $this->select .= ' AS '.$v['as']; - $as = $v['as']; + $as = trim($v['as']); + $this->select .= ' AS '.$as; $asFieldUsed = true; } @@ -2460,9 +2447,9 @@ abstract class GlmDataAbstract } // Check for "as" output field name - $as = $v['field']; + $as = trim($v['field']); if (isset($v['as']) && $v['as'] != false && trim($v['as'] != '')) { - $as = $v['as']; + $as = trim($v['as']); } // Get the current field data @@ -2474,7 +2461,6 @@ abstract class GlmDataAbstract // Call field processing function based on field tye $out = $this->{$type.'Output'}($v, $d, $forEdit, $id, $idfield, $op); - $data[$as] = $out; if($forEdit) { @@ -2485,12 +2471,14 @@ abstract class GlmDataAbstract } if ($forEdit) { - return array( + $r = array( 'status' => true, 'fieldData' => $data, 'fieldRequired' => $fieldRequired, 'fieldFail' => $fieldFail ); + + return $r; } return $data; } @@ -2533,9 +2521,9 @@ abstract class GlmDataAbstract } // Check for "as" output field name - $as = $v['field']; + $as = trim($v['field']); if (isset($v['as']) && $v['as'] != false && trim($v['as']) != '') { - $as = $v['as']; + $as = trim($v['as']); } // Check if this is a vew only field. @@ -2598,12 +2586,13 @@ abstract class GlmDataAbstract FROM $this->table WHERE $where;"; + $stats = $this->wpdb->get_row($sql, ARRAY_A); + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - getStats() query"); + glmMembersAdmin::addNotice($stats, 'DataBlock', "Stats Data"); } - $stats = $this->wpdb->get_row($sql, ARRAY_A); - return $stats['count']; } @@ -2617,8 +2606,6 @@ abstract class GlmDataAbstract public function getList($where = '', $order = '') { - $this->optionIncludeSelectListData = false; - // Get field specifications for this instance $this->buildFieldsList('l'); @@ -2636,10 +2623,6 @@ abstract class GlmDataAbstract "; } - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - getList() query"); - } - //echo "
$sql
"; $list = $this->wpdb->get_results($sql, ARRAY_A); @@ -2651,7 +2634,11 @@ abstract class GlmDataAbstract while (list($k, $v) = each($list)) { $list[$k] = $this->processOutputData($v, 'l'); } -//echo "
".print_r($list,1)."
"; + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - getList() query"); + glmMembersAdmin::addNotice($list, 'DataBlock', "getList() data"); + } return $list; } @@ -2662,7 +2649,7 @@ abstract class GlmDataAbstract * @return void * @access public */ - public function getEntry($id, $idfield = 'id', $where = '') + public function getEntry($id, $idfield = 'id', $where = '', $forEdit = false) { if ($id-0 == 0) { // echo "DataAbstract.php - getEntry() called with invalid ID"; @@ -2676,11 +2663,6 @@ abstract class GlmDataAbstract WHERE $idfield = $id $where ;"; - - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - getEntry() query"); - } - $detail = $this->wpdb->get_row($sql, ARRAY_A); // If nothing was found, simply return false @@ -2689,7 +2671,13 @@ abstract class GlmDataAbstract } // Process individual fields - $detail = $this->processOutputData($detail, 'g'); + $detail = $this->processOutputData($detail, 'g', $forEdit); + + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - getEntry() query"); + glmMembersAdmin::addNotice($detail, 'DataBlock', "getEntry() data"); + } return $detail; } @@ -2707,6 +2695,10 @@ abstract class GlmDataAbstract $r = $this->processInputData('n'); $r['fieldFail'] = false; + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($r, 'DataBlock', "newEntry() data"); + } + return $r; } @@ -2762,21 +2754,43 @@ abstract class GlmDataAbstract ( $fields ) VALUES ( $vals ); "; + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($sql, 'DataBlock', "insertEntry() Query"); + } + // Now store the field data $this->wpdb->query($sql); + $queryError = $this->wpdb->last_error; + + // If there were no errors + if (trim($queryError) != '') { + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice( + 'insertEntry() Query Failure
' + .'  Error Message: '.$queryError.'
' + .'  Table: '.$this->table, 'Alert'); + } + } + + // Get the current ID value and set that in the session - $r['insertedID'] = $this->wpdb->insert_id; + $r['fieldData']['id'] = $this->wpdb->insert_id; + } else { if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - insertEntry() query"); + glmMembersAdmin::addNotice('  insertEntry() requested to NOT store new entry!', 'Process'); } + } - // Get the data again for output - $r['fieldData'] = $this->getEntry($r['insertedID']); - + } else { + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice('  checkOther() returned bad status.', 'Process'); } + } + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($r, 'DataBlock', "DataAbstract - insertEntry() failure data"); } return $r; @@ -2796,11 +2810,6 @@ abstract class GlmDataAbstract FROM $this->table T WHERE $idfield = $id ;"; - - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - editEntry() query"); - } - $detail = $this->wpdb->get_row($sql, ARRAY_A); // Check for failure retrieving data @@ -2811,6 +2820,12 @@ abstract class GlmDataAbstract // Process individual fields $detail = $this->processOutputData($detail, 'e', true, $id, $idfield); + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - editEntry() query"); + glmMembersAdmin::addNotice($detail, 'DataBlock', "editEntry() data"); + } + + return $detail; } @@ -2834,9 +2849,9 @@ abstract class GlmDataAbstract if (isset($v['view_only']) && $v['view_only']) { // Check for "as" output field name - $as = $v['field']; + $as = trim($v['field']); if (isset($v['as']) && $v['as'] != false && trim($v['as']) != '' ) { - $as = $v['as']; + $as = trim($v['as']); } $r['fieldData'][$as] = $stored[$as]; @@ -2876,15 +2891,16 @@ abstract class GlmDataAbstract WHERE $idField = $id; "; - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($sql, 'DataBlock', "DataAbstract - updateEntry() query"); - } - // Now store the field data $this->wpdb->query($sql, ARRAY_A); // Get the data again for output $r['fieldData'] = $this->getEntry($id, $idField); + + } + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($r, 'DataBlock', "updateEntry() data"); } return $r; @@ -2948,6 +2964,10 @@ abstract class GlmDataAbstract } } + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($detail, 'DataBlock', "deleteEntry() data"); + } + return $detail; } diff --git a/lib/GlmDataAbstract/documentation.txt b/lib/GlmDataAbstract/documentation.txt index 88a50c9d..ead05c28 100644 --- a/lib/GlmDataAbstract/documentation.txt +++ b/lib/GlmDataAbstract/documentation.txt @@ -287,6 +287,8 @@ Field Specifications: 'minLength' Minimum length for an input field 'maxLength' Maximum length for an input field +'force_list' Always provide the picklist tables (p_static overrides) + 'p_table' Table to get related data from for pointer types 'p_field' Field to get related data from for field types @@ -322,6 +324,8 @@ Field Specifications: 'list' Required with field type 'list' - includes simple array where... array key is value for option array value is name for option + +'l_blank] Provide a blank entry for type 'list'. 'list_keytype' Type of key field (default is 'text') 'text' A Text key - expects a text field in the database diff --git a/lib/smartyTemplateSupport.php b/lib/smartyTemplateSupport.php index 1a150800..3e5c296c 100644 --- a/lib/smartyTemplateSupport.php +++ b/lib/smartyTemplateSupport.php @@ -53,17 +53,17 @@ class smartyTemplateSupport { /* * Load and instatiate Smarty Templates */ - require (GLM_MEMBERS_PLUGIN_DIR . '/lib/Smarty-3.1.21/libs/Smarty.class.php'); + require (GLM_MEMBERS_PLUGIN_PATH . '/lib/Smarty-3.1.21/libs/Smarty.class.php'); $this->template = new Smarty (); /* * Configure Smarty Templates for this site */ - $this->template->setTemplateDir ( GLM_MEMBERS_PLUGIN_DIR . '/views' ); - $this->template->setCompileDir ( GLM_MEMBERS_PLUGIN_DIR . '/misc/smarty/templates_c' ); - $this->template->setCacheDir ( GLM_MEMBERS_PLUGIN_DIR . '/misc/smarty/cache' ); - $this->template->setConfigDir ( GLM_MEMBERS_PLUGIN_DIR . '/misc/smarty/configs' ); + $this->template->setTemplateDir ( GLM_MEMBERS_PLUGIN_PATH . '/views' ); + $this->template->setCompileDir ( GLM_MEMBERS_PLUGIN_PATH . '/misc/smarty/templates_c' ); + $this->template->setCacheDir ( GLM_MEMBERS_PLUGIN_PATH . '/misc/smarty/cache' ); + $this->template->setConfigDir ( GLM_MEMBERS_PLUGIN_PATH . '/misc/smarty/configs' ); } /* diff --git a/misc/databaseScripts/create_database_V0.1.sql b/misc/databaseScripts/create_database_V0.1.sql index fe331695..e9d17f68 100644 --- a/misc/databaseScripts/create_database_V0.1.sql +++ b/misc/databaseScripts/create_database_V0.1.sql @@ -6,90 +6,141 @@ -- To permit each query below to be executed separately, -- all queries must be separated by a line with ---- -CREATE TABLE {prefix}members ( + +CREATE TABLE {prefix}accommodation_types ( id INT NOT NULL AUTO_INCREMENT, - active BOOLEAN NULL, - date_created TIMESTAMP NULL, + facility_type INT NULL, name TINYTEXT NULL, - data_records INT NULL, + descr TEXT NULL, + short_descr TINYTEXT NULL, PRIMARY KEY (id), + INDEX(facility_type), INDEX(name(20)) ); ---- -CREATE TABLE {prefix}member_type ( +CREATE TABLE {prefix}accommodations ( id INT NOT NULL AUTO_INCREMENT, + active BOOLEAN NULL, name TINYTEXT NULL, - descr TINYTEXT NULL, - PRIMARY KEY (id) + accommodation_type INT NULL, + descr TEXT NULL, + short_descr TINYTEXT NULL, + quant INT NULL, + reservation_url TINYTEXT NULL, + reservation_id TINYTEXT NULL, + year_round TINYINT(1) NULL, + ref_type INT NULL, + ref_dest INT NULL, + PRIMARY KEY (id), + INDEX(accommodation_type), + INDEX(name(20)), + INDEX(ref_type), + INDEX(ref_dest) ); ---- -CREATE TABLE {prefix}cities ( +CREATE TABLE {prefix}accounts ( id INT NOT NULL AUTO_INCREMENT, - name TINYTEXT NULL, - PRIMARY KEY (id) + member INT NULL, + payment_type INT NULL, + invoice_delivery INT NULL, + PRIMARY KEY (id), + INDEX(member) ); ---- -CREATE TABLE {prefix}regions ( +CREATE TABLE {prefix}activties ( id INT NOT NULL AUTO_INCREMENT, - active TINYINT(1) NULL, + active BOOLEAN NULL, + activity_type INT NULL, + facility INT NULL, name TINYTEXT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - PRIMARY KEY (id) + phone TINYTEXT NULL, + url TINYTEXT NULL, + notes TEXT NULL, + create_time TIMESTAMP NULL, + modify_time TIMESTAMP NULL, + ref_type INT NULL, + ref_dest INT NULL, + PRIMARY KEY (id), + INDEX(activity_type), + INDEX(name(20)), + INDEX(ref_type), + INDEX(ref_dest) ); ---- -CREATE TABLE {prefix}member_data ( +CREATE TABLE {prefix}amenities ( id INT NOT NULL AUTO_INCREMENT, - member INT NULL, - status INT NULL, - member_type INT NULL, + active TINYINT(1) NULL, + name TINYTEXT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - addr1 TINYTEXT NULL, - addr2 TINYTEXT NULL, - city INT NULL, - state INT NULL, - country INT NULL, - zip TINYTEXT NULL, - lat FLOAT NULL, - lon FLOAT NULL, - region INT NULL, - phone TINYTEXT NULL, - toll_free TINYTEXT NULL, - url TINYTEXT NULL, - logo TINYTEXT NULL, - cc_type INT NULL, - join_date DATE NULL, - notes TEXT NULL, - create_time TIMESTAMP NULL, - modify_time TIMESTAMP NULL, + facility_type INT NULL, + uses_value BOOLEAN NULL, PRIMARY KEY (id), - INDEX(status), - INDEX(city), - INDEX(zip(10)), - INDEX(lat), - INDEX(lon), - INDEX(region) + INDEX(name(20)) ); ---- -CREATE TABLE {prefix}locations ( +CREATE TABLE {prefix}amenity_ref ( + id INT NOT NULL AUTO_INCREMENT, + amenity INT NULL, + ref_type INT NULL, + ref_dest INT NULL, + amenity_value TINYTEXT NULL, + PRIMARY KEY (id), + INDEX(ref_type), + INDEX(ref_dest) +); + +---- + +CREATE TABLE {prefix}categories ( id INT NOT NULL AUTO_INCREMENT, - active BOOLEAN NULL, - location_type INT NULL, - member INT NULL, name TINYTEXT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, + parent INT NULL, + PRIMARY KEY (id) +); + +---- + +CREATE TABLE {prefix}category_member ( + id INT NOT NULL AUTO_INCREMENT, + category INT NULL, + member INT NULL, + PRIMARY KEY (id), + INDEX(category), + INDEX(member) +); + +---- + +CREATE TABLE {prefix}cities ( + id INT NOT NULL AUTO_INCREMENT, + name TINYTEXT NULL, + PRIMARY KEY (id) +); + +---- + +CREATE TABLE {prefix}contacts ( + id INT NOT NULL AUTO_INCREMENT, + active BOOLEAN NULL, + fname TINYTEXT NULL, + lname TINYTEXT NULL, + contact_type INT NULL, + org TINYTEXT NULL, addr1 TINYTEXT NULL, addr2 TINYTEXT NULL, city INT NULL, @@ -98,21 +149,29 @@ CREATE TABLE {prefix}locations ( zip TINYTEXT NULL, lat FLOAT NULL, lon FLOAT NULL, - region INT NULL, - phone TINYTEXT NULL, - toll_free TINYTEXT NULL, url TINYTEXT NULL, - logo TINYTEXT NULL, + office_phone TINYTEXT NULL, + home_phone TINYTEXT NULL, + mobile_phone TINYTEXT NULL, + alt_phone TINYTEXT NULL, + fax TINYTEXT NULL, + email TINYTEXT NULL, + alt_email TINYTEXT NULL, + password TINYTEXT NULL, + permissions TINYTEXT NULL, notes TEXT NULL, create_time TIMESTAMP NULL, modify_time TIMESTAMP NULL, + ref_type INT NULL, + ref_dest INT NULL, PRIMARY KEY (id), - INDEX(name(20)), + INDEX(fname(20)), + INDEX(lname(20)), INDEX(city), INDEX(zip(10)), INDEX(lat), INDEX(lon), - INDEX(region) + INDEX(email(20)) ); ---- @@ -150,59 +209,20 @@ CREATE TABLE {prefix}facilities ( ---- -CREATE TABLE {prefix}activties ( - id INT NOT NULL AUTO_INCREMENT, - active BOOLEAN NULL, - activity_type INT NULL, - facility INT NULL, - name TINYTEXT NULL, - descr TEXT NULL, - short_descr TINYTEXT NULL, - phone TINYTEXT NULL, - url TINYTEXT NULL, - notes TEXT NULL, - create_time TIMESTAMP NULL, - modify_time TIMESTAMP NULL, - ref_type INT NULL, - ref_dest INT NULL, - PRIMARY KEY (id), - INDEX(activity_type), - INDEX(name(20)), - INDEX(ref_type), - INDEX(ref_dest) -); - ----- - -CREATE TABLE {prefix}accommodation_types ( - id INT NOT NULL AUTO_INCREMENT, - facility_type INT NULL, - name TINYTEXT NULL, - descr TEXT NULL, - short_descr TINYTEXT NULL, - PRIMARY KEY (id), - INDEX(facility_type), - INDEX(name(20)) -); - ----- - -CREATE TABLE {prefix}accommodations ( +CREATE TABLE {prefix}files ( id INT NOT NULL AUTO_INCREMENT, - active BOOLEAN NULL, name TINYTEXT NULL, - accommodation_type INT NULL, + file_name TINYTEXT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - quant INT NULL, - reservation_url TINYTEXT NULL, - reservation_id TINYTEXT NULL, - year_round TINYINT(1) NULL, + size INT NULL, + pending TINYINT(1) NULL, + create_date DATE NULL, ref_type INT NULL, ref_dest INT NULL, PRIMARY KEY (id), - INDEX(accommodation_type), INDEX(name(20)), + INDEX(file_name(20)), INDEX(ref_type), INDEX(ref_dest) ); @@ -232,41 +252,56 @@ CREATE TABLE {prefix}golf ( ---- -CREATE TABLE {prefix}restaurant_types ( +CREATE TABLE {prefix}images ( id INT NOT NULL AUTO_INCREMENT, - active TINYINT(1) NULL, name TINYTEXT NULL, + file_name TINYTEXT NULL, descr TEXT NULL, - short_descr TINYTEXT NULL, + caption TINYTEXT NULL, + pending TINYINT(1) NULL, + position INT NULL, + ref_type INT NULL, + ref_dest INT NULL, PRIMARY KEY (id), - INDEX(name(20)) + INDEX(name(20)), + INDEX(file_name(20)), + INDEX(ref_type), + INDEX(ref_dest) ); ---- -CREATE TABLE {prefix}restaurants ( +CREATE TABLE {prefix}locations ( id INT NOT NULL AUTO_INCREMENT, active BOOLEAN NULL, + location_type INT NULL, + member INT NULL, name TINYTEXT NULL, - restaurant_type INT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - menu TEXT NULL, - special_menu TEXT NULL, - url TINYTEXT NULL, - reservation_url TINYTEXT NULL, + addr1 TINYTEXT NULL, + addr2 TINYTEXT NULL, + city INT NULL, + state INT NULL, + country INT NULL, + zip TINYTEXT NULL, + lat FLOAT NULL, + lon FLOAT NULL, + region INT NULL, phone TINYTEXT NULL, - hours_descr TINYTEXT NULL, - alcohol TINYINT(1) NULL, - non_smoking TINYINT(1) NULL, + toll_free TINYTEXT NULL, + url TINYTEXT NULL, + logo TINYTEXT NULL, notes TEXT NULL, - ref_type INT NULL, - ref_dest INT NULL, + create_time TIMESTAMP NULL, + modify_time TIMESTAMP NULL, PRIMARY KEY (id), - INDEX(restaurant_type), INDEX(name(20)), - INDEX(ref_type), - INDEX(ref_dest) + INDEX(city), + INDEX(zip(10)), + INDEX(lat), + INDEX(lon), + INDEX(region) ); ---- @@ -327,13 +362,25 @@ CREATE TABLE {prefix}meals ( ---- -CREATE TABLE {prefix}contacts ( +CREATE TABLE {prefix}members ( id INT NOT NULL AUTO_INCREMENT, - active BOOLEAN NULL, - fname TINYTEXT NULL, - lname TINYTEXT NULL, - contact_type INT NULL, - org TINYTEXT NULL, + access INT NULL, + member_type INT NULL, + created DATE NULL, + name TINYTEXT NULL, + PRIMARY KEY (id), + INDEX(name(20)), + INDEX(created) +); + +---- + +CREATE TABLE {prefix}member_info ( + id INT NOT NULL AUTO_INCREMENT, + member INT NULL, + status INT NULL, + descr TEXT NULL, + short_descr TINYTEXT NULL, addr1 TINYTEXT NULL, addr2 TINYTEXT NULL, city INT NULL, @@ -342,47 +389,36 @@ CREATE TABLE {prefix}contacts ( zip TINYTEXT NULL, lat FLOAT NULL, lon FLOAT NULL, + region INT NULL, + phone TINYTEXT NULL, + toll_free TINYTEXT NULL, url TINYTEXT NULL, - office_phone TINYTEXT NULL, - home_phone TINYTEXT NULL, - mobile_phone TINYTEXT NULL, - alt_phone TINYTEXT NULL, - fax TINYTEXT NULL, - email TINYTEXT NULL, - alt_email TINYTEXT NULL, - password TINYTEXT NULL, - permissions TINYTEXT NULL, + logo TINYTEXT NULL, + cc_type INT NULL, notes TEXT NULL, create_time TIMESTAMP NULL, modify_time TIMESTAMP NULL, - ref_type INT NULL, - ref_dest INT NULL, PRIMARY KEY (id), - INDEX(fname(20)), - INDEX(lname(20)), + INDEX(status), INDEX(city), INDEX(zip(10)), INDEX(lat), INDEX(lon), - INDEX(email(20)) + INDEX(region) ); ---- -CREATE TABLE {prefix}amenities ( +CREATE TABLE {prefix}member_type ( id INT NOT NULL AUTO_INCREMENT, - active TINYINT(1) NULL, name TINYTEXT NULL, - descr TEXT NULL, - short_descr TINYTEXT NULL, - facility_type INT NULL, - PRIMARY KEY (id), - INDEX(name(20)) + descr TINYTEXT NULL, + PRIMARY KEY (id) ); ---- -CREATE TABLE {prefix}social_media ( +CREATE TABLE {prefix}regions ( id INT NOT NULL AUTO_INCREMENT, name TINYTEXT NULL, descr TEXT NULL, @@ -392,101 +428,63 @@ CREATE TABLE {prefix}social_media ( ---- -CREATE TABLE {prefix}social_media_ref ( - id INT NOT NULL AUTO_INCREMENT, - ref_type INT NULL, - ref_dest INT NULL, - social_media INT NULL, - url TINYTEXT NULL, - PRIMARY KEY (id), - INDEX(ref_type), - INDEX(ref_dest), - INDEX(social_media) -); - ----- - -CREATE TABLE {prefix}amenity_ref ( - id INT NOT NULL AUTO_INCREMENT, - amenity INT NULL, - ref_type INT NULL, - ref_dest INT NULL, - PRIMARY KEY (id), - INDEX(ref_type), - INDEX(ref_dest) -); - ----- - -CREATE TABLE {prefix}accounts ( +CREATE TABLE {prefix}restaurant_types ( id INT NOT NULL AUTO_INCREMENT, - member INT NULL, - payment_type INT NULL, - invoice_delivery INT NULL, + active TINYINT(1) NULL, + name TINYTEXT NULL, + descr TEXT NULL, + short_descr TINYTEXT NULL, PRIMARY KEY (id), - INDEX(member) + INDEX(name(20)) ); ---- -CREATE TABLE {prefix}categories ( +CREATE TABLE {prefix}restaurants ( id INT NOT NULL AUTO_INCREMENT, + active BOOLEAN NULL, name TINYTEXT NULL, + restaurant_type INT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - parent INT NULL, - PRIMARY KEY (id) -); - ----- - -CREATE TABLE {prefix}category_member ( - id INT NOT NULL AUTO_INCREMENT, - category INT NULL, - main_category INT NULL, + menu TEXT NULL, + special_menu TEXT NULL, + url TINYTEXT NULL, + reservation_url TINYTEXT NULL, + phone TINYTEXT NULL, + hours_descr TINYTEXT NULL, + alcohol TINYINT(1) NULL, + non_smoking TINYINT(1) NULL, + notes TEXT NULL, ref_type INT NULL, ref_dest INT NULL, PRIMARY KEY (id), - INDEX(category), + INDEX(restaurant_type), + INDEX(name(20)), INDEX(ref_type), INDEX(ref_dest) ); ---- -CREATE TABLE {prefix}files ( +CREATE TABLE {prefix}social_media ( id INT NOT NULL AUTO_INCREMENT, name TINYTEXT NULL, - file_name TINYTEXT NULL, descr TEXT NULL, short_descr TINYTEXT NULL, - size INT NULL, - pending TINYINT(1) NULL, - create_date DATE NULL, - ref_type INT NULL, - ref_dest INT NULL, - PRIMARY KEY (id), - INDEX(name(20)), - INDEX(file_name(20)), - INDEX(ref_type), - INDEX(ref_dest) + PRIMARY KEY (id) ); ---- -CREATE TABLE {prefix}images ( +CREATE TABLE {prefix}social_media_ref ( id INT NOT NULL AUTO_INCREMENT, - name TINYTEXT NULL, - file_name TINYTEXT NULL, - descr TEXT NULL, - caption TINYTEXT NULL, - pending TINYINT(1) NULL, - position INT NULL, ref_type INT NULL, ref_dest INT NULL, + social_media INT NULL, + url TINYTEXT NULL, PRIMARY KEY (id), - INDEX(name(20)), - INDEX(file_name(20)), INDEX(ref_type), - INDEX(ref_dest) + INDEX(ref_dest), + INDEX(social_media) ); diff --git a/misc/databaseScripts/drop_database_V0.1.sql b/misc/databaseScripts/drop_database_V0.1.sql index eee1b69e..5fca8a39 100644 --- a/misc/databaseScripts/drop_database_V0.1.sql +++ b/misc/databaseScripts/drop_database_V0.1.sql @@ -4,26 +4,29 @@ -- Database Deletion Script DROP TABLE - {prefix}members, - {prefix}member_type, - {prefix}locations, - {prefix}facilities, - {prefix}activties, + {prefix}accommodation_types, {prefix}accommodations, + {prefix}accounts, + {prefix}activties, + {prefix}amenities, + {prefix}amenity_ref, + {prefix}categories, + {prefix}category_member, + {prefix}cities, + {prefix}contacts, + {prefix}facilities, + {prefix}files, {prefix}golf, - {prefix}restaurants, + {prefix}images, + {prefix}locations, {prefix}meals, - {prefix}contacts, - {prefix}accounts, - {prefix}amenities, - {prefix}amenity_member, - {prefix}categories, - {prefix}category_member, - {prefix}files, - {prefix}images, - {prefix}regions, - {prefix}social_media, - {prefix}social_media_member, - {prefix}cities + {prefix}members, + {prefix}member_info, + {prefix}member_type, + {prefix}regions, + {prefix}restaurant_types, + {prefix}restaurants, + {prefix}social_media, + {prefix}social_media_ref ; diff --git a/misc/documentation/Plugin_Directory_Structure.odg b/misc/documentation/Plugin_Directory_Structure.odg new file mode 100755 index 0000000000000000000000000000000000000000..30ee3ecd985781a1db28157ce40d207be233fa7b GIT binary patch literal 34990 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

*U+pY{qSv9)JS654YA9frPsG$0bi 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 V4e(}V11S>#LNnlOUs4N*2LM4xB)I?p literal 0 HcmV?d00001 diff --git a/misc/documentation/Plugin_program_flow.odg b/misc/documentation/Plugin_program_flow.odg new file mode 100755 index 0000000000000000000000000000000000000000..8760dbaee066588ee2e8dd28206dd9ac4ce2e55c GIT binary patch literal 18642 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 literal 0 HcmV?d00001 diff --git a/misc/smarty/templates_c/081a36d97cdf30d438a1e104c26a275acc180da0.file.index.html.php b/misc/smarty/templates_c/081a36d97cdf30d438a1e104c26a275acc180da0.file.index.html.php index 71330b67..dc3e86bf 100644 --- a/misc/smarty/templates_c/081a36d97cdf30d438a1e104c26a275acc180da0.file.index.html.php +++ b/misc/smarty/templates_c/081a36d97cdf30d438a1e104c26a275acc180da0.file.index.html.php @@ -1,4 +1,4 @@ - decodeProperties(array ( @@ -7,7 +7,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( '081a36d97cdf30d438a1e104c26a275acc180da0' => array ( 0 => '/var/www/server/wordpress/wp-content/plugins/glm-member-db/views/admin/members/index.html', - 1 => 1421691086, + 1 => 1423101141, 2 => 'file', ), ), @@ -15,33 +15,71 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'function' => array ( ), + 'version' => 'Smarty-3.1.21-dev', + 'unifunc' => 'content_54c05ab60bb1c1_03470573', 'variables' => array ( - 'numbMembers' => 0, + 'haveMemberTypes' => 0, 'thisURL' => 0, + 'haveCategories' => 0, + 'haveRegions' => 0, + 'haveAccommodationTypes' => 0, + 'numbMembers' => 0, + 'membersPending' => 0, ), 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.21-dev', - 'unifunc' => 'content_54c05ab60bb1c1_03470573', ),false); /*/%%SmartyHeaderCode%%*/?> getSubTemplate ('admin/members/header.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?>

Members Dashboard

+ +tpl_vars['haveMemberTypes']->value) {?> + + + + + +tpl_vars['haveCategories']->value) {?> + + + + + +tpl_vars['haveRegions']->value) {?> + + + + + +tpl_vars['haveAccommodationTypes']->value) {?> + + + + +tpl_vars['numbMembers']->value==0) {?> -

- You do not currently have any members listed. - Click here to create your first member. -

+ + + + +
You do not have any Member Types setup.Click here to add Member Types.
You do not have any Member Categories setup.Click here to add Member Categories.
You do not have any Regions setup.Click here to add Regions.
You do not have any AccommodationTypes setup.Click here to add AccommodationTypes.
You do not have any members listed.Click here to create your first member.
- +
+ tpl_vars['membersPending']->value) {?> class="glm-notice">Member Pending Data:
Number of Members Listed: tpl_vars['numbMembers']->value;?> +
tpl_vars['membersPending']->value;?>
getSubTemplate ('admin/footer.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> + diff --git a/misc/smarty/templates_c/15f83071407dddb0b3c23ae1a70b66cefbd681db.file.header.html.php b/misc/smarty/templates_c/15f83071407dddb0b3c23ae1a70b66cefbd681db.file.header.html.php index a080e005..a350316d 100644 --- a/misc/smarty/templates_c/15f83071407dddb0b3c23ae1a70b66cefbd681db.file.header.html.php +++ b/misc/smarty/templates_c/15f83071407dddb0b3c23ae1a70b66cefbd681db.file.header.html.php @@ -1,4 +1,4 @@ - decodeProperties(array ( @@ -7,7 +7,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( '15f83071407dddb0b3c23ae1a70b66cefbd681db' => array ( 0 => '/var/www/server/wordpress/wp-content/plugins/glm-member-db/views/admin/members/header.html', - 1 => 1421691086, + 1 => 1422653383, 2 => 'file', ), ), @@ -15,6 +15,8 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'function' => array ( ), + 'version' => 'Smarty-3.1.21-dev', + 'unifunc' => 'content_54c05ab60d1510_45219092', 'variables' => array ( 'thisURL' => 0, @@ -22,8 +24,6 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'thisAction' => 0, ), 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.21-dev', - 'unifunc' => 'content_54c05ab60d1510_45219092', ),false); /*/%%SmartyHeaderCode%%*/?>

Your Members

@@ -36,7 +36,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( &glm_action=list" class="nav-tabtpl_vars['thisAction']->value=='list') {?>-active">List of Members Reports +&glm_action=index" class="nav-tabtpl_vars['thisAction']->value=='add') {?>-active disabled">Reports Or Something - perahps mailing stuff? diff --git a/misc/smarty/templates_c/1be35689c5d30d774f40ebc45e387f5f95c45e90.file.index.html.php b/misc/smarty/templates_c/1be35689c5d30d774f40ebc45e387f5f95c45e90.file.index.html.php index 1294cac9..db2f3d79 100644 --- a/misc/smarty/templates_c/1be35689c5d30d774f40ebc45e387f5f95c45e90.file.index.html.php +++ b/misc/smarty/templates_c/1be35689c5d30d774f40ebc45e387f5f95c45e90.file.index.html.php @@ -1,4 +1,4 @@ - decodeProperties(array ( @@ -7,7 +7,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( '1be35689c5d30d774f40ebc45e387f5f95c45e90' => array ( 0 => '/var/www/server/wordpress/wp-content/plugins/glm-member-db/views/admin/member/index.html', - 1 => 1421905148, + 1 => 1423239729, 2 => 'file', ), ), @@ -19,10 +19,17 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'unifunc' => 'content_54c05abfc64731_62067320', 'variables' => array ( - 'deleted' => 0, + 'haveMemberTypes' => 0, + 'updated' => 0, + 'haveMember' => 0, 'member' => 0, 'thisURL' => 0, 'thisPage' => 0, + 'v' => 0, + 'haveInfoRecords' => 0, + 'memberInfoRecords' => 0, + 'i' => 0, + 'm' => 0, 'memberID' => 0, ), 'has_nocache_code' => false, @@ -30,66 +37,146 @@ $_valid = $_smarty_tpl->decodeProperties(array ( getSubTemplate ('admin/member/header.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> - tpl_vars['deleted']->value) {?> -
Delete this Member
-
-
-

Are you sure you want to delete this member?

-

Yes, delete this member

-

No, I don't want to delete this member

-
-
- - -

tpl_vars['member']->value['name'];?> -

+tpl_vars['haveMemberTypes']->value) {?> -

- - - - - tpl_vars['member']->value['status']['name']=='Pending Review') {?> class="glm-notice"tpl_vars['member']->value['status']['name']=='Active') {?> class="glm-active"> - tpl_vars['member']->value['status']['name'];?> + tpl_vars['updated']->value) {?> +

Record Updated

+ - -
- - - - + - }); - -> - getSubTemplate ('admin/footer.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> diff --git a/misc/smarty/templates_c/25c8610e0e0bacafec3046a296066e9f8eceedae.file.member.html.php b/misc/smarty/templates_c/25c8610e0e0bacafec3046a296066e9f8eceedae.file.member.html.php index 2adf0055..de7c21c3 100644 --- a/misc/smarty/templates_c/25c8610e0e0bacafec3046a296066e9f8eceedae.file.member.html.php +++ b/misc/smarty/templates_c/25c8610e0e0bacafec3046a296066e9f8eceedae.file.member.html.php @@ -1,4 +1,4 @@ -decodeProperties(array ( @@ -7,7 +7,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( '25c8610e0e0bacafec3046a296066e9f8eceedae' => array ( 0 => '/var/www/server/wordpress/wp-content/plugins/glm-member-db/views/admin/member/member.html', - 1 => 1421872896, + 1 => 1422350538, 2 => 'file', ), ), @@ -15,6 +15,8 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'function' => array ( ), + 'version' => 'Smarty-3.1.21-dev', + 'unifunc' => 'content_54c05ab4009233_84144294', 'variables' => array ( 'haveMember' => 0, @@ -24,12 +26,12 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'v' => 0, ), 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.21-dev', - 'unifunc' => 'content_54c05ab4009233_84144294', ),false); /*/%%SmartyHeaderCode%%*/?> getSubTemplate ('admin/member/header.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> +

Note: Members will not have access to this tab.

+ tpl_vars['haveMember']->value) {?>

Edit Member

@@ -48,7 +50,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( -
Status
Member Name:tpl_vars['member']->value['name'];?> -
Type:tpl_vars['member']->value['member_type'];?> -
Description:tpl_vars['member']->value['descr'];?> -
Short Description:tpl_vars['member']->value['short_descr'];?> +

+ tpl_vars['haveMember']->value) {?> + tpl_vars['member']->value['fieldData']['name'];?> + + + Add New Member + +

+ + +
+ + tpl_vars['haveMember']->value) {?> + + + + + + + + + + + + + + + + + + + + + + tpl_vars['haveMember']->value) {?> + + + +
tpl_vars['member']->value['fieldRequired']['name']) {?>class="glm-required">Member Name:tpl_vars['member']->value['fieldFail']['name']) {?>class="glm-form-bad-input"> + + tpl_vars['member']->value['fieldFail']['name']) {?>

tpl_vars['member']->value['fieldFail']['name'];?> +

+
tpl_vars['member']->value['fieldRequired']['access']) {?>class="glm-required">Access:tpl_vars['member']->value['fieldFail']['access']) {?>class="glm-form-bad-input"> + + tpl_vars['member']->value['fieldFail']['access']) {?>

tpl_vars['member']->value['fieldFail']['access'];?> +

+
tpl_vars['member']->value['fieldRequired']['member_type']) {?>class="glm-required">Member Type:tpl_vars['member']->value['fieldFail']['member_type']) {?>class="glm-form-bad-input"> + + tpl_vars['member']->value['fieldFail']['member_type']) {?>

tpl_vars['member']->value['fieldFail']['member_type'];?> +

+
Date created:tpl_vars['member']->value['fieldData']['created']['date'];?>
+

* Required

+ tpl_vars['haveMember']->value) {?> + + + + +
+ + tpl_vars['haveMember']->value) {?> + tpl_vars['haveInfoRecords']->value) {?> +

Member Information Versions

+ + + + + + + + + + tpl_vars["i"] = new Smarty_variable("0", null, 0);?> + tpl_vars['m'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['m']->_loop = false; + $_from = $_smarty_tpl->tpl_vars['memberInfoRecords']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} +foreach ($_from as $_smarty_tpl->tpl_vars['m']->key => $_smarty_tpl->tpl_vars['m']->value) { +$_smarty_tpl->tpl_vars['m']->_loop = true; +?> + tpl_vars['i']->value++ / 1)) {?> + + + + + + + + + +
Access:CreatedLast Update
tpl_vars['m']->value['status']['name'];?> +tpl_vars['m']->value['create_time']['time'];?> +tpl_vars['m']->value['modify_time']['time'];?> +
- - - type="text/javascript"> - jQuery(document).ready(function($) { - $("#deleteMemberDialog").dialog({ - autoOpen: false, - minWidth: 400, - dialogClass: "glm-dialog-no-close" - }); - $('#deleteMemberButton').click( function() { - $("#deleteMemberDialog").dialog("open"); - }); - $('#deleteMemberConfirm').click( function() { - $("#deleteMemberDialog").dialog("close"); - window.location.href = "tpl_vars['thisURL']->value;?> + +

You do not yet have any member information entered.

+

tpl_vars['memberID']->value;?> +">Click here too start entering information for this member.

+ + + + +

You do not have any Member Types setup.

+

You must have at least one Member Type to add a new member.

+
Click here to add Member Types.
+
- +
tpl_vars['member']->value['fieldRequired']['name']) {?>class="glm-required">Member Name: tpl_vars['member']->value['fieldFail']['name']) {?>class="glm-form-bad-input"> @@ -59,7 +61,7 @@ $_valid = $_smarty_tpl->decodeProperties(array (
Active:Status: tpl_vars['filterStatus']->value) {?> checked>Pending + Search + +

List of Members

+ - + + @@ -53,19 +66,27 @@ $_smarty_tpl->tpl_vars['m']->_loop = true; + + @@ -76,6 +97,37 @@ $_smarty_tpl->tpl_vars['m']->_loop = true;
Access Member NameTypeMember TypeDate Created  
+ tpl_vars['m']->value['access']['name'];?> + + tpl_vars['m']->value['name'];?> - tpl_vars['m']->value['member_type'];?> + tpl_vars['m']->value['member_type']['name'];?> + + + tpl_vars['m']->value['created']['date'];?> Manage
+ + type="text/javascript"> + jQuery(document).ready(function($) { + + // Filter triggers + $(".listFilter" ).change( function() { + + var filter = ''; + + // Check for pending data filter + if ($("#filterPending").attr('checked')) { + filter += '&filterPending=true'; + } + + // Check for member name filter + var filterName = $("#filterName").val(); + if (filterName != '') { + filter += '&filterName=' + encodeURIComponent(filterName).replace(/%20/g,'+'); + } + + window.location.href = "tpl_vars['thisURL']->value;?> +?page=tpl_vars['thisPage']->value;?> +&glm_action=list" + filter; + + return false; + }); + }); + +> + + getSubTemplate ('admin/footer.html', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> diff --git a/misc/smarty/templates_c/c74bd17240f8892f8955e8bedbedd434341aeca9.file.header.html.php b/misc/smarty/templates_c/c74bd17240f8892f8955e8bedbedd434341aeca9.file.header.html.php index a008c478..e9232294 100644 --- a/misc/smarty/templates_c/c74bd17240f8892f8955e8bedbedd434341aeca9.file.header.html.php +++ b/misc/smarty/templates_c/c74bd17240f8892f8955e8bedbedd434341aeca9.file.header.html.php @@ -1,4 +1,4 @@ - decodeProperties(array ( @@ -7,7 +7,7 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'c74bd17240f8892f8955e8bedbedd434341aeca9' => array ( 0 => '/var/www/server/wordpress/wp-content/plugins/glm-member-db/views/admin/member/header.html', - 1 => 1421691086, + 1 => 1422815090, 2 => 'file', ), ), @@ -15,6 +15,8 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'function' => array ( ), + 'version' => 'Smarty-3.1.21-dev', + 'unifunc' => 'content_54c05ab4030650_34922061', 'variables' => array ( 'thisURL' => 0, @@ -22,40 +24,39 @@ $_valid = $_smarty_tpl->decodeProperties(array ( 'memberID' => 0, 'thisAction' => 0, 'haveMember' => 0, + 'haveMemberInfo' => 0, ), 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.21-dev', - 'unifunc' => 'content_54c05ab4030650_34922061', ),false); /*/%%SmartyHeaderCode%%*/?>
-

Member Information

+

Member Data

diff --git a/models/admin/configure/accommodationTypes.php b/models/admin/configure/accommodationTypes.php index 044382b7..6f0a1604 100644 --- a/models/admin/configure/accommodationTypes.php +++ b/models/admin/configure/accommodationTypes.php @@ -14,7 +14,7 @@ */ // Load Member Types data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataAccommodationTypes.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataAccommodationTypes.php'); /* * This class performs the work for the default action of the "Members" menu @@ -177,7 +177,7 @@ class GlmMembersAdmin_configure_accommodationTypes extends GlmDataAccommodationT // Compile template data $templateData = array( - 'haveRegions' => $haveAccommodationTypes, + 'haveAccommodationTypes' => $haveAccommodationTypes, 'accommodationTypes' => $accommodationTypes ); diff --git a/models/admin/configure/amenities.php b/models/admin/configure/amenities.php new file mode 100644 index 00000000..6d1feb25 --- /dev/null +++ b/models/admin/configure/amenities.php @@ -0,0 +1,203 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +// Load Amenities data abstract +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataAmenities.php'); + +/* + * This class performs the work for the default action of the "Members" menu + * option, which is to display the members dashboard. + * + */ +class GlmMembersAdmin_configure_amenities extends GlmDataAmenities +{ + + /** + * 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($this->wpdb, $this->config); + + } + + /* + * 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 ($redirectData = false) + { + + $success = true; + $haveAmenities = false; + $amenities = false; + $error = false; + + $newAmenity = $this->newEntry(); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($newAmenity, 'DataBlock', 'New Amenity Data'); + } + + if (isset($_REQUEST['option']) && $_REQUEST['option'] == 'addNew') { + + $amenities = $this->insertEntry(); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('  New Entry Added ', 'Process'); + } + } + + if (isset($_REQUEST['option']) && $_REQUEST['option'] == 'delete' && isset($_REQUEST['amenityID'])) { + + $id = $_REQUEST['amenityID']-0; + if ($id > 0) { + $this->deleteEntry($id, true); + } + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('  Entry Deleted: id = '.$id, 'Process'); + } + + } + + // Check if a amenity ID is supplied + if (isset($_REQUEST['amenity_id'])) { + // Make sure it's a number + $amenityID = $_REQUEST['amenity_id']-0; + } + + // Check for action option + $option = false; + if (isset($_REQUEST['option']) && trim($_REQUEST['option']) != '') { + $option = $_REQUEST['option']; + } + + // Get a current list of amenities + $amenities = $this->getList(); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($amenities, 'DataBlock', 'Amenities Data'); + } + + // If we have list entries - even if it's an empty list + $success = true; + $haveAmenities = false; + if ($amenities !== false) { + + $success = true; + + // If we have any entries + if (count($amenities) > 0) { + $haveAmenities = true; + } + } + + // If we had a fatal error, redirect to the error page + if ($error) { + return array( + 'status' => $success, + 'menuItemRedirect' => 'error', + 'modelRedirect' => 'index', + 'view' => 'admin/error/index.html', + 'data' => false + ); + } + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($amenities, 'DataBlock', 'Amenities Data'); + } + + // Compile template data + $templateData = array( + 'haveAmenities' => $haveAmenities, + 'amenities' => $amenities, + 'newAmenity' => $newAmenity + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => $success, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/configure/amenities.html', + 'data' => $templateData + ); + + } + + +} + +?> \ No newline at end of file diff --git a/models/admin/configure/categories.php b/models/admin/configure/categories.php index a7558762..ac41d3a2 100644 --- a/models/admin/configure/categories.php +++ b/models/admin/configure/categories.php @@ -14,7 +14,7 @@ */ // Load Member Types data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataCategories.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataCategories.php'); /* * This class performs the work for the default action of the "Members" menu @@ -172,6 +172,9 @@ class GlmMembersAdmin_configure_categories extends GlmDataCategories ); } + // Sort results by higherarchy (Parent/Child and Alpha) + $categories = glmMembersAdmin::sortParentChild($categories); + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { glmMembersAdmin::addNotice($categories, 'DataBlock', 'Categories Data'); } diff --git a/models/admin/configure/cities.php b/models/admin/configure/cities.php index 2f78a428..ae35ea4c 100644 --- a/models/admin/configure/cities.php +++ b/models/admin/configure/cities.php @@ -14,7 +14,7 @@ */ // Load Member Types data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataCities.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataCities.php'); /* * This class performs the work for the default action of the "Members" menu diff --git a/models/admin/configure/development.php b/models/admin/configure/development.php new file mode 100644 index 00000000..6f518312 --- /dev/null +++ b/models/admin/configure/development.php @@ -0,0 +1,222 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +/* + * This class performs the work for the default action of the "Members" menu + * option, which is to display the members dashboard. + * + */ +class GlmMembersAdmin_configure_development +{ + + /** + * 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; + + } + + /* + * 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 ($redirectData = false) + { + + // Get current database version + $dbVersion = GLM_MEMBERS_PLUGIN_DB_VERSION; + settype($dbVersion, 'string'); + + $resultMessage = ''; + + // Load database activation class to get access to database version information + require_once (GLM_MEMBERS_PLUGIN_PATH . '/activate.php'); + $activate = new glmMembersPluginActivate($this->wpdb, $this->config, true); + + $option = ''; + if (isset($_REQUEST['option']) && $_REQUEST['option'] != '') { + $option = $_REQUEST['option']; + } + + switch($option) { + + case 'drop': + case 'reset': + + // Read in Database deletion script - assumes the current db version. + $sqlFile = GLM_MEMBERS_PLUGIN_DB_SCRIPTS.'/drop_database_V'.$dbVersion.'.sql'; + $sql = file_get_contents($sqlFile); + + // Replace {prefix} with table name prefix + $sql = str_replace('{prefix}', GLM_MEMBERS_PLUGIN_DB_PREFIX, $sql); + + // Removing the tables using the script + $this->wpdb->query($sql); + + $resultMessage .= 'Database deleted
'; + + if ($option != 'reset') { + break; + } + + case 'create': + + // Read in Database creation script + $sqlFile = GLM_MEMBERS_PLUGIN_DB_SCRIPTS.'/create_database_V'.$dbVersion.'.sql'; + $sql = file_get_contents($sqlFile); + + // Replace {prefix} with table name prefix + $sql = str_replace('{prefix}', GLM_MEMBERS_PLUGIN_DB_PREFIX, $sql); + + // Split script into separate queries by looking for lines with only "---" + $queries = preg_split('/^----$/m', $sql); + + // Try executing all queries to build database + do { + $q = current($queries); + $this->wpdb->query($q); + $queryError = $this->wpdb->last_error; + } while ($queryError == '' && next($queries)); + + // If there were no errors + if (trim($queryError) == '') { + + // Notify the user that the database has been installed + $resultMessage .= 'New database tables installed for the '.GLM_MEMBERS_PLUGIN_NAME.' plugin.
'; + + // Save the version of the installed database + update_option('glmMembersDatabaseDbVersion', $dbVersion); + + + } else { + $resultMessage .= 'Failure installing database tables for the '.GLM_MEMBERS_PLUGIN_NAME.' plugin.
'; + $resultMessage .= 'Database Installation Error:
'; + } + + break; + + case 'list': + + // Check if the database version set for this plugin is invalid. + if (!isset($activate->dbVersions[$dbVersion])) { + $resultMessage .= "The last database version set for the ".GLM_MEMBERS_PLUGIN_NAME." (V$dbVersion) isn't valid.
"; + break; + } + + // Get the number of tables for this plugin database version that should exist. + $tables = $activate->dbVersions[$dbVersion]['tables']; + + // Get the number of tables for this plugin that do currently exist. + $existingTables = $this->wpdb->get_results(" + SELECT table_name + FROM information_schema.tables + WHERE table_name like '".GLM_MEMBERS_PLUGIN_DB_PREFIX."%'; + ", ARRAY_A); + + if (is_array($existingTables)) { + $resultMessage .= 'Current database tables
    '; + foreach($existingTables as $t){ + $resultMessage .= "
  • ".$t['table_name'].'

  • '; + } + $resultMessage .= '
'; + } else { + $resultMessage .= 'No tables currently exist
'; + } + + break; + + default: + + break; + + } + + + $templateData = array( + 'resultMessage' => $resultMessage + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => true, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/configure/development.html', + 'data' => $templateData + ); + + } + +} + +?> \ No newline at end of file diff --git a/models/admin/configure/memberTypes.php b/models/admin/configure/memberTypes.php index 6b314b44..1d76f086 100644 --- a/models/admin/configure/memberTypes.php +++ b/models/admin/configure/memberTypes.php @@ -14,7 +14,7 @@ */ // Load Member Types data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataMemberTypes.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberTypes.php'); /* * This class performs the work for the default action of the "Members" menu diff --git a/models/admin/configure/regions.php b/models/admin/configure/regions.php index 0ed12574..b10264a1 100644 --- a/models/admin/configure/regions.php +++ b/models/admin/configure/regions.php @@ -14,7 +14,7 @@ */ // Load Member Types data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataRegions.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataRegions.php'); /* * This class performs the work for the default action of the "Members" menu diff --git a/models/admin/member/index.php b/models/admin/member/index.php index 3b50ef70..116f0141 100644 --- a/models/admin/member/index.php +++ b/models/admin/member/index.php @@ -14,7 +14,7 @@ */ // Load Members data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataMembers.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMembers.php'); /* * This class performs the work for the default action of the "Members" menu @@ -103,68 +103,117 @@ class GlmMembersAdmin_member_index extends GlmDataMembers $haveMember = false; $memberData = false; $memberID = 0; - $deleted = false; + $archived = false; + $updated = false; + $haveMemberInfo = false; + + // Check for required Member Types + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberTypes.php'); + $MemberTypes = new GlmDataMemberTypes($this->wpdb, $this->config); + $memberTypesStats = $MemberTypes->getStats(); + $haveMemberTypes = ($memberTypesStats > 0); // Check if a redirecting model supplied the member ID if (isset($redirectData['memberID'])) { $memberID = $redirectData['memberID']; - // Otherwise check if one was supplied by the user - } elseif (isset($_REQUEST['member_id'])) { + // Otherwise check if one was supplied by the user or passed from somewhere else + } elseif (isset($_REQUEST['id'])) { // Make sure it's a number - $memberID = $_REQUEST['member_id']-0; + $memberID = $_REQUEST['id']-0; + } elseif (isset($_REQUEST['member'])) { + $memberID = $_REQUEST['member']-0; } - // If we don't have a member ID, assume this is to add a member and go do that + // If we don't have a member ID, setup to add a new member if ($memberID <= 0) { - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { - glmMembersAdmin::addNotice('  No member ID supplied.', 'Process'); + // If this is a new member submission + if (isset($_REQUEST['option']) && $_REQUEST['option'] == 'addNew') { + + // Attempt to add the new member + $memberData = $this->insertEntry(); + if($memberData['status']) { + $memberID = $memberData['fieldData']['id']; + $haveMember = true; + } + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('  Added new member: ID = '.$memberID, 'Process'); + glmMembersAdmin::addNotice($memberData, 'DataBlock', 'Member Data'); + } + + + // Otherwise setup to get new mmember data + } else { + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('  No member ID supplied.', 'Process'); + } + + // Setup to add a new member + $memberData = $this->newEntry(); } - return array( - 'status' => $success, - 'menuItemRedirect' => false, - 'modelRedirect' => 'member', - 'view' => 'admin/member/member.html', - 'data' => array( - 'haveMember' => false, - ) - ); - } + // Otherwise if this is a member update + } elseif (isset($_REQUEST['option']) && $_REQUEST['option'] == 'submit') { - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { - glmMembersAdmin::addNotice("  Member ID specified: $memberID", 'Process'); - } + $memberData = $this->updateEntry($memberID); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  Member Update: $memberID", 'Process'); + } - // If a delete request has been made, try to delete the member without confirmation - if(isset($_REQUEST['option']) && $_REQUEST['option'] == 'delete') { - $memberData = $this->deleteEntry($memberID, true); - $deleted = $memberData['deleteConfirmed']; - $memberID = 0; - $haveMember = false; + // If update was successful then use editEntry() to setup for the edit again. + if ($memberData['status']) { + $memberData = $this->editEntry($memberID); + $updated = true; + } + + $haveMember = true; + // Otherwise, have a member, get the base member data } else { - // Try to get existing member data - $memberData = $this->getEntry($memberID); - } - // Check that we have data for the specified member ID - if (!$deleted && $memberData !== false) { + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  Member ID specified: $memberID", 'Process'); + } + + // Try to get existing member data + $memberData = $this->editEntry($memberID); $haveMember = true; + } if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { glmMembersAdmin::addNotice($memberData, 'DataBlock', 'Member Data'); } + // If we have a member then also get a list of member info records + $haveInfoRecords = false; + $memberInfoRecords = false; + if ($haveMember) { + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberInfo.php'); + $MemberInfo = new GlmDataMemberInfo($this->wpdb, $this->config); + $memberInfoRecords = $MemberInfo->getList($memberID); + + // Check if any members returned + if (is_array($memberInfoRecords) && count($memberInfoRecords) > 0) { + $haveInfoRecords = true; + } + } + // Compile template data $templateData = array( + 'haveMemberTypes' => $haveMemberTypes, 'haveMember' => $haveMember, 'memberID' => $memberID, 'member' => $memberData, - 'deleted' => $deleted + 'haveInfoRecords' => $haveInfoRecords, + 'memberInfoRecords' => $memberInfoRecords, + 'haveMemberInfo' => $haveMemberInfo, + 'updated' => $updated ); // Return status, suggested view, and data to controller diff --git a/models/admin/member/memberInfo.php b/models/admin/member/memberInfo.php new file mode 100644 index 00000000..fe06a9a3 --- /dev/null +++ b/models/admin/member/memberInfo.php @@ -0,0 +1,310 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +// Load Members data abstract +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberInfo.php'); + +/* + * This class performs the work for the default action of the "Members" menu + * option, which is to display the members dashboard. + * + */ +class GlmMembersAdmin_member_memberInfo extends GlmDataMemberInfo +{ + + /** + * 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($this->wpdb, $this->config); + + // Add scrips and css + add_action('glm_members_memberInfo_enqueue_scripts', + array( + $this, + 'glmMembersMemberInfoScripts' + ) + ); + + + } + + /** + * Setup inclusion of needed scripts + * + * This method is called by an add_action() hook setup in the contructor. + * + * (no prameters) + * + * @return void + * @access public + */ + public function glmMembersMemberInfoScripts () + { +/* Not working at this time + // Enqueue Geolocation Edit Script + wp_register_script('glm-members-geo-js', + GLM_MEMBERS_PLUGIN_URL . 'js/geolocation-edit/jquery.geolocation.edit.0.0.11.js', + array( + 'jquery' + ) + ); + wp_enqueue_script('glm-members-geo-js'); +*/ + } + + /* + * 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 ($redirectData = false) + { + + $success = true; + $memberID = 0; + $haveMember = false; + $memberInfoID = 0; + $haveMemberInfo = false; + $categories = false; + $haveCategories = false; + $regions = false; + $haveRegions = false; + $error = false; + + // Get sorted list of categories + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataCategories.php'); + $Categories = new GlmDataCategories($this->wpdb, $this->config); + $categories = $Categories->getList(); + if (is_array($categories) && count($categories) > 0) { + + // Sort results by higherarchy (Parent/Child and Alpha) + $categories = glmMembersAdmin::sortParentChild($categories); + $haveCategories = true; + + } + + // Check for action option + $option = false; + if (isset($_REQUEST['option']) && trim($_REQUEST['option']) != '') { + $option = $_REQUEST['option']; + } + + // Get supplied member ID + if (isset($_REQUEST['member'])) { + $memberID = $_REQUEST['member']-0; + } + + // If member ID not supplied - we shouldn't be here + if ($memberID <= 0) { + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  Member ID expected but no ID was supplied.", 'Alert'); + } + + return array( + 'status' => $success, + 'menuItemRedirect' => 'error', + 'modelRedirect' => 'index', + 'view' => 'admin/error/index.html', + 'data' => false + ); + + // Otherwise get member base data + } else { + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMembers.php'); + $Members = new GlmDataMembers($this->wpdb, $this->config); + $memberData = $Members->getEntry($memberID); + $haveMember = true; + } + + // Get member info record ID + if (isset($_REQUEST['member_info_id'])) { + $memberInfoID = $_REQUEST['member_info_id']-0; + $haveMemberInfo = true; + } + + // If no member info record, assume that we need to create the first record + if ($memberInfoID <= 0 && $option != 'addNew') { + $option = 'create'; + } + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  Option specified: $option", 'Process'); + } + + // Perform requested option + switch ($option) { + + case 'new': + + $MemberInfo = $this->newEntry(); + + break; + + case 'submit': + + if ($haveMemberInfo) { + // Update the member data + $MemberInfo = $this->updateEntry($memberID); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  No member information exists, assuming this is a new submission.", 'Process'); + } + + break; + } + + case 'addNew': + + // Insert the new member into the database + $MemberInfo = $this->insertEntry(); + + break; + + case 'create': + + $MemberInfo = $this->newEntry(); + + break; + + default: + + // Edit the existing member + $MemberInfo = $this->getEntry($memberInfoID); + + // If we have member data, say so + if (is_array($MemberInfo) && $MemberInfo['status']) { + $haveMemberInfo = true; + + // Otherwise + } else { + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice("  Specified Member Information Record ID is invalid: $memberInfoID", 'Alert'); + } + + $error = true; + + } + + break; + + + + } + + // If we had a fatal error, redirect to the error page + if ($error) { + return array( + 'status' => $success, + 'menuItemRedirect' => 'error', + 'modelRedirect' => 'index', + 'view' => 'admin/error/index.html', + 'data' => false + ); + } + + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { + glmMembersAdmin::addNotice($MemberInfo, 'DataBlock', 'Member Data'); + } + + // Compile template data + $templateData = array( + 'haveMember' => $haveMember, + 'memberID' => $memberID, + 'member' => $memberData, + 'haveMemberInfo' => $haveMemberInfo, + 'memberInfoID' => $memberInfoID, + 'memberInfo' => $MemberInfo, + 'haveCategories' => $haveCategories, + 'categories' => $categories + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => $success, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/member/memberInfo.html', + 'data' => $templateData + ); + + } + + +} + +?> \ No newline at end of file diff --git a/models/admin/members/index.php b/models/admin/members/index.php index 11295fa9..9cccabb5 100644 --- a/models/admin/members/index.php +++ b/models/admin/members/index.php @@ -14,14 +14,14 @@ */ // Load Members data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataMembers.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberInfo.php'); /* * This class performs the work for the default action of the "Members" menu * option, which is to display the members dashboard. * */ -class GlmMembersAdmin_members_index extends GlmDataMembers +class GlmMembersAdmin_members_index extends GlmDataMemberInfo { /** @@ -100,34 +100,44 @@ class GlmMembersAdmin_members_index extends GlmDataMembers { $success = true; - // Get a current list of members + // Get stats on the current list of members $stats = $this->getStats(); -/* - if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { - glmMembersAdmin::addNotice($stats, 'DataBlock', 'Member Data'); - } - - // If we have list entries - even if it's an empty list - $success = true; - $haveMembers = false; - if ($list !== false) { - - $success = true; - - // If we have any entries - if (count($list) > 0) { - $haveMembers = true; - } - } - - // Determine if current user can add, edit, delete member data - $canEdit = current_user_can('glm_members_edit'); -*/ + // Check for required Member Types + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberTypes.php'); + $MemberTypes = new GlmDataMemberTypes($this->wpdb, $this->config); + $memberTypesStats = $MemberTypes->getStats(); + $haveMemberTypes = ($memberTypesStats > 0); + + // Check for required Categories + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataCategories.php'); + $Categories = new GlmDataCategories($this->wpdb, $this->config); + $categoriesStats = $Categories->getStats(); + $haveCategories = ($categoriesStats > 0); + + // Check for required Regions + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataRegions.php'); + $Regions = new GlmDataRegions($this->wpdb, $this->config); + $regionsStats = $Regions->getStats(); + $haveRegions = ($regionsStats > 0); + + // Check for required Accommodation Types + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataAccommodationTypes.php'); + $AccommodationTypes = new GlmDataAccommodationTypes($this->wpdb, $this->config); + $accommodationTypesStats = $AccommodationTypes->getStats(); + $haveAccommodationTypes = ($accommodationTypesStats > 0); + + // Get number of members with pending updates + $membersPending = $this->getStats('status = '.$this->config['status_numb']['Pending']); // Compile template data $templateData = array( - 'numbMembers' => $stats + 'numbMembers' => $stats, + 'membersPending' => $membersPending, + 'haveMemberTypes' => $haveMemberTypes, + 'haveCategories' => $haveCategories, + 'haveRegions' => $haveRegions, + 'haveAccommodationTypes' => $haveAccommodationTypes ); // Return status, suggested view, and data to controller diff --git a/models/admin/members/list.php b/models/admin/members/list.php index 0ea9c570..51cb9ea4 100644 --- a/models/admin/members/list.php +++ b/models/admin/members/list.php @@ -14,7 +14,7 @@ */ // Load Members data abstract -require_once(GLM_MEMBERS_PLUGIN_CLASS_DIR.'/data/dataMembers.php'); +require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMembers.php'); /* * This class performs the work for the default action of the "Members" menu @@ -98,9 +98,25 @@ class GlmMembersAdmin_members_list extends GlmDataMembers */ public function modelAction ($redirectData = false) { + $where = ''; + $filterStatus = false; + $filterName = false; + $haveFilter = false; + + // Check for list filters + if (isset($_REQUEST['filterPending'])) { + $where .= 'T.status = '.$this->config['status_numb']['Pending']; + $filterStatus = true; + $haveFilter = true; + } + if (isset($_REQUEST['filterName'])) { + $filterName = $_REQUEST['filterName']; + $where .= "T.name like '%$filterName%'"; + $haveFilter = true; + } // Get a current list of members - $list = $this->getList(); + $list = $this->getList($where); if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) { glmMembersAdmin::addNotice($list, 'DataBlock', 'Member Data'); @@ -120,13 +136,16 @@ class GlmMembersAdmin_members_list extends GlmDataMembers } // Determine if current user can add, edit, delete member data - $canEdit = current_user_can('glm_members_edit'); +// $canEdit = current_user_can('glm_members_edit'); // Compile template data $templateData = array( 'haveMembers' => $haveMembers, 'members' => $list, - 'canEdit' => $canEdit + 'haveFilter' => $haveFilter, + 'filterStatus' => $filterStatus, + 'filterName' => stripslashes($filterName) +// 'canEdit' => $canEdit ); // Return status, suggested view, and data to controller diff --git a/views/admin/configure/accommodationTypes.html b/views/admin/configure/accommodationTypes.html index da2150a9..8be95c2e 100644 --- a/views/admin/configure/accommodationTypes.html +++ b/views/admin/configure/accommodationTypes.html @@ -6,7 +6,7 @@ - +
Accommodation Type Name: diff --git a/views/admin/configure/amenities.html b/views/admin/configure/amenities.html new file mode 100644 index 00000000..f6d52645 --- /dev/null +++ b/views/admin/configure/amenities.html @@ -0,0 +1,146 @@ +{include file='admin/configure/header.html'} + +
Add a Amenity
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Amenity Name: + +
Facility Type: + +
Uses a value:
Description: + +
Short Description: + +
+

* Required

+ Cancel + + +
+
+
+
+

Are you sure you want to delete this accommodation type?

+

Yes, delete this accommodation type

+

No, I don't want to delete this accommodation

+
+
+ + +

Amenities

+ + + + + + + + + + + + + +{if $haveAmenities} + {assign var="i" value="0"} + {foreach $amenities as $t} + {if $i++ is odd by 1} + + {else} + + {/if} + + + + + + + + {/foreach} +{else} + +{/if} + +
AmenityFacility TypeUses ValueDescriptionShort Description 
+ {$t.name} + + {$t.facility_type.name} + + {$t.uses_value.name} + + {$t.descr} + + {$t.short_descr} + +
Delete
+
(no amenities listed)
+ + + +{include file='admin/footer.html'} diff --git a/views/admin/configure/categories.html b/views/admin/configure/categories.html index 27337b81..0b3ced13 100644 --- a/views/admin/configure/categories.html +++ b/views/admin/configure/categories.html @@ -6,7 +6,7 @@ - +
- @@ -79,10 +80,9 @@ {/if} -
Category Name: @@ -20,7 +20,9 @@ {if $haveCategories} {foreach $categories as $t} + {if !$t.parent.value} + {/if} {/foreach} {/if} @@ -63,7 +65,6 @@
CategoryParent Description Short Description  
- {$t.name} - - {$t.parent} + + {$t.name} + {$t.descr} diff --git a/views/admin/configure/cities.html b/views/admin/configure/cities.html index 047ca067..39a7f428 100644 --- a/views/admin/configure/cities.html +++ b/views/admin/configure/cities.html @@ -6,7 +6,7 @@ - +
City Name: diff --git a/views/admin/configure/development.html b/views/admin/configure/development.html new file mode 100644 index 00000000..31e43aa8 --- /dev/null +++ b/views/admin/configure/development.html @@ -0,0 +1,25 @@ +{include file='admin/configure/header.html'} + +

Note: Customers will not have access to this tab.

+ +

Development Activities

+ + +{if $resultMessage} +
+

Results

+ {$resultMessage} +
+{/if} + +{include file='admin/footer.html'} diff --git a/views/admin/configure/header.html b/views/admin/configure/header.html index 7b073cf6..be5e15a1 100644 --- a/views/admin/configure/header.html +++ b/views/admin/configure/header.html @@ -9,6 +9,8 @@ Cities Regions Accommodation Types + Amenities + Development
\ No newline at end of file diff --git a/views/admin/configure/memberTypes.html b/views/admin/configure/memberTypes.html index 80a6b943..c2c2965b 100644 --- a/views/admin/configure/memberTypes.html +++ b/views/admin/configure/memberTypes.html @@ -6,7 +6,7 @@ - +
Member Type Name: diff --git a/views/admin/configure/regions.html b/views/admin/configure/regions.html index 3721af4e..0309213a 100644 --- a/views/admin/configure/regions.html +++ b/views/admin/configure/regions.html @@ -6,7 +6,7 @@ - +
+{/if} + {include file='admin/footer.html'} diff --git a/views/admin/member/memberInfo.html b/views/admin/member/memberInfo.html new file mode 100644 index 00000000..9cf0c861 --- /dev/null +++ b/views/admin/member/memberInfo.html @@ -0,0 +1,477 @@ +{include file='admin/member/header.html'} + + {if $haveMemberInfo} +

Edit Member Information

+ {else} +

Add New Member Information

+ {/if} + + + + + {if $haveMemberInfo} + + {else} + + {/if} + +
Region Name: diff --git a/views/admin/member/header.html b/views/admin/member/header.html index 73f17d9f..f82c128b 100644 --- a/views/admin/member/header.html +++ b/views/admin/member/header.html @@ -1,14 +1,14 @@
-

Member Information

+

Member Data

diff --git a/views/admin/member/index.html b/views/admin/member/index.html index 39602edd..99adee4b 100644 --- a/views/admin/member/index.html +++ b/views/admin/member/index.html @@ -1,53 +1,111 @@ {include file='admin/member/header.html'} - {if !$deleted} -
Delete this Member
-
-
-

Are you sure you want to delete this member?

-

Yes, delete this member

-

No, I don't want to delete this member

-
-
- {/if} - -

{$member.name}

+{if $haveMemberTypes} -

- - - - - - {$member.status.name} - - - - - - -
Status
Member Name:{$member.name}
Type:{$member.member_type}
Description:{$member.descr}
Short Description:{$member.short_descr}
- - + +
+ + {if $haveMember} + + + + {else} + + + {/if} + + + + + + + + + + + + + + {if $haveMember} + + {/if} + +
Member Name: + + {if $member.fieldFail.name}

{$member.fieldFail.name}

{/if} +
Access: + + {if $member.fieldFail.access}

{$member.fieldFail.access}

{/if} +
Member Type: + + {if $member.fieldFail.member_type}

{$member.fieldFail.member_type}

{/if} +
Date created:{$member.fieldData.created.date}
+

* Required

+ {if $haveMember} + + {else} + + {/if} +
+ + {if $haveMember} + {if $haveInfoRecords} +

Member Information Versions

+ + + + + + + + + + {assign var="i" value="0"} + {foreach $memberInfoRecords as $m} + {if $i++ is odd by 1} + + {else} + + {/if} + + + + + {/foreach} + +
Access:CreatedLast Update
{$m.status.name}{$m.create_time.time}{$m.modify_time.time}
+ {else} +

You do not yet have any member information entered.

+

Click here too start entering information for this member.

+ {/if} + {/if} + +{else} +

You do not have any Member Types setup.

+

You must have at least one Member Type to add a new member.

+
Click here to add Member Types.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {if $memberInfo.fieldRequired.lat} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Member Name:{$member.name}
Member Type:{$member.member_type.name}
Access:{$member.access.name}
 
Member Info Status: + + {if $memberInfo.fieldFail.status}

{$memberInfo.fieldFail.status}

{/if} +
Categories + +
Add a new Category
+
+ + + + + + + + + +
Category Name: + +
+
Parent Category: + + +
+

* Required

+ Cancel + +
+ +    Select a category to add to box below.
+
+
+
Region: + + {if $memberInfo.fieldFail.region}

{$memberInfo.fieldFail.region}

{/if} +
Description: + + {if $memberInfo.fieldFail.descr}

{$memberInfo.fieldFail.descr}

{/if} +
Short Description: + + {if $memberInfo.fieldFail.short_descr}

{$memberInfo.fieldFail.short_descr}

{/if} +
Address Line 1: + + {if $memberInfo.fieldFail.addr1}

{$memberInfo.fieldFail.addr1}

{/if} +
Address Line 2: + + {if $memberInfo.fieldFail.addr2}

{$memberInfo.fieldFail.addr2}

{/if} +
City + +
Add a new City
+
+ + + + + +
City Name: + +
+
+

* Required

+ Cancel + +
+ + +
State: + + {if $memberInfo.fieldFail.state}

{$memberInfo.fieldFail.state}

{/if} +
ZIP / Postal Code: + + {if $memberInfo.fieldFail.zip}

{$memberInfo.fieldFail.zip}

{/if} +
Country: + + {if $memberInfo.fieldFail.country}

{$memberInfo.fieldFail.country}

{/if} +
{else}{/if}Location: + Latitude:
+ Longitude:
+ (Temporary till we get the auto locate map working) + +
Phone #: + + {if $memberInfo.fieldFail.phone}

{$memberInfo.fieldFail.phone}

{/if} +
Toll Free #: + + {if $memberInfo.fieldFail.toll_free}

{$memberInfo.fieldFail.toll_free}

{/if} +
Web Address (URL): + (ex: http://www.gaslightmedia.com) + {if $memberInfo.fieldFail.url}

{$memberInfo.fieldFail.url}

{/if} +
Logo: + + {if $memberInfo.fieldFail.logo}

{$memberInfo.fieldFail.logo}

{/if} +
Credit Cards Accepted: + {foreach from=$memberInfo.fieldData.cc_type.bitmap item=v} + {$v.name}
+ {/foreach} + {if $memberInfo.fieldFail.cc_type}

{$memberInfo.fieldFail.cc_type}

{/if} +
Notes: + + {if $memberInfo.fieldFail.notes}

{$memberInfo.fieldFail.notes}

{/if} +
Logo: + {if $memberInfo.fieldData.logo} + Delete Image
+ {/if} + + {if $memberInfo.fieldFail.logo}

{$memberInfo.fieldFail.logo}

{/if} +
+

* Required

+ + + + + + +{include file='admin/footer.html'} diff --git a/views/admin/members/header.html b/views/admin/members/header.html index 6337c5fd..7c6161fe 100644 --- a/views/admin/members/header.html +++ b/views/admin/members/header.html @@ -3,7 +3,7 @@
diff --git a/views/admin/members/index.html b/views/admin/members/index.html index b8de5a44..63a290dd 100644 --- a/views/admin/members/index.html +++ b/views/admin/members/index.html @@ -2,15 +2,43 @@

Members Dashboard

+ +{if !$haveMemberTypes} + + + + +{/if} +{if !$haveCategories} + + + + +{/if} +{if !$haveRegions} + + + + +{/if} +{if !$haveAccommodationTypes} + + + + +{/if} {if $numbMembers == 0} -

- You do not currently have any members listed. - Click here to create your first member. -

+ + + + {/if} +
You do not have any Member Types setup.Click here to add Member Types.
You do not have any Member Categories setup.Click here to add Member Categories.
You do not have any Regions setup.Click here to add Regions.
You do not have any AccommodationTypes setup.Click here to add AccommodationTypes.
You do not have any members listed.Click here to create your first member.
- +
+ Member Pending Data:
Number of Members Listed: {$numbMembers}
{$membersPending}
{include file='admin/footer.html'} + diff --git a/views/admin/members/list.html b/views/admin/members/list.html index a4114c70..8f962997 100644 --- a/views/admin/members/list.html +++ b/views/admin/members/list.html @@ -1,12 +1,20 @@ {include file='admin/members/header.html'} +
+ List Filters:   + Pending + Search + +

List of Members

+ - + + @@ -20,13 +28,19 @@ {/if} + + {/foreach} @@ -36,4 +50,31 @@
Access Member NameTypeMember TypeDate Created  
- {$m.name} + {$m.access.name} + + {$m.name} - {$m.member_type} + {$m.member_type.name} - Manage + {$m.created.date} + + Manage
+ + + {include file='admin/footer.html'} -- 2.17.1