From ff1ce4947f9abd0e4b23fdd6431b6003c95adcc8 Mon Sep 17 00:00:00 2001
From: Chuck Scott
Date: Mon, 4 Dec 2017 09:03:04 -0500
Subject: [PATCH] initial commit
---
activate.php | 153 +++++++
assets/readme.txt | 2 +
classes/customFieldPluginSupport.php | 166 +++++++
classes/data/dataCustomFields.php | 185 ++++++++
classes/data/dataCustomFieldsData.php | 169 +++++++
classes/readme.txt | 3 +
config/plugin.ini | 11 +
css/admin.css | 20 +
css/front.css | 0
css/readme.txt | 1 +
deactivate.php | 61 +++
defines.php | 64 +++
index.php | 261 +++++++++++
js/readme.txt | 1 +
lib/readme.txt | 3 +
misc/documentation/AddAnAdminTab.txt | 15 +
misc/documentation/CreateNewAddOn.txt | 49 +++
models/admin/ajax/filterSearch.php | 119 +++++
models/admin/entity/fields.php | 192 ++++++++
models/admin/import/fields.php | 411 ++++++++++++++++++
models/admin/management/fields.php | 228 ++++++++++
models/admin/readme.txt | 5 +
models/front/fields/detail.php | 134 ++++++
models/front/fields/list.php | 131 ++++++
models/front/readme.txt | 7 +
readme.txt | 27 ++
setup/adminHooks.php | 224 ++++++++++
setup/adminMenus.php | 52 +++
setup/adminTabs.php | 79 ++++
setup/commonHooks.php | 29 ++
.../create_database_V1.0.0.sql | 39 ++
setup/databaseScripts/dbVersions.php | 19 +
setup/frontHooks.php | 199 +++++++++
setup/hooksHelp.html | 102 +++++
setup/permissions.php | 53 +++
setup/rolesAndCapabilities.php | 19 +
setup/shortcodes.php | 123 ++++++
setup/validActions.php | 81 ++++
uninstall.php | 27 ++
views/admin/entity/fields.html | 38 ++
views/admin/import/fields.html | 48 ++
views/admin/import/fieldsProcess.html | 16 +
views/admin/import/fieldsValidate.html | 40 ++
views/admin/management/fields.html | 259 +++++++++++
views/admin/readme.txt | 5 +
views/front/fields/detail.html | 19 +
views/front/fields/list.html | 20 +
views/front/readme.txt | 7 +
48 files changed, 3916 insertions(+)
create mode 100644 activate.php
create mode 100644 assets/readme.txt
create mode 100644 classes/customFieldPluginSupport.php
create mode 100644 classes/data/dataCustomFields.php
create mode 100644 classes/data/dataCustomFieldsData.php
create mode 100644 classes/readme.txt
create mode 100644 config/plugin.ini
create mode 100644 css/admin.css
create mode 100644 css/front.css
create mode 100644 css/readme.txt
create mode 100644 deactivate.php
create mode 100644 defines.php
create mode 100644 index.php
create mode 100644 js/readme.txt
create mode 100644 lib/readme.txt
create mode 100644 misc/documentation/AddAnAdminTab.txt
create mode 100644 misc/documentation/CreateNewAddOn.txt
create mode 100644 models/admin/ajax/filterSearch.php
create mode 100644 models/admin/entity/fields.php
create mode 100644 models/admin/import/fields.php
create mode 100644 models/admin/management/fields.php
create mode 100644 models/admin/readme.txt
create mode 100644 models/front/fields/detail.php
create mode 100644 models/front/fields/list.php
create mode 100644 models/front/readme.txt
create mode 100644 readme.txt
create mode 100644 setup/adminHooks.php
create mode 100644 setup/adminMenus.php
create mode 100644 setup/adminTabs.php
create mode 100644 setup/commonHooks.php
create mode 100644 setup/databaseScripts/create_database_V1.0.0.sql
create mode 100644 setup/databaseScripts/dbVersions.php
create mode 100644 setup/frontHooks.php
create mode 100644 setup/hooksHelp.html
create mode 100644 setup/permissions.php
create mode 100644 setup/rolesAndCapabilities.php
create mode 100644 setup/shortcodes.php
create mode 100644 setup/validActions.php
create mode 100644 uninstall.php
create mode 100644 views/admin/entity/fields.html
create mode 100644 views/admin/import/fields.html
create mode 100644 views/admin/import/fieldsProcess.html
create mode 100644 views/admin/import/fieldsValidate.html
create mode 100644 views/admin/management/fields.html
create mode 100644 views/admin/readme.txt
create mode 100644 views/front/fields/detail.html
create mode 100644 views/front/fields/list.html
create mode 100644 views/front/readme.txt
diff --git a/activate.php b/activate.php
new file mode 100644
index 0000000..257ff9e
--- /dev/null
+++ b/activate.php
@@ -0,0 +1,153 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release activate.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+// Check that we're being called by WordPress.
+if (!defined('ABSPATH')) {
+ die("Please do not call this code directly!");
+}
+
+/*
+ * This class performs all necessary additional work when this
+ * plugin is activated.
+ *
+ * Currently the only actions are to add role capability to display and modify
+ * prototypes.
+ */
+class glmMembersCustomFieldsPluginActivate
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+
+ /*
+ * 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, $config)
+ {
+
+ // Make sure the current user has this capability
+ if (! current_user_can('activate_plugins')) {
+ $this->addNotice("Interesting, you don't have permission to activate plugins.");
+ die();
+ }
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Set current plugin version
+ update_option('glmMembersCustomFieldsPluginVersion', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_VERSION);
+
+ // Set Roles and Capabilities for this plugin
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH.'/rolesAndCapabilities.php';
+ }
+
+ /*
+ * Add a capability to all current roles
+ *
+ * @param string $capability Name of capability to add
+ * @param array $default Whether capability should be on by default
+ * array(
+ * 'author' => false,
+ * 'contributor' => false,
+ * 'editor' => false,
+ * 'subscriber' => false
+ * )
+ *
+ * @return void
+ * @access private
+ */
+ private function addRoleCapability($capability, $default)
+ {
+ // Get list of role objects
+ $roleObjects = $GLOBALS['wp_roles']->role_objects;
+
+ // Get list of roles we can edit
+ $roles = get_editable_roles();
+
+ // For each role object
+ foreach ($roleObjects as $key => $role) {
+
+ // Check if the role exists in list of editable roles and
+ // the capability does not exist
+ if (isset($roles[$key]) && ! isset($role->capabilities[$capability])) {
+
+ // Check if a default value has been specified in the $default array
+ $enabled = false;
+ if (isset($default[$role->name])) {
+
+ // It has, so use that
+ $enabled = $default[$role->name];
+
+ }
+
+ // Add the role
+ $role->add_cap($capability, $enabled);
+
+ }
+ }
+ }
+
+
+ /*
+ * Delete a capability from all current roles
+ *
+ * @param string $capability Name of capability to add
+ *
+ * @return void
+ * @access private
+ */
+ private function deleteRoleCapability($capability)
+ {
+ // Get list of role objects
+ $roleObjects = $GLOBALS['wp_roles']->role_objects;
+
+ // Get list of roles we can edit
+ $roles = get_editable_roles();
+
+ // For each role object
+ foreach ($roleObjects as $key => $role) {
+
+ if ( isset($role->capabilities[$capability])) {
+ $role->remove_cap($capability);
+ }
+
+ }
+
+ }
+
+
+
+}
diff --git a/assets/readme.txt b/assets/readme.txt
new file mode 100644
index 0000000..34a6135
--- /dev/null
+++ b/assets/readme.txt
@@ -0,0 +1,2 @@
+Assets folder for things like images and other
+files that might need to be read directly.
\ No newline at end of file
diff --git a/classes/customFieldPluginSupport.php b/classes/customFieldPluginSupport.php
new file mode 100644
index 0000000..3b55d02
--- /dev/null
+++ b/classes/customFieldPluginSupport.php
@@ -0,0 +1,166 @@
+get_results($sql);
+
+ if(!empty($required)){
+ foreach($required as $req){
+ $requiredFields[] = $req->id;
+ }
+
+ foreach($_REQUEST['glm_custom_field'] as $fieldID =>$fieldValue){
+ $cfData[$fieldID] = $fieldValue;
+ if( in_array( $fieldID,$requiredFields )){
+ if($fieldValue === ''){
+ $fieldFail['fieldFail'][$fieldID] = true;
+ }
+ }
+ }
+ }
+ if(!empty($fieldFail)){
+ $fieldFailData = $cfData + $fieldFail;
+ return $fieldFailData;
+ }
+ // Loop through the glm_custom_field array
+ foreach ( $_REQUEST['glm_custom_field'] as $fieldId => $fieldValue ) {
+ $fieldData =array(
+ 'entity_id' => $entityID,
+ 'field_id' => $fieldId,
+ 'field_data' => wp_kses_post(stripslashes($fieldValue))
+ );
+ if ( !isset($currentCustomFields[$fieldId]) ) {
+ // Insert Entries
+ $wpdb->insert(
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data",
+ $fieldData,
+ $fieldDataFormat
+ );
+ } else {
+ // Update Entries
+ $wpdb->update(
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data",
+ $fieldData,
+ array(
+ 'entity_id' => $entityID,
+ 'field_id' => $fieldId
+ ),
+ $fieldDataFormat,
+ '%d'
+ );
+ }
+ }
+ return true;
+}
+
+function customFieldsCloneFields( $oldId, $newId )
+{
+ global $wpdb;
+ $customFields = customFieldsGetFields( $oldId );
+ $fieldDataFormat = array(
+ '%d',
+ '%d',
+ '%s'
+ );
+ if ( isset( $customFields ) ) {
+ foreach ( $customFields as $fieldId => $fieldData ) {
+ $fieldData =array(
+ 'entity_id' => $newId,
+ 'field_id' => $fieldId,
+ 'field_data' => $fieldData
+ );
+ $wpdb->insert(
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data",
+ $fieldData,
+ $fieldDataFormat
+ );
+ }
+ }
+}
+
+/**
+ * customFieldsGetMemberInfoFields
+ *
+ * Pull the member info custom field data.
+ * This will be used more for admin side.
+ *
+ * @param mixed $entityID Id for the member info record
+ *
+ * @access public
+ * @return void
+ */
+function customFieldsGetFieldData( $entityID )
+{
+ global $wpdb;
+ if ( !$entityID ) {
+ return false;
+ }
+ $data = array();
+ $sql = "
+ SELECT *
+ FROM " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data
+ WHERE entity_id = %d";
+ $fieldData = $wpdb->get_results( $wpdb->prepare( $sql, $entityID ), ARRAY_A );
+ if ( $fieldData ) {
+ foreach ( $fieldData as $key => $val ) {
+ $data[$val['field_id']] = $val['field_data'];
+ }
+ return $data;
+ } else {
+ return false;
+ }
+}
+/**
+ * customFieldsGetFields
+ * Pull the member info custom field data.
+ * This will be used more for admin side.
+ *
+ * @param mixed $entityID Id for the member info record
+ *
+ * @access public
+ * @return void
+ */
+function customFieldsGetFields( $entityID, $where = ' AND true ', $uid )
+{
+ global $wpdb;
+ if ( !$entityID) {
+ return false;
+ }
+ $data = array();
+ $sql = "
+ SELECT *
+ FROM " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_fields
+ WHERE id IN (select field_id from ".GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data WHERE entity_id = %d)" . $where;
+ $fieldData = $wpdb->get_results( $wpdb->prepare( $sql, $uid ), ARRAY_A );
+ echo '
', print_r($fieldData), '
';
+}
diff --git a/classes/data/dataCustomFields.php b/classes/data/dataCustomFields.php
new file mode 100644
index 0000000..814118d
--- /dev/null
+++ b/classes/data/dataCustomFields.php
@@ -0,0 +1,185 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataFields.php,v 1.0 2011/01/25 19:31:47 cscott Exp $
+ */
+
+/**
+ * GlmDataEvent class
+ *
+ * PHP version 5
+ *
+ * @category Data
+ * @package GLM Member DB
+ * @author Chuck Scott
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott
+ * Exp $
+ */
+class GlmDataFieldsCustomFields extends GlmDataAbstract
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+ /**
+ * Data Table Name
+ *
+ * @var $table
+ * @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;
+ /**
+ * MemberInfo DB object
+ *
+ * @var $MemberInfo
+ * @access public
+ */
+ public $MemberInfo;
+
+ /**
+ * Constructor
+ *
+ * @param object $d database connection
+ * @param array $config Configuration array
+ * @param bool $limitedEdit Flag to say indicate limited edit requested
+ *
+ * @return void
+ * @access public
+ */
+ public function __construct($wpdb, $config, $limitedEdit = false)
+ {
+
+ // If this class is not being extended along with existing $wpdb and $config
+ if (!$this->wpdb) {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ }
+
+ /*
+ * Table Name
+ */
+ $this->table = GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . 'custom_fields';
+
+ /*
+ * Table Data Fields
+ */
+
+ $this->fields = array (
+
+ 'id' => array (
+ 'field' => 'id',
+ 'type' => 'integer',
+ 'view_only' => true,
+ 'use' => 'a'
+ ),
+
+ // Event ID
+ 'field_name' => array(
+ 'field' => 'field_name',
+ 'type' => 'text',
+ 'required' => true,
+ 'use' => 'a'
+ ),
+ // group id
+ 'uid' => array (
+ 'field' => 'uid',
+ 'type' => 'text',
+ 'view_only' => false,
+ 'use' => 'a'
+ ),
+ // Category ID
+ 'field_type' => array(
+ 'field' => 'field_type',
+ 'type' => 'list',
+ 'list' => $this->config['custom_field_types'],
+ 'required' => true,
+ 'use' => 'a'
+ ),
+ // required field
+ 'required' => array(
+ 'field' => 'required',
+ 'type' => 'checkbox',
+ 'default' => false,
+ 'use' => 'a'
+ ),
+ // admin_search flag
+ 'admin_search' => array (
+ 'field' => 'admin_search',
+ 'type' => 'checkbox',
+ 'default' => false,
+ 'use' => 'a'
+ ),
+
+ );
+
+ }
+
+ /*
+ * Entry Post Processing Call-Back Method
+ *
+ * Perform post-processing for all result entries.
+ *
+ * In this case we're using it to append an array of category
+ * data to each member result and also sort by member name.
+ *
+ * @param array $r Array of field result data for a single entry
+ * @param string $a Action being performed (l, i, g, ...)
+ *
+ * @return object Class object
+ *
+ */
+ public function entryPostProcessing($r, $a)
+ {
+ return $r;
+ }
+
+}
diff --git a/classes/data/dataCustomFieldsData.php b/classes/data/dataCustomFieldsData.php
new file mode 100644
index 0000000..76436ed
--- /dev/null
+++ b/classes/data/dataCustomFieldsData.php
@@ -0,0 +1,169 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataFields.php,v 1.0 2011/01/25 19:31:47 cscott Exp $
+ */
+
+/**
+ * GlmDataEvent class
+ *
+ * PHP version 5
+ *
+ * @category Data
+ * @package GLM Member DB
+ * @author Chuck Scott
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott
+ * Exp $
+ */
+class GlmDataFieldsCustomFieldsData extends GlmDataAbstract
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+ /**
+ * Data Table Name
+ *
+ * @var $table
+ * @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;
+ /**
+ * MemberInfo DB object
+ *
+ * @var $MemberInfo
+ * @access public
+ */
+ public $MemberInfo;
+
+ /**
+ * Constructor
+ *
+ * @param object $d database connection
+ * @param array $config Configuration array
+ * @param bool $limitedEdit Flag to say indicate limited edit requested
+ *
+ * @return void
+ * @access public
+ */
+ public function __construct($wpdb, $config, $limitedEdit = false)
+ {
+
+ // If this class is not being extended along with existing $wpdb and $config
+ if (!$this->wpdb) {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ }
+
+ /*
+ * Table Name
+ */
+ $this->table = GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . 'custom_field_data';
+
+ /*
+ * Table Data Fields
+ */
+
+ $this->fields = array (
+
+ 'id' => array (
+ 'field' => 'id',
+ 'type' => 'integer',
+ 'view_only' => true,
+ 'use' => 'a'
+ ),
+ // Entity ID (event, member, package)
+ 'entity_id' => array (
+ 'field' => 'entity_id',
+ 'type' => 'integer',
+ 'view_only' => false,
+ 'use' => 'a'
+ ),
+ // Event ID
+ 'field_id' => array(
+ 'field' => 'field_id',
+ 'type' => 'integer',
+ 'required' => true,
+ 'use' => 'a'
+ ),
+
+ 'field_data' => array(
+ 'field' => 'field_data',
+ 'type' => 'text',
+ 'required' => true,
+ 'use' => 'a'
+ ),
+
+ );
+
+ }
+
+ /*
+ * Entry Post Processing Call-Back Method
+ *
+ * Perform post-processing for all result entries.
+ *
+ * In this case we're using it to append an array of category
+ * data to each member result and also sort by member name.
+ *
+ * @param array $r Array of field result data for a single entry
+ * @param string $a Action being performed (l, i, g, ...)
+ *
+ * @return object Class object
+ *
+ */
+ public function entryPostProcessing($r, $a)
+ {
+ return $r;
+ }
+
+}
diff --git a/classes/readme.txt b/classes/readme.txt
new file mode 100644
index 0000000..fa5f44e
--- /dev/null
+++ b/classes/readme.txt
@@ -0,0 +1,3 @@
+General class libraries developed specifically for this add-on should be placed in this directory.
+
+The lib directory should be considered instead for any standard class libraries not specifically developed for this add-on.
\ No newline at end of file
diff --git a/config/plugin.ini b/config/plugin.ini
new file mode 100644
index 0000000..e6f76cb
--- /dev/null
+++ b/config/plugin.ini
@@ -0,0 +1,11 @@
+;
+; Main Configuration File
+; {descrName}
+;
+; Place any static configuration parameters here.
+;
+
+[custom_field_types]
+text = 'text'
+textarea = 'textarea'
+checkbox = 'checkbox'
diff --git a/css/admin.css b/css/admin.css
new file mode 100644
index 0000000..cdd8308
--- /dev/null
+++ b/css/admin.css
@@ -0,0 +1,20 @@
+.glm-admin-custom-fields .glm-columns{
+ padding: 0 5px 10px 5px;
+}
+.glm-admin-custom-fields .glm-custom-field-label{
+ font-weight: bold;
+ line-height: 1;
+}
+.glm-admin-custom-fields .glm-input-wrapper{
+ display: inline-block;
+}
+@media(min-width: 1024px){
+ .glm-admin-custom-fields input[type=text]{
+/* width: 50%;*/
+ }
+}
+@media(max-width: 1024px){
+ .glm-admin-custom-fields input[type=text]{
+ width: 100%;
+ }
+}
diff --git a/css/front.css b/css/front.css
new file mode 100644
index 0000000..e69de29
diff --git a/css/readme.txt b/css/readme.txt
new file mode 100644
index 0000000..954cc9c
--- /dev/null
+++ b/css/readme.txt
@@ -0,0 +1 @@
+Add admin.css and/or front.css to this directory to have those registered automatically.
\ No newline at end of file
diff --git a/deactivate.php b/deactivate.php
new file mode 100644
index 0000000..df95a60
--- /dev/null
+++ b/deactivate.php
@@ -0,0 +1,61 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release admin.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+// Check that we're being called by WordPress.
+if (!defined('ABSPATH')) {
+ die("Please do not call this code directly!");
+}
+
+/*
+ * This class performs all necessary additional work when this
+ * plugin is deactivated.
+ */
+class glmMembersCustomFieldsPluginDeactivate
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+
+ /*
+ * Constructor
+ *
+ * Performs all the work for this model
+ */
+ public function __construct ($wpdb, $config)
+ {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Delete our version from WordPress Options
+ delete_option('glmMembersCustomFieldsPluginVersion');
+ }
+
+}
diff --git a/defines.php b/defines.php
new file mode 100644
index 0000000..1c56832
--- /dev/null
+++ b/defines.php
@@ -0,0 +1,64 @@
+prefix.'glm_MembersCustomFields_');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_ACTIVE_DB_OPTION', 'glmMembersCustomFieldsDbVersion');
+
+// Determine which system we're running on - If not provided, assume PRODUCTION
+$host = getenv('GLM_HOST_ID');
+if (trim($host) == '') {
+ $host = 'PRODUCTION';
+}
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_HOST', $host);
+
+// Determine current http/https protocol
+$pageProtocol = 'http';
+if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') {
+ $pageProtocol = 'https';
+}
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_HTTP_PROTOCOL', $pageProtocol);
+
+// Get various pieces of the URL
+$urlParts = parse_url(get_bloginfo('url'));
+$pageUri = explode('?', $_SERVER['REQUEST_URI']); // Bust this up to access URL path and script name only
+
+$WPUploadDir = wp_upload_dir();
+
+/*
+ * Create a copy of the plugin slug that can be used as a variable prefix used to keep
+ * global instances from clashing with instances in other plugins.
+ */
+$vprefix = str_replace('-', '_', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG);
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PREFIX', $vprefix.'_');
+
+// URLs
+define('GLM_MEMBERS_CUSTOMFIELDS_SITE_BASE_URL', home_url('/') );
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_URL', plugin_dir_url(__FILE__));
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_ADMIN_URL', admin_url('admin.php'));
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_BASE_URL', WP_PLUGIN_URL.'/'.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG);
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CURRENT_URL', $urlParts['scheme'].'://'.$urlParts['host'].$pageUri[0]);
+
+// Directories
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH', dirname(__FILE__));
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH.'/setup');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_SCRIPTS', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH.'/databaseScripts');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CLASS_PATH', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH.'/classes');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CONFIG_PATH', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH.'/config');
+
+// Parameters related to the Main GLM Member DB plugin - Depending on what's going on these may already defined by the main plugin
+$pluginsPath = str_replace(GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG, '', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH);
+define('GLM_MEMBERS_CUSTOMFIELDS_MAIN_PLUGIN_PATH', $pluginsPath.'/glm-member-db');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_LIB_PATH', GLM_MEMBERS_CUSTOMFIELDS_MAIN_PLUGIN_PATH.'/lib');
+
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..74fb839
--- /dev/null
+++ b/index.php
@@ -0,0 +1,261 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @version 1.0.0
+ */
+
+/*
+ * Plugin and Database Versions
+ *
+ * Note that the database version matches the version of the last
+ * plugin version where there was a change in the database.
+ *
+ * Updates to checkDatabase() in glmPluginSupport.php must be
+ * made together with the DB_VERSION below. ONLY bump the DB
+ * version when there's a change in the database!! Use the
+ * version number of that release for the DB version.
+ *
+ * We check the plugin version stored in the WordPress option below
+ * so that we're sure the other add-ons see an up to date
+ * version from this plugin.
+ */
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_VERSION', '1.0.0');
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_VERSION', '1.0.0');
+
+// This is the minimum version of the GLM Members DB plugin require for this plugin.
+define('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.8.0');
+
+// Check if plugin version is not current in WordPress option and if needed updated it
+if (GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_VERSION != get_option('glmMembersCustomFieldsPluginVersion')) {
+ update_option('glmMembersCustomFieldsPluginVersion', GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_VERSION);
+}
+
+/*
+ * Copyright 2014 Charles Scott (email : cscott@gaslightmedia.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+// Check that we're being called by WordPress.
+if (!defined('ABSPATH')) {
+ die("Please do not call this code directly!");
+}
+
+/*
+* Some initial setup and tests
+*/
+
+$startupNotices = '';
+
+// Get standard defined parameters
+require_once 'defines.php';
+
+// Required to be able to get user capabilities when being called as a filter from the main plugin
+require_once ABSPATH . 'wp-includes/pluggable.php';
+
+// Include defines to tell if a plugin is active
+include_once ABSPATH . 'wp-admin/includes/plugin.php';
+
+/*
+ * Do some preliminary sanity checks
+ */
+
+// Check if database version should be defined and it isn't - This would be a plugin/add-on setup issue
+if (is_file(GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH.'/setup/databaseScripts/dbVersions.php') && !defined('GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_VERSION')) {
+ die('You have database scripts but have not defined a current database version at the top of index.php for this plugin/add-on!');
+}
+
+/*
+ * Check installation, activation, and version of main Member DB plugin
+ */
+
+// Check for main plugin and that it's active
+function glmMembersCustomFieldsPluginRequired() {
+ echo '
+
+
The '.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_NAME.' add-on requires the base GLM Member DB plugin to be installed and active!
+
The '.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_NAME.' plugin has been de-activated.
+
+ ';
+}
+$plugin_name = 'glm-member-db/index.php';
+$is_active = is_plugin_active($plugin_name);
+if ($is_active != '1') {
+ add_action( 'admin_notices', 'glmMembersCustomFieldsPluginRequired' );
+ deactivate_plugins('/'.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG.'/index.php');
+}
+
+// Check for Minimum DB version for main Member DB
+function glmMembersCustomFieldsMinVerRequired() {
+ echo '
+
+
The '.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_NAME.' requires that the main GLM Member DB plugin version be no older than '
+ .GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION.'!
+ '.GLM_MEMBERS_CUSTOMFIELDS_MIN_VERSION_NOTE.'
+
The '.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_NAME.' plugin has been de-activated.
+
+ ';
+}
+$glmMembersDatabasePluginVersion = get_option('glmMembersDatabasePluginVersion');
+if (version_compare($glmMembersDatabasePluginVersion, GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION) < 0) {
+ define('GLM_MEMBERS_CUSTOMFIELDS_MIN_VERSION_NOTE', "Members DB: $glmMembersDatabasePluginVersion, Fields Requires: ".GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION);
+ add_action( 'admin_notices', 'glmMembersCustomFieldsMinVerRequired');
+ deactivate_plugins('/'.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG.'/'.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG.'.php');
+}
+
+/*
+ * Register this add-on with the main GLM Member DB plugin and get information on all add-ons loaded.
+ */
+require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH.'/validActions.php';
+require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH.'/shortcodes.php';
+if (is_file(GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_SCRIPTS.'/dbVersions.php')) {
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_SCRIPTS.'/dbVersions.php';
+}
+
+// Load Add-On Management Settings data
+/* None - Need to figure out a smooth way to do this.
+$glmMembersCustomFieldsManagementSettings = $wpdb->get_row( "SELECT * FROM ".GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX."management WHERE id = 1", ARRAY_A );
+unset($glmMembersCustomFieldsManagementSettings['id']);
+*/
+function glmMembersCustomFieldsRegisterAddOn($addOns) {
+
+ // Add this add-on to the add-ons array
+ $addOns[GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG] = array(
+ 'dir' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH,
+ 'name' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_NAME,
+ 'short_name' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SHORT_NAME,
+ 'slug' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ 'actions' => $GLOBALS['glmMembersCustomFieldsAddOnValidActions'],
+ 'config' => parse_ini_file(GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH.'/config/plugin.ini', true),
+ 'shortcodes' => $GLOBALS['glmMembersCustomFieldsShortcodes'],
+ 'shortcodesDescription' => $GLOBALS['glmMembersCustomFieldsShortcodesDescription']
+ );
+
+ // If we have database tables for this plugin/addon, provide that data also
+ if (isset($GLOBALS['glmMembersCustomFieldsDbVersions'])) {
+ $addOns[GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG]['database'] = array(
+ 'dbPrefix' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX,
+ 'dbCurrentVersion' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_VERSION,
+ 'dbActiveVersionOption' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_ACTIVE_DB_OPTION,
+ 'dbScriptPath' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_SCRIPTS,
+ 'dbVersions' => $GLOBALS['glmMembersCustomFieldsDbVersions']
+ );
+ } else {
+ $addOns[GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG]['database'] = false;
+ }
+
+ // Return the array with our data added
+ return $addOns;
+}
+add_filter('glm-member-db-register-addon','glmMembersCustomFieldsRegisterAddOn', 10, 1);
+
+/*
+ * Plugin Update Support - uses Gaslight Media update server
+ */
+/* Not functional yet - Need to resolve JavaScript conflicts with this feature in other plugins
+require GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_LIB_PATH.'/opentools-update-checker/opentools-update-checker.php';
+${GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PREFIX."updateChecker"} = new OpenToolsPluginUpdateChecker(
+ 'http://www.gaslightmedia.com/update_server/?action=get_metadata&slug='.GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ __FILE__,
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG
+);
+
+${GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PREFIX."updateChecker"}->declareCredentials(array(
+ 'license_key' => __('License Key:')
+));
+*/
+
+/*
+ *
+ * Activate and Deactivate hooks
+ *
+ */
+
+ // Activate
+function glmMembersCustomFieldsPluginActivate ()
+ {
+ global $wpdb, $config;
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH . '/activate.php';
+ new glmMembersCustomFieldsPluginActivate($wpdb, $config);
+ }
+ register_activation_hook(__FILE__, 'glmMembersCustomFieldsPluginActivate');
+
+ // Deactivate
+ function glmMembersCustomFieldsPluginDeactivate ()
+ {
+ global $wpdb, $config;
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_PATH . '/deactivate.php';
+ $x = new glmMembersCustomFieldsPluginDeactivate($wpdb, $config);
+ return false;
+ }
+ register_deactivation_hook(__FILE__, 'glmMembersCustomFieldsPluginDeactivate');
+
+/*
+ * Hooks for testing capabilities provided by this add-on
+ */
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SETUP_PATH.'/permissions.php';
+
+/*
+ * Adding filter for updating the shortcode attributes for the member list shortcode
+ * This has to be done before the frontHooks are run.
+ */
+add_filter( 'glm-custom-fields-shortcodes', function( $shortCodes ){
+ global $wpdb;
+ if ( !is_array( $shortCodes ) || empty( $shortCodes ) ) {
+ return $shortCodes;
+ }
+ // Get all custom fields
+ $customFields = $wpdb->get_results(
+ "SELECT field_name,field_type
+ FROM " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_fields",
+ ARRAY_A
+ );
+ foreach ( $customFields as $field ) {
+ switch ( $field['field_type'] ) {
+ case 'checkbox':
+ $fieldName = preg_replace( '/[ -]/', '_', strtolower( $field['field_name'] ) );
+ // If the attributes array exists in glm-members-list and the one for the custome
+ // field name has not been set yet, then set it.
+ if ( isset( $shortCodes['glm-members-list']['attributes'] )
+ && !isset( $shortCodes['glm-members-list']['attributes'][$fieldName] )
+ ) {
+ $shortCodes['glm-members-list']['attributes'][$fieldName] = false;
+ }
+ break;
+ }
+ }
+ return $shortCodes;
+ },
+ 10,
+ 1
+);
diff --git a/js/readme.txt b/js/readme.txt
new file mode 100644
index 0000000..f642355
--- /dev/null
+++ b/js/readme.txt
@@ -0,0 +1 @@
+Add admin.js and/or front.js to this directory to have those registered automatically.
\ No newline at end of file
diff --git a/lib/readme.txt b/lib/readme.txt
new file mode 100644
index 0000000..8373066
--- /dev/null
+++ b/lib/readme.txt
@@ -0,0 +1,3 @@
+Standard class libraries not specifically developed for this add-on should be placed here.
+
+The classes directory should be considered instead for class libraries developed specifically for this add-on.
diff --git a/misc/documentation/AddAnAdminTab.txt b/misc/documentation/AddAnAdminTab.txt
new file mode 100644
index 0000000..c697b47
--- /dev/null
+++ b/misc/documentation/AddAnAdminTab.txt
@@ -0,0 +1,15 @@
+Add an admin tab
+
+* Add a new section in setup/adminTabs.php
+
+* Add a model file - models/admin/{menu}/{action}.php
+
+* Add a view file - views/admin/{menu}/{action}.html
+
+* Add action to setup/validActions.php
+
+* If needed add a database table to the create_database_V...sql file
+ and update name to current database version, add an
+ update_database_V....sql file, and/or update dbVersions.php
+
+* If required add a data definition for any new tables
diff --git a/misc/documentation/CreateNewAddOn.txt b/misc/documentation/CreateNewAddOn.txt
new file mode 100644
index 0000000..b93235f
--- /dev/null
+++ b/misc/documentation/CreateNewAddOn.txt
@@ -0,0 +1,49 @@
+Procedure to create a new GLM Members add-on plugin
+----------------------------------------------------
+
+* Checkout glm-member-db-sample and rename directory to glm-member-db-{add-on name}
+
+* From a bash prompt, run "SETUP_SCRIPT"
+
+* Create new repository named WP-Plugins/glm-member-db-{name of add-on}.git
+
+* If there are any databases associated with this add-on, setup the database scripts and
+ data under the "setup/databaseScripts" directory. If there are no database tables
+ with this add-on, remove all but the "readme.txt" file from that directory.
+ NOTE: No "update_database..." files should be there for a new add-on with new tables.
+ NOTE: There should be only one entry in the "dbVersions.php" file.
+
+* Carefully review "defines.php" file and update as needed.
+
+* Do a quick review of the readme.txt file and update as desired.
+
+* TEST - At this point the add-on should install and activate but not do anything.
+ - If there are any database tables, make sure they were created and are correct.
+ - Go to "Members" -> "Management" -> "Add-Ons" and make sure the add-on was
+ properly registered with the main plugin and that any database data is shown.
+
+* Adding menus
+ - Update "setup/adminMenus.php" and add menu section as described there.
+ - Add an entry in the validActions.php file. Pay attention to how slug name is
+ constructed ("glm-members-admin-{page}-{action}").
+ - If needed add a database table to the create_database_V...sql file
+ Also add a "classes/data/data{Table}.php file
+ - Add a model file as "models/admin/{page}/{action}.php
+ - Add any desired view file as "views/admin/{page}/{action}.html
+ Note that additional possible view files should be named as...
+ "views/admin/{page}/{action}{Name}.html
+ - Test that when add-on is activated that the menu shows and is functional.
+
+* Adding tabs
+ - Update "setup/admin/Tabs.php" and add new tab filter as described there.
+ - Add an entry in the validActions.php file. Pay attention to how slug name is
+ constructed ("glm-members-admin-{page}-{action}").
+ - If needed add a database table to the create_database_V...sql file
+ Also add a "classes/data/data{Table}.php file
+ - Add a model file as "models/admin/{page}/{action}.php
+ - Add any desired view file as "views/admin/{page}/{action}.html
+ Note that additional possible view files should be named as...
+ "views/admin/{page}/{action}{Name}.html
+ - Test that when add-on is activated that the tab shows and is functional.
+
+ *
\ No newline at end of file
diff --git a/models/admin/ajax/filterSearch.php b/models/admin/ajax/filterSearch.php
new file mode 100644
index 0000000..18fb75a
--- /dev/null
+++ b/models/admin/ajax/filterSearch.php
@@ -0,0 +1,119 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @version 0.1
+ */
+
+// Load Event Times data abstract
+require_once GLM_MEMBERS_PLUGIN_CLASS_PATH .'/data/dataCategories.php';
+
+
+/*
+ * This class performs the work of handling images passed to it via
+ * an AJAX call that goes through the WorPress AJAX Handler.
+ *
+ */
+class GlmMembersAdmin_ajax_filterSearch extends GlmDataCategories
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+
+ /*
+ * Constructor
+ *
+ * This contructor sets up this model. At this time that only includes
+ * storing away the WordPress data object.
+ *
+ * @return object Class object
+ *
+ */
+ public function __construct ($wpdb, $config)
+ {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Run constructor for members data class
+ parent::__construct(false, false);
+
+ }
+ /**
+ * getModelEventsData
+ *
+ * Return the array of events.
+ *
+ * @param integer $categoryId Id of the category for filtering events (optional)
+ * @param integer $limit Number of events to return (optional)
+ * @param integer $memberID Member ID if filtering by member
+ *
+ * @access public
+ * @return array events
+ */
+
+
+ /*
+ * Perform Model Action
+ *
+ * This modelAction takes an AJAX image upload and stores the image in the
+ * media/images directory of the plugin.
+ *
+ * This model action does not return, it simply does it's work then calls die();
+ *
+ * @param $actionData
+ *
+ * Echos JSON string as response and does not return
+ */
+ public function modelAction ($actionData = false)
+ {
+
+ global $wpdb;
+//
+// $category_ids = $_REQUEST['cat_ids'];
+// $category_names = $_REQUEST['cat_names'];
+//
+// // get cat ids by name
+// foreach($category_names as $cat_name){
+// $sql = 'SELECT id FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . "categories WHERE name = '$cat_name';";
+// $cat_id = $wpdb->get_var($sql);
+//
+// // get the
+// }
+//
+//
+// $categories = $this->getListSortedParentChild();
+// $categories = $categories[$category_id];
+ $return = array(
+// 'manufacturers' => $category_ids,
+// 'brands' => $cat_id
+ );
+
+ header('Content-type:application/json;charset=utf-8', true);
+ echo json_encode($return);
+ wp_die();
+ }
+}
diff --git a/models/admin/entity/fields.php b/models/admin/entity/fields.php
new file mode 100644
index 0000000..6049837
--- /dev/null
+++ b/models/admin/entity/fields.php
@@ -0,0 +1,192 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release fields.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+// Load Management Fields data abstract
+require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CLASS_PATH.'/data/dataCustomFields.php';
+
+/**
+ * GlmMembersAdmin_management_fields
+ *
+ * PHP version 5
+ *
+ * @category Model
+ * @package GLM Member DB
+ * @author Chuck Scott
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: packaging.php,v 1.0 2011/01/25 19:31:47 cscott
+ * Exp $
+ */
+class GlmMembersAdmin_entity_fields extends GlmDataFieldsCustomFields
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * dbh Postgres database connection
+ *
+ * @var mixed
+ * @access public
+ */
+ public $dbh;
+ /**
+ * settings used for the schema and tablenames
+ *
+ * @var mixed
+ * @access public
+ */
+ public $settings = array();
+ /**
+ * categories
+ *
+ * @var bool
+ * @access public
+ */
+ public $categories = array();
+ public $oldCatMap = array();
+ /**
+ * fields
+ *
+ * @var bool
+ * @access public
+ */
+ public $fields = array();
+ public $image_owner;
+
+ /**
+ * Constructor
+ *
+ * This contructor performs the work for this model. This model returns
+ * an array containing the following.
+ *
+ * 'status'
+ *
+ * True if successfull and false if there was a fatal failure.
+ *
+ * 'view'
+ *
+ * A suggested view name that the contoller should use instead of the
+ * default view for this model or false to indicate that the default view
+ * should be used.
+ *
+ * 'data'
+ *
+ * Data that the model is returning for use in merging with the view to
+ * produce output.
+ *
+ * @wpdb object WordPress database object
+ *
+ * @return array Array containing status, suggested view, and any data
+ */
+ public function __construct ($wpdb, $config)
+ {
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Run constructor for members data class
+ parent::__construct(false, false);
+
+ }
+
+ /**
+ * modelAction
+ *
+ * @param bool $actionData
+ * @access public
+ * @return void
+ */
+ public function modelAction($actionData = false)
+ {
+ $option = false;
+ $customFields = false;
+ $haveCustomFields = false;
+ $customFieldData = false;
+ $where = 'true';
+ $uid = '';
+
+ if (isset($_REQUEST['option'])) {
+ $option = $_REQUEST['option'];
+ }
+
+ // Check if a field ID is supplied
+ $id = 0;
+ if (isset($_REQUEST['id'])) {
+ $id = $_REQUEST['id']-0;
+ }
+ $entityID = 0;
+ if (isset($actionData)) {
+ $entityID = $actionData['entityID'];
+ $uid = $actionData['uid'];
+ $fieldFail = $actionData['cfData'];
+// print_r($fieldFail);
+ }
+
+ switch ($option) {
+
+ default:
+ // Make sure option is set if default
+ $option = 'list';
+
+ break;
+
+ }
+ // $where .= " AND field_id in (select id from " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX ."custom_fields where uid = 'glm-member-db')";
+ $where .= " AND uid = '$uid'";
+ // Get list of Custom Fields
+ $customFields = $this->getList( $where, 'field_order,id' );
+ if ( isset($customFields) && $customFields && count( $customFields ) > 0 ) {
+ $haveCustomFields = true;
+ }
+
+ require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CLASS_PATH . '/customFieldPluginSupport.php';
+ // is array ensures that the data passed BAD
+ if(is_array($fieldFail)){
+ $customFieldsData = $fieldFail;
+ }else {
+ $customFieldsData = customFieldsGetFieldData( $entityID );
+ }
+
+
+ // Compile template data
+ $template_data = array(
+ 'prefix' => 'glm_custom_field',
+ 'customFields' => $customFields,
+ 'customFieldsData' => $customFieldsData,
+ 'fieldFail' => $fieldFail,
+ 'fieldTypes' => $this->config['custom_field_types'],
+ 'haveCustomFields' => $haveCustomFields,
+ 'uid' => $uid
+ );
+
+ // Return status, suggested view, and data to controller
+ return array(
+ 'status' => true,
+ 'menuItemRedirect' => false,
+ 'modelRedirect' => false,
+ 'view' => 'admin/entity/fields.html',
+ 'data' => $template_data
+ );
+
+
+ }
+
+}
diff --git a/models/admin/import/fields.php b/models/admin/import/fields.php
new file mode 100644
index 0000000..6736069
--- /dev/null
+++ b/models/admin/import/fields.php
@@ -0,0 +1,411 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @version 0.1
+ */
+require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CLASS_PATH.'/data/dataCustomFieldsData.php';
+require_once GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMemberInfo.php';
+/*
+ * This class performs the work for the default action of the "Import" menu
+ * option.
+ *
+ */
+class GlmMembersAdmin_import_fields extends GlmDataFieldsCustomFieldsData
+{
+
+ const CSV_CHARS_PER_LINE = 6000;
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+
+ /**
+ * errors
+ *
+ * @var $errors
+ * @access public
+ */
+ public $errors = array();
+
+ /**
+ * numberProcessed
+ *
+ * @var float
+ * @access public
+ */
+ public $numberProcessed = 0;
+
+ /**
+ * totalFields
+ *
+ * @var float
+ * @access public
+ */
+ public $totalFields = 0;
+
+ /**
+ * processingComplete
+ *
+ * @var bool
+ * @access public
+ */
+ public $processingComplete = false;
+
+ /**
+ * Constructor
+ *
+ * This contractor sets up this model. At this time that only includes
+ * storing away the WordPress data object.
+ *
+ * @return object Class object
+ *
+ */
+ public function __construct ($wpdb, $config)
+ {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Run constructor for members data class
+ parent::__construct(false, false);
+
+ }
+
+ /**
+ * Perform Model Action
+ *
+ * This method does the work for this model and returns any resulting data
+ *
+ * @return array Status and data array
+ *
+ * 'status'
+ *
+ * True if successful 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 controller should use instead of the
+ * default view for this model or false to indicate that the default view
+ * should be used.
+ *
+ * 'data'
+ *
+ * Data that the model is returning for use in merging with the view to
+ * produce output.
+ *
+ */
+ public function modelAction ($actionData = false)
+ {
+ // Set the view file
+ $view = 'fields.html';
+ $failure = false;
+ $option = 'fields';
+ $clearData = false;
+ $importRet = false;
+ $haveMembers = false;
+ $fileExists = false;
+ $isValid = false;
+ // Check to see if they have members
+ $haveMembers = $this->wpdb->get_var(
+ "SELECT count(id)
+ FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members"
+ );
+ // $fileData - The main files needed for the member import
+ // - field: input field name
+ // - name: file name
+ // - exists: Does file exists. Set to false at first.
+ // - validate: Validation array. Header line must match this.
+ // - type: Type of file. Used in the processing function.
+ $fileData = array(
+ 'Fields' => array(
+ 'field' => 'fields_file',
+ 'name' => 'fieldsData.csv',
+ 'exists' => false,
+ 'validate' => array( 'member_id', 'field_name', 'field_value' ),
+ 'type' => 'fields',
+ ),
+ );
+ // Setting readyToProcess to false (initialize)
+ $readyToProcess = false;
+
+ // Set the $option if found in $_REQUEST array
+ if (isset($_REQUEST['option']) && $_REQUEST['option'] != '') {
+ $option = $_REQUEST['option'];
+ }
+
+ // Set the $option2 if found in $_REQUEST array
+ if (isset($_REQUEST['option2']) && $_REQUEST['option2'] != '') {
+ $option2 = $_REQUEST['option2'];
+ }
+
+ // Set variable for the upload directory
+ $wpUploadDir = wp_get_upload_dir();
+
+ // Set the $uploadPath for import files
+ $uploadPath = $wpUploadDir['basedir'] . '/' . 'glm-member-import';
+
+ // If the folder for the upload import files doesn't exists create one.
+ if ( !is_dir( $uploadPath ) ) {
+ // Get old umask
+ $oldMask = umask(0);
+ // Set folder permission
+ mkdir( $uploadPath, 0770 );
+ // reset old umask
+ umask( $oldMask );
+ }
+
+ switch( $option ) {
+
+ case 'fieldsValidate';
+ $validFiles = 0;
+ // Set the view file
+ $view = 'fieldsValidate.html';
+ $fileCount = count( $fileData );
+ // Move any files uploaded
+ if ( isset( $_FILES ) ) {
+ foreach ( $fileData as $fileHeader => $file ) {
+ if ( !$_FILES[$file['field']]['error'] ) {
+ move_uploaded_file( $_FILES[$file['field']]['tmp_name'], $uploadPath . '/'. $file['name'] );
+ }
+ }
+ }
+ // Check that each file exists
+ foreach ( $fileData as $fileHeader => $file ) {
+ if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
+ $fileData[$fileHeader]['exists'] = true;
+ $fData = $this->readCSVFileHeaders( $uploadPath . '/' . $file['name'] );
+ $isValid = ( $file['validate'] == $fData );
+ if ( $isValid ) {
+ $validFiles++;
+ }
+ $fileData[$fileHeader]['data'] = $fData;
+ $fileData[$fileHeader]['isValid'] = $isValid;
+ }
+ }
+ $readyToProcess = ( $validFiles == $fileCount );
+ break;
+
+ case 'fieldsProcess':
+ $memberInfoData = new GlmDataMemberInfo( $this->wpdb, $this->config );
+ foreach ( $fileData as $fileHeader => $file ) {
+ if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
+ $fields = $this->readCSVFields( $uploadPath . '/'. $file['name'] );
+ //echo '
$fields: ' . print_r( $fields, true ) . '
';
+ $this->totalFields = count( $fields );
+ // Clear the custom field data table
+ $this->wpdb->query( "DELETE FROM " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_field_data" );
+ foreach ( $fields as $customRow ) {
+ // Need to first get the member id from the database
+ // It will match from the old_member_id field
+ $memberId = $this->wpdb->get_var(
+ $this->wpdb->prepare(
+ "SELECT id
+ FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members
+ WHERE old_member_id = %d",
+ $customRow[0]
+ )
+ );
+ // get the active member info id
+ $memberInfoId =
+ $memberInfoData->getActiveInfoIdForMember( $memberId );
+ $customFieldId = $this->wpdb->get_var(
+ $this->wpdb->prepare(
+ "SELECT id
+ FROM " . GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . "custom_fields
+ WHERE field_name = %s",
+ $customRow[1]
+ )
+ );
+ if ( $customFieldId ) {
+ $newId = $this->wpdb->insert(
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . 'custom_field_data',
+ array(
+ 'ref_dest' => $memberInfoId,
+ 'field_id' => $customFieldId,
+ 'field_data' => $customRow[2],
+ ),
+ array(
+ '%d',
+ '%d',
+ '%s'
+ )
+ );
+ $this->numberProcessed++;
+ }
+ }
+ $importRet = array();
+ }
+ }
+ if ( count( $this->errors ) == 0 ) {
+ $readyToProcess = true;
+ }
+ // Here we need to check to see if we processed all members.
+ // Also the counter has to increment the total processed so far.
+ if ( $this->numberProcessed == $this->totalFields ) {
+ $this->processingComplete = true;
+ }
+ // Set the view file:<
+ $view = 'fieldsProcess.html';
+ break;
+
+ case 'fields':
+ default:
+ // Set the view file
+ $view = 'fields.html';
+ // check upload dir to see if they have any files in yet
+ foreach ( $fileData as $fileHeader => $file ) {
+ if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
+ $fileData[$fileHeader]['exists'] = true;
+ $fileData[$fileHeader]['mtime'] = filemtime( $uploadPath . '/' . $file['name'] );
+ }
+ }
+
+ break;
+
+ }
+
+ // Setup the template data array
+ $templateData = array(
+ 'fileExists' => $fileExists,
+ 'option' => $option,
+ 'errors' => $this->errors,
+ 'numberProcessed' => $this->numberProcessed,
+ 'totalFields' => $this->totalFields,
+ 'completed' => $this->processingComplete,
+ 'data' => false,
+ 'fileData' => $fileData,
+ 'clearData' => $clearData,
+ 'importRet' => $importRet,
+ 'csvData' => '
$fileData: ' . print_r( $fileData, true ) . '
',
+ 'readyToProcess' => $readyToProcess,
+ 'haveMembers' => $haveMembers,
+ 'isValid' => $isValid,
+ 'sampleFileUrl' => GLM_MEMBERS_PLUGIN_BASE_URL . '/sample-files/',
+ );
+
+ // Return status, suggested view, and data to controller
+ return array(
+ 'status' => true,
+ 'menuItemRedirect' => false,
+ 'modelRedirect' => false,
+ 'view' => 'admin/import/' . $view,
+ 'data' => $templateData,
+ );
+
+ }
+
+ /**
+ * Read in fields from a csv file
+ *
+ * Header line as follows. Data follows immediately below this line. this
+ * line and all above it are ignored.
+ *
+ * 'member_id','member_name','member_login','member_passwd','contact_email'
+ *
+ * @param string $csv Temporary file name of csv file upload
+ *
+ * @return array Array of data from CSV file or an error message
+ *
+ */
+ public function readCSVFields($csv)
+ {
+
+ $fields = array();
+ $startImport = false;
+
+ // Try to open file
+ if (($handle = fopen($csv, "r")) !== false) {
+
+ // For each line in the file
+ while (($c = fgetcsv($handle, 1000, ",")) !== false) {
+
+ // If we're past the header, the first item is numeric, and we have at least 5 fields
+ if($startImport && ($c[0]-0) > 0 && count($c) >= 3) {
+
+ // Add this line of data to Contacts
+ $fields[] = $c;
+
+ }
+
+ // If we find the header, assume all data is below that
+ if ($c[0] == 'member_id') {
+ $startImport = true;
+ }
+
+ }
+
+ fclose($handle);
+
+ } else {
+ return "No file submitted.";
+ }
+
+ // If we never found the header
+ if (!$startImport) {
+ return "Required header not found in file.";
+ }
+
+ // If we found no data below the header
+ if (count($fields) == 0) {
+ return "Header found but no data followed";
+ }
+
+ return $fields;
+
+ }
+
+ /**
+ * readCSVFileHeaders
+ *
+ * Read the cvs file. Just the first line is read.
+ *
+ * @param mixed $fileName Name of the file (path)
+
+ * @access public
+ * @return void
+ */
+ public function readCSVFileHeaders( $fileName )
+ {
+ $fileHeaders = array();
+ if ( ( $fp = fopen( $fileName, 'r' ) ) !== false ) {
+ // get first line to use as headers
+ $fileHeaders = fgetcsv( $fp, SELF::CSV_CHARS_PER_LINE, ',' );
+ fclose( $fp );
+ }
+
+ return $fileHeaders;
+ }
+}
diff --git a/models/admin/management/fields.php b/models/admin/management/fields.php
new file mode 100644
index 0000000..cc22962
--- /dev/null
+++ b/models/admin/management/fields.php
@@ -0,0 +1,228 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release fields.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+// Load Management Fields data abstract
+require_once GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_CLASS_PATH.'/data/dataCustomFields.php';
+
+/**
+ * GlmMembersAdmin_management_fields
+ *
+ * PHP version 5
+ *
+ * @category Model
+ * @package GLM Member DB
+ * @author Chuck Scott
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: packaging.php,v 1.0 2011/01/25 19:31:47 cscott
+ * Exp $
+ */
+class GlmMembersAdmin_management_fields extends GlmDataFieldsCustomFields
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * dbh Postgres database connection
+ *
+ * @var mixed
+ * @access public
+ */
+ public $dbh;
+ /**
+ * settings used for the schema and tablenames
+ *
+ * @var mixed
+ * @access public
+ */
+ public $settings = array();
+ /**
+ * categories
+ *
+ * @var bool
+ * @access public
+ */
+ public $categories = array();
+ public $oldCatMap = array();
+ /**
+ * fields
+ *
+ * @var bool
+ * @access public
+ */
+ public $fields = array();
+ public $image_owner;
+
+ /**
+ * Constructor
+ *
+ * This contructor performs the work for this model. This model returns
+ * an array containing the following.
+ *
+ * 'status'
+ *
+ * True if successfull and false if there was a fatal failure.
+ *
+ * 'view'
+ *
+ * A suggested view name that the contoller should use instead of the
+ * default view for this model or false to indicate that the default view
+ * should be used.
+ *
+ * 'data'
+ *
+ * Data that the model is returning for use in merging with the view to
+ * produce output.
+ *
+ * @wpdb object WordPress database object
+ *
+ * @return array Array containing status, suggested view, and any data
+ */
+ public function __construct ($wpdb, $config)
+ {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ // Run constructor for members data class
+ parent::__construct(false, false);
+
+ }
+
+ /**
+ * modelAction
+ *
+ * @param bool $actionData
+ * @access public
+ * @return void
+ */
+ public function modelAction($actionData = false)
+ {
+ $glm_action = '';
+ $option = false;
+ $settings_updated = false;
+ $settings_update_error = false;
+ $custom_fields = false;
+ $haveCustomFields = false;
+ $where = ' TRUE ';
+
+ if (isset($_REQUEST['option2'])) {
+ $option = $_REQUEST['option2'];
+ }
+
+ if (isset($_GET['glm_action'])) {
+ $glm_action = $_GET['glm_action'];
+ }
+
+ // Check if a field ID is supplied
+ $id = 0;
+ if (isset($_REQUEST['id'])) {
+ $id = $_REQUEST['id']-0;
+ }
+
+ $uid = 0;
+
+ if (isset($actionData['uid'])) {
+ $uid = $actionData['uid'];
+ }
+
+ switch ($option) {
+
+ case 'addNew':
+ $this->insertEntry();
+ break;
+
+ case 'update':
+ if ($id > 0) {
+ $this->updateEntry($id);
+ }
+ break;
+
+ case 'delete':
+ if ($id > 0) {
+ $this->deleteEntry($id, true);
+
+ // Also delete any data entries
+ $this->wpdb->delete(
+ GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_DB_PREFIX . 'custom_field_data',
+ array( 'field_id' => $id )
+ );
+ }
+ break;
+
+ default:
+ // Make sure option is set if default
+ $option = 'list';
+
+ // Determine if current user can edit configurations
+ if (!current_user_can('glm_members_management')) {
+ return array(
+ 'status' => false,
+ 'menuItemRedirect' => 'error',
+ 'modelRedirect' => 'index',
+ 'view' => 'admin/error/index.html',
+ 'data' => array(
+ 'reason' => 'User does not have rights to make configuration changes.'
+ )
+ );
+ }
+
+ break;
+
+ }
+
+ $where .= " AND uid = '$uid' ";
+
+ // Get list of Custom Fields
+ $custom_fields = $this->getList( $where );
+ // echo "
+ Returns TRUE if Custom Fields Add-On is installed and active.
+
+
+
+
glm-member-db-customfields-nav
+
FILTER
+
$content, $tableName
+
+ Displays a tab to use for customer fields and will select the $tableName for display
+ when clicked. The $content parameter should be an empty string unless there is a
+ desire to put additional HTML code before the tab. The return will be HTML to
+ display a functional tab.
+
+ Note that such tabs will require the correct scripting to make them work as
+ is used for sub-tabs in our add-ons.
+
+
+
+
Fields Add/Delete/Edit
+
+
glm-members-customfields-edit
+
FILTER
+
$content, $uid
+
+ Return HTML for field add/delete/edit for the specified form ($uid).
+
+ The $content parameter should be an empty string when this filter is applied.
+ Any HTML returned from this filter will be appended to the supplied text.
+ If desired, HTML code may be provided to be included at the beginning of the
+ resulting string that's returned.
+
+
+ The $uid parameter is a text string that is a unique identifier for the the form that is to
+ be edited. This should include the slug of the plugin that is calling
+ for this form and a name or other identifier for the specific form. This might
+ typically be specified in the form of a slug with hyphens between the words.
+
+
+
+
Fields Use
+
+
glm-members-custom-fields-form
+
FILTER
+
$content, $uid, $id, $cfData
+
+ Displays a specific custom fields from to request user input.
+
+ The $content parameter should be an empty string when this filter is applied.
+ Any HTML returned from this filter will be appended to the supplied text.
+ If desired, HTML code may be provided to be included at the beginning of the
+ resulting string that's returned.
+
+
+ The $uid parameter is a text string that is a unique identifier for the the form that is to
+ be edited. This should include the slug of the plugin that is calling
+ for this form and a name or other identifier for the specific form. This might
+ typically be specified in the form of a slug with hyphens between the words.
+
+
+ The $id parameter is an INTEGER that is unique to this specific use of the form
+ specified by $uid. For example, if $uid points to a form with added fields to
+ be used along with the usual fields in a contact information form, the $id
+ parameter might be the 'id' field from the record containing the contact that's
+ being edited. Any results submitted will be stored along with this $id. If
+ this $uid and $id pair are used anywhere else, data submitted there will replace
+ the other uses of the same form and id.
+
+
+ The $cfData field is an array that contains field data to use as the default
+ when the form is displayed. This will usually come from a previous submission
+ of the form that failed due to a missing required field or other failure. This
+ permit re-displaying the form again with the data in it that the user attempted
+ to subit. The $cfData may also have information that will be used by the custom
+ fields add-on to format failed fields differently to show which need attention.
+ If This is an initial display of the form, simply provide FALSE. ??????
+
+
+
diff --git a/setup/permissions.php b/setup/permissions.php
new file mode 100644
index 0000000..68554ec
--- /dev/null
+++ b/setup/permissions.php
@@ -0,0 +1,53 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release permissions.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+
+/*
+ * Below are permission checks for various specific things in this add-on and
+ * elsewhere in the Member DB main plugin and add-ons.
+ *
+ * Each location where a permission might be required has an apply_filters()
+ * hook with a tag name that includes the plugin or add-on name, the menu,
+ * the action, and a name for the specific thing that needs permissions.
+ *
+ * This can be included in code or in a Smarty template used in these plugins.
+ * For example, to check permissions for the main Members menu and it's "index"
+ * action to see if a member search is permitted, the template includes the
+ * following code...
+ *
+ * {if $membersList && apply_filters('glm_members_permit_admin_members_index_member_search', true)}
+ * --- some template output ---
+ * {/if}
+ *
+ * In the case above, it's also checking to see if the members list even exists
+ * before checking the permissions. The default value of "true" in the hook ensures
+ * that the permission is granted if nothing has linked into the hook to say otherwise.
+ *
+ * Note that each add_filter() below first checks if the permission has already
+ * been retracted by prior hook. This requires all that are attached to the hook
+ * to permit the action.
+ *
+ * Of course any of these may test more than one capability if that's desired.
+ *
+ * Since we have capabilities that only exist if a particular add-on (such as Contacts)
+ * has been loaded and activated, it can be helpful to be able to test for a capability
+ * for the current user and permit some action if that capability doesn't exist. The
+ * main plugin therefore provides the following globally accessible function that will
+ * return true if the capability doesn't exist, otherwise it respects the capability.
+ *
+ * glmMembersUserCan('glm_members_edit_any_member', $permit);
+ *
+ * $permit is a boolean set before this function call for passing on permissions.
+*/
diff --git a/setup/rolesAndCapabilities.php b/setup/rolesAndCapabilities.php
new file mode 100644
index 0000000..0929d55
--- /dev/null
+++ b/setup/rolesAndCapabilities.php
@@ -0,0 +1,19 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release rolesAndPermissions.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+/**
+ * NOTE: This file is only included in the activate.php process.
+ * It is not regularly used during operation.
+ */
diff --git a/setup/shortcodes.php b/setup/shortcodes.php
new file mode 100644
index 0000000..9e6a1e6
--- /dev/null
+++ b/setup/shortcodes.php
@@ -0,0 +1,123 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release shortcodes.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+/*
+ * Array of short-code
+ *
+ * This array lists all of the short-codes available from the main
+ * member plugin and all add-ons that provide short-code features.
+ *
+ * This array is merged with the data from any registered add-ons
+ * providing short-code features. The plugin providing the short-code
+ * is designated in the 'plugin' elemeent.
+ *
+ * A shortcode is unique to a particular plugin. To provide additional
+ * data and features to a short-code, an add-on should use filters
+ * provided by the short-code to insert data into the template array,
+ * to insert additional format into the template, or to insert
+ * text directly into the completed template output.
+ *
+ * The "attributes" array is a list of available attributes for this
+ * shortcode and their default values. If a database table is provided,
+ * then the value for each attribute is a table column where we get
+ * the default value. If no table is provided, then the value for
+ * each attribute is the actual default value for that attribute.
+ * In the case that the data is taken from the database table, the
+ * "id" for the table entry where the data is stored is assumed to
+ * be 1.
+ *
+ * Note that if the value for a particular attribute is false, then
+ * it is not read from the database even if the table is specified
+ * but might be supplied at run-time as an attribute in the short-code.
+ * All attributes that might be specified in the shortcode must be
+ * listed in the 'attributes' array below. If an attribute is not
+ * specified here, it can't be read from the short-code.
+ *
+ * The following is an explanation of this array.
+ *
+ * array(
+ * '{shortcode-slug} => array(
+ * 'plugin' => '{plugin (add-on) slug}', // Identifies which plugin is providing the short-code
+ * 'menu' => '{menu name}', // Menu name in this context is simply where to find the action
+ * 'action' => '{shortcode action name}, // Action used to execute this shortcode
+ * 'table' => '{table prefix}{table name}', // Database table where default attribute values are stored
+ * 'attributes' => array( // An array of all shortcode attributes (options)
+ * '{attr name}' => '{field name}', // Available attribute names and the database field names with the default value
+ * ....
+ * ),
+ * ... additional short-codes
+ * )
+ *
+ * Shortcode descriptions sample
+ *
+ *
+ *
[glm-members-sample-shortcode]
+ *
+ *
+ * Displays something related to this add-on.
+ *
+ *
+ *
+ *
+ *
type="{types}"
+ *
+ * The "type" attribute is used to select the type of data to be displayed.
+ * Below is a list of available list types.
+ *
+ *
+ *
List Types
+ *
one
Type One
+ *
two
Type Two
+ *
+ *
+ *
+ *
+ */
+
+$glmMembersCustomFieldsShortcodes = array(
+ 'glm-members-fields-detail' => array(
+ 'plugin' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ 'menu' => 'fields',
+ 'action' => 'detail',
+ 'table' => false,
+ 'attributes' => array(
+ 'type' => 'all',
+ 'order' => 'title',
+ 'member' => false,
+ 'template' => false,
+ 'limit' => null,
+ 'featured' => null,
+ 'current' => null,
+ )
+ ),
+ 'glm-members-fields-list' => array(
+ 'plugin' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ 'menu' => 'fields',
+ 'action' => 'list',
+ 'table' => false,
+ 'attributes' => array(
+ 'type' => 'all',
+ 'order' => 'title',
+ 'member' => false,
+ 'template' => false,
+ 'limit' => null,
+ 'featured' => null,
+ 'current' => null,
+ )
+ ),
+);
+
+$glmMembersCustomFieldsShortcodesDescription = '';
+
diff --git a/setup/validActions.php b/setup/validActions.php
new file mode 100644
index 0000000..fac0518
--- /dev/null
+++ b/setup/validActions.php
@@ -0,0 +1,81 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release admin.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+/*
+ * Array of valid menu items and actions.
+ *
+ * The higher level elements are valid menu items. These correlate to
+ * actual menu or sub menu items that are hooks back to this controller
+ * class.
+ *
+ * The lower level items below each menu item are actions that may be specified
+ * by a "glmMembersAction" form field.
+ *
+ * The string after the action is the slug of the plugin where the model/view
+ * is to perform that action.
+ *
+ * This array is integrated into the valid actions array in the main GLM Member
+ * DB plugin when this plugin registers itself.
+ *
+ * EXAMPLE
+ *
+ * $glmMembersCustomFieldsAddOnValidActions = array(
+ * 'adminActions' => array(
+ * 'members' => array(
+ * 'sample' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ * ),
+ * 'sample' => array(
+ * 'index' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ * 'more' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ * ),
+ * 'info' => array(
+ * 'index' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG
+ * )
+ * ),
+ * 'frontActions' => array(
+ * 'sample' => array(
+ * 'list' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ * 'detail' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG
+ * )
+ * )
+ * );
+ *
+ *
+ *
+ *
+ */
+
+$glmMembersCustomFieldsAddOnValidActions = array(
+ 'adminActions' => array(
+ 'ajax' => array(
+ 'filterSearch' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ ),
+ 'entity' => array(
+ 'fields' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ ),
+ 'management' => array(
+ 'fields' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ ),
+ 'import' => array(
+ 'fields' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ ),
+ ),
+ 'frontActions' => array(
+ 'fields' => array(
+ 'list' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ 'detail' => GLM_MEMBERS_CUSTOMFIELDS_PLUGIN_SLUG,
+ ),
+ )
+);
diff --git a/uninstall.php b/uninstall.php
new file mode 100644
index 0000000..623bb56
--- /dev/null
+++ b/uninstall.php
@@ -0,0 +1,27 @@
+
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release admin.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link http://dev.gaslightmedia.com/
+ */
+
+// Check that we're being called by WordPress.
+if (!defined('ABSPATH')) {
+ die("Please do not call this code directly!");
+}
+
+//if uninstall not called from WordPress exit
+if (!defined('WP_UNINSTALL_PLUGIN')) {
+ die("Sorry, uninstall must be called by WordPress!");
+}
diff --git a/views/admin/entity/fields.html b/views/admin/entity/fields.html
new file mode 100644
index 0000000..2c69862
--- /dev/null
+++ b/views/admin/entity/fields.html
@@ -0,0 +1,38 @@
+
+
+
+
diff --git a/views/admin/readme.txt b/views/admin/readme.txt
new file mode 100644
index 0000000..5a9d7ea
--- /dev/null
+++ b/views/admin/readme.txt
@@ -0,0 +1,5 @@
+The admin controller uses views (templates) under this directory to generate final output.
+
+Typically you should add a directory here that matches the page where the view is used.
+
+Under that directory place the view (template) for the various actions.
\ No newline at end of file
diff --git a/views/front/fields/detail.html b/views/front/fields/detail.html
new file mode 100644
index 0000000..25b417d
--- /dev/null
+++ b/views/front/fields/detail.html
@@ -0,0 +1,19 @@
+
+{/foreach}
diff --git a/views/front/readme.txt b/views/front/readme.txt
new file mode 100644
index 0000000..1138d90
--- /dev/null
+++ b/views/front/readme.txt
@@ -0,0 +1,7 @@
+The front controller uses views (templates) under this directory to generate final output.
+
+Typically you should add a directory here that matches the category of actions that will use these views.
+
+Under that directory place the view (template) for the various actions.
+
+Views under this directory would normally be called due to processing of a shortcode.
\ No newline at end of file
--
2.17.1