View source
<?php
function webform_report_help($path) {
switch ($path) {
case 'admin/modules#description':
return t('Allows users to create reports from Webform data.');
break;
case 'node/add#webform_report':
return t('A Webform report is a dynamic page that contains Webform data. The data can be sorted by a particular field, and fields can be included/excluded from the report as needed.');
break;
}
}
function webform_report_perm() {
return array(
'access webform reports',
'create webform reports',
'edit webform reports',
'edit own webform reports',
);
}
function webform_report_access($op, $node, $account = NULL) {
global $user;
if (empty($account)) {
$account = $user;
}
switch ($op) {
case 'view':
return user_access('access webform reports', $account);
break;
case 'create':
return user_access('create webform reports', $account);
break;
case 'update':
case 'delete':
return user_access("edit webform reports") || user_access("edit own webform reports") && $user->uid == $node->uid;
break;
}
}
function webform_report_db_rewrite_sql($query, $primary_table, $primary_field, $args) {
switch ($primary_field) {
case 'nid':
$return = array();
if (!user_access('access webform reports')) {
if ($primary_table != 'n' && $primary_table != 'node') {
$return['join'] = "LEFT JOIN {node} n ON {$primary_table}.nid = n.nid";
$return['where'] = "n.type <> 'webform_report'";
}
else {
if ($primary_table == 'n') {
$return['where'] = "n.type <> 'webform_report'";
}
if ($primary_table == 'node') {
$return['where'] = "node.type <> 'webform_report'";
}
}
return $return;
}
break;
case 'tid':
break;
case 'vid':
break;
}
}
function webform_report_menu() {
global $user;
$items = array();
$items['admin/content/webform_report'] = array(
'title' => t('Webform Reports'),
'description' => t('View and edit Webform reports.'),
'page callback' => '_webform_report_page',
'access callback' => 'user_access',
'access arguments' => array(
'access webform reports',
),
'file' => 'webform_report.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['node/%webform_report_menu/edit/webform_report/configuration'] = array(
'title' => t('Configuration'),
'page callback' => 'node_page_edit',
'page arguments' => array(
1,
),
'access callback' => 'webform_report_access',
'access arguments' => array(
'update',
1,
$user,
),
'weight' => 1,
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['node/%webform_report_menu/edit/webform_report/criteria'] = array(
'title' => t('Report Criteria'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_report_criteria_form',
1,
),
'access callback' => 'webform_report_access',
'access arguments' => array(
'update',
1,
$user,
),
'weight' => 2,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_report_menu/add/webform_report/criteria'] = array(
'title' => t('Report Criteria'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_report_criteria_form',
1,
),
'access callback' => 'webform_report_access',
'access arguments' => array(
'create',
1,
$user,
),
'type' => MENU_CALLBACK,
);
$items['node/%webform_report_menu/csv'] = array(
'title' => t('Report CSV Export'),
'page callback' => 'webform_report_csv',
'page arguments' => array(
1,
),
'access callback' => 'webform_report_access',
'access arguments' => array(
'view',
1,
$user,
),
'file' => 'webform_report.inc',
'type' => MENU_CALLBACK,
);
return $items;
}
function webform_report_menu_load($nid) {
if (!is_numeric($nid)) {
return FALSE;
}
$node = node_load($nid);
if (empty($node->type) || $node->type != 'webform_report') {
return FALSE;
}
return $node;
}
function webform_report_node_info() {
return array(
'webform_report' => array(
'name' => t('Webform report'),
'module' => 'webform_report',
'description' => t('A webform report is a dynamic page that contains user-specified data
collected by the Webform module. The data can be sorted by a particular field, and fields can
be included/excluded as needed.'),
),
);
}
function webform_report_load($node) {
$additions = NULL;
if (empty($_POST['wnid'])) {
$additions = db_fetch_object(db_query("SELECT wnid, kcid, description, sort, filter_type, filter_value, results_per_page, components\n FROM {webform_report} WHERE nid = %d", $node->nid));
$components = unserialize(stripslashes($additions->components));
if (is_array($components)) {
$additions->components = $components;
}
else {
$additions->components = unserialize(base64_decode($additions->components));
}
$additions->sort_col = $additions->kcid;
}
else {
if ($_POST['wnid'] != 0) {
$additions->wnid = $_POST['wnid'];
$additions->kcid = $_POST['kcid'];
$additions->description = $_POST['description'];
$additions->sort = $_POST['sort'];
$additions->sort_col = $_POST['sort_col'];
$additions->components = $_POST['components'];
$additions->filter_type = $_POST['filter_type'];
$additions->filter_value = $_POST['filter_value'];
$additions->results_per_page = $_POST['results_per_page'];
}
}
return $additions;
}
function webform_report_view($node, $teaser = FALSE, $page = FALSE) {
if (!empty($node->nid) && empty($node->wnid) && (arg(2) != 'add' && arg(2) != 'edit')) {
drupal_goto('node/' . $node->nid . '/add/webform_report/criteria');
}
module_load_include('inc', 'webform_report', 'webform_report');
$data = _webform_report_get_data($node);
$output = _webform_report_get_body_content($data, $node);
$node->content['body'] = array(
'#value' => check_markup($node->body, $node->format, FALSE),
);
$node->content['webform_report'] = array(
'#value' => $output,
'#weight' => 10,
);
return $node;
}
function webform_report_insert($node) {
db_query("INSERT INTO {webform_report} (nid, description)\n VALUES (%d, '%s')", $node->nid, $node->description);
watchdog('webform_report', 'Webform report @title added', array(
'@title' => $node->title,
), WATCHDOG_NOTICE);
}
function webform_report_update($node) {
if (arg(2) == 'add' | arg(2) == 'edit') {
if (arg(4) == 'criteria') {
db_query("UPDATE {webform_report} SET wnid = %d, kcid = %d, sort = %d, components = '%s', filter_type = %d, filter_value = '%s', results_per_page = %d\n WHERE nid = %d", $node->wnid, $node->kcid, $node->sort, addslashes(serialize($node->components)), $node->filter_type, $node->filter_value, $node->results_per_page, $node->nid);
}
else {
db_query("UPDATE {webform_report} SET description = '%s' WHERE nid = '" . $node->nid . "'", $node->description);
watchdog('webform_report', 'Webform report @title updated', array(
'@title' => $node->title,
), WATCHDOG_NOTICE);
}
}
}
function webform_report_delete($node) {
db_query("DELETE FROM {webform_report} WHERE nid = %d", $node->nid);
watchdog('webform_report', 'Webform report @title deleted', array(
'@title' => $node->title,
), WATCHDOG_NOTICE);
}
function webform_report_validate($node, &$form) {
if ($node->op == t('Delete')) {
drupal_goto('node/' . $node->nid . '/delete');
}
}
function webform_report_form(&$node, $form_state) {
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Title'),
'#required' => TRUE,
'#default_value' => $node->title,
'#weight' => -9,
'#description' => t('Enter a title for your Webform report page'),
);
$form['description'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#description' => t('The description will be displayed at the top of the report page'),
'#default_value' => $node->description,
'#required' => FALSE,
'#weight' => -8,
);
if (arg(2) == 'edit') {
$form['#redirect'] = 'node/' . $node->nid . '/edit/webform_report/criteria';
}
return $form;
}
function webform_report_criteria_form_validate($form, &$form_state) {
if ($_POST['wnid'] == 0) {
form_set_error('wnid', t('You must select a form'));
unset($form_state['values']);
}
else {
if ($_POST['kcid'] == 0) {
form_set_error('kcid', t('You must select a field'));
}
else {
if ($_POST['filter_type'] != 0 && $_POST['filter_type'] != 7 && $_POST['filter_type'] != 8 && empty($_POST['filter_value'])) {
form_set_error('filter_value', t('You must specify a filter value'));
}
else {
if (empty($_POST['components'])) {
form_set_error('components', t('You must select at least one field '));
}
}
}
}
$form_state['rebuild'] = TRUE;
}
function webform_report_criteria_form_publish($form, &$form_state) {
$errors = form_get_errors();
if (empty($errors)) {
webform_report_update(node_load(arg(1)));
}
}
function webform_report_criteria_form($form_state) {
global $user;
$node = node_load(arg(1));
$webform_report = db_fetch_object(db_query("SELECT wnid FROM {webform_report} WHERE nid = '" . $node->nid . "'"));
module_load_include('inc', 'webform_report', 'webform_report');
if (arg(2) == 'add' && empty($webform_report->wnid) && user_access('create webform reports') || (user_access('edit webform reports') || user_access('edit own webform reports') && $user->uid == $node->uid) || arg(2) == 'edit') {
$webforms = _webform_report_get_webforms();
$webform_components = _webform_report_get_components($node->wnid);
$meta_components = array(
-1 => t('User'),
-2 => t('Date'),
-3 => t('Time'),
-4 => t('IP Address'),
);
$filter_options = array(
0 => t('none'),
1 => t('begins with'),
2 => t('does not begin with'),
3 => t('contains'),
4 => t('does not contain'),
5 => t('equals'),
6 => t('does not equal'),
7 => t('is empty'),
8 => t('is not empty'),
);
$sort_options = array(
SORT_ASC => t('Ascending'),
SORT_DESC => t('Descending'),
);
$results_per_page_options = array(
0 => 'All',
20 => '20',
40 => '40',
60 => '60',
80 => '80',
100 => '100',
);
if (!empty($node->wnid)) {
$default = $node->wnid;
}
else {
$default = 0;
}
$form['wnid'] = array(
'#type' => 'select',
'#title' => t('Webform'),
'#default_value' => $default,
'#options' => array(
0 => t('Select a Webform'),
) + $webforms,
'#attributes' => array(
'onchange' => 'this.form.submit()',
),
'#required' => TRUE,
'#weight' => 0,
'#description' => 'Select a webform to include in the report.',
);
unset($default);
if (!empty($node->wnid)) {
if (!empty($node->kcid)) {
$default = $node->kcid;
}
else {
$default = 0;
}
$form['kcid'] = array(
'#type' => 'select',
'#title' => t('Key field'),
'#default_value' => $default,
'#options' => array(
0 => t('Select a field'),
) + $meta_components + $webform_components,
'#attributes' => array(
'onchange' => 'this.form.submit()',
),
'#required' => TRUE,
'#weight' => 1,
);
}
unset($default);
if (!empty($node->kcid)) {
$form['filter_type'] = array(
'#type' => 'select',
'#title' => t('Filter Type'),
'#options' => $filter_options,
'#attributes' => array(
'onchange' => 'this.form.submit()',
),
'#default_value' => $node->filter_type,
'#weight' => 3,
);
}
if (!empty($node->kcid) && !empty($node->filter_type)) {
$form['filter_value'] = array(
'#type' => 'textfield',
'#title' => t('Filter Value'),
'#description' => t('Filter the key field using the specified value'),
'#default_value' => $node->filter_value,
'#attributes' => array(
'onchange' => 'this.form.submit()',
),
'#required' => FALSE,
'#weight' => 4,
);
}
if (!empty($node->kcid)) {
$form['sort'] = array(
'#type' => 'select',
'#title' => t('Sort order'),
'#options' => $sort_options,
'#default_value' => $node->sort,
'#weight' => 2,
);
}
if (is_array($node->components)) {
$default = $node->components;
}
else {
$default = array();
}
if (!empty($node->kcid)) {
$form['components'] = array(
'#type' => 'checkboxes',
'#title' => t('Include components'),
'#description' => t('Select all of the components to include in this report and click Preview to display the results'),
'#options' => array_map('filter_xss', $meta_components + $webform_components + array(
-5 => t('Edit link'),
)),
'#default_value' => $default,
'#required' => TRUE,
'#weight' => 5,
);
}
unset($default);
if (!empty($node->kcid)) {
if (arg(2) != 'add' && (!empty($node->results_per_page) || $node->results_per_page == 0)) {
$default = $node->results_per_page;
}
else {
$default = 20;
}
$form['results_per_page'] = array(
'#type' => 'select',
'#title' => t('Results per page'),
'#options' => $results_per_page_options,
'#default_value' => $default,
'#weight' => 6,
);
}
unset($default);
$form['update'] = array(
'#type' => 'submit',
'#value' => t('Update'),
'#weight' => 8,
);
if (!form_get_errors()) {
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Publish'),
'#validate' => array(
'webform_report_criteria_form_publish',
),
'#weight' => 9,
);
}
$form['#redirect'] = 'node/' . $node->nid;
return $form;
}
else {
drupal_access_denied();
exit;
}
}