You are here

views_revisions.module in Views Revisions 6

Same filename and directory in other branches
  1. 7 views_revisions.module

A module to provide revisions of Views.

File

views_revisions.module
View source
<?php

/**
 * @file
 * A module to provide revisions of Views.
 */

/**
 * Implements hook_help().
 */
function views_revisions_help($path, $arg) {
  switch ($path) {
    case 'admin/help#views_revisions':
      return "<p>" . l('View README.txt', drupal_get_path('module', 'views_revisions') . '/README.txt') . "</p>";
      break;
  }
}

/**
 * Implements hook_menu().
 */
function views_revisions_menu() {
  $items = array();
  $items['admin/build/views/revisions/%'] = array(
    'type' => MENU_NORMAL_ITEM,
    'title' => 'Views Revisions',
    'page callback' => 'views_revisions_page',
    'page arguments' => array(
      4,
    ),
    'access arguments' => array(
      'administer views',
    ),
  );
  $items['admin/build/views/revisions/revision/%'] = array(
    'type' => MENU_NORMAL_ITEM,
    'title' => 'Views Revision',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'views_revisions_revision_page',
      5,
    ),
    'access arguments' => array(
      'administer views',
    ),
  );
  return $items;
}

/**
 * Implements hook_form_alter().
 */
function views_revisions_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_ui_edit_view_form' && $form_state['view']->vid != 'new') {
    $form['#prefix'] .= '<div>' . l('Views Revisions', 'admin/build/views/revisions/' . $form_state['view']->name) . '</div>';
    $form['buttons']['views_revisions_revision'] = array(
      '#type' => 'checkbox',
      '#title' => t('Create new revision'),
      '#default_value' => 1,
      '#weight' => -100,
    );
    $form['buttons']['views_revisions_log'] = array(
      '#type' => 'textarea',
      '#title' => t('Revision log message'),
      '#description' => t('Provide an explanation of the changes you are making. This will help other authors understand your motivations.'),
      '#rows' => 3,
      '#weight' => -99,
    );
    array_unshift($form['buttons']['save']['#submit'], 'views_revisions_form_submit');
  }
  else {
    if ($form_id == 'views_ui_delete_confirm') {
      $form['views_revisions_save_history'] = array(
        '#title' => t('Save the Views Revions History'),
        '#type' => 'checkbox',
        '#default_value' => 1,
      );
      $form['#submit'][] = 'views_revisions_delete';
    }
  }
}

/**
 * Submission handler for the Views UI form.
 */
function views_revisions_form_submit($form, &$form_state) {
  global $user;
  $revision = $form_state['values']['views_revisions_revision'];
  if ($revision) {
    $log = $form_state['values']['views_revisions_log'];
    $data = $form_state['view']
      ->export();
    $sql = "INSERT INTO {views_revisions} (vid, uid, created, log, data) VALUES \n            (%d, %d, %d, '%s', '%s')";
    db_query($sql, $form_state['view']->vid, $user->uid, time(), $log, $data);
  }
}

/**
 * Submission handler for the ctools delete confirmation form.
 */
function views_revisions_delete($form, &$form_state) {
  dpm($form_state['values']);
  if (!$form_state['values']['views_revisions_save_history']) {
    $vid = $form_state['view']->vid;
    db_query("DELETE FROM {views_revisions} WHERE vid = :vid", array(
      ':vid' => $vid,
    ));
  }
}

/**
 * Page callback function for the views revisions page.
 */
function views_revisions_page($name) {
  $html = "<h2>{$name}</h2><p>" . l('Go Back to View', "admin/build/views/edit/{$name}") . " &raquo;</p>";
  $vid = db_result(db_query("SELECT vid FROM {views_view} WHERE name = '%s'", $name));
  if (!$vid) {
    $html .= t('Failed to load view!');
    return $html;
  }
  $revisions = db_query("SELECT vr.vrvid, vr.vid, vr.uid, vr.created, vr.log, u.name\n    FROM {views_revisions} vr\n    LEFT OUTER JOIN {users} u ON vr.uid = u.uid\n    WHERE vr.vid = %d\n    ORDER BY vr.created DESC", $vid);
  $header = array(
    array(
      "data" => t('User'),
    ),
    array(
      "data" => t('Message'),
    ),
    array(
      "data" => t('Created'),
    ),
    array(
      "data" => t('Revision'),
    ),
  );
  $rows = array();
  $revision_count == 0;
  while ($revision = db_fetch_object($revisions)) {
    $row = array(
      l($revision->name, "user/{$revision->uid}"),
      $revision->log,
      format_date($revision->created, 'custom', 'Y-m-d H:i:s'),
      l('View', "admin/build/views/revisions/revision/{$revision->vrvid}"),
    );
    $rows[] = $row;
    $revision_count++;
  }
  if ($revision_count == 0) {
    $html .= t('There are no revisions for this view.');
    return $html;
  }
  $html .= theme('table', $header, $rows);
  return $html;
}

/**
 * Page callback function for the views revisions revision page.
 */
function views_revisions_revision_page($form_state, $vrvid) {
  $form = array();
  $html = '';
  $result = db_query("SELECT vr.vrvid, vr.vid, vr.uid, vr.created, vr.log, vr.data, u.name, vv.name as view_name\n    FROM {views_revisions} vr\n    LEFT OUTER JOIN {users} u ON vr.uid = u.uid\n    INNER JOIN {views_view} vv ON vr.vid = vv.vid\n    WHERE vrvid = %d", $vrvid);
  $revision = db_fetch_object($result);
  $header = array(
    array(
      "data" => t('User'),
    ),
    array(
      "data" => t('Message'),
    ),
    array(
      "data" => t('Created'),
    ),
  );
  $rows = array(
    array(
      l($revision->name, "user/{$revision->uid}"),
      $revision->log,
      format_date($revision->created, 'custom', 'Y-m-d H:i:s'),
    ),
  );
  $table = theme('table', $header, $rows);
  $form['export_data'] = array(
    '#title' => t('Export data before revision was made'),
    '#type' => 'textarea',
    '#value' => $revision->data,
    '#rows' => 32,
  );
  $html .= "<h2>{$revision->view_name}</h2>" . '<p>' . l('View', "admin/build/views/edit/{$revision->view_name}") . ' &raquo; ' . l('Revisions', "admin/build/views/revisions/{$revision->view_name}") . ' &raquo;' . '</p>' . $table . '<p>' . l('Go to Import Page', 'admin/build/views/import') . '</p>';
  $form['#prefix'] = $html;
  return $form;
}

Functions

Namesort descending Description
views_revisions_delete Submission handler for the ctools delete confirmation form.
views_revisions_form_alter Implements hook_form_alter().
views_revisions_form_submit Submission handler for the Views UI form.
views_revisions_help Implements hook_help().
views_revisions_menu Implements hook_menu().
views_revisions_page Page callback function for the views revisions page.
views_revisions_revision_page Page callback function for the views revisions revision page.