Pseudo-random sort order for package list added
authorLaury GvR <laury@gaslightmedia.com>
Fri, 30 Mar 2018 15:25:40 +0000 (11:25 -0400)
committerLaury GvR <laury@gaslightmedia.com>
Fri, 30 Mar 2018 15:25:40 +0000 (11:25 -0400)
Pseudo-random sort ordering will order the list differently for
each session (not each page refresh) by using a random seed and a
cookie. The database now contains the package_list_order field,
and management for package list has a dropdown for this setting.

The default is still Alpha-Numeric, and the config values used are
the ones in the Member DB plugin.ini file.

classes/data/dataManagement.php
config/plugin.ini
index.php
models/front/packaging/list.php
setup/databaseScripts/create_database_V1.1.7.sql [deleted file]
setup/databaseScripts/create_database_V1.1.8.sql [new file with mode: 0644]
setup/databaseScripts/dbVersions.php
setup/databaseScripts/update_database_V1.1.8.sql [new file with mode: 0644]
views/admin/management/packaging.html

index aca0c49..dd2604d 100644 (file)
@@ -140,6 +140,18 @@ class GlmDataPackagingManagement extends GlmDataAbstract
                 'use'      => 'a',
             ),
 
+            // Front-end Listings - Member List Order
+            'package_list_order' => array(
+                'field' => 'package_list_order',
+                'type' => 'list',
+                'list' => $this->config['sort_order'],
+                'required' => true,
+                'default' => $this->config['sort_order_numb']['Alpha-Numeric'],
+                'force_list' => true,
+                'use' => 'a'
+            ),
+
             // Canonical Page Slug
             'canonical_package_page' => array (
                 'field'    => 'canonical_package_page',
index 8fdb6a8..4ab6699 100644 (file)
@@ -3,4 +3,4 @@
 ; Gaslight Media Members Database Packaging Add-On Plugin 
 ;
 
-[common]
+[common]
\ No newline at end of file
index f947d11..e025a13 100644 (file)
--- a/index.php
+++ b/index.php
@@ -44,7 +44,7 @@ if (!defined('ABSPATH')) {
  *  version from this plugin.
  */
 define('GLM_MEMBERS_PACKAGING_PLUGIN_VERSION', '1.2.18');
-define('GLM_MEMBERS_PACKAGING_PLUGIN_DB_VERSION', '1.1.7');
+define('GLM_MEMBERS_PACKAGING_PLUGIN_DB_VERSION', '1.1.8');
 
 // This is the minimum version of the GLM Members DB plugin require for this plugin.
 define('GLM_MEMBERS_PACKAGING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.9.15');
index 6718db4..e674f9b 100644 (file)
@@ -215,61 +215,66 @@ class GlmMembersFront_packaging_list extends GlmDataPackages
 
             // Drop the data organized by packages
             $packages = false;
-
-
-
-
-                /*
-                 * Sort members by pseudo-random sequence
-                 *
-                 * A management option in packaging will need to be created to select this
-                 * or "Sort by member name" below.
-                 *
-                 * *** THIS IS UNTESTED CODE ***
-                 *
-                 * WARNING: shuffle() will create new keys for the array!
-                 * The $members keys will no longer match the member IDs.
-                 * This should not be a problem, but be aware of it.
-                 *
-                 */
-
-            /*
-                $cookieName = 'GLM_PACKAGE_SORT_SEED';
-                $cookieTime = 86400;
-
-                // Get browser cookie if it exists or otherwise generate one
-                if (isset($_COOKIE[$cookieName])) {
-                    $seed = ($_COOKIE[$cookieName]);
-                } else {
-                    $seed = intval(time()*1000000+microtime()*1000000);
-                }
-
-                // Enforce seed as positive integer
-                $seed = abs(intval($seed -0));
-
-                // Store or update seed in browser cookie
-                setcookie($cookieName, $seed, time() + $cookieTime);
-
-                // Use the seed to order the Member list - Note that shuffle() will produce the same results if strand() has the same seed.
-                srand($seed);
-                shuffle($members);
-            */
-
-
-
-            // Sort by member name
-            reset( $members );
-            uasort(
-                $members,
-                function($a, $b) {
-                    if ( $a['member'] == $b['member'] ) {
-                        return 0;
+            
+            // Determine how to sort the package list
+            // The sort order config uses the one set up in Member DB plugin.ini
+            switch ($this->config['settings']['package_list_order']) {
+
+                // Pseudo-Random list order
+                case $this->config['sort_order_numb']['Pseudo-Random']:
+
+                    /*
+                     * Sort members by pseudo-random sequence
+                     *
+                     * WARNING: shuffle() will create new keys for the array!
+                     * The $members keys will no longer match the member IDs.
+                     * This should not be a problem, but be aware of it.
+                     *
+                     */
+                    $cookieName = 'GLM_PACKAGE_SORT_SEED';
+                    $cookieTime = 86400;
+
+                    // Get browser cookie if it exists or otherwise generate one
+                    if (isset($_COOKIE[$cookieName])) {
+                        $seed = ($_COOKIE[$cookieName]);
+                    } else {
+                        $seed = intval(time()*1000000+microtime()*1000000);
                     }
-                    return ( $a['member'] < $b['member'] ) ? -1 : 1;
-                }
-            );
 
+                    // Enforce seed as positive integer
+                    $seed = abs(intval($seed -0));
+
+                    // Store or update seed in browser cookie
+                    setcookie($cookieName, $seed, time() + $cookieTime);
+
+                    // Use the seed to order the Member list - Note that shuffle() will produce the same results if strand() has the same seed.
+                    srand($seed);
+                    shuffle($members);
+
+                    break;
+
+                // Default is alpha-numeric list order
+                default:
+                case $this->config['sort_order_numb']['Alpha-Numeric']:
+                    
+                    // Sort by member name
+                    reset( $members );
+                    uasort(
+                        $members,
+                        function($a, $b) {
+                            if ( $a['member'] == $b['member'] ) {
+                                return 0;
+                            }
+                            return ( $a['member'] < $b['member'] ) ? -1 : 1;
+                        }
+                    );
+
+                    break;
+                    
+            }
+            
             $byMember = true;
+
         }
 
         // Check for alternate template requests
diff --git a/setup/databaseScripts/create_database_V1.1.7.sql b/setup/databaseScripts/create_database_V1.1.7.sql
deleted file mode 100644 (file)
index 0ee81ee..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
--- Gaslight Media Members Database - Packaging
--- File Created: 12/02/15 15:27:15
--- Database Version: 1.1.6
--- Database Creation Script
---
--- To permit each query below to be executed separately,
--- all queries must be separated by a line with four dashes
-
--- Packages
-CREATE TABLE {prefix}packages (
-  id INT NOT NULL AUTO_INCREMENT,
-  active BOOLEAN NULL,                      -- Package is active
-  status INT NULL,                          -- Status for this package, see config['status']
-  title TINYTEXT NULL,                      -- Title of package
-  package_slug TINYTEXT NULL,               -- Package name slug for canonical URLs (lowercase, "-" for spaces, no punctuation)
-  offsite_url TINYTEXT NULL,                -- Url for the package list on the member's site
-  descr TEXT NULL,                          -- Description of package
-  short_descr TINYTEXT NULL,                -- Short description of package
-  image TINYTEXT NULL,                      -- Package image
-  start_date TIMESTAMP NULL,                -- Date display of this package starts
-  end_date TIMESTAMP NULL,                  -- Date display of this package ends (last date of display)
-  expire_date TIMESTAMP NULL,               -- Date package expires (first date it's expired)
-  position INT NULL,                        -- Display order position
-  pricing TINYTEXT NULL,                    -- Pricing, descriptive
-  ref_type INT NULL,                        -- Type of entity this package is associated with
-  ref_dest INT NULL,                        -- Pointer to the specific entity
-  PRIMARY KEY (id),
-  INDEX(ref_type),
-  INDEX(ref_dest),
-  INDEX(start_date),
-  INDEX(end_date),
-  INDEX(expire_date)
-);
-
-----
-
--- Package Elements - Items in a package
-CREATE TABLE {prefix}package_elements (
-  id INT NOT NULL AUTO_INCREMENT,
-  package INT NULL,                         -- Pointer to the package
-  active BOOLEAN NULL,                      -- Package is active
-  title TINYTEXT NULL,                      -- Title of element
-  descr TEXT NULL,                          -- Description for this entity's participation in the package
-  short_descr TEXT NULL,                    -- Short description for this entity's participation in the package
-  image TINYTEXT NULL,                      -- Element image
-  position INT NULL,                        -- Display order position
-  ref_type INT NULL,                        -- Type of entity this element is association with
-  ref_dest INT NULL,                        -- Pointer to the specific entity
-  PRIMARY KEY (id),
-  INDEX(package),
-  INDEX(ref_type),
-  INDEX(ref_dest)
-);
-
-----
-
--- Package Management Settings
-CREATE TABLE {prefix}management (
-  id INT NOT NULL AUTO_INCREMENT,
-  canonical_package_page TINYTEXT NULL,                         -- Canonical page slug for package detail
-  package_link_text_member_list TINYTEXT NULL,
-  package_link_text_member_detail TINYTEXT NULL,
-  package_to_email TINYTEXT NULL,                               -- Email address of the recipient
-  package_from_email TINYTEXT NULL,                             -- Email address of the sender
-  package_email_notification TEXT NULL,                         -- Email notification message
-  package_display_member_message BOOLEAN DEFAULT '0',           -- Boolean to show member message or not
-  package_member_message TEXT NULL,                             -- Member Message
-  package_all_moderated BOOLEAN DEFAULT '0',                    -- if all packages are moderated or not
-  package_list_show_image BOOLEAN DEFAULT '1',
-  package_list_show_short_descr BOOLEAN DEFAULT '1',
-  package_list_show_expire_date BOOLEAN DEFAULT '1',
-  package_list_show_pricing BOOLEAN DEFAULT '1',
-  package_list_show_offsite_url BOOLEAN DEFAULT '1',
-  package_list_show_offsite_url_newtarget BOOLEAN DEFAULT '1',
-  package_list_show_member_image BOOLEAN DEFAULT '1',
-  package_list_show_member_short_descr BOOLEAN DEFAULT '1',
-  package_list_show_member_link BOOLEAN DEFAULT '1',
-  package_list_show_member_link_newtarget BOOLEAN DEFAULT '1',
-  package_list_show_member_address BOOLEAN DEFAULT '1',
-  package_list_show_member_second_address BOOLEAN DEFAULT '1',
-  package_list_show_member_street BOOLEAN DEFAULT '1',
-  package_list_show_member_citystatezip BOOLEAN DEFAULT '1',
-  package_list_show_member_country BOOLEAN DEFAULT '1',
-  package_list_show_member_region BOOLEAN DEFAULT '1',
-  package_list_show_member_phone BOOLEAN DEFAULT '1',
-  package_list_show_member_tollfree BOOLEAN DEFAULT '1',
-  package_list_show_member_email BOOLEAN DEFAULT '1',
-  package_list_show_member_website_url BOOLEAN DEFAULT '1',
-  package_list_show_member_website_url_newtarget BOOLEAN DEFAULT '1',
-  package_list_show_package_detail_link BOOLEAN DEFAULT '1',
-  package_detail_show_image BOOLEAN DEFAULT '1',
-  package_detail_show_offsite_url BOOLEAN DEFAULT '1',
-  package_detail_show_offsite_url_newtarget BOOLEAN DEFAULT '1',
-  package_detail_show_member_link BOOLEAN DEFAULT '1',
-  package_detail_show_member_link_newtarget BOOLEAN DEFAULT '1',
-  package_detail_show_member_address BOOLEAN DEFAULT '1',
-  package_detail_show_member_street BOOLEAN DEFAULT '1',
-  package_detail_show_member_citystatezip BOOLEAN DEFAULT '1',
-  package_detail_show_member_country BOOLEAN DEFAULT '1',
-  package_detail_show_member_region BOOLEAN DEFAULT '1',
-  package_detail_show_member_phone BOOLEAN DEFAULT '1',
-  package_detail_show_member_tollfree BOOLEAN DEFAULT '1',
-  package_detail_show_member_email BOOLEAN DEFAULT '1',
-  PRIMARY KEY (id)
-);
-
-----
-
--- Set default package management entry
-INSERT INTO {prefix}management
-    ( id, canonical_package_page )
-   VALUES
-    ( 1, 'package-detail' )
-;
-
diff --git a/setup/databaseScripts/create_database_V1.1.8.sql b/setup/databaseScripts/create_database_V1.1.8.sql
new file mode 100644 (file)
index 0000000..61aa1a8
--- /dev/null
@@ -0,0 +1,116 @@
+-- Gaslight Media Members Database - Packaging
+-- File Created: 12/02/15 15:27:15
+-- Database Version: 1.1.8
+-- Database Creation Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+
+-- Packages
+CREATE TABLE {prefix}packages (
+  id INT NOT NULL AUTO_INCREMENT,
+  active BOOLEAN NULL,                      -- Package is active
+  status INT NULL,                          -- Status for this package, see config['status']
+  title TINYTEXT NULL,                      -- Title of package
+  package_slug TINYTEXT NULL,               -- Package name slug for canonical URLs (lowercase, "-" for spaces, no punctuation)
+  offsite_url TINYTEXT NULL,                -- Url for the package list on the member's site
+  descr TEXT NULL,                          -- Description of package
+  short_descr TINYTEXT NULL,                -- Short description of package
+  image TINYTEXT NULL,                      -- Package image
+  start_date TIMESTAMP NULL,                -- Date display of this package starts
+  end_date TIMESTAMP NULL,                  -- Date display of this package ends (last date of display)
+  expire_date TIMESTAMP NULL,               -- Date package expires (first date it's expired)
+  position INT NULL,                        -- Display order position
+  pricing TINYTEXT NULL,                    -- Pricing, descriptive
+  ref_type INT NULL,                        -- Type of entity this package is associated with
+  ref_dest INT NULL,                        -- Pointer to the specific entity
+  PRIMARY KEY (id),
+  INDEX(ref_type),
+  INDEX(ref_dest),
+  INDEX(start_date),
+  INDEX(end_date),
+  INDEX(expire_date)
+);
+
+----
+
+-- Package Elements - Items in a package
+CREATE TABLE {prefix}package_elements (
+  id INT NOT NULL AUTO_INCREMENT,
+  package INT NULL,                         -- Pointer to the package
+  active BOOLEAN NULL,                      -- Package is active
+  title TINYTEXT NULL,                      -- Title of element
+  descr TEXT NULL,                          -- Description for this entity's participation in the package
+  short_descr TEXT NULL,                    -- Short description for this entity's participation in the package
+  image TINYTEXT NULL,                      -- Element image
+  position INT NULL,                        -- Display order position
+  ref_type INT NULL,                        -- Type of entity this element is association with
+  ref_dest INT NULL,                        -- Pointer to the specific entity
+  PRIMARY KEY (id),
+  INDEX(package),
+  INDEX(ref_type),
+  INDEX(ref_dest)
+);
+
+----
+
+-- Package Management Settings
+CREATE TABLE {prefix}management (
+  id INT NOT NULL AUTO_INCREMENT,
+  canonical_package_page TINYTEXT NULL,                         -- Canonical page slug for package detail
+  package_link_text_member_list TINYTEXT NULL,
+  package_link_text_member_detail TINYTEXT NULL,
+  package_to_email TINYTEXT NULL,                               -- Email address of the recipient
+  package_from_email TINYTEXT NULL,                             -- Email address of the sender
+  package_email_notification TEXT NULL,                         -- Email notification message
+  package_display_member_message BOOLEAN DEFAULT '0',           -- Boolean to show member message or not
+  package_member_message TEXT NULL,                             -- Member Message
+  package_all_moderated BOOLEAN DEFAULT '0',                    -- if all packages are moderated or not
+  package_list_order SMALLINT DEFAULT '10',
+  package_list_show_image BOOLEAN DEFAULT '1',
+  package_list_show_short_descr BOOLEAN DEFAULT '1',
+  package_list_show_expire_date BOOLEAN DEFAULT '1',
+  package_list_show_pricing BOOLEAN DEFAULT '1',
+  package_list_show_offsite_url BOOLEAN DEFAULT '1',
+  package_list_show_offsite_url_newtarget BOOLEAN DEFAULT '1',
+  package_list_show_member_image BOOLEAN DEFAULT '1',
+  package_list_show_member_short_descr BOOLEAN DEFAULT '1',
+  package_list_show_member_link BOOLEAN DEFAULT '1',
+  package_list_show_member_link_newtarget BOOLEAN DEFAULT '1',
+  package_list_show_member_address BOOLEAN DEFAULT '1',
+  package_list_show_member_second_address BOOLEAN DEFAULT '1',
+  package_list_show_member_street BOOLEAN DEFAULT '1',
+  package_list_show_member_citystatezip BOOLEAN DEFAULT '1',
+  package_list_show_member_country BOOLEAN DEFAULT '1',
+  package_list_show_member_region BOOLEAN DEFAULT '1',
+  package_list_show_member_phone BOOLEAN DEFAULT '1',
+  package_list_show_member_tollfree BOOLEAN DEFAULT '1',
+  package_list_show_member_email BOOLEAN DEFAULT '1',
+  package_list_show_member_website_url BOOLEAN DEFAULT '1',
+  package_list_show_member_website_url_newtarget BOOLEAN DEFAULT '1',
+  package_list_show_package_detail_link BOOLEAN DEFAULT '1',
+  package_detail_show_image BOOLEAN DEFAULT '1',
+  package_detail_show_offsite_url BOOLEAN DEFAULT '1',
+  package_detail_show_offsite_url_newtarget BOOLEAN DEFAULT '1',
+  package_detail_show_member_link BOOLEAN DEFAULT '1',
+  package_detail_show_member_link_newtarget BOOLEAN DEFAULT '1',
+  package_detail_show_member_address BOOLEAN DEFAULT '1',
+  package_detail_show_member_street BOOLEAN DEFAULT '1',
+  package_detail_show_member_citystatezip BOOLEAN DEFAULT '1',
+  package_detail_show_member_country BOOLEAN DEFAULT '1',
+  package_detail_show_member_region BOOLEAN DEFAULT '1',
+  package_detail_show_member_phone BOOLEAN DEFAULT '1',
+  package_detail_show_member_tollfree BOOLEAN DEFAULT '1',
+  package_detail_show_member_email BOOLEAN DEFAULT '1',
+  PRIMARY KEY (id)
+);
+
+----
+
+-- Set default package management entry
+INSERT INTO {prefix}management
+    ( id, canonical_package_page )
+   VALUES
+    ( 1, 'package-detail' )
+;
+
index de15c0e..450ace1 100644 (file)
@@ -23,5 +23,6 @@ $glmMembersPackagingDbVersions = array(
     '1.1.5' => array('version' => '1.1.5', 'tables' => 3),
     '1.1.6' => array('version' => '1.1.6', 'tables' => 3),
     '1.1.7' => array('version' => '1.1.7', 'tables' => 3),
+    '1.1.8' => array('version' => '1.1.8', 'tables' => 3),
 );
 
diff --git a/setup/databaseScripts/update_database_V1.1.8.sql b/setup/databaseScripts/update_database_V1.1.8.sql
new file mode 100644 (file)
index 0000000..658ff52
--- /dev/null
@@ -0,0 +1,12 @@
+-- Gaslight Media Members Database
+-- File Created: 3/30/2018
+-- Database Version: 1.1.8
+-- Database Update From Previous Version Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashses
+ALTER TABLE {prefix}management ADD COLUMN package_list_order SMALLINT NULL;
+
+----
+
+UPDATE {prefix}management SET package_list_order = 10;
\ No newline at end of file
index fda1fb6..16590c7 100644 (file)
                     <table class="glm-admin-table">
                         <tr><td colspan="2"><h2>Package List Display Options</h2></td></tr>
                         <!-- package info -->
+                        <tr>
+                            <th>Package List Order</th>
+                            <td>
+                                <select name="package_list_order">
+                    {foreach from=$packagingSettings.fieldData.package_list_order.list item=v}
+                                    <option value="{$v.value}"{if $v.default} selected="selected"{/if}>{$v.name}</option>
+                    {/foreach}
+                                </select>
+                            </td>
+                        </tr>
                         <tr><th>Show Package Image:</th><td><input type="checkbox" name="package_list_show_image"{if $packagingSettings.fieldData.package_list_show_image.value} checked="checked"{/if}></td></tr>
                         <tr><th>Show Package Short Description:</th><td><input type="checkbox" name="package_list_show_short_descr"{if $packagingSettings.fieldData.package_list_show_short_descr.value} checked="checked"{/if}></td></tr>
                         <tr><th>Show Package Expire Date:</th><td><input type="checkbox" name="package_list_show_expire_date"{if $packagingSettings.fieldData.package_list_show_expire_date.value} checked="checked"{/if}></td></tr>