Initially complete packaging
authorChuck Scott <cscott@gaslightmedia.com>
Mon, 14 Dec 2015 19:26:25 +0000 (14:26 -0500)
committerChuck Scott <cscott@gaslightmedia.com>
Mon, 14 Dec 2015 19:26:25 +0000 (14:26 -0500)
17 files changed:
classes/data/dataPackages.php
defines.php
glm-member-db-packaging.php
models/admin/member/packaging.php
models/admin/members/packaging.php
models/front/packaging/detail.php [new file with mode: 0644]
models/front/packaging/list.php [new file with mode: 0644]
setup/adminTabs.php
setup/permissions.php
setup/shortcodes.php [new file with mode: 0644]
setup/validActions.php
views/admin/member/packaging.html
views/admin/members/packaging.html
views/front/footer.html [new file with mode: 0644]
views/front/packaging/detail.html [new file with mode: 0644]
views/front/packaging/header.html [new file with mode: 0644]
views/front/packaging/list.html [new file with mode: 0644]

index b57b355..963c73b 100644 (file)
@@ -231,6 +231,23 @@ class GlmDataPackages extends GlmDataAbstract
 
     }
 
+    public function entryPostProcessing($r, $a)
+    {
+
+        // Only run these tests for list, get, edit, and delete
+        if (in_array($a, array('l', 'g', 'e', 'd', 'u')) && $r['ref_type'] > 0 && $r['ref_dest'] > 0) {
+
+            // Get entity table
+            $table = GLM_MEMBERS_PLUGIN_DB_PREFIX.$this->config['ref_type_table'][$r['ref_type']['value']];
+
+            $dest = $this->wpdb->get_row("SELECT name FROM $table WHERE id = ".$r['ref_dest'].";");
+            $r['ref_dest_name'] = $dest->name;
+
+        }
+
+        return $r;
+    }
+
 }
 
 ?>
\ No newline at end of file
index 02a2c76..07ad47a 100644 (file)
@@ -42,7 +42,6 @@ define('GLM_MEMBERS_PACKAGING_PLUGIN_URL', plugin_dir_url(__FILE__));
 define('GLM_MEMBERS_PACKAGING_PLUGIN_ADMIN_URL', admin_url('admin.php'));
 define('GLM_MEMBERS_PACKAGING_PLUGIN_BASE_URL', WP_PLUGIN_URL.'/'.GLM_MEMBERS_PACKAGING_PLUGIN_SLUG);
 define('GLM_MEMBERS_PACKAGING_PLUGIN_CURRENT_URL', $urlParts['scheme'].'://'.$urlParts['host'].$pageUri[0]);
-define('GLM_MEMBERS_PACKAGING_PLUGIN_MEDIA_URL', $WPUploadDir['baseurl'].'/'.GLM_MEMBERS_PACKAGING_PLUGIN_SLUG);
 
 // Directories
 define('GLM_MEMBERS_PACKAGING_PLUGIN_PATH', dirname(__FILE__));
