From 55a52595d50bf125723159eb7149fa1f7a406f97 Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Fri, 18 Sep 2015 15:54:28 -0400 Subject: [PATCH] Added Old Member DB import --- classes/data/dataMemberInfo.php | 2 +- controllers/admin.php | 6 +- css/admin.css | 9 + lib/GlmDataAbstract/DataAbstract.php | 2 +- misc/notes.txt | 7 - models/admin/member/memberInfo.php | 16 +- models/admin/settings/import.php | 1097 +++++++++++++++++ views/admin/member/memberInfo.html | 27 +- views/admin/settings/header.html | 1 + views/admin/settings/import.html | 95 ++ views/admin/settings/import/readDatabase.html | 56 + 11 files changed, 1291 insertions(+), 27 deletions(-) create mode 100644 models/admin/settings/import.php create mode 100644 views/admin/settings/import.html create mode 100644 views/admin/settings/import/readDatabase.html diff --git a/classes/data/dataMemberInfo.php b/classes/data/dataMemberInfo.php index c1cadecd..a679a534 100644 --- a/classes/data/dataMemberInfo.php +++ b/classes/data/dataMemberInfo.php @@ -371,7 +371,7 @@ class GlmDataMemberInfo extends GlmDataAbstract public function entryPostProcessing($r, $a) { - // Only run these tests for 'l' (getList) or 'g' (getEntry) + // Only run these tests for 'l' (getList), 'g' (getEntry), 'e' (editEntry) if ($a != 'l' && $a != 'g' && $a != 'e') { return $r; } diff --git a/controllers/admin.php b/controllers/admin.php index 304fcb4b..969c6f70 100644 --- a/controllers/admin.php +++ b/controllers/admin.php @@ -58,7 +58,8 @@ $GLOBALS['glmMembersAdminValidActions'] = array( 'settings' => array( 'index', // General Options 'terms', // Terms and Phrases - 'development' + 'development', + 'import' // Import data ), 'shortcodes' => array( 'index' @@ -720,6 +721,8 @@ class glmMembersAdmin extends GlmPluginSupport // Check if there's been a model redirect request if ($results['modelRedirect']) { + $this->addNotice('
'.print_r($results,1).'
', 'DataBlock', 'Model Redirect'); + // Set the new model action $action = $results['modelRedirect']; @@ -768,6 +771,7 @@ class glmMembersAdmin extends GlmPluginSupport } // Loop again if there's a model redirect + } while ($modelRedirect); /* diff --git a/css/admin.css b/css/admin.css index a42055ea..ad75c1de 100644 --- a/css/admin.css +++ b/css/admin.css @@ -94,6 +94,9 @@ .glm-form-text-input-medium { width: 30em; } +.glm-form-text-input-medium-long { + width: 50em; +} .glm-form-textarea { width: 90%; } @@ -258,3 +261,9 @@ width: 70%; resize: none; } + +.glm-ol-selected +{ + font-weight: bold; + color: green; +} \ No newline at end of file diff --git a/lib/GlmDataAbstract/DataAbstract.php b/lib/GlmDataAbstract/DataAbstract.php index 69ec86fb..c6fe2e09 100755 --- a/lib/GlmDataAbstract/DataAbstract.php +++ b/lib/GlmDataAbstract/DataAbstract.php @@ -748,7 +748,7 @@ abstract class GlmDataAbstract } // If this is not a "new", then do these things - if ($op != 'n') { + if ($op != 'n' && isset($_REQUEST[$as])) { // Get selected - Pointers are treated as integers except that there's no min/max $in = $_REQUEST[$as]-0; diff --git a/misc/notes.txt b/misc/notes.txt index e248ef94..7ff9029b 100644 --- a/misc/notes.txt +++ b/misc/notes.txt @@ -1,15 +1,8 @@ Development Notes ----------------- - -**** NEED TO SOLVE ISSUES WITH AMENITIES NOT UPDATING CORRECTLY WHEN YOU ADD/DELETE THEM IN MEMBER INFO PAGE **** - Database Updates -* Added table settings_general -* Added table settings_terms -* ALTER TABLE wp_glm_members_images CHANGE pending status tinyint; -* alter table wp_2_glm_members_amenities change column facility_type ref_type integer; diff --git a/models/admin/member/memberInfo.php b/models/admin/member/memberInfo.php index ccfae2f6..0867b341 100644 --- a/models/admin/member/memberInfo.php +++ b/models/admin/member/memberInfo.php @@ -431,17 +431,19 @@ class GlmMembersAdmin_member_memberInfo extends GlmDataMemberInfo } // Have member info - // If we have member data + // If we have member info data if (is_array($this->memberInfo) && $this->memberInfo['status']) { // Say we do $this->haveMemberInfo = true; - // Also get any image gallery images - require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataImages.php'); - $Images = new GlmDataImages($this->wpdb, $this->config); - $this->imageGallery = $Images->getGallery($this->config['ref_type_numb']['MemberInfo'], $this->memberInfoID); - $this->haveImageGallery = ($this->imageGallery != false); + // Also, if this is not a create, get any image gallery images + if ($this->memberInfoID) { + require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataImages.php'); + $Images = new GlmDataImages($this->wpdb, $this->config); + $this->imageGallery = $Images->getGallery($this->config['ref_type_numb']['MemberInfo'], $this->memberInfoID); + $this->haveImageGallery = ($this->imageGallery != false); + } // Otherwise } else { @@ -520,9 +522,7 @@ class GlmMembersAdmin_member_memberInfo extends GlmDataMemberInfo $_REQUEST['city'] = $cID; } - } - } /* diff --git a/models/admin/settings/import.php b/models/admin/settings/import.php new file mode 100644 index 00000000..6cfecf59 --- /dev/null +++ b/models/admin/settings/import.php @@ -0,0 +1,1097 @@ + + * @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_settings_import +{ + + /** + * 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 ($actionData = false) + { + + $templateData = array(); + + $requestedView = false; + $failure = false; + + $option = ''; + + // If there has been a redirect + if ($actionData) { + + $templateData = $actionData; + $option = 'importSelect'; + + // Otherwise check the request for desired option + } elseif (isset($_REQUEST['option']) && $_REQUEST['option'] != '') { + + $option = $_REQUEST['option']; + + // Fall back to importSelect + } else { + + $option = 'importSelect'; + + } + + switch($option) { + + case 'importSelect': + + $requestedView = 'import.html'; + + break; + + case 'readDatabase': + + /* + * Check all input + */ + + // Check hostname + $dbServer = preg_replace("/[^a-zA-Z0-9\._-]+/", "", trim($_REQUEST['dbServer'])); + $templateData['dbServer'] = array('value' => $dbServer, 'problem' => false); + if (!$dbServer || $dbServer == '' || $dbServer != trim($_REQUEST['dbServer'])) { + $templateData['dbServer']['problem'] = 'Server name or IP address was not provided or contained invalid characters.'; + $failure = true; + } + + // Check database port # + $dbPort = preg_replace("/[^0-9]+/", "", trim($_REQUEST['dbPort'])); + $templateData['dbPort'] = array('value' => $dbPort, 'problem' => false); + if (!$dbPort || $dbPort == '' || $dbPort != trim($_REQUEST['dbPort'])) { + $templateData['dbPort']['problem'] = 'Server port was not provided or is not a valid nummber.'; + $failure = true; + } + + // Check database name + $dbName = preg_replace("/[^a-zA-Z0-9_]+/", "", trim($_REQUEST['dbName'])); + $templateData['dbName'] = array('value' => $dbName, 'problem' => false); + if (!$dbName || $dbName == '' || $dbName != trim($_REQUEST['dbName'])) { + $templateData['dbName']['problem'] = 'Database name was not provided or is not valid for Postgres.'; + $failure = true; + } + + // Check database user + $dbUser = preg_replace("/[^a-zA-Z0-9_]+/", "", trim($_REQUEST['dbUser'])); + $templateData['dbUser'] = array('value' => $dbUser, 'problem' => false); + if (!$dbUser || $dbUser == '' || $dbUser != trim($_REQUEST['dbUser'])) { + $templateData['dbUser']['problem'] = 'Database user was not provided or is not valid for Postgres.'; + $failure = true; + } + + // Check Image URL + $dbImageURL = filter_var($_REQUEST['dbImageURL'], FILTER_SANITIZE_URL); + $templateData['dbImageURL'] = array('value' => $dbImageURL, 'problem' => false); + if (!$dbImageURL || $dbImageURL == '' || $dbImageURL != trim($_REQUEST['dbImageURL'])) { + $templateData['dbImageURL']['problem'] = 'Image URL does not appear to be valid.'; + $failure = true; + } + + if ($failure) { + $templateData['genError'] = 'There was a problem with the database connection information you provided. See below for specific instructions.'; + } + + /* + * Determine if source database is sane + */ + + // Connect to database + if (!$failure) { + $connString = "host=$dbServer port=$dbPort dbname=$dbName user=$dbUser"; + $db = @pg_connect($connString); + if (!$db) { + + $err = error_get_last(); + $templateData['genError'] = 'There was a problem connecting to the database. The error message was...
'.$err['message']; + $failure = true; + + } + } + + // Determine if the members schema exists + if (!$failure) { + $sql = " + SELECT EXISTS + ( + SELECT 1 + FROM information_schema.schemata AS exists + WHERE schema_name = 'members' + ) AS isMembers + ;"; + $res = pg_query($db, $sql); + if (pg_fetch_result($res, 0, 'isMembers') == 'f') { + $templateData['genError'] = 'The "members" schema was not found! Is this the right database?'; + $failure = true; + } + } + + /* + * Load data from source database + */ + + // Attempt to get member base data + if (!$failure) { + $sql = " + SELECT * + FROM members.member + ORDER BY member_id + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any members listed in this database!'; + $failure = true; + } else { + $member = pg_fetch_all($res); + if (count($member) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading base member data, we did not receive the expected number of members! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } + } + } + + // Read in all amenities + if (!$failure) { + $sql = " + SELECT * + FROM members.amenity + ORDER BY amenity_name + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any cities listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading amenity data, we did not receive the expected number of amenities! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $amenity = array(); + + // Reprocess into array indexed by amenity_id + foreach ($tmp as $x) { + $amenity[$x['amenity_id']] = $x; + } + } + } + } + + // Read in member/amenity cross-reference table + if (!$failure) { + $sql = " + SELECT * + FROM members.member_amenity + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any member/amenity cross-reference entries listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading amenity data, we did not receive the expected number of amenities! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the ameities into an array indexed by amenity_id + $membAmen = array(); + + // Reprocess into array grouped by member with the main index the member ID + foreach ($tmp as $x) { + + // If member entry hasn't been created yet, add it now + if (!isset($membAmen[$x['member_id']])) { + $membAmen[$x['member_id']] = array(); + } + + $membAmen[$x['member_id']][] = $x; + } + } + } + } + + // Read in all credit card types + if (!$failure) { + $sql = " + SELECT * + FROM members.ccard_type + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any credit card types listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading credit card type data, we did not receive the expected number of credit card types! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $ccard = array(); + + // Reprocess into array indexed by ccard_type_id + foreach ($tmp as $x) { + $ccard[$x['ccard_type_id']] = $x; + } + } + } + } + + // Read in member/credit card cross-reference table + if (!$failure) { + $sql = " + SELECT * + FROM members.member_ccard_type + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any member/credit card cross-reference entries listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading member/credit card cross-reference data, we did not receive the expected number of entries! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $membCcard = array(); + + // Reprocess into array grouped by member with the main index the member ID + foreach ($tmp as $x) { + + // If member entry hasn't been created yet, add it now + if (!isset($membCcard[$x['member_id']])) { + $membCcard[$x['member_id']] = array(); + } + + $membCcard[$x['member_id']][] = $x; + } + } + } + } + + + // Read in all member categories + if (!$failure) { + $sql = " + SELECT * + FROM members.category + ORDER BY category_id + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any categories listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading category data, we did not receive the expected number of categories! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the categories into a higherarchical array + $category = array(); + + // Process top level categories first + foreach ($tmp as $x) { + + // If this is a top level category + if ($x['parent_id'] == 0) { + $category[$x['category_id']] = $x; + $category[$x['category_id']]['subcat'] = array(); + } + + } + + // Now process all sub-categories + reset($tmp); + foreach ($tmp as $x) { + + // If this is NOT a top level category + if ($x['parent_id'] > 0) { + + // Check if we have the requested parent as a top-level category + if (isset($category[$x['parent_id']])) { + $category[$x['parent_id']]['subcat'][$x['category_id']] = $x; + } else { + $templateData['genError'] = 'There is at least one sub-category that does not have a matching top-level parent! ('.$x['name'].')
+ This could be a third-level category. Perhaps we can handle this when we have time to work on this a bit.'; + $failure = true; + } + } + } + } + } + } + + // Read in member/Category cross-reference table + if (!$failure) { + $sql = " + SELECT * + FROM members.member_category + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any member/category cross-reference entries listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading category data, we did not receive the expected number of categories! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $membCat = array(); + + // Reprocess into array grouped by member with the main index the member ID + foreach ($tmp as $x) { + + // If member entry hasn't been created yet, add it now + if (!isset($membCat[$x['member_id']])) { + $membCat[$x['member_id']] = array(); + } + + $membCat[$x['member_id']][] = $x; + } + } + } + } + + + + // Read in all cities + if (!$failure) { + $sql = " + SELECT * + FROM members.city + ORDER BY city_name + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any cities listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading city data, we did not receive the expected number of cities! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $city = array(); + + // Reprocess into array indexed by city_id + foreach ($tmp as $x) { + $city[$x['city_id']] = $x; + } + } + } + } + + // Read in all states + if (!$failure) { + $sql = " + SELECT * + FROM members.state + ORDER BY state_name + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any states listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading state data, we did not receive the expected number of states! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $state = array(); + + // Reprocess into array indexed by state_id + foreach ($tmp as $x) { + $state[$x['state_id']] = $x; + } + } + } + } + + // Read in all regions + if (!$failure) { + $sql = " + SELECT * + FROM members.region + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any regions listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading region data, we did not receive the expected number of regions! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $region = array(); + + // Reprocess into array indexed by state_id + foreach ($tmp as $x) { + $region[$x['region_id']] = $x; + } + } + } + } + + + + // Read in all member photos for member image gallery + if (!$failure) { + $sql = " + SELECT * + FROM members.member_photos + ;"; + $res = pg_query($db, $sql); + $rows = pg_num_rows($res); + if ($rows == 0) { + $templateData['genError'] = 'There does not appear to be any member photos listed in this database!'; + $failure = true; + } else { + $tmp = pg_fetch_all($res); + if (count($tmp) != $rows) { + $notice = pg_last_notice($res); + $templateData['genError'] = 'While reading member photo data, we did not receive the expected number of member photos! '; + if ($notice) { + $templateData['genError'] .= 'Perhaps the following message will help.
'.$notice; + } + $failure = true; + } else { + + // Since there was no problem, we'll post-process the cities into an array indexed by city_id + $image = array(); + + // Reprocess into array grouped by member with the main index the member ID + foreach ($tmp as $x) { + + // If member entry hasn't been created yet, add it now + if (!isset($image[$x['member_id']])) { + $image[$x['member_id']] = array(); + } + + $image[$x['member_id']][] = $x; + } + } + } + } + + /* + * If requested, reset the database + */ + + // Reset database is Option is selected + if (!$failure && isset($_REQUEST['dbReset']) && $_REQUEST['dbReset'] == 'on') { + + // Get current db version + $dbVersion = GLM_MEMBERS_PLUGIN_DB_VERSION; + + // Reset the database + if (!$this->deleteDataTables($dbVersion)) { + glmMembersAdmin::addNotice('Unable to delete the database tables while resetting the database.
', 'AdminError'); + break; + } + if (!$this->createDataTables($dbVersion)) { + glmMembersAdmin::addNotice('Unable to create the database tables while resetting the database.
', 'AdminError'); + break; + } + + glmMembersAdmin::addNotice('Database tables have been reset in preparation importing members.
', 'AdminNotice'); + + // Delete Images + foreach( new RecursiveIteratorIterator( + + new RecursiveDirectoryIterator( GLM_MEMBERS_PLUGIN_IMAGES_PATH, FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ), + RecursiveIteratorIterator::CHILD_FIRST ) as $value ) { + if ($value->isFile()) { + unlink( $value ); + } + } + + } + + /* + * Start importing data + */ + + if (!$failure) { + + // Import Cities + while (list ($key, $val) = each ($city) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'cities', + array( + 'name' => $val['city_name'], + ), + array( + '%s', + ) + ); + $city[$key]['new_id'] = $this->wpdb->insert_id; + + } + + // Import Regions + while (list ($key, $val) = each ($region) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'regions', + array( + 'name' => $val['region_name'], + 'descr' => '', + 'short_descr' => '' + ), + array( + '%s', + '%s', + '%s' + ) + ); + $region[$key]['new_id'] = $this->wpdb->insert_id; + + } + + // Import Amenities + while (list ($key, $val) = each ($amenity) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'amenities', + array( + 'active' => true, + 'name' => $val['amenity_name'], + 'descr' => '', + 'short_descr' => '', + 'ref_type' => $this->config['ref_type_numb']['MemberInfo'] + ), + array( + '%d', + '%s', + '%s', + '%s', + '%d' + ) + ); + $amenity[$key]['new_id'] = $this->wpdb->insert_id; + + } + + // Import Categories + $catTrans = array(); + while (list ($key, $val) = each ($category) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'categories', + array( + 'name' => $val['name'], + 'descr' => '', + 'short_descr' => '', + 'parent' => 0 + ), + array( + '%s', + '%s', + '%s', + '%d' + ) + ); + $newID = $this->wpdb->insert_id; + $category[$key]['new_id'] = $newID; + $category[$key]['new_parent'] = 0; + + $catTrans[$key] = array( + 'new' => $newID, + 'parent' => 0 + ); + + // Do any sub-cats for this category + while (list ($key2, $val2) = each ($val['subcat']) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'categories', + array( + 'name' => $val2['name'], + 'descr' => '', + 'short_descr' => '', + 'parent' => $category[$key]['new_id'] + ), + array( + '%s', + '%s', + '%s', + '%d' + ) + ); + $newID2 = $this->wpdb->insert_id; + $category[$key]['subcat'][$key2]['new_id'] = $newID; + $category[$key]['subcat'][$key2]['new_parent'] = $category[$key]['new_id']; + + $catTrans[$key2] = array( + 'new' => $newID2, + 'parent' => $newID + ); + + } + } + + + + // Index Credit Card types - Match to card types in configuration + while (list ($key, $val) = each ($ccard) ) { + reset($this->config['credit_card_numb']); + while (list ($key2, $val2) = each ($this->config['credit_card_numb']) ) { + if (substr($val['ccard_type_name'], 0, 3) == substr(($key2), 0, 3)) { + $ccard[$key]['bitpos'] = $val2; + } + } + } + + /* + * Create Defaults Not Provided By Old Member DB + */ + + // Member Types + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'member_type', + array( + 'name' => 'Default', + 'descr' => '', + ), + array( + '%s', + '%s', + ) + ); + $defaultMemberType = $this->wpdb->insert_id; + + /* + * Now Start Adding Members + */ + + // Import Members + while (list ($key, $val) = each ($member) ) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'members', + array( + 'access' => $this->config['memb_access_numb']['Full'], + 'member_type' => $defaultMemberType, + 'created' => date('Y-m-d'), + 'name' => $val['member_name'] + ), + array( + '%d', + '%d', + '%s', + '%s' + ) + ); + $membID = $this->wpdb->insert_id; + $member[$key]['new_id'] = $membID; + + // Create truncated short_descr from descritions - Less tags, html encoded characters, newlines, tabs, etc. + $stripped = str_replace(PHP_EOL, '', preg_replace('/\t+/', '', preg_replace("/&#?[a-z0-9]{2,8};/i", "", strip_tags($val['description'])))); + $short_descr = implode(' ', array_slice(explode(' ', $stripped), 0, 30)); + if (strlen($short_descr) < strlen($stripped)) { + $short_descr .= ' ...'; + } + + // Build Credit Card bitmap + $ccBits = 0; + if (isset($membCcard[$val['member_id']])) { + foreach ($membCcard[$val['member_id']] as $c) { + $b = $ccard[$c['ccard_type_id']]['bitpos']; + $ccBits += pow(2, $b); + } + } + + // Insert Member Information Record + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'member_info', + array( + 'member' => $membID, + 'member_name' => $val['member_name'], + 'status' => $this->config['status_numb']['Active'], + 'reference_name' => 'Imported Membmer Information', + 'descr' => $val['description'], + 'short_descr' => $short_descr, + 'addr1' => $val['street'], + 'addr2' => '', + 'city' => $city[$val['city_id']]['new_id'], + 'state' => $state[$val['state_id']]['state_abb'], + 'country' => 'US', + 'zip' => $val['zip'], + 'lat' => $val['lat'], + 'lon' => $val['lon'], + 'region' => (isset($region[$val['region']]) ? $region[$val['region']]['new_id'] : 0), + 'phone' => $val['phone'], + 'toll_free' => $val['toll_free'], + 'url' => $val['url'], + 'email' => $val['process_email'], + 'logo' => '', + 'cc_type' => $ccBits, + 'notes' => '', + 'create_time' => $val['create_date'], + 'modify_time' => $val['last_update'] + ), + array( + '%d', + '%s', + '%d', + '%s', + '%s', + '%s', + '%s', + '%s', + '%d', + '%s', + '%s', + '%s', + '%f', + '%f', + '%d', + '%s', + '%s', + '%s', + '%s', + '%s', + '%d', + '%s', + '%s', + '%s' + ) + ); + $mID = $this->wpdb->insert_id; + $member[$key]['new_id'] = $mID; + + // Add Member Categories + if (isset($membCat[$val['member_id']])) { + foreach ($membCat[$val['member_id']] as $c) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'category_member_info', + array( + 'category' => $catTrans[$c['category_id']]['new'], + 'member_info' => $mID + ), + array( + '%d', + '%d' + ) + ); + + } + } + + // Add Member Amenities + if (isset($membAmen[$val['member_id']])) { + foreach ($membAmen[$val['member_id']] as $a) { + + $res = $this->wpdb->insert( + GLM_MEMBERS_PLUGIN_DB_PREFIX.'amenity_ref', + array( + 'amenity' => $amenity[$a['amenity_id']]['new_id'], + 'ref_type' => $this->config['ref_type_numb']['MemberInfo'], + 'ref_dest' => $mID + ), + array( + '%d', + '%d', + '%d' + ) + ); + + } + } + + + } + + // Import + + } + + // If everything is OK, make data available to the template + if (!$failure) { + $templateData['member'] = $member; + $templateData['defaultMemberType'] = $defaultMemberType; + $templateData['amenity'] = $amenity; + $templateData['membAmen'] = $membAmen; + $templateData['category'] = $category; + $templateData['membCat'] = $membCat; + $templateData['catTrans'] = $catTrans; + $templateData['city'] = $city; + $templateData['state'] = $state; + $templateData['region'] = $region; + $templateData['ccard'] = $ccard; + $templateData['membCcard'] = $membCcard; + $templateData['image'] = $image; + } + + + if ($failure) { + return array( + 'status' => true, + 'menuItemRedirect' => 'settings', + 'modelRedirect' => 'import', + 'view' => 'admin/settings/import.html', + 'data' => $templateData + ); + + } + + $requestedView = 'import/readDatabase.html'; + + break; + + default: + + break; + + } + + // Return status, suggested view, and data to controller + return array( + 'status' => true, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/settings/'.$requestedView, + 'data' => $templateData + ); + + } + + /* + * Delete Members Database Tables + * + * @param string $dbVersion Current version of Members Database + * + * @return boolean + * @access public + */ + public function deleteDataTables($dbVersion) + { + + // 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); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('Dropping all database tables', 'Process'); + glmMembersAdmin::addNotice($sql, 'DataBlock', 'Drop Tables SQL'); + } + + // Removing the tables using the script + $this->wpdb->query($sql); + + // If there's been an error, display in debug Alert + $queryError = $this->wpdb->last_error; + if ($queryError) { + glmMembersAdmin::addNotice('Error when deleting database: Database tables may not have existed.
Check following message.
'.$queryError, 'AdminError'); + } + + return true; + + } + + /* + * Create Members Database Tables + * + * @param string $dbVersion Current version of Members Database + * + * @return boolean + * @access public + */ + public function createDataTables($dbVersion) + { + + // 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 + $qForDebug = ''; + do { + $q = current($queries); + $this->wpdb->query($q); + $queryError = $this->wpdb->last_error; + + if ($queryError) { + glmMembersAdmin::addNotice('Error when creating database: Database tables may already exist.
Check following message.
'.$queryError, 'AdminError'); + return false; + } + $qForDebug .= $queryError.$q; + + } while ($queryError == '' && next($queries)); + + if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) { + glmMembersAdmin::addNotice('Creating database tables', 'Process'); + glmMembersAdmin::addNotice($qForDebug, 'DataBlock', 'Create Tables SQL'); + } + + return true; + + } + +} + +?> \ No newline at end of file diff --git a/views/admin/member/memberInfo.html b/views/admin/member/memberInfo.html index 87ce81a0..da67855b 100644 --- a/views/admin/member/memberInfo.html +++ b/views/admin/member/memberInfo.html @@ -6,7 +6,7 @@ - {if $memberInfo} + {if $memberInfoID && $memberInfo}
Archive this Member Information
@@ -29,7 +29,7 @@
- {if $memberInfo} + {if $memberInfoID && $memberInfo} @@ -47,7 +47,7 @@ Member Type: {$member.member_type.name} - {if $memberInfo} + {if $memberInfoID && $memberInfo} Access: {$member.access.name} @@ -58,14 +58,14 @@ {/if}   - {if $memberInfo} + {if $memberInfoID && $memberInfo} Created: {$memberInfo.fieldData.create_time.datetime} Last Updated: - {$memberInfo.fieldData.modify_time.datetime} + {if isset($create_time)}{$memberInfo.fieldData.modify_time.datetime}{/if} {/if} Member Info Status: @@ -157,6 +157,7 @@    Select a category to add to box below.
- {if $memberInfo.fieldData.categories} + + {if isset($memberInfo.fieldData.categories) && $memberInfo.fieldData.categories} {foreach from=$memberInfo.fieldData.categories item=c}
{if $c.parent_name != ''}{$c.parent_name}: {/if}{$c.name} @@ -297,7 +299,7 @@ {/if}    Select an amenity to add to box below.
- {if $memberInfo.fieldData.amenities} + {if isset($memberInfo.fieldData.amenities) && $memberInfo.fieldData.amenities} {foreach from=$memberInfo.fieldData.amenities item=c}
{$c.name} @@ -406,6 +408,8 @@ Image Gallery + + {if $memberInfoID}
@@ -505,6 +509,11 @@ {/foreach} {/if}
+ {else} + Note: Images may only be added to member information records that have been created. + You are editing information to create a new record. +
After you click "Add new member" below, you may come back here to add images to the gallery. + {/if} @@ -768,7 +777,7 @@ $( "#largeLogoDialog" ).dialog( "option", "width", newWidth ); }); - {if $memberInfo} + {if $memberInfoID && $memberInfo} // Delete Member Info dialog $("#deleteMemberInfoDialog").dialog({ autoOpen: false, @@ -780,7 +789,7 @@ }); $('#deleteMemberInfoCancel').click( function() { $("#deleteMemberInfoDialog").dialog("close"); - }); + }); $('#deleteMemberInfoSubmit').click( function() { window.location.replace("{$thisURL}?page={$thisPage}&glm_action=index&member={$memberID}&deleteID={$memberInfo.fieldData.id}"); }); diff --git a/views/admin/settings/header.html b/views/admin/settings/header.html index fdf136d4..10ae4a53 100644 --- a/views/admin/settings/header.html +++ b/views/admin/settings/header.html @@ -6,6 +6,7 @@ General Settings Terms and Phrases Development + Data Import
\ No newline at end of file diff --git a/views/admin/settings/import.html b/views/admin/settings/import.html new file mode 100644 index 00000000..c05d239b --- /dev/null +++ b/views/admin/settings/import.html @@ -0,0 +1,95 @@ +{include file='admin/settings/header.html'} + +

