From f51927fc426d7ccd2f07b410997bf05826e2fd4a Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Sun, 3 Apr 2016 01:42:19 -0400 Subject: [PATCH 01/18] v4.0.35 Add Admin Notifier after header.php In ZC 1.5.5, loading of JQuery is included in the includes/header.php file. As a result, previously loaded script may be overridden and made unusable/inactive. In order to load/activate additional features, applicable script must be loaded after the header.php file. This was identified in two locations on the ZC forum one in relation to design and operation of another plugin and another in relation to this one specifically. --- admin/easypopulate_4.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/admin/easypopulate_4.php b/admin/easypopulate_4.php index bd0a40f..ae5be43 100644 --- a/admin/easypopulate_4.php +++ b/admin/easypopulate_4.php @@ -1,5 +1,5 @@ - + notify('EP4_ZC155_AFTER_HEADER'); + ?>
From 76a0f997631d70d3fc913db8182ae63338f47cdd Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Sun, 3 Apr 2016 01:47:51 -0400 Subject: [PATCH 02/18] v4.0.35 changelog.txt Update Updated to include action/revision of v4.0.35. --- changelog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.txt b/changelog.txt index e4cb469..37509e7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -292,3 +292,7 @@ be properly formatted regex type expression. The UTF-8 version of the character was not properly formatted and no further action was taken on the variable (until now). This restores EP4 to its full functionality before attempting to make that improvement. +4.0.35 04/03/2016 Added an additional notifier to follow the loading of the admin's header.php file. The header.php + file also loads JQuery, such that if JQuery was loaded in an earlier notifier, it would be + overridden within the header.php file when JQuery is loaded without consideration of previous + loadings/presence. From 2a9945ceaef185f9a8f94feaa5a618bbe63a07e2 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Fri, 15 Apr 2016 10:56:16 -0400 Subject: [PATCH 03/18] Fallback to English language file Added a filecheck to the use of the session's language such that if the language's file doesn't exist to default to the English language. --- admin/easypopulate_4.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4.php b/admin/easypopulate_4.php index ae5be43..c9b663d 100644 --- a/admin/easypopulate_4.php +++ b/admin/easypopulate_4.php @@ -88,7 +88,7 @@ } // Current EP Version - Modded by mc12345678 after Chadd had done so much -$curver = $curver . ' - 04-03-2016' . $message; +$curver = $curver . ' - 04-15-2016' . $message; $display_output = ''; // results of import displayed after script run $ep_dltype = NULL; $ep_stack_sql_error = false; // function returns true on any 1 error, and notifies user of an error @@ -97,7 +97,12 @@ $zco_notifier->notify('EP4_START'); // Load language file(s) for main screen menu(s). -require(DIR_FS_ADMIN . DIR_WS_LANGUAGES . $_SESSION['language'] . '/easypopulate_4_menus.php'); +if(file_exists(DIR_FS_ADMIN . DIR_WS_LANGUAGES . $_SESSION['language'] . '/easypopulate_4_menus.php')) +{ + require(DIR_FS_ADMIN . DIR_WS_LANGUAGES . $_SESSION['language'] . '/easypopulate_4_menus.php'); +} else { + require(DIR_FS_ADMIN . DIR_WS_LANGUAGES . 'english' . '/easypopulate_4_menus.php'); +} // all mods go in this array as 'name' => 'true' if exist. eg $ep_supported_mods['psd'] => true means it exists. $ep_supported_mods = array(); From e30419a933342c8b43072413240c7613f865e85c Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Thu, 21 Apr 2016 08:36:14 -0400 Subject: [PATCH 04/18] Incorporate bindVars/sanitization into Basic Attributes import Queries were modified to either use/include bindVars to offer sanitization or variables were forced to be of type integer where such were supported. --- admin/easypopulate_4_attrib.php | 79 ++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/admin/easypopulate_4_attrib.php b/admin/easypopulate_4_attrib.php index e845e06..faecc72 100644 --- a/admin/easypopulate_4_attrib.php +++ b/admin/easypopulate_4_attrib.php @@ -1,5 +1,5 @@ bindVars($query, ':v_products_model', $v_products_model, 'string'); $result = ep_4_query($query); if (($ep_uses_mysqli ? mysqli_num_rows($result) : mysql_num_rows($result)) == 0) { // products_model is not in TABLE_PRODUCTS @@ -67,7 +68,9 @@ // HERE ==> language 1 is main key, and assumbed $l_id = 1; // temporary check - should this be the default language id? $query = "SELECT products_options_id, products_options_name FROM ".TABLE_PRODUCTS_OPTIONS." - WHERE products_options_name = '".$v_products_options_name[$l_id]."' AND language_id = '".$l_id."'"; + WHERE products_options_name = :v_products_options_name: AND language_id = :language_id:"; + $query = $db->bindVars($query, ':v_products_options_name:', $v_products_options_name[$l_id], 'string'); + $query = $db->bindVars($query, ':language_id:', $l_id, 'integer'); $result = ep_4_query($query); // insert new products_options_name @@ -88,7 +91,11 @@ $sql = "INSERT INTO ".TABLE_PRODUCTS_OPTIONS." (products_options_id, language_id, products_options_name, products_options_type) VALUES - ('$v_products_options_id', '".$l_id."', '".$v_products_options_name[$l_id]."', '".zen_db_input($v_products_options_type)."')"; + (:v_products_options_id:, :language_id:, :v_products_options_name:, :v_products_options_type:)"; + $sql = $db->bindVars($sql, ':v_products_options_id:', $v_products_options_id, 'integer'); + $sql = $db->bindVars($sql, ':language_id:', $l_id, 'integer'); + $sql = $db->bindVars($sql, ':v_products_options_name', $v_products_options_name[$l_id], 'string'); + $sql = $db->bindVars($sql, ':v_products_options_type', $v_products_options_type, 'integer'); $errorcheck = ep_4_query($sql); } $new_options_name++; @@ -141,9 +148,11 @@ .TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS." as a, " .TABLE_PRODUCTS_OPTIONS_VALUES." as b WHERE - a.products_options_id = '".$v_products_options_id."' AND + a.products_options_id = :v_products_options_id: AND a.products_options_values_id = b.products_options_values_id AND - b.products_options_values_name = '".$values_names_array[$l_id][$values_names_index]."'"; + b.products_options_values_name = :values_name:"; + $sql = $db->bindVars($sql, ':v_products_options_id:', $v_products_options_id, 'integer'); + $sql = $db->bindVars($sql, ':values_name:', $values_names_array[$l_id][$values_names_index], 'string'); $result4 = ep_4_query($sql); // if $result4 == 0, products_options_values_name not found @@ -158,10 +167,14 @@ products_options_values_name, products_options_values_sort_order) VALUES ( - '$products_options_values_id', - '".$l_id."', - '".$values_names_array[$l_id][$values_names_index]."', - '$products_options_values_sort_order')"; + :products_options_values_id:, + :language_id:, + :values_name:, + :products_options_values_sort_order:)"; + $sql = $db->bindVars($sql, ':products_options_values_id:', $products_options_values_id, 'integer'); + $sql = $db->bindVars($sql, ':language_id:', $l_id, 'integer'); + $sql = $db->bindVars($sql, ':values_name:', $values_names_array[$l_id][$values_names_index], 'string'); + $sql = $db->bindVars($sql, ':products_options_values_sort_order:', $products_options_values_sort_order, 'integer'); $errorcheck = ep_4_query($sql); } // foreach $new_options_values_name++; @@ -179,15 +192,16 @@ FROM " .TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS." WHERE - products_options_id = '".$v_products_options_id."' AND + products_options_id = :v_products_options_id: AND products_options_values_id = '0'"; + $sql5 = $db->bindVars($sql5, ':v_products_options_id:', $v_products_options_id, 'integer'); $result5 = ep_4_query($sql5); // if $result5 == 0, combination not found if (($ep_uses_mysqli ? mysqli_num_rows($result5) : mysql_num_rows($result5)) == 0) { // combination is not in TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS // insert new combination $errorcheck = ep_4_query("INSERT INTO ".TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS." (products_options_values_to_products_options_id, products_options_id, products_options_values_id) - VALUES('$products_options_values_to_products_options_id', '$v_products_options_id', '0')"); + VALUES(" . (int)$products_options_values_to_products_options_id . ", " . (int)$v_products_options_id . ", 0)"); } else { // duplicate entry, skip } } else { // add $products_options_values_id @@ -201,16 +215,18 @@ .TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS. " as a, " .TABLE_PRODUCTS_OPTIONS_VALUES. " as b WHERE - a.products_options_id = '".$v_products_options_id."' AND + a.products_options_id = :v_products_options_id: AND a.products_options_values_id = b.products_options_values_id AND - b.products_options_values_name = '".$values_names_array[$l_id][$values_names_index]."'"; + b.products_options_values_name = :values_name:"; + $sql5 = $db->bindVars($sql5, ':v_products_options_id', $v_products_options_id, 'integer'); + $sql5 = $db->bindVars($sql5, ':values_name:', $values_names_array[$l_id][$values_names_index], 'string'); $result5 = ep_4_query($sql5); // if $result5 == 0, combination not found if (($ep_uses_mysqli ? mysqli_fetch_array($result5) : mysql_num_rows($result5)) == 0) { // combination is not in TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS $errorcheck = ep_4_query("INSERT INTO ".TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS." (products_options_values_to_products_options_id, products_options_id, products_options_values_id) - VALUES('$products_options_values_to_products_options_id', '$v_products_options_id', '$products_options_values_id')"); + VALUES(" . (int)$products_options_values_to_products_options_id . ", " . (int)$v_products_options_id . ", " . (int)$products_options_values_id . ")"); } else { // duplicate entry, skip } } @@ -220,7 +236,7 @@ if (in_array($v_products_options_type, $exclude_array)) { // $errorcheck = ep_4_query("INSERT INTO ".TABLE_PRODUCTS_ATTRIBUTES." (products_id, options_id, options_values_id) - VALUES ('".$v_products_id."', '".$v_products_options_id."','0')"); + VALUES (".(int)$v_products_id.", ".(int)$v_products_options_id.",0)"); } else { $l_id = 1; // default first language is main key $sql5 = "SELECT @@ -232,9 +248,11 @@ .TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS. " as a, " .TABLE_PRODUCTS_OPTIONS_VALUES. " as b WHERE - a.products_options_id = '".$v_products_options_id."' AND + a.products_options_id = :v_products_options_id: AND a.products_options_values_id = b.products_options_values_id AND - b.products_options_values_name = '". $values_names_array[$l_id][$values_names_index]."'"; + b.products_options_values_name = :values_name:"; + $sql5 = $db->bindVars($sql5, ':v_products_options_id:', $v_products_options_id, 'integer'); + $sql5 = $db->bindVars($sql5, ':values_name:', $values_names_array[$l_id][$values_names_index], 'string'); $result5 = ep_4_query($sql5); $row5 = ($ep_uses_mysqli ? mysqli_fetch_array($result5) : mysql_fetch_array($result5)); @@ -247,23 +265,30 @@ $sql6 = "SELECT * FROM " .TABLE_PRODUCTS_ATTRIBUTES. " WHERE - products_id = '".$v_products_id."' AND - options_id = '".$v_products_options_id."' AND - options_values_id = '".$a_products_options_values_id."'"; + products_id = :v_products_id: AND + options_id = :v_products_options_id: AND + options_values_id = :a_products_options_values_id:"; + $sql6 = $db->bindVars($sql6, ':v_products_id:', $v_products_id, 'integer'); + $sql6 = $db->bindVars($sql6, ':v_products_options_id:', $v_products_options_id, 'integer'); + $sql6 = $db->bindVars($sql6, ':a_products_options_values_id:', $a_products_options_values_id, 'integer'); $result6 = ep_4_query($sql6); $row6 = ($ep_uses_mysqli ? mysqli_fetch_array($result6) : mysql_fetch_array($result6)); if (($ep_uses_mysqli ? mysqli_num_rows($result6) : mysql_num_rows($result6)) == 0) { $errorcheck = ep_4_query("INSERT INTO ".TABLE_PRODUCTS_ATTRIBUTES." (products_id, options_id, options_values_id) - VALUES ('".$v_products_id."', '".$v_products_options_id."','".$a_products_options_values_id."')"); + VALUES (".(int)$v_products_id.", ".(int)$v_products_options_id.",".(int)$a_products_options_values_id.")"); $table_products_attributes_update = 0; } else { // UPDATE $sql7 ="UPDATE ".TABLE_PRODUCTS_ATTRIBUTES." SET - products_options_sort_order ='".$values_names_index."' + products_options_sort_order = :values_names_index: WHERE - products_id = '".$v_products_id."' AND - options_id = '".$v_products_options_id."' AND - options_values_id = '".$a_products_options_values_id."'"; + products_id = :v_products_id: AND + options_id = :v_products_options_id: AND + options_values_id = :a_products_options_values_id:"; + $sql7 = $db->bindVars($sql7, ':values_names_index:', $values_names_index, 'integer'); + $sql7 = $db->bindVars($sql7, ':v_products_id:', $v_products_id, 'integer'); + $sql7 = $db->bindVars($sql7, ':v_products_options_id:', $v_products_options_id, 'integer'); + $sql7 = $db->bindVars($sql7, ':a_products_options_values_id:', $a_productsion_options_values_id, 'integer'); $errorcheck = ep_4_query($sql7); $table_products_attributes_update = 1; } @@ -300,4 +325,4 @@ } // END: if } // END: while #2 } // END: while #1 -?> \ No newline at end of file +?> From 88a0e058fecd17c438aa8959c00e8d66c0de2f04 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Fri, 22 Apr 2016 15:39:31 -0400 Subject: [PATCH 05/18] Account for system not having mb_strlen available Import code was designed to detect string length by multibyte comparison. Systems that don't have mb_ related functions active/installed could not successfully import without this functionality. Added the ability to detect string length by "normal" means (strlen) if the mb_strlen function did not exist on the system. --- admin/easypopulate_4_import.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index ed29d1f..54bc459 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -947,7 +947,7 @@ if (isset($filelayout['v_products_name_' . $l_id])) { // do for each language in our upload file if exist // check products name length and display warning on error, but still process record $v_products_name[$l_id] = ep_4_curly_quotes($items[$filelayout['v_products_name_' . $l_id]]); - if (mb_strlen($v_products_name[$l_id]) > $products_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_products_name[$l_id]) > $products_name_max_len) || (!function_exists('mb_strlen') && strlen($v_products_name[$l_id]) > $products_name_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_PRODUCTS_NAME_LONG, $v_products_model, $v_products_name[$l_id], $products_name_max_len); $ep_warning_count++; } @@ -976,7 +976,7 @@ if (isset($filelayout['v_products_url_' . $l_id])) { // do for each language in our upload file if exist $v_products_url[$l_id] = $items[$filelayout['v_products_url_' . $l_id]]; // check products url length and display warning on error, but still process record - if (mb_strlen($v_products_url[$l_id]) > $products_url_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_products_url[$l_id]) > $products_url_max_len) || (!function_exists('mb_strlen') && strlen($v_products_url[$l_id]) > $products_url_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_PRODUCTS_URL_LONG, $v_products_model, $v_products_url[$l_id], $products_url_max_len); $ep_warning_count++; } @@ -1043,7 +1043,7 @@ } // check size of v_products_model, loop on error - if (mb_strlen($v_products_model) > $products_model_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_products_model) > $products_model_max_len) || (!function_exists('mb_strlen') && strlen($v_products_model) > $products_model_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_PRODUCTS_MODEL_LONG, $v_products_model, $products_model_max_len); $ep_error_count++; continue; // short-circuit on error @@ -1051,7 +1051,7 @@ // BEGIN: Manufacturer's Name // convert the manufacturer's name into id's for the database - if (isset($v_manufacturers_name) && ($v_manufacturers_name != '') && (mb_strlen($v_manufacturers_name) <= $manufacturers_name_max_len)) { + if (isset($v_manufacturers_name) && ($v_manufacturers_name != '') && ((function_exists('mb_strlen') && mb_strlen($v_manufacturers_name) <= $manufacturers_name_max_len) || (!function_exists('mb_strlen') && strlen($v_manufacturers_name) <= $manufacturers_name_max_len))) { $sql = "SELECT man.manufacturers_id AS manID FROM " . TABLE_MANUFACTURERS . " AS man WHERE man.manufacturers_name = :manufacturers_name: LIMIT 1"; $sql = $db->bindVars($sql, ':manufacturers_name:', $v_manufacturers_name, 'string'); @@ -1084,7 +1084,7 @@ } } } else { // $v_manufacturers_name == '' or name length violation - if (mb_strlen($v_manufacturers_name) > $manufacturers_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_manufacturers_name) > $manufacturers_name_max_len) || (!function_exists('mb_strlen') && strlen($v_manufacturers_name) > $manufacturers_name_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_MANUFACTURER_NAME_LONG, $v_manufacturers_name, $manufacturers_name_max_len); $ep_error_count++; continue; @@ -1116,7 +1116,7 @@ // check category names for length violation. abort on error if ($categories_count[$lang['id']] > 0) { // only check $categories_name_max_len if $categories_count[$lang['id']] > 0 for ($category_index = 0; $category_index < $categories_count[$lang['id']]; $category_index++) { - if (mb_strlen($categories_names_array[$lang['id']][$category_index]) > $categories_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($categories_names_array[$lang['id']][$category_index]) > $categories_name_max_len) || (!function_exists('mb_strlen') && strlen($categories_names_array[$lang['id']][$category_index]))) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_CATEGORY_NAME_LONG, ${$chosen_key}, $categories_names_array[$lang['id']][$category_index], $categories_name_max_len); $ep_error_count++; continue 3; // skip to next record @@ -1256,7 +1256,7 @@ // HERE ==========================> // BEGIN: record_artists if (isset($filelayout['v_artists_name'])) { - if (isset($v_artists_name) && ($v_artists_name != '') && (mb_strlen($v_artists_name) <= $artists_name_max_len)) { + if (isset($v_artists_name) && ($v_artists_name != '') && ((function_exists('mb_strlen') && mb_strlen($v_artists_name) <= $artists_name_max_len) || (!function_exists('mb_strlen') && strlen($v_artists_name) <= $artists_name_max_len))) { $sql = "SELECT artists_id AS artistsID FROM " . TABLE_RECORD_ARTISTS . " WHERE artists_name = :artists_name: LIMIT 1"; $sql = $db->bindVars($sql, ':artists_name:', ep_4_curly_quotes($v_artists_name), 'string'); $result = ep_4_query($sql); @@ -1326,7 +1326,7 @@ } } } else { // $v_artists_name == '' or name length violation - if (mb_strlen($v_artists_name) > $artists_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_artists_name) > $artists_name_max_len) || (!function_exists('mb_strlen') && strlen($v_artists_name) > $artists_name_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_ARTISTS_NAME_LONG, $v_artists_name, $artists_name_max_len); $ep_error_count++; continue; @@ -1339,7 +1339,7 @@ // HERE ==========================> // BEGIN: record_company if (isset($filelayout['v_record_company_name'])) { - if (isset($v_record_company_name) && ($v_record_company_name != '') && (mb_strlen($v_record_company_name) <= $record_company_name_max_len)) { + if (isset($v_record_company_name) && ($v_record_company_name != '') && ((function_exists('mb_strlen') && mb_strlen($v_record_company_name) <= $record_company_name_max_len) || (!function_exists('mb_strlen') && strlen($v_record_company_name) <= $record_company_name_max_len))) { $sql = "SELECT record_company_id AS record_companyID FROM " . TABLE_RECORD_COMPANY . " WHERE record_company_name = :record_company_name: LIMIT 1"; $sql = $db->bindVars($sql, ':record_company_name:', ep_4_curly_quotes($v_record_company_name), 'string'); $result = ep_4_query($sql); @@ -1395,7 +1395,7 @@ } } } else { // $v_record_company_name == '' or name length violation - if (mb_strlen($v_record_company_name) > $record_company_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_record_company_name) > $record_company_name_max_len) || (!function_exists('mb_strlen') && strlen($v_record_company_name) > $record_company_name_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_RECORD_COMPANY_NAME_LONG, $v_record_company_name, $record_company_name_max_len); $ep_error_count++; continue; @@ -1408,7 +1408,7 @@ // HERE ==========================> // BEGIN: music_genre if (isset($filelayout['v_music_genre_name'])) { - if (isset($v_music_genre_name) && ($v_music_genre_name != '') && (mb_strlen($v_music_genre_name) <= $music_genre_name_max_len)) { + if (isset($v_music_genre_name) && ($v_music_genre_name != '') && ((function_exists('mb_strlen') && mb_strlen($v_music_genre_name) <= $music_genre_name_max_len) || (!function_exists('mb_strlen') && strlen($v_music_genre_name) <= $music_genre_name_max_len))) { $sql = "SELECT music_genre_id AS music_genreID FROM " . TABLE_MUSIC_GENRE . " WHERE music_genre_name = :music_genre_name: LIMIT 1"; $sql = $db->bindVars($sql, ':music_genre_name:', $v_music_genre_name, 'string'); $result = ep_4_query($sql); @@ -1425,7 +1425,7 @@ $v_music_genre_id = ($ep_uses_mysqli ? mysqli_insert_id($db->link) : mysql_insert_id()); // id is auto_increment } } else { // $v_music_genre_name == '' or name length violation - if (mb_strlen($v_music_genre_name) > $music_genre_name_max_len) { + if ((function_exists('mb_strlen') && mb_strlen($v_music_genre_name) > $music_genre_name_max_len) || (!function_exists('mb_strlen') && strlen($v_music_genre_name) > $music_genre_name_max_len)) { $display_output .= sprintf(EASYPOPULATE_4_DISPLAY_RESULT_MUSIC_GENRE_NAME_LONG, $v_music_genre_name, $music_genre_name_max_len); $ep_error_count++; continue; From 1b24980b557c2808b70ee5545ba8bd10bb1b590d Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Mon, 25 Apr 2016 10:29:32 -0400 Subject: [PATCH 06/18] Provide a non-zero date on featured import of blank dates. This commit will set the available and expire dates for featured product to the ZC standard of '0001-01-01' for each of these fields not imported instead of '0000-00-00'. There remains other issues with import of featured product to address. Such as, the several conditions permitted by ZC for a product to remain active as a featured product. --- admin/easypopulate_4_import.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index 54bc459..784d04f 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -149,8 +149,16 @@ if ($row2 = ($ep_uses_mysqli ? mysqli_fetch_array($result2) : mysql_fetch_array($result2))) { // update featured product $v_featured_id = $row2['featured_id']; $v_today = strtotime(date("Y-m-d")); - $v_expires_date = $items[$filelayout['v_expires_date']]; - $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; + if (isset($filelayout['v_expires_date'])) { + $v_expires_date = $items[$filelayout['v_expires_date']]; + } else { + $v_expires_date = '0001-01-01'; + } + if (isset($filelayout['v_featured_date_available'])) { + $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; + } else { + $v_featured_date_available = '0001-01-01'; + } if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date))) { $v_status = 1; $v_date_status_change = date("Y-m-d"); From e9f3e1de7bb3104d285e25d19b38f09932f19005 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 06:25:03 -0400 Subject: [PATCH 07/18] Ensure that featured dates are established to standard Forces the uploaded dates for featured product to either be '0001-01-01' if the entered value is less than or equal to this (blank, 0, 0000-00-00, etc..) or is set to the value uploaded if that value is greater than '0001-01-01'. This does not ensure that the information is entered in the correct date sequence or is at all a date. Import of a non-date will be identified in the SQL command, exchange of MM and DD may go unnoticed, but could also show an incorrect result after import. --- admin/easypopulate_4_import.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index 784d04f..e7612e6 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -149,12 +149,12 @@ if ($row2 = ($ep_uses_mysqli ? mysqli_fetch_array($result2) : mysql_fetch_array($result2))) { // update featured product $v_featured_id = $row2['featured_id']; $v_today = strtotime(date("Y-m-d")); - if (isset($filelayout['v_expires_date'])) { + if (isset($filelayout['v_expires_date']) && $items[$filelayout['v_expires_date']] > '0001-01-01') { $v_expires_date = $items[$filelayout['v_expires_date']]; } else { $v_expires_date = '0001-01-01'; } - if (isset($filelayout['v_featured_date_available'])) { + if (isset($filelayout['v_featured_date_available']) && $items[$filelayout['v_featured_date_available']] > '0001-01-01') { $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; } else { $v_featured_date_available = '0001-01-01'; From b3dfbf42ccbc7b242813818b3f22a7de03282761 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 07:00:30 -0400 Subject: [PATCH 08/18] Increase activation band of featured product and incorporate into featured insert Previously in order to activate featured product, at least the expiration date had to be entered otherwise, featured items would be deactivated, also there would be a problem with dates if the available date was blank or 0 on insert with more recent PHP versions. The span of dates has been increased such that automatically upon insert the status is set to active for the routine conditions that ZC already checks and for conditions that would be expected to set a featured product to be active. This does not however automatically set a product as active if the available and expire dates are empty or '0001-01-01'. That will need to be addressed by an admin switch as not everyone wants to have such an upload become automatically active. While this does change the span at which EP4 makes product active, it is also consistent with the ZC store's auto activate/disable. The other change made in this commit was duplicating the changes made to the update section into the insert section for featured product. Perhaps ideally in the future, much of this could be pulled out so that changes need only be made once, but perhaps others prefer this option. It would just be easier to maintain if they weren't treated separately. --- admin/easypopulate_4_import.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index e7612e6..2867ebc 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -159,7 +159,7 @@ } else { $v_featured_date_available = '0001-01-01'; } - if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date))) { + if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01')) { $v_status = 1; $v_date_status_change = date("Y-m-d"); } else { @@ -195,9 +195,17 @@ $max_featured_id = 1; } $v_today = strtotime(date("Y-m-d")); - $v_expires_date = $items[$filelayout['v_expires_date']]; - $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; - if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date))) { + if (isset($filelayout['v_expires_date']) && $items[$filelayout['v_expires_date']] > '0001-01-01') { + $v_expires_date = $items[$filelayout['v_expires_date']]; + } else { + $v_expires_date = '0001-01-01'; + } + if(isset($filelayout['v_featured_date_available']) && $items[$filelayout['v_featured_date_available']] > '0001-01-01') { + $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; + } else { + $v_featured_date_available = '0001-01-01'; + } + if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01')) { $v_status = 1; $v_date_status_change = date("Y-m-d"); } else { From 7cbe61a3dea65c5471a2adaa7b678c77c8a880ed Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 08:26:22 -0400 Subject: [PATCH 09/18] Add configuration option to default blank featured product as active Adds a configuration option that defaults to true for import of featured product to be active if essentially the imported available and expiry dates are both "empty". --- .../functions/extra_functions/easypopulate_4_functions.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/admin/includes/functions/extra_functions/easypopulate_4_functions.php b/admin/includes/functions/extra_functions/easypopulate_4_functions.php index e051744..ab6c0d5 100644 --- a/admin/includes/functions/extra_functions/easypopulate_4_functions.php +++ b/admin/includes/functions/extra_functions/easypopulate_4_functions.php @@ -536,6 +536,7 @@ function install_easypopulate_4() { ('Verbose Feedback', 'EASYPOPULATE_4_CONFIG_VERBOSE', 'true', 'When importing, report all messages. Set to false for only warnings and errors. (default: true).', ".$group_id.", '70', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Show all EP4 Filetypes with Files', 'EP4_SHOW_ALL_FILETYPES', 'true', 'When looking at the EP4 Tools screen, should the filename prefix for all specific file types be displayed for all possible file types (true [default]), should only the method(s) that will be used to process the files present be displayed (false), or should there be no assistance be provided on filenaming on the main page (Hidden) like it was until this feature was added? (true, false, or Hidden)', ".$group_id.", '80', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\", \"Hidden\"),'), ('Replace Blank Image', 'EP4_REPLACE_BLANK_IMAGE', 'false', 'On import, if the image information is blank, then update the image path to the path of the blank image (true)? Otherwise the image path will remain blank (false ).