@@ -55,7 +54,5 @@ define('GLM_MEMBERS_PACKAGING_PLUGIN_CONFIG_PATH', GLM_MEMBERS_PACKAGING_PLUGIN_
 $pluginsPath = str_replace(GLM_MEMBERS_PACKAGING_PLUGIN_SLUG, '', GLM_MEMBERS_PACKAGING_PLUGIN_PATH);
 define('GLM_MEMBERS_PACKAGING_MAIN_PLUGIN_PATH', $pluginsPath.'/glm-member-db');
 define('GLM_MEMBERS_PACKAGING_PLUGIN_LIB_PATH', GLM_MEMBERS_PACKAGING_MAIN_PLUGIN_PATH.'/lib');
-define('GLM_MEMBERS_PACKAGING_PLUGIN_MEDIA_PATH', $WPUploadDir['basedir'].'/'.GLM_MEMBERS_PACKAGING_PLUGIN_SLUG);
-define('GLM_MEMBERS_PACKAGING_PLUGIN_IMAGES_PATH', GLM_MEMBERS_PACKAGING_MAIN_PLUGIN_PATH.'/images');
 
 ?>
index 963d1e0..556874a 100644 (file)
@@ -106,7 +106,8 @@ function glmMembersPluginMinVerRequired() {
     echo '
         <div class="error">
             <p>The '.GLM_MEMBERS_PACKAGING_PLUGIN_NAME.' requires that the main GLM Member DB plugin version be no older than '
-                    .GLM_MEMBERS_PACKAGING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION.'!</p>
+                    .GLM_MEMBERS_PACKAGING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION.'!<br>
+                    '.GLM_MEMBERS_PACKAGING_MIN_VERSION_NOTE.'</p>
             <p>The '.GLM_MEMBERS_PACKAGING_PLUGIN_NAME.' plugin has been de-activated.</p>
         </div>
     ';
@@ -117,6 +118,7 @@ function glmMembersPluginMinVerRequired() {
  */
 $glmMembersDatabasePluginVersion = get_option('glmMembersDatabasePluginVersion');
 if (version_compare($glmMembersDatabasePluginVersion, GLM_MEMBERS_PACKAGING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION) < 0) {
+    define('GLM_MEMBERS_PACKAGING_MIN_VERSION_NOTE', "Members DB: $glmMembersDatabasePluginVersion, Packaging Requires: ".GLM_MEMBERS_PACKAGING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION);
     add_action( 'admin_notices', 'glmMembersPluginMinVerRequired');
     deactivate_plugins('/'.GLM_MEMBERS_PACKAGING_PLUGIN_SLUG.'/'.GLM_MEMBERS_PACKAGING_PLUGIN_SLUG.'.php');
 }
@@ -125,6 +127,7 @@ if (version_compare($glmMembersDatabasePluginVersion, GLM_MEMBERS_PACKAGING_PLUG
  * Register this add-on with the main GLM Member DB plugin and get information on all add-ons loaded.
  */
 require_once(GLM_MEMBERS_PACKAGING_PLUGIN_SETUP_PATH.'/validActions.php');
+require_once(GLM_MEMBERS_PACKAGING_PLUGIN_SETUP_PATH.'/shortcodes.php');
 require_once(GLM_MEMBERS_PACKAGING_PLUGIN_DB_SCRIPTS.'/dbVersions.php');
 function glmMembersRegisterPackaging($addOns) {
 
@@ -135,6 +138,8 @@ function glmMembersRegisterPackaging($addOns) {
             'short_name' => GLM_MEMBERS_PACKAGING_PLUGIN_SHORT_NAME,
             'slug' => GLM_MEMBERS_PACKAGING_PLUGIN_SLUG,
             'actions' => $GLOBALS['glmMembersPackagingAddOnValidActions'],
+            'shortcodes' => $GLOBALS['glmMembersPackagingShortcodes'],
+            'shortcodesDescription' => $GLOBALS['glmMembersPackagingShortcodesDescription'],
             'database' => array(
                 'dbPrefix' => GLM_MEMBERS_PACKAGING_PLUGIN_DB_PREFIX,
                 'dbCurrentVersion' => GLM_MEMBERS_PACKAGING_PLUGIN_DB_VERSION,
index 8c4743a..39b03ce 100644 (file)
@@ -13,7 +13,7 @@
  * @link     http://dev.gaslightmedia.com/
  */
 
-// Load Member Types data abstract
+// Load Packages data abstract
 require_once(GLM_MEMBERS_PACKAGING_PLUGIN_CLASS_PATH.'/data/dataPackages.php');
 
 /**
@@ -88,6 +88,9 @@ class GlmMembersAdmin_member_packaging extends GlmDataPackages
         $packageUpdated = false;
         $packageInfo = false;
         $packageError = false;
+        $haveMember = false;
+        $memberID = false;
+        $memberName = false;
         $option = false;
         $error = false;
 
@@ -103,12 +106,35 @@ class GlmMembersAdmin_member_packaging extends GlmDataPackages
             $packageID = $_REQUEST['packageID'] - 0;
         }
 
+        /*
+         * Get the selected member information
+         */
+
         // Get the current Member ID
         $memberID = 0;
         if (isset($_REQUEST['member']) && ($_REQUEST['member']-0) > 0) {
             $memberID = $_REQUEST['member'] - 0;
         }
 
+        // If we have a member ID
+        if ($memberID > 0) {
+
+            // Get Member data
+            require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataMembers.php');
+            $Members = new GlmDataMembers($this->wpdb, $this->config);
+            $memberInfo = $Members->getEntry($memberID);
+            $memberName = $memberInfo['name'];
+
+            // Check for good member data
+            if (!$memberInfo || count($memberInfo) == 0) {
+                $memberID = 0;
+            } else {
+                $haveMember = true;
+            }
+
+        }
+
+        // If we don't have a member ID at this point, then it's a fatal error
         if ($memberID == 0) {
 
             // There should have been a member ID - So failure
@@ -119,8 +145,13 @@ class GlmMembersAdmin_member_packaging extends GlmDataPackages
                 'view' => 'admin/error/index.html',
                 'data' => false
             );
+
         }
 
+        /*
+         * Process based on supplied option
+         */
+
         switch($option) {
 
             case 'add':
@@ -156,6 +187,7 @@ class GlmMembersAdmin_member_packaging extends GlmDataPackages
 
                     // Tell the template there were errors and let them try again
                     $packageError = true;
+                    $option = 'add';
 
                 }
                 break;
@@ -262,7 +294,9 @@ class GlmMembersAdmin_member_packaging extends GlmDataPackages
             'packageID' => $packageID,
             'packageInfo' => $packageInfo,
             'packageError' => $packageError,
+            'haveMember' => $haveMember,
             'memberID' => $memberID,
+            'memberName' => $memberName,
             'option' => $option
         );
 
index 4809410..6f44177 100644 (file)
@@ -13,7 +13,7 @@
  * @link     http://dev.gaslightmedia.com/
  */
 
-// Load Member Types data abstract
+// Load packages data abstract
 require_once(GLM_MEMBERS_PACKAGING_PLUGIN_CLASS_PATH.'/data/dataPackages.php');
 
 /**
diff --git a/models/front/packaging/detail.php b/models/front/packaging/detail.php
new file mode 100644 (file)
index 0000000..2561d5b
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Gaslight Media Members Database
+ * Front Package detail
+ *
+ * PHP version 5.5
+ *
+ * @category glmWordPressPlugin
+ * @package  glmMembersDatabase
+ * @author   Chuck Scott <cscott@gaslightmedia.com>
+ * @license  http://www.gaslightmedia.com Gaslightmedia
+ * @version  0.1
+ */
+
+// Load packages data abstract
+require_once(GLM_MEMBERS_PACKAGING_PLUGIN_CLASS_PATH.'/data/dataPackages.php');
+
+/*
+ * This class performs the work for displaying members packages.
+ */
+class GlmMembersFront_packaging_detail extends GlmDataPackages
+{
+
+    /**
+     * WordPress Database Object
+     *
+     * @var $wpdb
+     * @access public
+     */
+    public $wpdb;
+    /**
+     * Plugin Configuration Data
+     *
+     * @var $config
+     * @access public
+     */
+    public $config;
+
+    /*
+     * Constructor
+     *
+     * This contructor sets up this model. At this time that only includes
+     * storing away the WordPress data object.
+     *
+     * @return object Class object
+     *
+     */
+    public function __construct ($wpdb, $config)
+    {
+
+        // Save WordPress Database object
+        $this->wpdb = $wpdb;
+
+        // Save plugin configuration object
+        $this->config = $config;
+
+        // Run constructor for members data class
+        parent::__construct(false, false);
+
+    }
+
+    /*
+     * Perform Model Action
+     *
+     * This method does the work for this model and returns any resulting data
+     *
+     * @return array Status and data array
+     *
+     * 'status'
+     *
+     * True if successfull and false if there was a fatal failure.
+     *
+     * 'menuItemRedirect'
+     *
+     * If not false, provides a menu item the controller should
+     * execute after this one. Normally if this is used, there would also be a
+     * modelRedirect value supplied as well.
+     *
+     * 'modelRedirect'
+     *
+     * If not false, provides an action the controller should execute after
+     * this one.
+     *
+     * 'view'
+     *
+     * A suggested view name that the contoller should use instead of the
+     * default view for this model or false to indicate that the default view
+     * should be used.
+     *
+     * 'data'
+     *
+     * Data that the model is returning for use in merging with the view to
+     * produce output.
+     *
+     */
+    public function modelAction ($actionData = false)
+    {
+
+        $havePackage = false;
+        $packageID = false;
+        $package = false;
+        $settings = array();
+        $status = false;
+
+        // Get requested package - Check URL parameter first
+        if (isset($_REQUEST['packageID'])) {
+            $packageID = ($_REQUEST['packageID'] - 0);
+        }
+
+        // If not supplied in URL, then check shortcode attribute
+        if (!$packageID) {
+            $packageID = $actionData['request']['id'] - 0;
+        }
+
+        // If there's a package ID, then get the package data
+        if ($packageID > 0) {
+            $package = $this->getEntry($packageID);
+            if ($package) {
+                $havePackage = true;
+                $status = true;
+            }
+        }
+
+        // Compile template data
+        $templateData = array(
+            'havePackage' => $havePackage,
+            'packageID' => $packageID,
+            'package' => $package
+        );
+
+        // Return status, suggested view, and data to controller - also return any modified settings
+        return array(
+            'status' => $status,
+            'menuItemRedirect' => false,
+            'modelRedirect' => false,
+            'view' => 'front/packaging/detail.html',
+            'data' => $templateData,
+            'settings' => $settings
+        );
+
+    }
+
+
+}
+
+?>
\ No newline at end of file
diff --git a/models/front/packaging/list.php b/models/front/packaging/list.php
new file mode 100644 (file)
index 0000000..fd1de41
--- /dev/null
@@ -0,0 +1,221 @@
+<?php
+/**
+ * Gaslight Media Members Database
+ * Front Package List
+ *
+ * PHP version 5.5
+ *
+ * @category glmWordPressPlugin
+ * @package  glmMembersDatabase
+ * @author   Chuck Scott <cscott@gaslightmedia.com>
+ * @license  http://www.gaslightmedia.com Gaslightmedia
+ * @version  0.1
+ */
+
+// Load packages data abstract
+require_once(GLM_MEMBERS_PACKAGING_PLUGIN_CLASS_PATH.'/data/dataPackages.php');
+
+/*
+ * This class performs the work for displaying members packages.
+ */
+class GlmMembersFront_packaging_list extends GlmDataPackages
+{
+
+    /**
+     * WordPress Database Object
+     *
+     * @var $wpdb
+     * @access public
+     */
+    public $wpdb;
+    /**
+     * Plugin Configuration Data
+     *
+     * @var $config
+     * @access public
+     */
+    public $config;
+
+    /*
+     * Constructor
+     *
+     * This contructor sets up this model. At this time that only includes
+     * storing away the WordPress data object.
+     *
+     * @return object Class object
+     *
+     */
+    public function __construct ($wpdb, $config)
+    {
+
+        // Save WordPress Database object
+        $this->wpdb = $wpdb;
+
+        // Save plugin configuration object
+        $this->config = $config;
+
+        // Run constructor for members data class
+        parent::__construct(false, false);
+
+    }
+
+    /*
+     * Perform Model Action
+     *
+     * This method does the work for this model and returns any resulting data
+     *
+     * @return array Status and data array
+     *
+     * 'status'
+     *
+     * True if successfull and false if there was a fatal failure.
+     *
+     * 'menuItemRedirect'
+     *
+     * If not false, provides a menu item the controller should
+     * execute after this one. Normally if this is used, there would also be a
+     * modelRedirect value supplied as well.
+     *
+     * 'modelRedirect'
+     *
+     * If not false, provides an action the controller should execute after
+     * this one.
+     *
+     * 'view'
+     *
+     * A suggested view name that the contoller should use instead of the
+     * default view for this model or false to indicate that the default view
+     * should be used.
+     *
+     * 'data'
+     *
+     * Data that the model is returning for use in merging with the view to
+     * produce output.
+     *
+     */
+    public function modelAction ($actionData = false)
+    {
+
+        $havePackages = false;
+        $settings = array();
+        $status = false;
+        $where = 'true';
+        $orderBy = '';
+        $byMember = false;
+
+        // Select by specified type
+        switch($actionData['request']['type']) {
+
+            // Member Packages Only
+            case 'member':
+
+                $where .= ' AND T.ref_dest > 0';
+                break;
+
+            // Multi-member Packages (CVB) Only
+            case 'multi-member':
+
+                $where .= ' AND T.ref_dest = 0';
+                break;
+
+            // All package types
+            case 'all':
+            default:
+
+                $type = 'all';
+                break;;
+
+        }
+
+        // Check for specified member ID
+        $memberID = ($actionData['request']['member'] - 0);
+        if ($actionData['request']['member'] > 0) {
+            $where .= " AND T.ref_type = ".$this->config['ref_type_numb']['Member']." and T.ref_dest = $memberID";
+        }
+
+        // Check for specified output ordering
+        $order_type = $actionData['request']['order'];
+        switch($order_type) {
+
+            case 'member':
+                // Need to do this here after getting data
+
+            case 'title':
+                $orderBy = 'T.title';
+                break;
+
+            case 'start-date':
+                $orderBy = 'T.start_date';
+                break;
+
+            case 'end-date':
+                $orderBy = 'T.end_date';
+                break;
+
+            case 'exp-date':
+                $orderBy = 'T.expire_date';
+                break;
+
+            default:
+                $order_type = 'member';         // Sets type to 'member' to do after getting the list
+                break;
+
+        }
+
+        // Get the selected list of packages
+        $packages = $this->getList($where, $orderBy);
+        if ($packages && count($packages) > 0) {
+            $havePackages = true;
+            $status = true;
+        }
+
+        // Check for specified output ordering by member name
+        function packageMemberCmp($a, $b) {
+            if ($a['ref_dest_name'] == $b['ref_dest_name']) {
+                return 0;
+            }
+            return ($a['ref_dest_name'] < $b['ref_dest_name']) ? -1 : 1;
+        }
+        if ($actionData['request']['order'] == 'member') {
+
+            // Sort by member name
+            reset($packages);
+            uasort($packages, 'packageMemberCmp');
+
+            // Mark first entry for each member
+            reset($packages);
+            $memb = '';
+            while (list($key, $val) = each($packages)) {
+                $packages[$key]['firstForMember'] = false;
+                if ($memb != $val['ref_dest_name']) {
+                    $packages[$key]['firstForMember'] = true;
+                    $memb = $val['ref_dest_name'];
+                }
+            }
+
+            $byMember = true;
+        }
+
+        // Compile template data
+        $templateData = array(
+            'havePackages' => $havePackages,
+            'packages' => $packages,
+            'byMember' => $byMember
+        );
+
+        // Return status, suggested view, and data to controller - also return any modified settings
+        return array(
+            'status' => $status,
+            'menuItemRedirect' => false,
+            'modelRedirect' => false,
+            'view' => 'front/packaging/list.html',
+            'data' => $templateData,
+            'settings' => $settings
+        );
+
+    }
+
+
+}
+
+?>
\ No newline at end of file
index b0f6c3d..d0bb894 100644 (file)
  *
  */
 
-add_filter('glm-member-db-add-tab-for-members',
-    function($addOnTabs) {
-        $newTabs = array(
-            array(
-                'text' => 'Packaging',
-                'menu' => 'members',
-                'action' => 'packaging'
-            )
-        );
-        $addOnTabs = array_merge($addOnTabs, $newTabs);
-        return $addOnTabs;
-    }
-);
-
-add_filter('glm-member-db-add-tab-for-member',
-    function($addOnTabs) {
-        $newTabs = array(
-            array(
-                'text' => 'Packaging',
-                'menu' => 'member',
-                'action' => 'packaging'
-            )
-        );
-        $addOnTabs = array_merge($addOnTabs, $newTabs);
-        return $addOnTabs;
-    }
-);
+if (apply_filters('glm_members_permit_admin_members_packages_tab', true)) {
+    add_filter('glm-member-db-add-tab-for-members',
+        function($addOnTabs) {
+            $newTabs = array(
+                array(
+                    'text' => 'Packaging',
+                    'menu' => 'members',
+                    'action' => 'packaging'
+                )
+            );
+            $addOnTabs = array_merge($addOnTabs, $newTabs);
+            return $addOnTabs;
+        }
+    );
+}
 
+if (apply_filters('glm_members_permit_admin_members_packages_tab', true)) {
+    add_filter('glm-member-db-add-tab-for-member',
+        function($addOnTabs) {
+            $newTabs = array(
+                array(
+                    'text' => 'Packaging',
+                    'menu' => 'member',
+                    'action' => 'packaging'
+                )
+            );
+            $addOnTabs = array_merge($addOnTabs, $newTabs);
+            return $addOnTabs;
+        }
+    );
+}
 
 ?>
\ No newline at end of file
index 048444d..d037bfa 100644 (file)
  * Of course any of these may test more than one capability if that's desired.
  */
 
+// glm-member-db, view/members/index.html, Display Multi-Member (CVB) Packages tab
+add_filter('glm_members_permit_admin_members_packages_tab',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_view_any_member');
+    }
+);
+
+// glm-member-db, view/members/packaging.html, Add a Multi-Member (CVB) Package
+add_filter('glm_members_permit_admin_members_packaging_add_package',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_edit_any_member');
+    }
+);
+
+// glm-member-db, view/member/packaging.html, Edit a Multi-Member (CVB) Package
+add_filter('glm_members_permit_admin_members_packaging_edit_package',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_view_any_member');
+    }
+);
+
+// glm-member-db, view/member/index.html, Display Member Packages tab
+add_filter('glm_members_permit_admin_members_packages_tab',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_view_any_member') || current_user_can('glm_members_view_my_member');
+    }
+);
+
+// glm-member-db, view/member/packaging.html, View a Member Package
+add_filter('glm_members_permit_admin_member_packaging_add_package',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_edit_any_member') || current_user_can('glm_members_edit_my_member');
+    }
+);
+
+// glm-member-db, view/member/contacts.html, Edit a Member Package
+add_filter('glm_members_permit_admin_member_packaging_edit_package',
+    function($permit) {
+        if (!$permit) { return false; }
+        return current_user_can('glm_members_edit_any_member') || current_user_can('glm_members_edit_my_member');
+    }
+);
+
 ?>
\ No newline at end of file
diff --git a/setup/shortcodes.php b/setup/shortcodes.php
new file mode 100644 (file)
index 0000000..4d7ae5b
--- /dev/null
@@ -0,0 +1,170 @@
+<?php
+/**
+ * Gaslight Media Members Database
+ * GLM Members Packaging Add-On Short Codes
+ *
+ * PHP version 5.5
+ *
+ * @category glmWordPressPlugin
+ * @package  glmMembersDatabase
+ * @author   Chuck Scott <cscott@gaslightmedia.com>
+ * @license  http://www.gaslightmedia.com Gaslightmedia
+ * @release  shortcodes.php,v 1.0 2014/10/31 19:31:47 cscott Exp $
+ * @link     http://dev.gaslightmedia.com/
+ */
+
+/*
+ * Array of short-code
+ *
+ * This array lists all of the short-codes available from the main
+ * member plugin and all add-ons that provide short-code features.
+ *
+ * This array is merged with the data from any registered add-ons
+ * providing short-code features. The plugin providing the short-code
+ * is designated in the 'plugin' elemeent.
+ *
+ * A shortcode is unique to a particular plugin. To provide additional
+ * data and features to a short-code, an add-on should use filters
+ * provided by the short-code to insert data into the template array,
+ * to insert additional format into the template, or to insert
+ * text directly into the completed template output.
+ *
+ * The "attributes" array is a list of available attributes for this
+ * shortcode and their default values. If a database table is provided,
+ * then the value for each attribute is a table column where we get
+ * the default value. If no table is provided, then the value for
+ * each attribute is the actual default value for that attribute.
+ * In the case that the data is taken from the database table, the
+ * "id" for the table entry where the data is stored is assumed to
+ * be 1.
+ *
+ * Note that if the value for a particular attribute is false, then
+ * it is not read from the database even if the table is specified
+ * but might be supplied at run-time as an attribute in the short-code.
+ * All attributes that might be specified in the shortcode must be
+ * listed in the 'attributes' array below. If an attribute is not
+ * specified here, it can't be read from the short-code.
+ *
+ * The following is an explanation of this array.
+ *
+ * array(
+ *      '{shortcode-slug} => array(
+ *          'plugin' => '{plugin (add-on) slug}',       // Identifies which plugin is providing the short-code
+ *          'menu' => '{menu name}',                    // Menu name in this context is simply where to find the action
+ *          'action' => '{shortcode action name},       // Action used to execute this shortcode
+ *          'table' => '{table prefix}{table name}',    // Database table where default attribute values are stored
+ *          'attributes' => array(                      // An array of all shortcode attributes (options)
+ *              '{attr name}' => '{field name}',        // Available attribute names and the database field names with the default value
+ *              ....
+ *          ),
+ *      ... additional short-codes
+ * )
+ *
+ */
+
+$glmMembersPackagingShortcodes = array(
+    'glm-members-packaging-list' => array(
+        'plugin' => GLM_MEMBERS_PACKAGING_PLUGIN_SLUG,
+        'menu' => 'packaging',
+        'action' => 'list',
+        'table' => false,
+        'attributes' => array(
+            'type' => 'all',                            // 'all', 'member', 'multi-member'
+            'order' => 'member',                        // 'member', 'title', 'start-date', 'end-date', 'exp-date'
+            'member' => false                           // ID of member for member specific list
+        )
+    ),
+    'glm-members-packaging-detail' => array(
+        'plugin' => GLM_MEMBERS_PACKAGING_PLUGIN_SLUG,
+        'menu' => 'packaging',
+        'action' => 'detail',
+        'table' => false,
+        'attributes' => array(
+            'id' => false
+        )
+    )
+);
+
+$glmMembersPackagingShortcodesDescription = '
+
+    <tr>
+        <th>[glm-members-packaging-list]</th>
+        <td>&nbsp;</td>
+        <td width="50%">
+            <p>
+            Displays a list of packages. Optionally, the attributes below may used to modify
+            the display of this page.
+            </p>
+        </td>
+    </tr>
+    <tr>
+        <td>&nbsp;</td>
+        <th>type="{list type}"</th>
+        <td>
+            <p>
+            The "type" attribute is used to select the type of list you would like displayed.
+            Below is a list of available list types.
+            </p>
+            <p>
+                <table width="100%">
+                    <tr><th colspan=3">List Types</th></tr>
+                    <tr><td>all</td><td>List all packages</td></tr>
+                    <tr><td>member</td><td>Member packages only</td></tr>
+                    <tr><td>multi-member</td><td>Multi-member (CVB) packages only</td></tr>
+                </table>
+            </p>
+
+        </td>
+    </tr>
+    <tr>
+        <td>&nbsp;</td>
+        <th>order="{ordering method}"</th>
+        <td>
+            <p>
+            The "order" attribute is used to specify how the list will be ordered (sorted).
+            Below is a list of available order types.
+            </p>
+            <p>
+                <table width="100%">
+                    <tr><th colspan=3">Ordering Types</th></tr>
+                    <tr><td>specified</td><td>Order specified in the packages</td></tr>
+                    <tr><td>member</td><td>By member name</td></tr>
+                    <tr><td>title</td><td>By package title</td></tr>
+                    <tr><td>start-date</td><td>By package start date</td></tr>
+                    <tr><td>end-date</td><td>By package end date</td></tr>
+                    <tr><td>expire-date</td><td>By package expire date</td></tr>
+                </table>
+            </p>
+        </td>
+    </tr>
+    <tr>
+        <td>&nbsp;</td>
+        <th>member="{member ID}"</th>
+        <td>
+            <p>
+            The "member" attribute is used to specify a member ID. When included, the list
+            will only include packages for the member with that ID.
+            </p>
+        </td>
+    </tr>
+    <tr>
+        <th>[glm-members-packaging-detail]</th>
+        <td>&nbsp;</td>
+        <td width="50%">
+            <p>
+            Displays the detail of a specific package.
+            </p>
+        </td>
+    </tr>
+    <tr>
+        <td>&nbsp;</td>
+        <th>id="{package ID}"</th>
+        <td>
+            <p>
+            The "id" attribute is used to select the package to be displayed. This is a
+            required attribute.
+            </p>
+        </td>
+    </tr>
+
+';
\ No newline at end of file
index ba1e4d4..f427686 100644 (file)
@@ -40,8 +40,11 @@ $glmMembersPackagingAddOnValidActions = array(
         )
     ),
     'frontActions' => array(
+        'packaging' => array(
+            'list' => 'glm-member-db-packaging',
+            'detail' => 'glm-member-db-packaging'
+        )
     )
 );
 