Note: Customers will not have access to this tab.

+ +

Data Import

+

+ This process export data from a legacy Gaslight Media Member DB database and imports that data into this plugin. It will only work with a Postgres database. + The process will include the following steps. +

+
    +
  1. Provide information on the legacy database from which we'll be extracting data.
  2. +
  3. Test that database to make sure it's compatible with this process.
  4. +
  5. Read the needed data from the legacy database.
  6. +
  7. Review the extracted data to make sure it looks like the data you want to import.
  8. +
  9. Import the extracted data into is plugin
  10. +
  11. Review resulst
  12. +
+ + +

Data Import Step 1

+{if isset($genError)} +

+

Oops!

+

{$genError}

+

+{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Database Server: + + {if isset($dbServer)} +

{$dbServer.problem}

+ {/if} +
Database Port #: + + {if isset($dbPort)} +

{$dbPort.problem}

+ {/if} +
Database Name: + + {if isset($dbName)} +

{$dbName.problem}

+ {/if} +
Database User: + + {if isset($dbUser)} +

{$dbUser.problem}

+ {/if} +
Base Original Image URL: + + {if isset($dbImageURL)} +

{$dbImageURL.problem}

+ {/if} +
Reset Database Before Import: + +
NOTE: Selecting this option will remove all existing data from the Member database! +
If you do not select this option, the new data will be added to the database and there will be no attempt to match up imported data with the existing data. +
+ + + + + + +{include file='admin/footer.html'} diff --git a/views/admin/settings/import/readDatabase.html b/views/admin/settings/import/readDatabase.html new file mode 100644 index 00000000..7fe5168d --- /dev/null +++ b/views/admin/settings/import/readDatabase.html @@ -0,0 +1,56 @@ +{include file='admin/settings/header.html'} + +

Note: Customers will not have access to this tab.

+ +

Data Import - Test Database

+
    +
  1. Provide information on the legacy database from which we'll be extracting data.
  2. +
  3. Test database to make sure it's compatible with this process.
  4. +
  5. Read the needed data from the legacy database.
  6. +
  7. Review the extracted data to make sure it looks like the data you want to import.
  8. +
  9. Import the extracted data into is plugin
  10. +
  11. Review resulst
  12. +
+ + +

Data Import Step 2

+{if isset($genError)} +

+

Oops!

+

{$genError}

+

+{/if} +
+ + + + + + + + + + + + + + + + + + + +
Database Server: + +
Database Name: + +
Database User: + +
+ + + +
+ + +{include file='admin/footer.html'} -- 2.17.1