false (Default)
true.', ".$group_id.", '90', NULL, now(), NULL, 'zen_cfg_select_option(array(\'false\', \'true\'),'), + ('Activate Blank Featured', 'EP4_ACTIVATE_BLANK_FEATURED', 'true', 'On import, if the available date and expiry date are both blank, 0, 0001-01-01, or not imported, should the featured product be made automatically active?
(yes=true or no=false)
(Default: yes)', ".$group_id.", '95', NULL, now(), NULL, 'zen_cfg_select_option(array(\'false\', \'true\'),'), ('Make Zero Qty Products Inactive', 'EASYPOPULATE_4_CONFIG_ZERO_QTY_INACTIVE', 'false', 'When uploading, make the status Inactive for products with zero qty (default: false).', ".$group_id.", '100', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Smart Tags Replacement of Newlines', 'EASYPOPULATE_4_CONFIG_SMART_TAGS', 'true', 'Allows your description fields in your uploads file to have carriage returns and/or new-lines converted to HTML line-breaks on uploading, thus preserving some rudimentary formatting - Note: this legacy code is disabled until further review. (default: true).', ".$group_id.", '110', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Advanced Smart Tags', 'EASYPOPULATE_4_CONFIG_ADV_SMART_TAGS', 'false', 'Allow the use of complex regular expressions to format descriptions, making headings bold, add bullets, etc. Note: legacy code is disabled until further review. (default: false).', ".$group_id.", '120', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), @@ -570,6 +571,7 @@ function install_easypopulate_4() { ('Verbose Feedback', 'EASYPOPULATE_4_CONFIG_VERBOSE', 'true', 'When importing, report all messages. Set to false for only warnings and errors. (default: true).', ".$group_id.", '70', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Show all EP4 Filetypes with Files', 'EP4_SHOW_ALL_FILETYPES', 'true', 'When looking at the EP4 Tools screen, should the filename prefix for all specific file types be displayed for all possible file types (true [default]), should only the method(s) that will be used to process the files present be displayed (false), or should there be no assistance be provided on filenaming on the main page (Hidden) like it was until this feature was added? (true, false, or Hidden)', ".$group_id.", '80', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\", \"Hidden\"),'), ('Replace Blank Image', 'EP4_REPLACE_BLANK_IMAGE', 'false', 'On import, if the image information is blank, then update the image path to the path of the blank image (true)? Otherwise the image path will remain blank (false ).

false (Default)
true.', ".$group_id.", '90', NULL, now(), NULL, 'zen_cfg_select_option(array(\'false\', \'true\'),'), + ('Activate Blank Featured', 'EP4_ACTIVATE_BLANK_FEATURED', 'true', 'On import, if the available date and expiry date are both blank, 0, 0001-01-01, or not imported, should the featured product be made automatically active?
(yes=true or no=false)
(Default: yes)', ".$group_id.", '95', NULL, now(), NULL, 'zen_cfg_select_options(array(\'false\', \'true\'),'), ('Make Zero Qty Products Inactive', 'EASYPOPULATE_4_CONFIG_ZERO_QTY_INACTIVE', 'false', 'When uploading, make the status Inactive for products with zero qty (default: false).', ".$group_id.", '100', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Smart Tags Replacement of Newlines', 'EASYPOPULATE_4_CONFIG_SMART_TAGS', 'true', 'Allows your description fields in your uploads file to have carriage returns and/or new-lines converted to HTML line-breaks on uploading, thus preserving some rudimentary formatting - Note: this legacy code is disabled until further review. (default: true).', ".$group_id.", '110', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), ('Advanced Smart Tags', 'EASYPOPULATE_4_CONFIG_ADV_SMART_TAGS', 'false', 'Allow the use of complex regular expressions to format descriptions, making headings bold, add bullets, etc. Note: legacy code is disabled until further review. (default: false).', ".$group_id.", '120', NULL, now(), NULL, 'zen_cfg_select_option(array(\"true\", \"false\"),'), From b4f012966527176c2d0044dd0d0f9ea2b9b9700b Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 08:33:34 -0400 Subject: [PATCH 10/18] Correct bitwise and for logical and The following line of code; `// if products has been added before, do not change, else use current time stamp $v_date_added = ($v_date_added == true & $v_date_added > "0001-01-01") ? date("Y-m-d H:i:s", strtotime($v_date_added)) : "CURRENT_TIMESTAMP";` performed a bitwise comparison instead of logical comparison. In this situation it does not impact the result because both sides of the comparison are Boolean, therefore true & true is true, any combination involving false would evaluate as false as expected. It is though an inconsistency to be addressed. --- admin/easypopulate_4_import.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index 2867ebc..e0fb704 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -1031,7 +1031,7 @@ $v_date_avail = ($v_date_avail == true && $v_date_avail > "0001-01-01") ? date("Y-m-d H:i:s", strtotime($v_date_avail)) : "NULL"; // if products has been added before, do not change, else use current time stamp - $v_date_added = ($v_date_added == true & $v_date_added > "0001-01-01") ? date("Y-m-d H:i:s", strtotime($v_date_added)) : "CURRENT_TIMESTAMP"; + $v_date_added = ($v_date_added == true && $v_date_added > "0001-01-01") ? date("Y-m-d H:i:s", strtotime($v_date_added)) : "CURRENT_TIMESTAMP"; // default the stock if they spec'd it or if it's blank // $v_db_status = '1'; // default to active From 2aba58b653563bbb8f1b0722bab9da5453dd651c Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 08:41:46 -0400 Subject: [PATCH 11/18] Implement active featured product on import when blank Added the key that was generated in the functions install file so that if the key is present in the system then it will identify if "empty" product ought to be active feature products upon import or if the constant is not defined then it will default to true of importing featured product and making them active upon upload if the available and expiry dates are "empty". --- admin/easypopulate_4_import.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index e0fb704..ab95ee6 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -159,7 +159,7 @@ } else { $v_featured_date_available = '0001-01-01'; } - if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01')) { + if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01') || ($v_featured_date_available == '0001-01-01' && $v_expires_date == '0001-01-01' && (defined('EP4_ACTIVATE_BLANK_FEATURED') ? EP4_ACTIVATE_BLANK_FEATURED : true))) { $v_status = 1; $v_date_status_change = date("Y-m-d"); } else { @@ -205,7 +205,7 @@ } else { $v_featured_date_available = '0001-01-01'; } - if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01')) { + if (($v_today >= strtotime($v_featured_date_available)) && ($v_today < strtotime($v_expires_date)) || ($v_today >= strtotime($v_featured_date_available) && $v_featured_date_available != '0001-01-01' && $v_expires_date == '0001-01-01') || ($v_featured_date_available == '0001-01-01' && $v_expires_date == '0001-01-01' && (defined('EP4_ACTIVATE_BLANK_FEATURED') ? EP4_ACTIVATE_BLANK_FEATURED : true))) { $v_status = 1; $v_date_status_change = date("Y-m-d"); } else { From 49f733e35e86f21599e54b0e7e455c7988c88e62 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Tue, 26 Apr 2016 10:07:50 -0400 Subject: [PATCH 12/18] Version Update Update the version number to 4.0.35 --- admin/easypopulate_4_import.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index ab95ee6..5bb5c80 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -1,5 +1,5 @@ Date: Tue, 26 Apr 2016 10:08:37 -0400 Subject: [PATCH 13/18] Version Update Update file version to 4.0.35. --- .../functions/extra_functions/easypopulate_4_functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/includes/functions/extra_functions/easypopulate_4_functions.php b/admin/includes/functions/extra_functions/easypopulate_4_functions.php index ab6c0d5..86a8508 100644 --- a/admin/includes/functions/extra_functions/easypopulate_4_functions.php +++ b/admin/includes/functions/extra_functions/easypopulate_4_functions.php @@ -1,5 +1,5 @@ Date: Wed, 27 Apr 2016 21:41:26 -0400 Subject: [PATCH 14/18] Restored import update of the user defined fields. Thanks to a report in the forum and detailed troubleshooting this issue was discovered and corrected. It is now possible to update the products_model field if the primary key is not the products_model. This was expected/intended to be possible; however, apparently it was only implemented in the insert function not the update. Conflicts: admin/easypopulate_4_import.php --- admin/easypopulate_4_import.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index 5bb5c80..a3534f2 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -1,5 +1,5 @@ 0) { foreach ($custom_fields as $field) { $value = 'v_' . $field; - if ($filelayout[$value]) { + if (isset($filelayout[$value])) { $query .= ":field: = :value:, "; $query = $db->bindVars($query, ':field:', $field, 'noquotestring'); $query = $db->bindVars($query, ':value:', ${$value}, 'string'); @@ -1720,6 +1724,7 @@ metatags_price_status = :metatags_price_status:, metatags_title_tagline_status = :metatags_title_tagline_status: WHERE (products_id = :products_id:)"; + $query = $db->bindVars($query, ':products_model:', $v_products_model , 'string'); $query = $db->bindVars($query, ':products_price:', $v_products_price , 'currency'); $query = $db->bindVars($query, ':products_price_uom:', $v_products_price_uom , 'currency'); $query = $db->bindVars($query, ':products_upc:', $v_products_upc, 'string'); From d24f4dec7b438877aebd0837d88811a931fea12c Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Thu, 28 Apr 2016 21:21:55 -0400 Subject: [PATCH 15/18] Correct the use of mb_split where the function doesn't exist. Not all systems have the multi-byte plugin installed and therefore some of the UTF-8 related functions in EP4 would not work. In order to provide the maximum support, functionality is maintained but through the use of explode instead. There is also one formatting correction. --- admin/easypopulate_4_import.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index a3534f2..7603697 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -200,7 +200,7 @@ } else { $v_expires_date = '0001-01-01'; } - if(isset($filelayout['v_featured_date_available']) && $items[$filelayout['v_featured_date_available']] > '0001-01-01') { + if (isset($filelayout['v_featured_date_available']) && $items[$filelayout['v_featured_date_available']] > '0001-01-01') { $v_featured_date_available = $items[$filelayout['v_featured_date_available']]; } else { $v_featured_date_available = '0001-01-01'; @@ -1122,10 +1122,13 @@ $categories_delimiter = $category_delimiter; // add this to configuration variables // get all defined categories foreach ($langcode as $key => $lang) { + if (!function_exists('mb_split')) { // iso-8859-1 - // $categories_names_array[$lang['id']] = explode($categories_delimiter,$items[$filelayout['v_categories_name_'.$lang['id']]]); + $categories_names_array[$lang['id']] = explode($categories_delimiter,$items[$filelayout['v_categories_name_'.$lang['id']]]); + } else { // utf-8 - $categories_names_array[$lang['id']] = mb_split(preg_quote($categories_delimiter), $items[$filelayout['v_categories_name_' . $lang['id']]]); + $categories_names_array[$lang['id']] = mb_split(preg_quote($categories_delimiter), $items[$filelayout['v_categories_name_' . $lang['id']]]); + } // get the number of tokens in $categories_names_array[] $categories_count[$lang['id']] = count($categories_names_array[$lang['id']]); From 75894862a4077c3f0ba85d0b00a7922f98e8aed6 Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Wed, 27 Apr 2016 21:41:26 -0400 Subject: [PATCH 16/18] Restored import update of the user defined fields. Thanks to a report in the forum and detailed troubleshooting this issue was discovered and corrected. It is now possible to update the products_model field if the primary key is not the products_model. This was expected/intended to be possible; however, apparently it was only implemented in the insert function not the update. --- admin/easypopulate_4_import.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4_import.php b/admin/easypopulate_4_import.php index 54bc459..7e43ccc 100644 --- a/admin/easypopulate_4_import.php +++ b/admin/easypopulate_4_import.php @@ -1,5 +1,5 @@ 0) { foreach ($custom_fields as $field) { $value = 'v_' . $field; - if ($filelayout[$value]) { + if (isset($filelayout[$value])) { $query .= ":field: = :value:, "; $query = $db->bindVars($query, ':field:', $field, 'noquotestring'); $query = $db->bindVars($query, ':value:', ${$value}, 'string'); @@ -1704,6 +1708,7 @@ metatags_price_status = :metatags_price_status:, metatags_title_tagline_status = :metatags_title_tagline_status: WHERE (products_id = :products_id:)"; + $query = $db->bindVars($query, ':products_model:', $v_products_model , 'string'); $query = $db->bindVars($query, ':products_price:', $v_products_price , 'currency'); $query = $db->bindVars($query, ':products_price_uom:', $v_products_price_uom , 'currency'); $query = $db->bindVars($query, ':products_upc:', $v_products_upc, 'string'); From 6592084f73eac9bee3e862f7af754328d5d2f98f Mon Sep 17 00:00:00 2001 From: mc12345678 Date: Fri, 29 Apr 2016 23:53:31 -0400 Subject: [PATCH 17/18] Update version history and version main file version date. --- admin/easypopulate_4.php | 4 ++-- changelog.txt | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/admin/easypopulate_4.php b/admin/easypopulate_4.php index c9b663d..c17ae67 100644 --- a/admin/easypopulate_4.php +++ b/admin/easypopulate_4.php @@ -1,5 +1,5 @@ Date: Fri, 29 Apr 2016 23:58:26 -0400 Subject: [PATCH 18/18] Updated version number tracked by ZC to ensure notification would be made to those that downloaded a github version of the software while it was set to v4.0.35. --- admin/easypopulate_4.php | 4 ++-- changelog.txt | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/admin/easypopulate_4.php b/admin/easypopulate_4.php index c17ae67..3ddd2cd 100644 --- a/admin/easypopulate_4.php +++ b/admin/easypopulate_4.php @@ -1,5 +1,5 @@