/**
  * Constructs the frontend config array
  * @return config array
  */
 function construct_config_array()
 {
     $current_url = HA_Common::get_current_url();
     $config_array = array('ajax_url' => admin_url('admin-ajax.php'), 'ajax_nonce' => wp_create_nonce(HA_Common::PLUGIN_ID . '-nonce'), 'ignore_ajax_actions' => $this->ignore_ajax_actions, 'plugin_version' => HA_Common::PLUGIN_VERSION);
     $ip_address = HA_Common::get_ip_address();
     $session_id = session_id();
     // get or create user details and user environment details
     $user_details = HA_Common::get_user_details($ip_address, $session_id, false, null);
     $user_environment_details = HA_Common::get_user_environment_details($user_details['user_id'], false, null);
     $config_array = array_merge($config_array, $user_environment_details);
     $config_array = array_merge($config_array, $user_details);
     $config_array = array_merge($config_array, $this->get_custom_events($current_url));
     $config_array = array_merge($config_array, $this->get_schedule_check());
     $config_array = array_merge($config_array, $this->get_url_excluded($current_url));
     $config_array = array_merge($config_array, $this->get_general_settings());
     $config_array = array_merge($config_array, $this->get_heat_map_settings());
     $config_array = array_merge($config_array, $this->get_url_db_limit_check($current_url));
     $config_array = array_merge($config_array, $this->get_url_filters_settings());
     return $config_array;
 }
