From 4d74fb86cda7561b4489c963a1cf5b951749222e Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Tue, 18 Oct 2016 17:03:54 -0400 Subject: [PATCH] Added pseudo-random sort order to member list results. Still need to consider implementing paging. --- lib/GlmDataAbstract/DataAbstract.php | 459 +++++++++++++++++++------- lib/GlmDataAbstract/documentation.odt | Bin 38889 -> 30775 bytes models/front/members/list.php | 7 +- 3 files changed, 346 insertions(+), 120 deletions(-) diff --git a/lib/GlmDataAbstract/DataAbstract.php b/lib/GlmDataAbstract/DataAbstract.php index 3cbb754b..cc4ca085 100755 --- a/lib/GlmDataAbstract/DataAbstract.php +++ b/lib/GlmDataAbstract/DataAbstract.php @@ -129,28 +129,37 @@ abstract class GlmDataAbstract */ public $fieldPrefix = ''; /** - * Field processing for various field types + * Pseudo-Random Order Key Array - Used for Pseudo-Random database result lists * - * @var $f is field data + * @access private + */ + public $pseudoRandArray = false; + /** + * Pseudo-Random Order flag * - * @return void - * @access public + * @access private + */ + public $pseudoRand = false; + + + /* + * Field processing for various types of fields */ // Integer Field Processing - function integerField($f) + private function integerField($f) { return 'T.'.$f['field']; } - function integerOptions($f) + private function integerOptions($f) { return false; } - function integerOutput($f, $d) + private function integerOutput($f, $d) { return $d; } - function integerInput($as, $f, $id, $idfield, $op) + private function integerInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -227,7 +236,7 @@ abstract class GlmDataAbstract return $in; } - function integerStore($in, $f) + private function integerStore($in, $f) { return $in; } @@ -235,15 +244,15 @@ abstract class GlmDataAbstract /* * Float Field Processing */ - function floatField($f) + private function floatField($f) { return 'T.'.$f['field']; } - function floatOptions($f) + private function floatOptions($f) { return false; } - function floatOutput($f, $d) + private function floatOutput($f, $d) { // if a format is specified if (isset($f['output_format']) && $f['output_format']) { @@ -252,7 +261,7 @@ abstract class GlmDataAbstract return $d; } - function floatInput($as, $f, $id, $idfield, $op) + private function floatInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -336,7 +345,7 @@ abstract class GlmDataAbstract return $in; } - function floatStore($in, $f) + private function floatStore($in, $f) { return $in; } @@ -344,20 +353,20 @@ abstract class GlmDataAbstract /* * Money Field Processing */ - function moneyField($f) + private function moneyField($f) { return 'T.'.$f['field']; } - function moneyOptions($f) + private function moneyOptions($f) { return false; } - function moneyOutput($f, $d) + private function moneyOutput($f, $d) { return "$".sprintf("%01.2f", $d); ; } - function moneyInput($as, $f, $id, $idfield, $op) + private function moneyInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -434,7 +443,7 @@ abstract class GlmDataAbstract return $in; } - function moneyStore($in, $f) + private function moneyStore($in, $f) { return $in; } @@ -442,19 +451,19 @@ abstract class GlmDataAbstract /* * Percent Field Processing */ - function percentField($f) + private function percentField($f) { return 'T.'.$f['field']; } - function percentOptions($f) + private function percentOptions($f) { return false; } - function percentOutput($f, $d) + private function percentOutput($f, $d) { return $d; } - function percentInput($as, $f, $id, $idfield, $op) + private function percentInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -531,7 +540,7 @@ abstract class GlmDataAbstract return $in; } - function percentStore($in, $f) + private function percentStore($in, $f) { return $in; } @@ -539,11 +548,11 @@ abstract class GlmDataAbstract /* * Pointer Field Processing */ - function pointerField($f) + private function pointerField($f) { return 'T.'.$f['field']; } - function pointerOptions($f) + private function pointerOptions($f) { // Get ID field of other table - default to 'id' @@ -564,7 +573,7 @@ abstract class GlmDataAbstract return $options; } - function pointerOutput($f, $d, $forEdit = false, $id = false, $idfield = 'id') + private function pointerOutput($f, $d, $forEdit = false, $id = false, $idfield = 'id') { /* @@ -718,7 +727,7 @@ abstract class GlmDataAbstract return $d; } - function pointerInput($as, $f, $id, $idfield, $op) + private function pointerInput($as, $f, $id, $idfield, $op) { $this->inputFieldStatus = true; @@ -892,7 +901,7 @@ abstract class GlmDataAbstract return $r; } - function pointerStore($in, $f) + private function pointerStore($in, $f) { return $in['value']; } @@ -900,15 +909,15 @@ abstract class GlmDataAbstract /* * List Field Processing */ - function listField($f) + private function listField($f) { return 'T.'.$f['field']; } - function listOptions($f) + private function listOptions($f) { return false; } - function listOutput($f, $d, $forEdit, $id, $idfield, $op) + private function listOutput($f, $d, $forEdit, $id, $idfield, $op) { // Check for a list data @@ -971,7 +980,7 @@ abstract class GlmDataAbstract return $r; } - function listInput($as, $f, $id, $idField, $op) + private function listInput($as, $f, $id, $idField, $op) { // Check for a list data @@ -1054,7 +1063,7 @@ abstract class GlmDataAbstract return $r; } - function listStore($in, $f) + private function listStore($in, $f) { $keytype = 'text'; @@ -1075,15 +1084,15 @@ abstract class GlmDataAbstract /* * Bitmap List Field Processing */ - function bitmapField($f) + private function bitmapField($f) { return 'T.'.$f['field']; } - function bitmapOptions($f) + private function bitmapOptions($f) { return false; } - function bitmapOutput($f, $d) + private function bitmapOutput($f, $d) { // Check for a bitmap data if (!isset($f['bitmap']) || !is_array($f['bitmap'])) { @@ -1127,7 +1136,7 @@ abstract class GlmDataAbstract return $r; } - function bitmapInput($as, $f, $id, $idField, $op) + private function bitmapInput($as, $f, $id, $idField, $op) { // Check for a bitmap data @@ -1183,7 +1192,7 @@ abstract class GlmDataAbstract return $r; } - function bitmapStore($in, $f) + private function bitmapStore($in, $f) { $keytype = 'text'; @@ -1204,19 +1213,19 @@ abstract class GlmDataAbstract /* * Text Field Processing */ - function textField($f) + private function textField($f) { return 'T.'.$f['field']; } - function textOptions($f) + private function textOptions($f) { return false; } - function textOutput($f, $d) + private function textOutput($f, $d) { return $d; } - function textInput($as, $f, $id, $idField, $op) + private function textInput($as, $f, $id, $idField, $op) { // If this is setup for a new entry, then just return default value @@ -1321,7 +1330,7 @@ abstract class GlmDataAbstract return $in; } - function textStore($in, $f) + private function textStore($in, $f) { $r = "'".addslashes($in)."'"; return $r; @@ -1330,20 +1339,20 @@ abstract class GlmDataAbstract /* * Password Field Processing */ - function passwordField($f) + private function passwordField($f) { return 'T.'.$f['field']; } - function passwordOptions($f) + private function passwordOptions($f) { return false; } - function passwordOutput($f, $d) + private function passwordOutput($f, $d) { // No output for a password field return ''; } - function passwordInput($as, $f, $id, $idField, $op) + private function passwordInput($as, $f, $id, $idField, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -1427,7 +1436,7 @@ abstract class GlmDataAbstract return $c; } - function passwordStore($in, $f) + private function passwordStore($in, $f) { $r = "'".addslashes($in)."'"; return $r; @@ -1436,15 +1445,15 @@ abstract class GlmDataAbstract /* * Checkbox Field Processing */ - function checkboxField($f) + private function checkboxField($f) { return 'T.'.$f['field']; } - function checkboxOptions($f) + private function checkboxOptions($f) { return false; } - function checkboxOutput($f, $d) + private function checkboxOutput($f, $d) { $list = array( 0 => array( @@ -1479,7 +1488,7 @@ abstract class GlmDataAbstract return $r; } - function checkboxInput($as, $f, $x, $y, $op) + private function checkboxInput($as, $f, $x, $y, $op) { $list = array( 0 => array( @@ -1530,7 +1539,7 @@ abstract class GlmDataAbstract return $r; } - function checkboxStore($in, $f) + private function checkboxStore($in, $f) { if ($in['value']) { return "true"; @@ -1542,19 +1551,19 @@ abstract class GlmDataAbstract /* * E-Mail Field Procesing */ - function emailField($f) + private function emailField($f) { return 'T.'.$f['field']; } - function emailOptions($f) + private function emailOptions($f) { return false; } - function emailOutput($f, $d) + private function emailOutput($f, $d) { return $d; } - function emailInput($as, $f, $id, $idfield, $op) + private function emailInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -1611,7 +1620,7 @@ abstract class GlmDataAbstract return $in; } - function emailStore($in, $f) + private function emailStore($in, $f) { return "'".addslashes($in)."'"; } @@ -1619,15 +1628,15 @@ abstract class GlmDataAbstract /* * Date Field Processing */ - function dateField($f) + private function dateField($f) { return 'T.'.$f['field']; } - function dateOptions($f) + private function dateOptions($f) { return false; } - function dateOutput($f, $d, $forEdit) + private function dateOutput($f, $d, $forEdit) { // Check for min/max date values @@ -1684,7 +1693,7 @@ abstract class GlmDataAbstract return $out; } - function dateInput($as, $f, $id, $idfield, $op) + private function dateInput($as, $f, $id, $idfield, $op) { $this->inputFieldStatus = true; @@ -1824,7 +1833,7 @@ abstract class GlmDataAbstract return $v; } - function dateStore($in, $f) + private function dateStore($in, $f) { // Check if there's no date then supply null @@ -1844,7 +1853,7 @@ abstract class GlmDataAbstract * Time Field Processing */ // Support function to build picklists for Time field - function buildTimeFieldLists() + private function buildTimeFieldLists() { // Setup hour and minute pick lists $hour_list = array(); @@ -1871,15 +1880,15 @@ abstract class GlmDataAbstract return $time_list; } - function timeField($f) + private function timeField($f) { return 'T.'.$f['field']; } - function timeOptions($f) + private function timeOptions($f) { return false; } - function timeOutput($f, $d) + private function timeOutput($f, $d) { // Default values if no time returned $hour = 12; @@ -1928,7 +1937,7 @@ abstract class GlmDataAbstract return $r; } - function timeInput($as, $f, $id, $idfield, $op) + private function timeInput($as, $f, $id, $idfield, $op) { $this->inputFieldStatus = true; $hour = 12; @@ -2059,7 +2068,7 @@ abstract class GlmDataAbstract return $r; } - function timeStore($in, $f) + private function timeStore($in, $f) { return "'".$in['time_store']."'"; } @@ -2067,15 +2076,15 @@ abstract class GlmDataAbstract /* * datetime (date and time) Field Processing */ - function datetimeField($f) + private function datetimeField($f) { return 'T.'.$f['field']; } - function datetimeOptions($f) + private function datetimeOptions($f) { return false; } - function datetimeOutput($f, $d, $forEdit) + private function datetimeOutput($f, $d, $forEdit) { // Check for min/max date values @@ -2154,7 +2163,7 @@ abstract class GlmDataAbstract return $out; } - function datetimeInput($as, $f, $id, $idfield, $op) + private function datetimeInput($as, $f, $id, $idfield, $op) { $this->inputFieldStatus = true; @@ -2297,7 +2306,7 @@ abstract class GlmDataAbstract return $v; } - function datetimeStore($in, $f) + private function datetimeStore($in, $f) { // Check if there's no date then supply null @@ -2317,19 +2326,19 @@ abstract class GlmDataAbstract /* * Phone Field Processing */ - function phoneField($f) + private function phoneField($f) { return 'T.'.$f['field']; } - function phoneOptions($f) + private function phoneOptions($f) { return false; } - function phoneOutput($f, $d) + private function phoneOutput($f, $d) { return $d; } - function phoneInput($as, $f, $id, $idfield, $op) + private function phoneInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -2343,7 +2352,7 @@ abstract class GlmDataAbstract $in = $_REQUEST[$as]; return $in; } - function phoneStore($in, $f) + private function phoneStore($in, $f) { return "'".addslashes($in)."'"; } @@ -2351,19 +2360,19 @@ abstract class GlmDataAbstract /* * Image Field Processing */ - function imageField($f) + private function imageField($f) { return 'T.'.$f['field']; } - function imageOptions($f) + private function imageOptions($f) { return false; } - function imageOutput($f, $d) + private function imageOutput($f, $d) { return $d; } - function imageInput($as, $f, $id, $idfield, $op) + private function imageInput($as, $f, $id, $idfield, $op) { $new = false; @@ -2498,7 +2507,7 @@ abstract class GlmDataAbstract return $current_img; } - function imageStore($in, $f) + private function imageStore($in, $f) { return "'".addslashes($in)."'"; } @@ -2506,19 +2515,19 @@ abstract class GlmDataAbstract /* * Base64 Image Field Processing (for inline images) */ - function b64imageField($f) + private function b64imageField($f) { return 'T.'.$f['field']; } - function b64imageOptions($f) + private function b64imageOptions($f) { return false; } - function b64imageOutput($f, $d) + private function b64imageOutput($f, $d) { return $d; } - function b64imageInput($as, $f, $id, $idfield, $op) + private function b64imageInput($as, $f, $id, $idfield, $op) { $new = false; @@ -2556,7 +2565,7 @@ abstract class GlmDataAbstract return $b64image; } - function b64imageStore($in, $f) + private function b64imageStore($in, $f) { return "'".$in."'"; } @@ -2564,19 +2573,19 @@ abstract class GlmDataAbstract /* * File Field Processing */ - function fileField($f) + private function fileField($f) { return 'T.'.$f['field']; } - function fileOptions($f) + private function fileOptions($f) { return false; } - function fileOutput($f, $d) + private function fileOutput($f, $d) { return $d; } - function fileInput($as, $f, $id, $idfield, $op) + private function fileInput($as, $f, $id, $idfield, $op) { $new = false; @@ -2668,7 +2677,7 @@ abstract class GlmDataAbstract return $current_file; } - function fileStore($in, $f) + private function fileStore($in, $f) { return "'".addslashes($in)."'"; } @@ -2676,15 +2685,15 @@ abstract class GlmDataAbstract /* * latitude Field Processing */ - function latitudeField($f) + private function latitudeField($f) { return 'T.'.$f['field']; } - function latitudeOptions($f) + private function latitudeOptions($f) { return false; } - function latitudeOutput($f, $d) + private function latitudeOutput($f, $d) { $type = 'DMS'; if (isset($f['latlon_type'])) { @@ -2700,7 +2709,7 @@ abstract class GlmDataAbstract return $lat; } - function latitudeInput($as, $f, $id, $idfield, $op) + private function latitudeInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -2790,7 +2799,7 @@ abstract class GlmDataAbstract return $in; } - function latitudeStore($in, $f) + private function latitudeStore($in, $f) { // NOTE: input must be processed first. @@ -2803,15 +2812,15 @@ abstract class GlmDataAbstract /* * Longitude Field Processing */ - function longitudeField($f) + private function longitudeField($f) { return 'T.'.$f['field']; } - function longitudeOptions($f) + private function longitudeOptions($f) { return false; } - function longitudeOutput($f, $d) + private function longitudeOutput($f, $d) { $type = 'DMS'; @@ -2828,7 +2837,7 @@ abstract class GlmDataAbstract return $out; } - function longitudeInput($as, $f, $id, $idfield, $op) + private function longitudeInput($as, $f, $id, $idfield, $op) { // If this is setup for a new entry, then just return default value if ($op == 'n') { @@ -2918,7 +2927,7 @@ abstract class GlmDataAbstract return $in; } - function longitudeStore($in, $f) + private function longitudeStore($in, $f) { // NOTE: input must be processed first. // Need to convert to float degrees here @@ -2937,7 +2946,7 @@ abstract class GlmDataAbstract * @return void * @access public */ - public function buildFieldsList($op = 'l', $options = false, $defaults = false) + private function buildFieldsList($op = 'l', $options = false, $defaults = false) { $this->fieldData = array(); $this->select = ''; @@ -3033,7 +3042,7 @@ abstract class GlmDataAbstract * * @access public */ - public function processOutputData($data, $op = 'l', $forEdit = false, $id = false, $idfield = 'id') + private function processOutputData($data, $op = 'l', $forEdit = false, $id = false, $idfield = 'id') { if ($forEdit) { @@ -3117,7 +3126,7 @@ abstract class GlmDataAbstract * * @access public */ - public function processInputData($op = 'u', $id = false, $idField = false) + private function processInputData($op = 'u', $id = false, $idField = false) { // Status is good unless otherwise determined @@ -3242,6 +3251,9 @@ abstract class GlmDataAbstract * * @param string $where Optional WHERE clause for selection of entries. Defaults to all. * @param string $order Optional ORDER BY clause for sorting of results. + * Set to "pseudo-random" for Pseudo-Random sorting that uses a browser cookie + * to store a custom seed value so all results are in the same randomized order + * for some period of time. See genPseudoRandIdArray() and pseudoRandDataSort(). * @param boolean $fieldVals Optional flag requesting fields contain array of all possible values. * @param string $idField Optional name of ID field (primary index) to use for result array keys. * @@ -3256,24 +3268,64 @@ abstract class GlmDataAbstract // Get field specifications for this instance $this->buildFieldsList('l'); + // If pseudo random order is requested + $this->pseudoRand = false; + if ($order == 'pseudo-random') { + + // Set pseudo random flag and clear the order string + $this->pseudoRand = true; + $order = ''; + + } + + // If doing pseudo-random ordering, generate array of IDs in pseudo-random order + $idString = ''; + if ($this->pseudoRand) { + + $prSql = "SELECT $idField + FROM $this->table T + "; + if (trim($where) != '') { + $prSql .= "WHERE $where + "; + } + + $idList = $this->wpdb->get_results($prSql, ARRAY_A); + $prList = $this->genPseudoRandIdArray($idList, $start, $limit); + $idString = $prList['idString']; + + } + $sql = "SELECT $this->select FROM $this->table T + WHERE true "; if (trim($where != '')) { - $sql .= "WHERE $where + $sql .= "AND $where + "; + } + + // If there's a pseudo-random id list to use for results selection + if ($idString != '') { + $sql .= "AND T.$idField IN ($idString) "; } - if (trim($order != '')) { + if (!$this->pseudoRand && trim($order != '')) { $sql .= "ORDER BY $order "; } - // If $start and $limit, we're doing paging + // If $start and $limit, we're doing paging (pseudo-random does it's own paging) $paging = false; if ($start !== false && $limit > 0) { - $sql .= "limit ".($start-1).", $limit"; + + // If using pseudo-random, don't use the SQL limit. The pseudo-random code does it's own paging + if (!$this->pseudoRand) { + $sql .= "limit ".($start-1).", $limit"; + } + $paging = true; } @@ -3295,11 +3347,15 @@ abstract class GlmDataAbstract $newList[$v['id']] = $this->processOutputData($v, 'l'); } + // If pseudo-random, sort the list by $prList + if ($this->pseudoRand) { + $this->pseudoRandDataSort($prList, $newList); + } + if (is_admin() && GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE && class_exists('glmMembersAdmin')) { $this->addDataAbstractNotice($newList, 'DataBlock', "getList() data"); } - // If we're doing paging, return that data along with the list if ($paging) { $c = count($list); @@ -3824,7 +3880,7 @@ abstract class GlmDataAbstract } /* - * Convert fload degrees to N/S or E/W Lat/Lon as D, D M, or D M S + * Convert float degrees to N/S or E/W Lat/Lon as D, D M, or D M S * * @return array * text Text output of value @@ -3833,7 +3889,7 @@ abstract class GlmDataAbstract * min Minutes * sec Seconds */ - public function f2LatLon($d, $LatLon, $type, $precision) + private function f2LatLon($d, $LatLon, $type, $precision) { $sign = +1; @@ -3916,7 +3972,7 @@ abstract class GlmDataAbstract * * @return array */ - public function buildDateFieldLists($min, $max, $time = false) + private function buildDateFieldLists($min, $max, $time = false) { if (!$this->optionIncludeSelectListData) { @@ -3995,7 +4051,7 @@ abstract class GlmDataAbstract * @return object Class object * */ - public function addDataAbstractNotice ( $d1, $d2 = false, $d3 = false) + private function addDataAbstractNotice ( $d1, $d2 = false, $d3 = false) { if (is_admin() && GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE ) { @@ -4004,5 +4060,174 @@ abstract class GlmDataAbstract glmMembersFront::addNotice($d1, $d2, $d3); } } + + /** + * The following two functions are used to build pseudo-random list results with optional paging + */ + + /* + * Generate a list of ID's sorted in pseudo-random order from + * a supplied array of record IDs. + * + * This function checks for a browser cookie that is used to save + * the seed. If that seed exists and has not timed out, it is used. + * Otherwise a new seed is generated and stored into a browser cookie. + * + * This function is passed an array of all possible record IDs that have been + * retrieved by a query against some table. That query should use a specific + * sort order to ensure that the resulting list of IDs is sorted the same + * for each identical query. + * + * Optional start and page size values may be specified to have this function + * return a subset of the IDs for a particular page of pagenated results. + * + * The return from this function is an array of IDs for the desired pseudo- + * random results in the desired sequence (numerical keys in sequence). + * + * Use the PseudoRandArraysort() function to order any selected results that + * were generated using the ID list returned from this function. + * + * @param array $idList A simple array that's a list of record IDs + * in the order in which they were retrieved. + * @param int $start Optional start of page value for paging + * @param int $length Optional length of page value for paging + * (required if there is a $start value) + * @param string $idName Optional id field name to override default 'id' + * @param string $cookieName Optional name for seed cookie + * @param int $cookieTime Optional # of seconds for cookie timeout + * @param int $seed Optional seed value to use instead of using value from cookie + * + * @return array Array inluding the following... + * 'idString' A comma separated string to use for an "in" clause in + * a second SQL query to get the actual data. + * 'idArray' An array of IDs in the generated pseudo-random order + * + */ + private function genPseudoRandIdArray ($ids, $start = false, $length = false, $idName = 'id', $cookieName = 'GLM_PR_SEED', $cookieTime = 86400, $seed = false) + { + + $transientSeed = false; // Indicates if the function was passed a specific seed. These are not stored back into a browser cookie. + + // Change $ids array to simple array of ids + foreach ($ids as $k => $v) { + $ids[$k] = $v[$idName]; + } + + // if no id list is supplied + if (!is_array($ids) || count($ids) == 0) { + return false; + } + + // If a seed is supplied + if ($seed && is_int($seed)) { + + // Set flag so cookie is not updated with this seed. + $transientSeed = true; + + //Otherwise, use a browser cookie seed if available or generate a new one + } else { + + // Get browser cookie if it exists + if (isset($_COOKIE[$cookieName])) { + $seed = ($_COOKIE[$cookieName]); + } else { + + // Generate a new seed + $seed = intval(time()*1000000+microtime()*1000000); + + } + } + + // Enforce seed as positive integer + $seed = abs(intval($seed -0)); + + // If seed is somehow 0, return false + if ($seed == 0) { + return false; + } + + // If this is not a transient seed, store or updated it into the browser cookie. + if (!$transientSeed) { + setcookie($cookieName, $seed, time() + $cookieTime); + } + + // Use the seed to order the ID list - Note that shuffle() will produce the same results if strand() has the same seed. + srand($seed); + shuffle($ids); + + // If we have a start value + if ($start !== false) { + + // Enforce valid start + $start = abs(intval($start-0)); + + // Enforce length - Required with a $start value + $length = abs(intval($length-0)); + if ($length == 0) { + return false; + } + + // Get at max $length elements of the ID array starting with $start + $ids = array_slice($ids, $start, $length, true); + + + } + + // If paging, build comma separated string of id's for use as part of a "in" clause in an SQL query. + $idString = ''; + $newIdArray = array(); + if ($start !== false) { + $sep = ''; + foreach ($ids as $i) { + $idString .= $sep.$i; + $sep = ', '; + } + } + + return array('idString' => $idString, 'idArray' => $ids); + + } + + + /* + * Order a final data array by the sequence of results from genPseudoRandIdArray(). + * + * To use this function... + * + * * Query the database to get a list of record IDs only matching the desired result + * * Retrieve an ordered list of those IDs using genPseudoRandIdArray() + * * Query the database again for final results matching the list of IDs + * * Use this function to sort the final resuts by the generated order of IDs + * + * Note that the $data parameter is used by reference so as to not duplicate the full + * data array. This will modify the original array. + * + * @param array $idArray An array returned by genPseudoRandIdArray() + * @param array &$data A data array of final results to be ordered + * @param string $idName Optional id field name to override default 'id' + * + * @return boolean True if successful, otherwise false + * + */ + private function pseudoRandDataSort ($idList, &$data, $idName = 'id') + { + + $idFlip = array_flip($idList['idArray']); + + foreach($data as $k=>$v) { + $data[$k]['prSort'] = $idFlip[$v[$idName]]; + } + + uasort( $data, function($a, $b) { + if ($a['prSort'] == $b['prSort']) { + return 0; + } + return ($a['prSort'] < $b['prSort']) ? -1 : 1; + }); + + return true; + } + + } ?> \ No newline at end of file diff --git a/lib/GlmDataAbstract/documentation.odt b/lib/GlmDataAbstract/documentation.odt index b3d3b4178fb58eb96f9964e72f55e95837598157..330ff4445d01af30c86f0d76135912ea0531f3fa 100644 GIT binary patch literal 30775 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' AND '.$where, $alphaSelected); } - + /* * Check for which view file to use, else default to list */ @@ -552,8 +552,9 @@ class GlmMembersFront_members_list extends GlmDataMemberInfo // Get stats for the current selection $membersFound = $this->getStats(str_replace('T.', '', $where)); - // Get member list and sort - $list = $this->getList($where.$alphaWhere, 'member_name'); + // Get member list and sort - Currently using pseudo-random order + // $list = $this->getList($where.$alphaWhere, 'member_name'); + $list = $this->getList($where.$alphaWhere, 'pseudo-random'); if (GLM_MEMBERS_PLUGIN_FRONT_DEBUG) { glmMembersFront::addNotice($list, 'DataBlock', 'Member Data'); -- 2.17.1