} else {
update_option(GLM_MEMBERS_PLUGIN_OPTION_FIRST_ACTIVATION, 'false');
}
+
}
/*
public function __construct ($wpdb, $config)
{
- if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - Start Admin Controller Constructor',E_USER_NOTICE);
}
// Save WordPress Database object
}
- if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - End Admin Controller Constructor',E_USER_NOTICE);
}
}
$defaultTimeZone = date_default_timezone_get();
date_default_timezone_set($this->config['settings']['time_zone']);
- if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - Start Admin Controller AJAX',E_USER_NOTICE);
}
// Get the model action
// Generate output from model data and view
$smarty->template->display($viewFile);
- if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - End Admin Controller AJAX',E_USER_NOTICE);
}
// Restore timezone that was set before our code was called
* @param string $menuItem Name of the menu item that is being processed
* @param string $action Specified Action to take or false
* @param array $actionData Optional array of data to pass to the selected action
+ * @param boolean $returnOutput Optionally tell controller to return the output rather than display it
+ * @param boolean $forceAction Optionally tell controller it must run the supplied action
+ * This last paramter can prevent a submit paramter from overriding the action.
*
* @return void
* @access public
*/
- public function controller( $menuItem, $action = false, $actionData = false, $returnOutput = false )
+ public function controller( $menuItem, $action = false, $actionData = false, $returnOutput = false, $forceAction = false )
{
- if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - Start Admin Controller',E_USER_NOTICE);
}
// Enque admin scripts and css here so that only happens when we're doing something
$action = 'index';
}
- // Get any requested "action" from a form submission and modify path/name
- // accordingly. This modifies the previously set $action.
- if (!$actionData && isset($_REQUEST['glm_action']) && $_REQUEST['glm_action'] != '') {
+ /*
+ * Get any requested "action" from a form submission and modify path/name
+ * accordingly.
+ *
+ * The 'glm_action' REQUEST parameter used to override the $action supplied to this controller
+ * but that behavior has been changed so that it doesn't. Not sure why we did that.
+ *
+ */
+ if (!$forceAction && !$actionData && isset($_REQUEST['glm_action']) && $_REQUEST['glm_action'] != '') {
$a = sanitize_text_field($_REQUEST['glm_action']);
if ($a != '') {
$action = $a;
if (! isset($this->config['validActions']['adminActions'][$menuItem]) ||
! isset($this->config['validActions']['adminActions'][$menuItem][$action])) {
- trigger_error('Error in Admin Controller: Requested Menu Item is invalid! - '.$menuItem, E_USER_NOTICE);
+ trigger_error("Error in Admin Controller: Requested Menu Item is invalid! - $menuItem/$action", E_USER_NOTICE);
$menuItem = 'error';
$action = 'badAction';
$modelRedirect = true;
}
+ // If there's no view and no data returned, assume it doesn't want a view processd and just return;
+ if (!$results['view'] && !$results['data']) {
+ return false;
+ }
+
// Get the specified view file path and name
$view = false;
if (isset($results['view'])) {
// Restore timezone that was set before our code was called
date_default_timezone_set($defaultTimeZone);
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error(glmAssociateMemoryUsage().' - End Admin Controller',E_USER_NOTICE);
+ }
+
if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
$smarty->template->display( 'admin/smartyDebug.html');
}
{
if (GLM_MEMBERS_PLUGIN_FRONT_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ trigger_error(glmAssociateMemoryUsage()." - Controller Constructor Start",E_USER_NOTICE);
}
// Save WordPress Database object
add_action('glmMembersFrontCSSFilter',array($this,'glmMembersFrontCSS'));
if (GLM_MEMBERS_PLUGIN_FRONT_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ trigger_error(glmAssociateMemoryUsage()." - Controller Constructor End",E_USER_NOTICE);
}
}
$this->config = $config;
*/
- // Not doing anything here for now.
+ // Unschedule GLM Assoicate Cron
+ $timestamp = wp_next_scheduled( 'glm_associate_cron' );
+ if ($timestamp) {
+ trigger_error("Unscheduling glm_associate_cron @ ".date('r', $timestamp));
+ wp_unschedule_event( $timestamp, 'glm_associate_cron' );
+ }
+
}
}
require_once 'config.php';
if (GLM_MEMBERS_PLUGIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ trigger_error(glmAssociateMemoryUsage()." - Start glm-member-db setup",E_USER_NOTICE);
}
/*
}
if (GLM_MEMBERS_PLUGIN_DEBUG_VERBOSE) {
- trigger_error(glmAssociateMemoryUsage(),E_USER_NOTICE);
+ trigger_error(glmAssociateMemoryUsage()." - End glm-member-db setup",E_USER_NOTICE);
}
/*
$mu = $m - $GLOBALS['glmAssociateMemTracker'];
return 'GLM Associate Memory Usage: '.number_format($mu,0).' of '.number_format($m,0).' Bytes';
}
+
+/*
+ * GLM Associate Cron
+ *
+ * All cron actions requested by this plugin or add-ons are registerd by using the
+ * "glm_associate_cron_request" add_filter(). That filter supplies a blank array and anything
+ * requesting a cron action will add an array element that describes what needs to be
+ * done as described below. Note that a plugin may provide more than one entry if it
+ * has multiple actions it wants called.
+ *
+ * The action will be executed at the correct time by running apply_filter() with
+ * the name of {plugin}-{actionID}. That callback that will include an array like
+ * the second one below.
+ *
+ * When an action add_filter is called, it is supplied with a copy of the
+ * "params" array suplied when the action was requested and the day of week and hour
+ * being executed.
+ *
+ * On completion of the action, the action filter will return a success flag
+ * and an optional message stating what was completed or what failed.
+ *
+ * An action request should be to execute a set of tasks that are related rather
+ * than for each thing that needs to be processed to keep from cluttering the requests.
+ *
+ * NOTE that a plugin only needs to provide an action request that it wants executed.
+ * via the "glm_associate_cron_request" filter when it needs to be on the schedule. There is
+ * no need to tell GLM Associate Cron when something is no longer needed. This avoids
+ * the need for the add-ons to have something in the activation/deactivation scripts
+ * for this cron.
+ *
+ * An appropriate place for the "
+ *
+ * Array supplied when requesting an action
+ *
+ * array(
+ * 'menu' => Menu assciated with requested action.
+ * 'action' => Model to be run - The admin controller will be used to
+ * run this model.
+ * 'daysOfWeek'=> Array of days on which the action should take place.
+ * 1 to 7 starting with Sunday. If false call action on all days.
+ * 'times' => Array of hours on which the action should take place.
+ * These are numeric hours using 24 hour clock.
+ * If false then call this action at the next hour.
+ * 'params' => Array of parameters that will be passedd to the action
+ * These parameters allow one callback to perform various
+ * actions at the requested times.
+ * )
+ *
+ * Array provided to callback function when executing the action
+ *
+ * array(
+ * 'day' => Day of week on which the action is being called,
+ * 'time' => Integer hour at which the action is being called,
+ * 'params' => The 'params' array for this action
+ * )
+ *
+ * Array returned by the callback function when done performing the action.
+ * NOTE: Logging of this information is a future feature, so this return array
+ * is currently optional.
+ *
+ * array(
+ * 'success' => True if successful
+ * 'Message' => Additional message describing what was accomplished for cron log
+ * )
+ *
+ * Flow of GLM Associate Cron
+ *
+ * 1) activate.php adds a scheduled event for WordPress to run 'glm_associate_cron' (below)
+ * every hour on the half hour.
+ * 2) deactivate.php removes the 'glm_asscoiate_cron' scheduled event when deactivating this plugin.
+ * 3) GLM Associate plugins/add-ons request cron actions using the 'glm_associate_cron_request'
+ * add_action which should be in their setup/adminHooks.php file. (see sample in main plugin)
+ * 3) The add_action() below sets up action 'glm_associate_cron' to call do_glm_associate_cron().
+ * 4) When called, do_glm_associate_cron() does an AJAX request to models/admin/ajax/glmCron.php.
+ * 5) When AJAX action glmCron is run it will apply 'glm_associate_cron_request' filters to get
+ * any requested cron actions from any GLM Associate plugin/add-on. It then calls each model
+ * requested in sequence that asked to be run at that time.
+ *
+ * NOTE: Since the result of the scheduled event is to run an AJAX mode, that model may be run
+ * at any time by entering the proper URL into a browser.
+ *
+ * http://{hostname}/wp-admin/admin-ajax.php?action=glm_members_admin_ajax&glm_action=glmCron
+ */
+
+// Called by WordPress each hour on the half hour. (see activate.php)
+add_action('glm_associate_cron', 'do_glm_associate_cron');
+function do_glm_associate_cron() {
+
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error('Run GLM Associate Cron', E_USER_NOTICE);
+ }
+
+ // Do AJAX call to glmCron.php
+ wp_remote_get(admin_url().'admin-ajax.php?action=glm_members_admin_ajax&glm_action=glmCron');
+
+}
+
+//
+// If no cron schedue is set, add it now to start at 30 min after the hour during the next hour.
+$timestamp = wp_next_scheduled( 'glm_associate_cron' );
+if (!$timestamp) {
+ $t = strtotime(date('Y-m-d G:00 e')." + 90 minutes");
+ trigger_error('No Cron Set: Scheduling glm_cron to start @ '.date('r', $t), E_USER_NOTICE);
+ wp_schedule_event( $t, 'hourly', 'glm_associate_cron' );
+}
+
+
--- /dev/null
+<?php
+
+/**
+ * Gaslight Media Members Database
+ * GLM Associate Cron - Ajax
+ *
+ * PHP version 5.5
+ *
+ * @category glmWordPressPlugin
+ * @package glmMembersDatabase
+ * @author Chuck Scott <cscott@gaslightmedia.com>
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @version 0.1
+ */
+
+require_once GLM_MEMBERS_PLUGIN_PATH . '/controllers/admin.php';
+
+/*
+ * This class exports the currently selected members list
+ * to a printable HTML file, to a CSV file, or otherwise.
+ */
+class GlmMembersAdmin_ajax_glmCron extends glmMembersAdmin
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+
+ /*
+ * Constructor
+ *
+ * This contructor sets up this model. At this time that only includes
+ * storing away the WordPress data object.
+ *
+ * @return object Class object
+ *
+ */
+ public function __construct ($wpdb, $config)
+ {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ }
+
+ /*
+ * Perform requested actions for a GLM Cron instance
+ */
+ public function modelAction ($actionData = false)
+ {
+
+ $run = 0;
+
+ // Get day and hour this is being run - force hours to numeric
+ $thisDay = date('N');
+ $thisHour = (date('G')-0);
+
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error("glmCron processing started: day = $thisDay, hour = $thisHour", E_USER_NOTICE);
+ }
+
+ // Get requested cron actions
+ $cronActions = apply_filters('glm_associate_cron_request', array());
+
+
+ // Loop through these actions and call what's appropriate for the current time
+ if (is_array($cronActions)) {
+ if (count($cronActions) > 0) {
+
+ foreach ($cronActions as $act) {
+
+ // Check if this action should be run now
+ if (in_array($thisDay, $act['daysOfWeek']) && in_array($thisHour, $act['times'])) {
+
+ // Run the action by calling the controller - force controller to use supplied action (no REQUEST override)
+ $this->controller($act['menu'], $act['action'], $act['params'], false, true);
+ $run++;
+
+ }
+ }
+
+ }
+ } else {
+ trigger_error('GLM Associate Cron: Bad request array!', E_USER_WARNING);
+ }
+
+ if (GLM_MEMBERS_PLUGIN_ADMIN_DEBUG) {
+ trigger_error("GLM Cron processed $run matching day and hour out of ".count($cronActions).' total requested.', E_USER_NOTICE);
+ }
+
+ // This AJAX action does not return to anything.
+ wp_die();
+
+ }
+
+}
* Also note that parameters will be in the context of the main admin controller constructor.
*/
+/*
+ * Add an action to GLM Associate Cron
+ *
+ * See description for "GLM Associate Cron" in main plugin index.php file.
+ */
+/* Sample add cron request for testing.
+add_filter('glm_associate_cron_request', function($request) {
+
+ // Sanity check - Must be passed an array
+ if (is_array($request)) {
+
+ $request[] = array(
+ 'menu' => GLM_MEMBERS_PLUGIN_UNDERSCORED_NAME, // Menu where action exists
+ 'action' => 'test_action', // Name of action to run
+ 'daysOfWeek'=> false, // All Days
+ 'times' => false, // All Hours
+ 'params' => false // Any parameters needed by the triggered action
+ );
+
+ } else {
+ trigger_error('Cron Request filter recieved bad request array!', E_USER_WARNING);
+ }
+
+ return $request;
+
+}, 10, 1);
+*/
// Add content to member detail page
add_filter('glm-member-db-admin-management-hooksHelp', function($content) {
'fileLibraryUpload' => 'glm-member-db',
'fileLibraryDownload' => 'glm-member-db',
'fileLibraryDelete' => 'glm-member-db',
- 'fileLibraryUpdate' => 'glm-member-db'
+ 'fileLibraryUpdate' => 'glm-member-db',
+ 'glmCron' => 'glm-member-db'
),
'dashboard' => array(
'index' => 'glm-member-db',