Esempio n. 2
0
 /**
  * Saves mouse click or touchscreen tap information database
  *
  * @since 2.0
  */
 public function save_user_event()
 {
     $ajaxNonce = $_POST['nonce'];
     $response = array();
     if (wp_verify_nonce($ajaxNonce, HA_Common::PLUGIN_ID . '-nonce')) {
         $response = array('status' => 'OK', 'message' => '');
         // POST parameters
         $x_coord = isset($_POST['xCoord']) && is_numeric($_POST['xCoord']) ? intval($_POST['xCoord']) : -1;
         $y_coord = isset($_POST['yCoord']) && is_numeric($_POST['yCoord']) ? intval($_POST['yCoord']) : -1;
         $url = isset($_POST['url']) ? HA_Common::normalize_url(urldecode($_POST['url'])) : null;
         $page_width = isset($_POST['pageWidth']) && is_numeric($_POST['pageWidth']) ? intval($_POST['pageWidth']) : null;
         $ip_address = isset($_POST['ipAddress']) ? $_POST['ipAddress'] : null;
         $user_id = isset($_POST['userId']) ? $_POST['userId'] : null;
         $user_environment_id = isset($_POST['userEnvironmentId']) ? $_POST['userEnvironmentId'] : null;
         $event_type = isset($_POST['eventType']) ? $_POST['eventType'] : null;
         $description = isset($_POST['description']) ? urldecode($_POST['description']) : '';
         $data = isset($_POST['data']) ? urldecode($_POST['data']) : '';
         // validate data
         if (!$url || !$page_width || !$ip_address || !$event_type) {
             $response['status'] = 'Error';
             $response['message'] = 'Required data missing from request';
             echo json_encode($response);
             return;
         }
         $ip_address = HA_Common::get_IP_address();
         // if user_id is null, create it
         if ($user_id == null) {
             $user_details = HA_Common::get_user_details(HA_Common::get_ip_address(), session_id(), true, $this->data_services);
             $user_id = $user_details['user_id'];
         }
         // if user_environment_id is null, create it
         if ($user_environment_id == null) {
             $user_environment_details = HA_Common::get_user_environment_details($user_id, true, $this->data_services);
             $user_environment_id = $user_environment_details['user_environment_id'];
         }
         // insert data into database
         $user_event_id = '';
         try {
             global $wpdb;
             $rowsAffected = $wpdb->insert($wpdb->prefix . HA_Common::USER_EVENT_TBL_NAME, array(HA_Common::USER_ID_COLUMN => $user_id, HA_Common::USER_ENV_ID_COLUMN => $user_environment_id, HA_Common::X_COORD_COLUMN => $x_coord, HA_Common::Y_COORD_COLUMN => $y_coord, HA_Common::URL_COLUMN => $url, HA_Common::PAGE_WIDTH_COLUMN => $page_width, HA_Common::LAST_UPDT_DATE_COLUMN => current_time('mysql'), HA_Common::RECORD_DATE_COLUMN => current_time('mysql'), HA_Common::DESCRIPTION_COLUMN => $description, HA_Common::DATA_COLUMN => $data, HA_Common::EVENT_TYPE_COLUMN => $event_type));
             $user_event_id = $wpdb->insert_id;
         } catch (Exception $e) {
             $response['status'] = 'Error';
             $response['message'] = 'An unexpected error occured';
             echo json_encode($response);
             return;
         }
         $debug = isset($_POST['debug']) && $_POST['debug'] == 'true' ? true : false;
         $draw_heat_map_enabled = isset($_POST['drawHeatMapEnabled']) && $_POST['drawHeatMapEnabled'] == 'true' ? true : false;
         $width_allowance = isset($_POST['widthAllowance']) && is_numeric($_POST['widthAllowance']) ? intval($_POST['widthAllowance']) : null;
         $spot_radius = isset($_POST['spotRadius']) && is_numeric($_POST['spotRadius']) ? intval($_POST['spotRadius']) : null;
         // debug
         if ($event_type !== null && ($event_type == HA_Common::MOUSE_CLICK_EVENT_TYPE || $event_type == HA_Common::TOUCHSCREEN_TAP_EVENT_TYPE) && $debug && $draw_heat_map_enabled && $width_allowance && $spot_radius) {
             // retrieve all clicks and taps and calculate heat value
             $query = 'SELECT ' . HA_Common::ID_COLUMN . ', ' . HA_Common::X_COORD_COLUMN . ', ' . HA_Common::Y_COORD_COLUMN . ', ' . HA_Common::URL_COLUMN . ', ' . HA_Common::PAGE_WIDTH_COLUMN . ' FROM ' . $wpdb->prefix . HA_Common::USER_EVENT_TBL_NAME . ' WHERE ' . HA_Common::URL_COLUMN . ' = "' . $url . '" AND (' . HA_Common::EVENT_TYPE_COLUMN . ' = "' . HA_Common::MOUSE_CLICK_EVENT_TYPE . '" OR ' . HA_Common::EVENT_TYPE_COLUMN . ' = "' . HA_Common::TOUCHSCREEN_TAP_EVENT_TYPE . '")';
             // allow a range either side to be the same
             $diff_left = $page_width - $width_allowance;
             $diff_right = $page_width + $width_allowance;
             $query .= ' AND ' . HA_Common::PAGE_WIDTH_COLUMN . ' >= ' . $diff_left . ' AND ' . HA_Common::PAGE_WIDTH_COLUMN . ' <= ' . $diff_right;
             $rows = $wpdb->get_results($query);
             $heat_value = HA_Common::calculate_heat_value($x_coord, $y_coord, $user_event_id, $rows, $spot_radius);
             $response = array_merge($response, array('user_event_id' => $user_event_id, 'heat_value' => $heat_value));
         } else {
             $response = array_merge($response, array('user_event_id' => $user_event_id));
         }
         echo json_encode($response);
     }
     die;
 }