-
 ?>
\ No newline at end of file
index 611230d..4e31cc7 100644 (file)
 {include file='admin/member/header.html'}
 
-    {if $packageUpdated}<h2 class="glm-notice glm-flash-updated">Package Updated</h2>{/if}
-    {if $packageError}<h2 class="glm-error glm-flash-updated">Error submitting package, see below...</h2>{/if}
-    
 {if $option == 'edit' || $option == 'add'}
-    
-  {if $option == 'edit'}
-    <h2>Edit Package</h2>
-  {else}
-    <h2>Add new Package</h2>
-  {/if}
+        
 
+  {if apply_filters('glm_members_permit_admin_member_packaging_edit_package', true)}
 
-    <form action="{$thisURL}?page={$thisPage}" method="post" enctype="multipart/form-data">
-        <input type="hidden" name="glm_action" value="packaging">
-        <input type="hidden" name="member" value="{$memberID}">
-        <input type="hidden" name="ref_type" value="{$ref_type_numb.Member}">
-        <input type="hidden" name="ref_dest" value="{$memberID}">
-      {if $havePackage}
-        <input type="hidden" name="option" value="update">
-        <input type="hidden" name="packageID" value="{$packageID}">
+        {if $packageUpdated}<h2 class="glm-notice glm-flash-updated">Package Updated</h2>{/if}
+        {if $packageError}<h2 class="glm-error glm-flash-updated">Error submitting package, see below...</h2>{/if}
+    
+      {if $option == 'edit'}
+        <h2>Edit Package</h2>
       {else}