Esempio n. 3
0
 /**
  * Gets the user details by ip address and session id
  * @param unknown_type $ip_address
  * @param unknown_type $session_id
  * @param unknown_type $create_if_empty
  */
 public static function get_user_details($ip_address, $session_id, $create_if_empty, $data_services)
 {
     $wp_user_details = HA_Common::get_wp_user_details();
     $current_time = current_time('mysql');
     $user_role = $wp_user_details['user_role'];
     $username = $wp_user_details['username'];
     $user_id = '';
     if ($data_services != null) {
         $params = array('ip_address' => $ip_address, 'session_id' => $session_id, 'create_if_empty' => $create_if_empty, 'current_time' => $current_time, 'user_role' => $user_role, 'username' => $username);
         $data = $data_services->custom_query('add_retrieve_user_details', $params);
         $user_id = $data->user_id;
     }
     return array('user_id' => $user_id, 'ip_address' => $ip_address, 'session_id' => $session_id, 'user_role' => $user_role, 'username' => $username);
 }
 public static function sanitize_url_filters_settings($input)
 {
     // Apply URL filters option
     if (isset($input[HA_Common::APPLY_URL_FILTERS_OPTION]) && $input[HA_Common::APPLY_URL_FILTERS_OPTION] == "true") {
         $input[HA_Common::APPLY_URL_FILTERS_OPTION] = true;
     } else {
         $input[HA_Common::APPLY_URL_FILTERS_OPTION] = false;
     }
     $url_filters_list = preg_split("/[\r\n,]+/", $input[HA_Common::URL_FILTERS_LIST_OPTION], -1, PREG_SPLIT_NO_EMPTY);
     $new_url_filters_list = '';
     foreach ($url_filters_list as $url) {
         $url = HA_Common::normalize_url($url);
         $new_url_filters_list .= $url . '&#13;&#10;';
     }
     $input[HA_Common::URL_FILTERS_LIST_OPTION] = $new_url_filters_list;
     return $input;
 }
 /**
  * Default column
  * @param unknown_type $item
  * @param unknown_type $column_name
  * @return unknown|mixed
  */
 function column_default($item, $column_name)
 {
     switch ($column_name) {
         case 'action':
             return $item[$column_name];
             break;
         case 'time_elapsed':
             $sequence = intval($item['sequence']);
             if ($sequence > 1) {
                 $current_activity_time = strtotime($item['record_date']);
                 $page_num = $this->get_pagenum();
                 $items_per_page = $this->get_pagination_arg('per_page');
                 $previous_row = $this->items[count($this->items) - $sequence + 1 + ($page_num - 1) * $items_per_page];
                 $previous_activity_time = strtotime($previous_row['record_date']);
                 $human_time_diff = HA_Common::human_time_diff($previous_activity_time, $current_activity_time);
                 echo $human_time_diff;
             }
             break;
         case 'url':
             echo '<a href="' . $item[$column_name] . '">' . $item[$column_name] . '</a>';
             break;
         default:
             echo $item[$column_name];
             break;
     }
 }
 /**
  * Sanitize and validate Schedule settings
  *
  * @param unknown_type $input
  * @return boolean
  */
 public static function sanitize_schedule_settings($input)
 {
     // from server or to user - get_date_from_gmt
     // from user or to server  	get_gmt_from_date
     $schedule_start_date = null;
     if (isset($input[HA_Common::SCHEDULED_START_DATE_OPTION]) && strlen($input[HA_Common::SCHEDULED_START_DATE_OPTION]) > 0) {
         if (HA_Common::check_date_format($input[HA_Common::SCHEDULED_START_DATE_OPTION]) == false) {
             add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'schedule_start_date_error', 'Scheduled start date invalid format', 'error');
             $input[HA_Common::SCHEDULED_START_DATE_OPTION] = '';
         } else {
             list($year, $month, $day) = explode('-', $input[HA_Common::SCHEDULED_START_DATE_OPTION]);
             // default yyyy-mm-dd format
             // add time part
             $scheduled_start_time_part = $_POST['scheduled_start_time_part'];
             $hour = 0;
             $minute = 0;
             if (!preg_match("/([01]?[0-9]|2[0-3]):([0-5][0-9])/", $scheduled_start_time_part)) {
                 add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'scheduled_start_time_part_invalid_format_error', 'Invalid scheduled start time format. Time must be in 24 hour format HH:mm (i.e. 12:30).', 'error');
                 // Default to 0, 0, 0
             } else {
                 // set time parts
                 list($hour, $minute) = explode(':', $scheduled_start_time_part);
             }
             $schedule_start_date = get_gmt_from_date(date("Y-m-d H:i:s", gmmktime($hour, $minute, 0, $month, $day, $year)));
             $today = get_gmt_from_date(get_date_from_gmt(date("Y-m-d H:i:s")));
             if (strtotime($schedule_start_date) <= strtotime($today)) {
                 add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'schedule_start_date_past_error', 'Scheduled start date must be in the future', 'error');
                 $input[HA_Common::SCHEDULED_START_DATE_OPTION] = '';
             }
             $input[HA_Common::SCHEDULED_START_DATE_OPTION] = $schedule_start_date;
         }
     } else {
         $input[HA_Common::SCHEDULED_START_DATE_OPTION] = "";
     }
     if (isset($input[HA_Common::SCHEDULED_END_DATE_OPTION]) && strlen($input[HA_Common::SCHEDULED_END_DATE_OPTION]) > 0) {
         if (HA_Common::check_date_format($input[HA_Common::SCHEDULED_END_DATE_OPTION]) == false) {
             add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'schedule_end_date_error', 'Scheduled end date invalid format', 'error');
             $input[HA_Common::SCHEDULED_START_DATE_OPTION] = '';
         } else {
             list($year, $month, $day) = explode('-', $input[HA_Common::SCHEDULED_END_DATE_OPTION]);
             // default yyyy-mm-dd format
             // add time part
             $scheduled_end_time_part = $_POST['scheduled_end_time_part'];
             $hour = 23;
             $minute = 59;
             if (!preg_match("/([01]?[0-9]|2[0-3]):([0-5][0-9])/", $scheduled_end_time_part)) {
                 add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'scheduled_end_time_part_invalid_format_error', 'Invalid scheduled end time format. Time must be in 24 hour format HH:mm (i.e. 12:30).', 'error');
                 // Default to 0, 0, 0
             } else {
                 // set time parts
                 list($hour, $minute) = explode(':', $scheduled_end_time_part);
             }
             $schedule_end_date = get_gmt_from_date(date("Y-m-d H:i:s", gmmktime($hour, $minute, 0, $month, $day, $year)));
             $today = get_gmt_from_date(get_date_from_gmt(date("Y-m-d H:i:s")));
             if (strtotime($schedule_end_date) <= strtotime($today)) {
                 add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'schedule_end_date_past_error', 'Scheduled end date must be in the future', 'error');
                 $input[HA_Common::SCHEDULED_END_DATE_OPTION] = '';
             } else {
                 if ($schedule_start_date != null && strtotime($schedule_end_date) <= strtotime($schedule_start_date)) {
                     add_settings_error(HA_Common::SCHEDULE_SETTINGS_KEY, 'schedule_end_date_after_start_date_error', 'Scheduled end date must be after the scheduled start date', 'error');
                     $input[HA_Common::SCHEDULED_END_DATE_OPTION] = '';
                 }
             }
             $input[HA_Common::SCHEDULED_END_DATE_OPTION] = $schedule_end_date;
         }
     } else {
         $input[HA_Common::SCHEDULED_END_DATE_OPTION] = "";
     }
     return $input;
 }
    public static function settings_page($tabs)
    {
        $current_tab = isset($_GET['tab']) ? $_GET['tab'] : HA_Common::GENERAL_SETTINGS_TAB;
        ?>
		<div class="wrap">
			<?php 
        HA_Admin_Page_View::page_header('Settings');
        HA_Admin_Page_View::show_page_tabs(HA_Common::SETTINGS_PAGE_SLUG, $tabs, $current_tab);
        if (isset($_GET['updated']) && isset($_GET['page'])) {
            add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');
        }
        settings_errors();
        if ($current_tab == HA_Common::GENERAL_SETTINGS_TAB) {
            HA_Admin_Page_View::show_settings_form(HA_Common::GENERAL_SETTINGS_KEY);
        } else {
            if ($current_tab == HA_Common::SCHEDULE_SETTINGS_TAB) {
                HA_Admin_Page_View::show_settings_form(HA_Common::SCHEDULE_SETTINGS_KEY);
            } else {
                if ($current_tab == HA_Common::HEAT_MAP_SETTINGS_TAB) {
                    HA_Admin_Page_View::show_settings_form(HA_Common::HEAT_MAP_SETTINGS_KEY);
                } else {
                    if ($current_tab == HA_Common::URL_FILTERS_SETTINGS_TAB) {
                        HA_Admin_Page_View::show_settings_form(HA_Common::URL_FILTERS_SETTINGS_KEY);
                    } else {
                        if ($current_tab == HA_Common::DATABASE_SETTINGS_TAB) {
                            ?>
				<form method="post" name="<?php 
                            echo HA_Common::DATABASE_SETTINGS_KEY;
                            ?>
" action="options.php" class="hut-settings-form">
					<?php 
                            wp_nonce_field('update-options');
                            settings_fields(HA_Common::DATABASE_SETTINGS_KEY);
                            do_settings_sections(HA_Common::DATABASE_SETTINGS_KEY);
                            ?>
					<p class="submit">
						<?php 
                            submit_button(null, 'primary', 'submit', false, null);
                            submit_button('Clear Database', 'delete', 'clear-database', false, null);
                            ?>
					</p>
					<input type="hidden" name="clear-database-flag" id="clear-database-flag" value="false" />
				</form>
				<?php 
                        } else {
                            if ($current_tab == HA_Common::CUSTOM_EVENTS_SETTINGS_TAB) {
                                echo '<h3>Custom Events</h3>';
                                if (isset($_POST['eventType']) && isset($_POST['customEvent'])) {
                                    $event_type = isset($_POST['eventType']) ? $_POST['eventType'] : '';
                                    $custom_event = isset($_POST['customEvent']) ? $_POST['customEvent'] : '';
                                    $description = isset($_POST['description']) ? $_POST['description'] : '';
                                    $url = isset($_POST['url']) ? trim($_POST['url']) : '';
                                    $url = HA_Common::normalize_url($url);
                                    $url = addslashes($url);
                                    $is_form_submit = isset($_POST['isFormSubmit']) ? true : false;
                                    $is_mouse_click = isset($_POST['isMouseClick']) ? true : false;
                                    $is_touchscreen_tap = isset($_POST['isTouchscreenTap']) ? true : false;
                                    $valid_input = true;
                                    if (strlen(trim($custom_event)) == 0) {
                                        echo '<div class="error"><p>An event type is required.</p></div>';
                                        $valid_input = false;
                                    }
                                    if (strlen(trim($custom_event)) == 0) {
                                        echo '<div class="error"><p>A custom event jQuery selector is required.</p></div>';
                                        $valid_input = false;
                                    }
                                    if ($valid_input == true) {
                                        global $wpdb;
                                        try {
                                            $results = $wpdb->insert($wpdb->prefix . HA_Common::CUSTOM_EVENT_TBL_NAME, array(HA_Common::DESCRIPTION_COLUMN => $description, HA_Common::CUSTOM_EVENT_COLUMN => $custom_event, HA_Common::EVENT_TYPE_COLUMN => $event_type, HA_Common::URL_COLUMN => $url, HA_Common::IS_FORM_SUBMIT_COLUMN => $is_form_submit, HA_Common::IS_MOUSE_CLICK_COLUMN => $is_mouse_click, HA_Common::IS_TOUCHSCREEN_TAP_COLUMN => $is_touchscreen_tap));
                                            echo '<div class="success"><p>Custom event added successfully.</p></div>';
                                        } catch (Exception $e) {
                                            echo '<div class="error"><p>An error occurred. ' . $e->getMessage() . '</p></div>';
                                        }
                                    }
                                }
                                ?>
				<form method="post">
					<table class="form-table">
						<tbody>
							<tr valign="top">
								<th scope="row">Custom Event</th>
								<td>
									<input type="text" name="customEvent" id="customEvent" value="" />
									<p class="description">Enter a jQuery element selector.</p>
								</td>
							</tr>
							<tr valign="top">
								<th scope="row">Event Type</th>
								<td>
									<input type="text" name="eventType" id="eventType" value="" />
									<p class="description">Categorise the event with a named type.</p>
								</td>
							</tr>
							<tr valign="top">
								<th scope="row">Trigger events</th>
								<td>
									<input type="checkbox" name="isMouseClick" id="isMouseClick" value="" checked="checked"/>
									<label for="isMouseClick">Mouse click?</label><br />
									<input type="checkbox" name="isToushcreenTap" id="isToushcreenTap" value="" />
									<label for="isTouchscreenTap">Touchscreen tap?</label><br />
									<input type="checkbox" name="isFormSubmit" id="isFormSubmit" value="" />
									<label for="isTouchscreenTap">Form submit?</label>
									<p class="description">Is the custom event associated with a form submit JavaScript event? If none are checked, mouse click is defaulted.</p>
								</td>
							</tr>
							<tr valign="top">
								<th scope="row">Description</th>
								<td>
									<input type="text" name="description" id="description" value="" />
									<p class="description">Add a description of the event.</p>
								</td>
							</tr>
							
							<tr valign="top">
								<th scope="row">URL</th>
								<td>
									<input class="regular-text" type="text" name="url" id="url" value="" />&nbsp(Optional, leave empty to target all URLs)
									<p class="description">You can enter a URL to target a specific page.</p>
								</td>
							</tr>
						</tbody>
					</table>
					
					<input type="submit" class="button button-secondary" value="Add Custom Event" />
				</form>
		
				<br />
							
				<form method="post">
					<?php 
                                $custom_event_table = new HA_Custom_Event_Table();
                                $custom_event_table->prepare_items();
                                $custom_event_table->display();
                                ?>
				</form>
				<?php 
                            }
                        }
                    }
                }
            }
        }
        ?>
			
		</div>
		<div class="clear" />
		<?php 
    }