-        <input type="hidden" name="option" value="insert">
+        <h2>Add new Package</h2>
       {/if}
+    
+    
+        <form action="{$thisURL}?page={$thisPage}" method="post" enctype="multipart/form-data">
+            <input type="hidden" name="glm_action" value="packaging">
+            <input type="hidden" name="member" value="{$memberID}">
+            <input type="hidden" name="ref_type" value="{$ref_type_numb.Member}">
+            <input type="hidden" name="ref_dest" value="{$memberID}">
+          {if $havePackage}
+            <input type="hidden" name="option" value="update">
+            <input type="hidden" name="packageID" value="{$packageID}">
+          {else}
+            <input type="hidden" name="option" value="insert">
+          {/if}
+    
+            <table class="glm-admin-table">
+                <tr>
+                    <th {if $packageInfo.fieldRequired.title}class="glm-required"{/if}>Title:</th>
+                    <td {if $packageInfo.fieldFail.title}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="title" value="{$packageInfo.fieldData.title}" class="glm-form-text-input-short">
+                        {if $packageInfo.fieldFail.title}<p>{$packageInfo.fieldFail.title}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th>Active:</th>
+                    <td>
+                        <input type="checkbox" name="active" {if $packageInfo.fieldData.active.value} checked{/if}>
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.descr}class="glm-required"{/if}>Description:</th>
+                    <td {if $packageInfo.fieldFail.descr}class="glm-form-bad-input"{/if}>
+                        {php} 
+                            wp_editor('{$packageInfo.fieldData.descr|escape:quotes}', 'glm_descr', array(
+                                // 'media_buttons' => true,
+                                // 'quicktags' => false,
+                                // 'wpautop' => false,  NOTE: Dont's use. Problem when numerous spaces before text.
+                                'textarea_name' => 'descr',
+                                'editor_height' => 200,     // Height in px, overrides editor_rows
+                                    // 'textarea_rows' => 8
+                            ));
+                        {/php}
+                        {if $packageInfo.fieldFail.descr}<p>{$packageInfo.fieldFail.descr}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.short_descr}class="glm-required"{/if}>Short Description:</th>
+                    <td {if $packageInfo.fieldFail.short_descr}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="short_descr" value="{$packageInfo.fieldData.short_descr}" class="glm-form-text-input" placeholder="A short, one line, description of the package.">
+                        {if $packageInfo.fieldFail.short_descr}<p>{$packageInfo.fieldFail.short_descr}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.image}class="glm-required"{/if}>Image:</th>
+                    <td {if $packageInfo.fieldFail.image}class="glm-form-bad-input"{/if}>
+                        <table class="glm-admin-image-edit-table">
+            {if $packageInfo.fieldData.image}
+                            <tr>
+                                <td>
+                                    <div class="glm-galleryImage" data-id="image">
+                                        <img src="{$glmPluginMediaURL}/images/small/{$packageInfo.fieldData.image}">
+                                    </div>
+                                </td>
+                                <td>
+                                    <input type="checkbox" name="image_delete"> Delete Image<br>
+                                    {$packageInfo.fieldData.image}<br>
+                                </td>
+                            </tr>
+            {/if}
+                            <tr><td colspan="2"><b>New image:</b> <input type="file" name="image_new"></td></tr>
+                        </table>
+                        <div id="glm-galleryImageLarger_image" class="glm-imageDialog"><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></div>
+                        {if $packageInfo.fieldFail.image}<p>{$packageInfo.fieldFail.image}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.start_date}class="glm-required"{/if}>Start Date:</th>
+                    <td {if $packageInfo.fieldFail.start_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="start_date" value="{$packageInfo.fieldData.start_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.start_date}<p>{$packageInfo.fieldFail.start_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.end_date}class="glm-required"{/if}>End Date:</th>
+                    <td {if $packageInfo.fieldFail.end_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="end_date" value="{$packageInfo.fieldData.end_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.end_date}<p>{$packageInfo.fieldFail.end_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.expire_date}class="glm-required"{/if}>Expire Date:</th>
+                    <td {if $packageInfo.fieldFail.expire_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="expire_date" value="{$packageInfo.fieldData.expire_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.expire_date}<p>{$packageInfo.fieldFail.expire_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.pricing}class="glm-required"{/if}>Pricing Description:</th>
+                    <td {if $packageInfo.fieldFail.pricing}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="pricing" value="{$packageInfo.fieldData.pricing}" class="glm-form-text-input" placeholder="Describe package pricing.">
+                        {if $packageInfo.fieldFail.pricing}<p>{$packageInfo.fieldFail.pricing}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.position}class="glm-required"{/if}>Display Order:</th>
+                    <td {if $packageInfo.fieldFail.position}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="position" value="{$packageInfo.fieldData.position}" class="glm-form-text-input-short">
+                        {if $packageInfo.fieldFail.position}<p>{$packageInfo.fieldFail.position}</p>{/if}
+                    </td>
+                </tr>
+            </table>
+            <input type="submit" value="{if $havePackage}Update Package{else}Add New Package{/if}">
+        </form>    
+
+  {else} <!-- Can just display -->
 
         <table class="glm-admin-table">
-            <tr>
-                <th>Active:</th>
-                <td>
-                    <input type="checkbox" name="active" {if $packageInfo.fieldData.active.value} checked{/if}>
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.title}class="glm-required"{/if}>Title:</th>
-                <td {if $packageInfo.fieldFail.title}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="title" value="{$packageInfo.fieldData.title}" class="glm-form-text-input-short">
-                    {if $packageInfo.fieldFail.title}<p>{$packageInfo.fieldFail.title}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-            <th {if $packageInfo.fieldRequired.descr}class="glm-required"{/if}>Description:</th>
-            <td {if $packageInfo.fieldFail.descr}class="glm-form-bad-input"{/if}>
-                {php} 
-                    wp_editor('{$packageInfo.fieldData.descr|escape:quotes}', 'glm_descr', array(
-                        // 'media_buttons' => true,
-                        // 'quicktags' => false,
-                        // 'wpautop' => false,  NOTE: Dont's use. Problem when numerous spaces before text.
-                        'textarea_name' => 'descr',
-                        'editor_height' => 200,     // Height in px, overrides editor_rows
-                            // 'textarea_rows' => 8
-                    ));
-                {/php}
-                {if $packageInfo.fieldFail.descr}<p>{$packageInfo.fieldFail.descr}</p>{/if}
-            </td>
-        </tr>
-        <tr>
-            <th {if $packageInfo.fieldRequired.short_descr}class="glm-required"{/if}>Short Description:</th>
-            <td {if $packageInfo.fieldFail.short_descr}class="glm-form-bad-input"{/if}>
-                <input type="text" name="short_descr" value="{$packageInfo.fieldData.short_descr}" class="glm-form-text-input" placeholder="A short, one line, description of the package.">
-                {if $packageInfo.fieldFail.short_descr}<p>{$packageInfo.fieldFail.short_descr}</p>{/if}
-            </td>
-        </tr>
-        <tr>
-            <th {if $packageInfo.fieldRequired.image}class="glm-required"{/if}>Logo:</th>
-            <td {if $packageInfo.fieldFail.image}class="glm-form-bad-input"{/if}>
-                <table class="glm-admin-image-edit-table">
-    {if $packageInfo.fieldData.image}
-                    <tr>
-                        <td>
-                            <div class="glm-galleryImage" data-id="logo">
-                                <img src="{$glmPluginMediaURL}/images/small/{$packageInfo.fieldData.image}">
-                            </div>
-                        </td>
-                        <td>
-                            <input type="checkbox" name="logo_delete"> Delete Image<br>
-                            {$packageInfo.fieldData.image}<br>
-                        </td>
-                    </tr>
-    {/if}
-                    <tr><td colspan="2"><b>New image:</b> <input type="file" name="logo_new"></td></tr>
-                </table>
-                <div id="glm-galleryImageLarger_logo" class="glm-imageDialog"><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></div>
-                {if $packageInfo.fieldFail.image}<p>{$packageInfo.fieldFail.image}</p>{/if}
-            </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.start_date}class="glm-required"{/if}>Start Date:</th>
-                <td {if $packageInfo.fieldFail.start_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="start_date" value="{$packageInfo.fieldData.start_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.start_date}<p>{$packageInfo.fieldFail.start_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.end_date}class="glm-required"{/if}>End Date:</th>
-                <td {if $packageInfo.fieldFail.end_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="end_date" value="{$packageInfo.fieldData.end_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.end_date}<p>{$packageInfo.fieldFail.end_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.expire_date}class="glm-required"{/if}>Expire Date:</th>
-                <td {if $packageInfo.fieldFail.expire_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="expire_date" value="{$packageInfo.fieldData.expire_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.expire_date}<p>{$packageInfo.fieldFail.expire_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.pricing}class="glm-required"{/if}>Pricing Description:</th>
-                <td {if $packageInfo.fieldFail.pricing}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="pricing" value="{$packageInfo.fieldData.pricing}" class="glm-form-text-input" placeholder="Describe package pricing.">
-                    {if $packageInfo.fieldFail.pricing}<p>{$packageInfo.fieldFail.pricing}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.position}class="glm-required"{/if}>Display Order:</th>
-                <td {if $packageInfo.fieldFail.position}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="position" value="{$packageInfo.fieldData.position}" class="glm-form-text-input-short">
-                    {if $packageInfo.fieldFail.position}<p>{$packageInfo.fieldFail.position}</p>{/if}
-                </td>
-            </tr>
+            <tr><th>Title:</th><td>{$packageInfo.fieldData.title}</td></tr>
+            <tr><th>Active:</th><td>{$packageInfo.fieldData.active.name}</td></tr>
+            <tr><th>Description:</th><td>{$packageInfo.fieldData.descr}</td></tr>
+            <tr><th>Short Description:</th><td>{$packageInfo.fieldData.short_descr}</td></tr>
+            <tr><th>Image:</th><td><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></td></tr>
+            <tr><th>Start Date:</th><td>{$packageInfo.fieldData.start_date.date}</td></tr>
+            <tr><th>End Date:</th><td>{$packageInfo.fieldData.end_date.date}</td></tr>
+            <tr><th>Expiration Date:</th><td>{$packageInfo.fieldData.expire_date.date}</td></tr>
+            <tr><th>Pricing Description:</th><td>{$packageInfo.fieldData.pricing}</td></tr>
+            <tr><th>Display Order:</th><td>{$packageInfo.fieldData.position}</td></tr>
         </table>
-        <input type="submit" value="{if $havePackage}Update Package{else}Add New Package{/if}">
-    </form>
 
-{else} <!-- option is not edit or add -->
-    
-    <div id="addPackageButton" class="button-primary glm-right">Add a Package</div>    
-    <h2>Multi-Member Packages</h2>
+  {/if}    
 
-    <table class="wp-list-table striped glm-admin-table">
-        <thead>
-            <tr>
-                <th>Package</th>
-                <th>Start</th>
-                <th>End</th>
-                <th>Expire</th>
-            </tr>
-        </thead>
-        <tbody>
-  {if $havePackages}
-    {foreach $packages as $p}
-            <tr>
-                <td>
-                    <a href="{$thisURL}?page={$thisPage}&glm_action=packaging&option=edit&packageID={$p.id}&member={$memberID}">{$p.title}</a>
-                </td>
-                <td>
-                    {$p.start_date.date}
-                </td>
-                <td>
-                    {$p.end_date.date}
-                </td>
-                <td>
-                    {$p.expire_date.date}
-                </td>
-            </tr>
-    {/foreach}
-  {else}
-            <tr class="alternate"><td colspan="5">(no packages listed)</td></tr>
+{else} <!-- option is not edit or add -->
+        
+  {if apply_filters('glm_members_permit_admin_member_packaging_add_package', true)}
+        <div id="addPackageButton" class="button-primary glm-right">Add a Package</div>
   {/if}
-        </tbody>
-    </table>
-
-{/if} <!-- end of option test -->
+  
+        <h2>Multi-Member Packages</h2>
+    
+        <table class="wp-list-table striped glm-admin-table">
+            <thead>
+                <tr>
+                    <th>Package</th>
+                    <th>Start</th>
+                    <th>End</th>
+                    <th>Expire</th>
+                </tr>
+            </thead>
+            <tbody>
+      {if $havePackages}
+        {foreach $packages as $p}
+                <tr>
+                    <td>
+                        <a href="{$thisURL}?page={$thisPage}&glm_action=packaging&option=edit&packageID={$p.id}&member={$memberID}">{$p.title}</a>
+                    </td>
+                    <td>
+                        {$p.start_date.date}
+                    </td>
+                    <td>
+                        {$p.end_date.date}
+                    </td>
+                    <td>
+                        {$p.expire_date.date}
+                    </td>
+                </tr>
+        {/foreach}
+      {else}
+                <tr class="alternate"><td colspan="5">(no packages listed)</td></tr>
+      {/if}
+            </tbody>
+        </table>
+{/if}
 
     <script type="text/javascript">
         jQuery(document).ready(function($) {
             
             // Date Input
             $('.glm-date-input').datepicker();
-//            $( "#glmStartDate" ).datepicker();
             
             // Flash certain elements for a short time after display      
             $(".glm-flash-updated").fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500);
index 23d1992..cf135d7 100644 (file)
     
 {if $option == 'edit' || $option == 'add'}
     
-  {if $option == 'edit'}
-    <h2>Edit Multi-Member Package</h2>
-  {else}
-    <h2>Add new Multi-Member Package</h2>
-  {/if}
-
+  {if apply_filters('glm_members_permit_admin_members_packaging_edit_package', true)}
 
-    <form action="{$thisURL}?page={$thisPage}" method="post" enctype="multipart/form-data">
-        <input type="hidden" name="glm_action" value="packaging">
-        <input type="hidden" name="ref_type" value="0">
-        <input type="hidden" name="ref_dest" value="0">
-      {if $havePackage}
-        <input type="hidden" name="option" value="update">
-        <input type="hidden" name="packageID" value="{$packageID}">
+        
+      {if $option == 'edit'}
+        <h2>Edit Multi-Member Package</h2>
       {else}
-        <input type="hidden" name="option" value="insert">
+        <h2>Add new Multi-Member Package</h2>
       {/if}
-
-        <table class="glm-admin-table">
-            <tr>
-                <th>Active:</th>
-                <td>
-                    <input type="checkbox" name="active" {if $packageInfo.fieldData.active.value} checked{/if}>
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.title}class="glm-required"{/if}>Title:</th>
-                <td {if $packageInfo.fieldFail.title}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="title" value="{$packageInfo.fieldData.title}" class="glm-form-text-input-short">
-                    {if $packageInfo.fieldFail.title}<p>{$packageInfo.fieldFail.title}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-            <th {if $packageInfo.fieldRequired.descr}class="glm-required"{/if}>Description:</th>
-            <td {if $packageInfo.fieldFail.descr}class="glm-form-bad-input"{/if}>
-                {php} 
-                    wp_editor('{$packageInfo.fieldData.descr|escape:quotes}', 'glm_descr', array(
-                        // 'media_buttons' => true,
-                        // 'quicktags' => false,
-                        // 'wpautop' => false,  NOTE: Dont's use. Problem when numerous spaces before text.
-                        'textarea_name' => 'descr',
-                        'editor_height' => 200,     // Height in px, overrides editor_rows
-                            // 'textarea_rows' => 8
-                    ));
-                {/php}
-                {if $packageInfo.fieldFail.descr}<p>{$packageInfo.fieldFail.descr}</p>{/if}
-            </td>
-        </tr>
-        <tr>
-            <th {if $packageInfo.fieldRequired.short_descr}class="glm-required"{/if}>Short Description:</th>
-            <td {if $packageInfo.fieldFail.short_descr}class="glm-form-bad-input"{/if}>
-                <input type="text" name="short_descr" value="{$packageInfo.fieldData.short_descr}" class="glm-form-text-input" placeholder="A short, one line, description of the package.">
-                {if $packageInfo.fieldFail.short_descr}<p>{$packageInfo.fieldFail.short_descr}</p>{/if}
-            </td>
-        </tr>
-        <tr>
-            <th {if $packageInfo.fieldRequired.image}class="glm-required"{/if}>Logo:</th>
-            <td {if $packageInfo.fieldFail.image}class="glm-form-bad-input"{/if}>
-                <table class="glm-admin-image-edit-table">
-    {if $packageInfo.fieldData.image}
-                    <tr>
-                        <td>
-                            <div class="glm-galleryImage" data-id="logo">
-                                <img src="{$glmPluginMediaURL}/images/small/{$packageInfo.fieldData.image}">
-                            </div>
-                        </td>
-                        <td>
-                            <input type="checkbox" name="logo_delete"> Delete Image<br>
-                            {$packageInfo.fieldData.image}<br>
-                        </td>
-                    </tr>
-    {/if}
-                    <tr><td colspan="2"><b>New image:</b> <input type="file" name="logo_new"></td></tr>
-                </table>
-                <div id="glm-galleryImageLarger_logo" class="glm-imageDialog"><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></div>
-                {if $packageInfo.fieldFail.image}<p>{$packageInfo.fieldFail.image}</p>{/if}
-            </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.start_date}class="glm-required"{/if}>Start Date:</th>
-                <td {if $packageInfo.fieldFail.start_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="start_date" value="{$packageInfo.fieldData.start_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.start_date}<p>{$packageInfo.fieldFail.start_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.end_date}class="glm-required"{/if}>End Date:</th>
-                <td {if $packageInfo.fieldFail.end_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="end_date" value="{$packageInfo.fieldData.end_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.end_date}<p>{$packageInfo.fieldFail.end_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.expire_date}class="glm-required"{/if}>Expire Date:</th>
-                <td {if $packageInfo.fieldFail.expire_date}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="expire_date" value="{$packageInfo.fieldData.expire_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
-                    {if $packageInfo.fieldFail.expire_date}<p>{$packageInfo.fieldFail.expire_date}</p>{/if}
-                </td>
-            </tr>
-            <tr>
-                <th {if $packageInfo.fieldRequired.pricing}class="glm-required"{/if}>Pricing Description:</th>
-                <td {if $packageInfo.fieldFail.pricing}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="pricing" value="{$packageInfo.fieldData.pricing}" class="glm-form-text-input" placeholder="Describe package pricing.">
-                    {if $packageInfo.fieldFail.pricing}<p>{$packageInfo.fieldFail.pricing}</p>{/if}
+    
+    
+        <form action="{$thisURL}?page={$thisPage}" method="post" enctype="multipart/form-data">
+            <input type="hidden" name="glm_action" value="packaging">
+            <input type="hidden" name="ref_type" value="0">
+            <input type="hidden" name="ref_dest" value="0">
+          {if $havePackage}
+            <input type="hidden" name="option" value="update">
+            <input type="hidden" name="packageID" value="{$packageID}">
+          {else}
+            <input type="hidden" name="option" value="insert">
+          {/if}
+    
+            <table class="glm-admin-table">
+                <tr>
+                    <th {if $packageInfo.fieldRequired.title}class="glm-required"{/if}>Title:</th>
+                    <td {if $packageInfo.fieldFail.title}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="title" value="{$packageInfo.fieldData.title}" class="glm-form-text-input-short">
+                        {if $packageInfo.fieldFail.title}<p>{$packageInfo.fieldFail.title}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th>Active:</th>
+                    <td>
+                        <input type="checkbox" name="active" {if $packageInfo.fieldData.active.value} checked{/if}>
+                    </td>
+                </tr>
+                <tr>
+                <th {if $packageInfo.fieldRequired.descr}class="glm-required"{/if}>Description:</th>
+                <td {if $packageInfo.fieldFail.descr}class="glm-form-bad-input"{/if}>
+                    {php} 
+                        wp_editor('{$packageInfo.fieldData.descr|escape:quotes}', 'glm_descr', array(
+                            // 'media_buttons' => true,
+                            // 'quicktags' => false,
+                            // 'wpautop' => false,  NOTE: Dont's use. Problem when numerous spaces before text.
+                            'textarea_name' => 'descr',
+                            'editor_height' => 200,     // Height in px, overrides editor_rows
+                                // 'textarea_rows' => 8
+                        ));
+                    {/php}
+                    {if $packageInfo.fieldFail.descr}<p>{$packageInfo.fieldFail.descr}</p>{/if}
                 </td>
             </tr>
             <tr>
-                <th {if $packageInfo.fieldRequired.position}class="glm-required"{/if}>Display Order:</th>
-                <td {if $packageInfo.fieldFail.position}class="glm-form-bad-input"{/if}>
-                    <input type="text" name="position" value="{$packageInfo.fieldData.position}" class="glm-form-text-input-short">
-                    {if $packageInfo.fieldFail.position}<p>{$packageInfo.fieldFail.position}</p>{/if}
+                <th {if $packageInfo.fieldRequired.short_descr}class="glm-required"{/if}>Short Description:</th>
+                <td {if $packageInfo.fieldFail.short_descr}class="glm-form-bad-input"{/if}>
+                    <input type="text" name="short_descr" value="{$packageInfo.fieldData.short_descr}" class="glm-form-text-input" placeholder="A short, one line, description of the package.">
+                    {if $packageInfo.fieldFail.short_descr}<p>{$packageInfo.fieldFail.short_descr}</p>{/if}
                 </td>
             </tr>
             <tr>
-                <th>Participating Members</th>
-                <td class="glm-imageGalleryContainer">
-
-                    
-                    Search to add a member: <input  id="glmMembersList" type="text" id="autoTest" style="margin-left: 2em;"><br>
-                                        
-                    
-                    <input type="hidden" id="galleryPositionOrder" name="galleryPositionOrder" 
-                        value="{if $havePackageMembers}{foreach $gallery as $i name=ig}{if $i.title}{$i.id}{if not $smarty.foreach.ig.last},{/if}{/if}{/foreach}{/if}" />
-
-                    <!-- The contents of this div are read by imageUpload.js to use as a template for inserting a new image into the gallery area -->
-                    <div id="glmGalleryItmeDataTemplate" class="glm-imageItemHidden">
-                        <li id="packageMember_{ id }" class="glm-galleryContainerFlexible">
-                            <input type="hidden" name="packageMember_{ id }" value="{ id }">
-                            <input type="hidden" name="position_{ id }" value="{ position }">
-                                <table class="glm-statusTable">
-                                    <tr><th>Package Member:</th><td>{ memberName }</td></tr>
-                                    <tr><th>Active:</th><td><input type="checkbox"></td></tr>
-                                    <tr><th>Package Element Title:</th><td><input type="text" value=""></td></tr>
-                                    <tr><th>Description:</th><td><input type="text" value=""></td></tr>
-                                    <tr><th>Short Description:</th><td><input type="text" value=""></td></tr>
-                                    <tr><th>Image:</th><td><input type="file"></td></tr>
-                                </table>
-                        </li>
-                    </div>
-                    <!-- End of template -->
-                    <div class="glm-imageGalleryContainer glm-item-container">
-                        <ul id="glmPackageMembersList" class=".glm-galleryContainer">
-        {if $havePackageMembers}     
-                            <!-- Note that id in li is needed for sorting -->
-            {foreach $packageMembers as $i}
-                            <li id="packageMember_{$i.id}" class="glm-galleryContainerFlexible">
-                                <input type="hidden" name="packageMember_{$i.id}" value="{$i.id}">
-                                <input type="hidden" name="position_{$i.id}" value="{$i.position}">
-                                <div class="glm-galleryImageData">
-                                <table class="glm-galleryContainerContent">
-                                    <tr><th>Package Member:</th><td>{$i.memberName}</td></tr>
-                                    <tr><th>Active:</th><td><input type="checkbox"></td></tr>
-                                    <tr><th>Package Element Title:</th><td><input type="text"></td></tr>
-                                    <tr><th>Description:</th><td><input type="text"></td></tr>
-                                    <tr><th>Short Description:</th><td><input type="text"></td></tr>
-                                    <tr><th>Image:</th><td><input type="file"></td></tr>
-                                    
-                                </table>
+                <th {if $packageInfo.fieldRequired.image}class="glm-required"{/if}>Image:</th>
+                <td {if $packageInfo.fieldFail.image}class="glm-form-bad-input"{/if}>
+                    <table class="glm-admin-image-edit-table">
+        {if $packageInfo.fieldData.image}
+                        <tr>
+                            <td>
+                                <div class="glm-galleryImage" data-id="image">
+                                    <img src="{$glmPluginMediaURL}/images/small/{$packageInfo.fieldData.image}">
                                 </div>
-                            </li>
-            {/foreach}
-        {else}
-                            <li id="glmNoMembersSelected">No members have been added to this package yet.<br>Please select a member above.</li>
+                            </td>
+                            <td>
+                                <input type="checkbox" name="image_delete"> Delete Image<br>
+                                {$packageInfo.fieldData.image}<br>
+                            </td>
+                        </tr>
         {/if}
-                        </ul>
-                    </div>
+                        <tr><td colspan="2"><b>New image:</b> <input type="file" name="image_new"></td></tr>
+                    </table>
+                    <div id="glm-galleryImageLarger_image" class="glm-imageDialog"><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></div>
+                    {if $packageInfo.fieldFail.image}<p>{$packageInfo.fieldFail.image}</p>{/if}
                 </td>
-            </tr>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.start_date}class="glm-required"{/if}>Start Date:</th>
+                    <td {if $packageInfo.fieldFail.start_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="start_date" value="{$packageInfo.fieldData.start_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.start_date}<p>{$packageInfo.fieldFail.start_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.end_date}class="glm-required"{/if}>End Date:</th>
+                    <td {if $packageInfo.fieldFail.end_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="end_date" value="{$packageInfo.fieldData.end_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.end_date}<p>{$packageInfo.fieldFail.end_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.expire_date}class="glm-required"{/if}>Expire Date:</th>
+                    <td {if $packageInfo.fieldFail.expire_date}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="expire_date" value="{$packageInfo.fieldData.expire_date.date}" class="glm-form-text-input-short glm-date-input" placeholder="Click for Calendar">
+                        {if $packageInfo.fieldFail.expire_date}<p>{$packageInfo.fieldFail.expire_date}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.pricing}class="glm-required"{/if}>Pricing Description:</th>
+                    <td {if $packageInfo.fieldFail.pricing}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="pricing" value="{$packageInfo.fieldData.pricing}" class="glm-form-text-input" placeholder="Describe package pricing.">
+                        {if $packageInfo.fieldFail.pricing}<p>{$packageInfo.fieldFail.pricing}</p>{/if}
+                    </td>
+                </tr>
+                <tr>
+                    <th {if $packageInfo.fieldRequired.position}class="glm-required"{/if}>Display Order:</th>
+                    <td {if $packageInfo.fieldFail.position}class="glm-form-bad-input"{/if}>
+                        <input type="text" name="position" value="{$packageInfo.fieldData.position}" class="glm-form-text-input-short">
+                        {if $packageInfo.fieldFail.position}<p>{$packageInfo.fieldFail.position}</p>{/if}
+                    </td>
+                </tr>
+                
+    {if false} <!-- NOT COMPLETING PARTICIPATING MEMBERS AT THIS TIME -->
+                
+                <tr>
+                    <th>Participating Members</th>
+                    <td class="glm-imageGalleryContainer">
+    
+                        
+                        Search to add a member: <input  id="glmMembersList" type="text" id="autoTest" style="margin-left: 2em;"><br>
+                                            
+                        
+                        <input type="hidden" id="galleryPositionOrder" name="galleryPositionOrder" 
+                            value="{if $havePackageMembers}{foreach $gallery as $i name=ig}{if $i.title}{$i.id}{if not $smarty.foreach.ig.last},{/if}{/if}{/foreach}{/if}" />
+    
+                        <!-- The contents of this div are read by imageUpload.js to use as a template for inserting a new image into the gallery area -->
+                        <div id="glmGalleryItmeDataTemplate" class="glm-imageItemHidden">
+                            <li id="packageMember_{ id }" class="glm-galleryContainerFlexible">
+                                <input type="hidden" name="packageMember_{ id }" value="{ id }">
+                                <input type="hidden" name="position_{ id }" value="{ position }">
+                                    <table class="glm-statusTable">
+                                        <tr><th>Package Member:</th><td>{ memberName }</td></tr>
+                                        <tr><th>Active:</th><td><input type="checkbox"></td></tr>
+                                        <tr><th>Package Element Title:</th><td><input type="text" value=""></td></tr>
+                                        <tr><th>Description:</th><td><input type="text" value=""></td></tr>
+                                        <tr><th>Short Description:</th><td><input type="text" value=""></td></tr>
+                                        <tr><th>Image:</th><td><input type="file"></td></tr>
+                                    </table>
+                            </li>
+                        </div>
+                        <!-- End of template -->
+                        <div class="glm-imageGalleryContainer glm-item-container">
+                            <ul id="glmPackageMembersList" class=".glm-galleryContainer">
+            {if $havePackageMembers}     
+                                <!-- Note that id in li is needed for sorting -->
+                {foreach $packageMembers as $i}
+                                <li id="packageMember_{$i.id}" class="glm-galleryContainerFlexible">
+                                    <input type="hidden" name="packageMember_{$i.id}" value="{$i.id}">
+                                    <input type="hidden" name="position_{$i.id}" value="{$i.position}">
+                                    <div class="glm-galleryImageData">
+                                    <table class="glm-galleryContainerContent">
+                                        <tr><th>Package Member:</th><td>{$i.memberName}</td></tr>
+                                        <tr><th>Active:</th><td><input type="checkbox"></td></tr>
+                                        <tr><th>Package Element Title:</th><td><input type="text"></td></tr>
+                                        <tr><th>Description:</th><td><input type="text"></td></tr>
+                                        <tr><th>Short Description:</th><td><input type="text"></td></tr>
+                                        <tr><th>Image:</th><td><input type="file"></td></tr>
+                                        
+                                    </table>
+                                    </div>
+                                </li>
+                {/foreach}
+            {else}
+                                <li id="glmNoMembersSelected">No members have been added to this package yet.<br>Please select a member above.</li>
+            {/if}
+                            </ul>
+                        </div>
+                    </td>
+                </tr>
+    
+    {/if}       
+                
+            </table>
+            <input type="submit" value="{if $havePackage}Update Package{else}Add New Package{/if}">
+        </form>
         
-            
-            
-            
-            
+  {else} <!-- Can just display -->
+          
+        <table class="glm-admin-table">
+            <tr><th>Title:</th><td>{$packageInfo.fieldData.title}</td></tr>
+            <tr><th>Active:</th><td>{$packageInfo.fieldData.active.name}</td></tr>
+            <tr><th>Description:</th><td>{$packageInfo.fieldData.descr}</td></tr>
+            <tr><th>Short Description:</th><td>{$packageInfo.fieldData.short_descr}</td></tr>
+            <tr><th>Image:</th><td><img src="{$glmPluginMediaURL}/images/large/{$packageInfo.fieldData.image}"></td></tr>
+            <tr><th>Start Date:</th><td>{$packageInfo.fieldData.start_date.date}</td></tr>
+            <tr><th>End Date:</th><td>{$packageInfo.fieldData.end_date.date}</td></tr>
+            <tr><th>Expiration Date:</th><td>{$packageInfo.fieldData.expire_date.date}</td></tr>
+            <tr><th>Pricing Description:</th><td>{$packageInfo.fieldData.pricing}</td></tr>
+            <tr><th>Display Order:</th><td>{$packageInfo.fieldData.position}</td></tr>
         </table>
-        <input type="submit" value="{if $havePackage}Update Package{else}Add New Package{/if}">
-    </form>
+        
+  {/if}
 
 {else} <!-- option is not edit or add -->
     
-    <div id="addPackageButton" class="button-primary glm-right">Add a Package</div>    
+  {if apply_filters('glm_members_permit_admin_members_packaging_add_package', true)}
+    <div id="addPackageButton" class="button-primary glm-right">Add a Package</div>
+  {/if}
+      
     <h2>Multi-Member Packages</h2>
 
     <table class="wp-list-table striped glm-admin-table">
         </tbody>
     </table>
 
-{/if} <!-- end of option test -->
+{/if}
 
     <script type="text/javascript">
         jQuery(document).ready(function($) {
             
             // Date Input
             $('.glm-date-input').datepicker();
-//            $( "#glmStartDate" ).datepicker();
             
             // Flash certain elements for a short time after display      
             $(".glm-flash-updated").fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500);
diff --git a/views/front/footer.html b/views/front/footer.html
new file mode 100644 (file)
index 0000000..ce3a205
--- /dev/null
@@ -0,0 +1,10 @@
+
+    </div> <!-- / admin content area -->
+          
+  {if $frontDebug}
+    <script>
+        window.open('{$thisURL}?glmDebugWindow=true','GLM_Plugin_Debug','width=800,height=800,left=50,top=50,resizable=yes,scrollbars=yes');
+    </script>
+  {/if}
+  
+</div> <!-- / wrap -->
\ No newline at end of file
diff --git a/views/front/packaging/detail.html b/views/front/packaging/detail.html
new file mode 100644 (file)
index 0000000..b2e9506
--- /dev/null
@@ -0,0 +1,34 @@
+{include file='front/packaging/header.html'}
+
+{if $havePackage}
+
+    <div>
+        <h1><a src="">{$package.title}</a></h1>
+   {if $package.ref_type.value}
+        <h2>{$package.ref_type.name}: {$package.ref_dest_name}</h2>
+  {/if}
+      {if $package.image}
+        <div>
+            <img src="{$glmPluginMediaURL}/images/small/{$package.image}">
+        </div> 
+      {/if}
+        <div>
+            <table>
+                <tr><th>Start Date:</th><td>{$package.start_date.date}</td></tr>
+                <tr><th>End Date:</th><td>{$package.end_date.date}</td></tr>
+                <tr><th>Expiration Date:</th><td>{$package.expire_date.date}</td></tr>
+                <tr><th>Pricing:</th><td>{$package.pricing}</td></tr>
+            </table>
+      {if $package.descr}
+            <p><b>Description:</b> {$package.descr}</p>
+      {else if $package.short_descr}
+            <p><b>Description:</b> {$package.short_descr}</p>
+      {/if}
+        </div>
+    </div>
+
+{else}
+    (Sorry, no data on the specified package.)
+{/if}
+
+{include file='front/footer.html'}
diff --git a/views/front/packaging/header.html b/views/front/packaging/header.html
new file mode 100644 (file)
index 0000000..4af7c4f
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="wrap">
+    <div id="glm-front-content-container">
+    
\ No newline at end of file
diff --git a/views/front/packaging/list.html b/views/front/packaging/list.html
new file mode 100644 (file)
index 0000000..1b7d851
--- /dev/null
@@ -0,0 +1,39 @@
+{include file='front/packaging/header.html'}
+    
+{foreach $packages as $p}
+    <div>
+  {if $p.ref_type.value}
+    {if $byMember}
+      {if $p.firstForMember}
+        <h1>{$p.ref_type.name}: {$p.ref_dest_name}</h1>
+      {/if}
+    {else}
+        <h3>{$p.ref_type.name}: {$p.ref_dest_name}</h3>
+    {/if}
+  {/if}
+    <h2><a href="{$thisURL}?glm_action=detail&packageID={$p.id}">{$p.title}</a></h2>
+      {if $p.image}
+        <div>
+            <img src="{$glmPluginMediaURL}/images/small/{$p.image}">
+        </div> 
+      {/if}
+        <div>
+            <table>
+                <tr><th>Start Date:</th><td>{$p.start_date.date}</td></tr>
+                <tr><th>End Date:</th><td>{$p.end_date.date}</td></tr>
+                <tr><th>Expiration Date:</th><td>{$p.expire_date.date}</td></tr>
+                <tr><th>Pricing:</th><td>{$p.pricing}</td></tr>
+            </table>
+          {if $p.descr}
+            <p><b>Description:</b> {$p.descr}</p>
+          {else if $p.short_descr}
+            <p><b>Description:</b> {$p.short_descr}</p>
+          {/if}
+        </div>
+    </div>
+    
+  
+
+{/foreach}
+  
+{include file='front/footer.html'}