Esempio n. 8
0
    public static function user_activity_summary_metabox($params)
    {
        $query_helper = new HA_Query_Helper();
        $query_helper->get_session_filters(array('ip_address' => true, 'session_id' => true, 'event_type' => true, 'url' => true));
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $query_helper->get_http_filters('POST');
        } else {
            $query_helper->get_http_filters('GET');
        }
        $query_helper->set_session_filters();
        global $ha_admin_controller;
        $data = $ha_admin_controller->get_data_services()->simple_query('user_activity_summary_data', $query_helper->get_filters());
        if (isset($data->count_total) && $data->count_total > 0) {
            ?>
			<table class="form-table">
				<tbody>
					<tr valign="top">
						<th scope="row">IP Address</th>
						<td><?php 
            echo $data->ip_address;
            ?>
</td>
						<th scope="row">Session ID</th>
						<td><?php 
            echo $data->session_id;
            ?>
</td>
						<th scope="row">Duration</th>
						<td><?php 
            $latest_record_date = strtotime($data->latest_record_date);
            $oldest_record_date = strtotime($data->oldest_record_date);
            $human_time_diff = HA_Common::human_time_diff($oldest_record_date, $latest_record_date);
            echo $human_time_diff;
            ?>
</td>
					</tr>
					<tr valign="top">
						<th scope="row">Username</th>
						<td><?php 
            echo $data->username;
            ?>
</td>
						<th scope="row">Role</th>
						<td><?php 
            echo $data->role;
            ?>
</td>
						<th scope="row">Browser</th>
						<td><?php 
            echo $data->browser;
            ?>
</td>
					</tr>
					<tr valign="top">
						<th scope="row">Latest Record Date</th>
						<td><?php 
            echo date("F j, Y, g:i a", strtotime($data->latest_record_date));
            ?>
</td>
						<th scope="row">Page Views</th>
						<td><?php 
            echo $data->count_page_views;
            ?>
</td>
						<th scope="row">Device</th>
						<td><?php 
            echo $data->device;
            ?>
</td>
						
					</tr>
					<tr valign="top">
						<th scope="row">Mouse Clicks</th>
						<td><?php 
            echo $data->count_mouse_clicks;
            ?>
</td>
						<th scope="row">Touchscreen Taps</th>
						<td><?php 
            echo $data->count_touchscreen_taps;
            ?>
</td>
						<th scope="row">Operating System</th>
						<td><?php 
            echo $data->os;
            ?>
</td>
					</tr>
					<tr valign="top">
						<th scope="row">AJAX Actions</th>
						<td><?php 
            echo $data->count_ajax_actions;
            ?>
</td>
						<th scope="row">Custom Events</th>
						<td><?php 
            echo $data->count_total - $data->count_mouse_clicks - $data->count_touchscreen_taps - $data->count_page_views - $data->count_ajax_actions;
            ?>
</td>
						<th scope="row">Page Width</th>
						<td><?php 
            echo $data->page_width;
            ?>
px</td>
						</tr>
				</tbody>
			</table>
			<?php 
        } else {
            echo '<p>No summary found.</p>';
        }
    }