You are here

views_ui_basic.module in Views UI: Edit Basic Settings 6

Same filename and directory in other branches
  1. 8 views_ui_basic.module
  2. 7 views_ui_basic.module

views_ui_basic.module User interface to edit basic settings of Views.

File

views_ui_basic.module
View source
<?php

/**
 * @file views_ui_basic.module
 * User interface to edit basic settings of Views.
 */

/**
 * Return list of editable fields.
 */
function _views_ui_basic_fields() {
  $fields = array(
    // Views form name => label
    'header' => t('Header'),
    'footer' => t('Footer'),
    'title' => t('Title'),
    'empty' => t('Empty text'),
  );
  switch (_views_ui_basic_ver()) {
    case 2:
      $fields['items_per_page'] = t('Items per page');
      break;
    case 3:
      $fields['pager_options'] = t('Pager options');
      break;
  }
  return $fields;
}

/**
 * Return Views API major version number.
 */
function _views_ui_basic_ver() {
  return (int) substr(views_api_version(), 0, 1);
}

/**
 * Implements hook_menu().
 */
function views_ui_basic_menu() {
  $items = array();
  $items['admin/content/views_ui_basic'] = array(
    'title' => t('Edit views'),
    'page callback' => 'views_ui_basic_list_page',
    'access arguments' => array(
      'edit views basic settings',
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['views_ui_basic'] = array(
    // different URI to support rich text editors
    'title' => t('Edit basic settings'),
    'page callback' => 'views_ui_basic_edit_form',
    'page arguments' => array(
      1,
      2,
      3,
    ),
    'access arguments' => array(
      'edit views basic settings',
    ),
    'type' => MENU_CALLBACK,
  );
  $items['admin/build/views/views_ui_basic'] = array(
    'title' => t('Editable basic settings'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'views_ui_basic_admin_form',
    ),
    'access arguments' => array(
      'administer views',
    ),
    'type' => MENU_LOCAL_TASK,
    'file' => 'views_ui_basic.admin.inc',
    'weight' => 50,
  );

  // Generate local tasks (menu tabs) for View pages
  _views_ui_basic_define_menu($items);
  return $items;
}

/**
 * Implements hook_perm().
 */
function views_ui_basic_perm() {
  return array(
    'edit views basic settings',
  );
}

/**
 * Implements hook_form_alter().
 */
function views_ui_basic_form_alter(&$form, $form_state, $form_id) {
  if ((arg(0) == 'views_ui_basic' || _views_ui_basic_is_tab()) && ($form_id == 'views_ui_edit_display_form' || $form_id == 'views_ui_config_item_form')) {

    // Views 3.x
    if ($form_id == 'views_ui_config_item_form') {
      unset($form['options']['override']);
    }

    // WYSIWYG support
    if (module_exists('wysiwyg')) {
      $form_rename = array();

      // Format key must be renamed and same key order maintained
      foreach ($form as $key => $value) {
        if (strpos($key, '_format') !== FALSE) {

          // e.g., 'header_format' to 'format'
          $key = 'format';
        }
        $form_rename[$key] = $value;
      }
      $form = $form_rename;
    }
    unset($form['buttons']['override_update']);
    unset($form['buttons']['cancel']);
    unset($form['buttons']['remove']);
    unset($form['override']);

    // We'll override the Views setting on submit.
    if ($form['buttons']['submit']['#value'] == t('Update default display')) {
      $form['buttons']['submit']['#value'] = t('Update');
      $form['override_submit'] = array(
        '#type' => 'hidden',
        '#value' => 1,
      );
    }
    $form['buttons']['submit']['#submit'] = array(
      'views_ui_basic_submit',
    );

    // New submit handler (removes old)
  }
}

/**
 * Preprocess page hook.
 */
function views_ui_basic_preprocess_page(&$vars) {
  if (arg(0) == 'views_ui_basic' && arg(1)) {

    // Determine tabs
    $fields = _views_ui_basic_fields();
    foreach (variable_get('views_ui_basic_fields', array()) as $field) {
      $tabpages[$field] = $fields[$field];
    }
    if (isset($tabpages)) {
      $tabs = theme('menu_local_task', theme('menu_item_link', array(
        'title' => '< Edit views',
        'href' => 'admin/content/views_ui_basic',
        'type' => MENU_LOCAL_TASK,
      )));
      foreach ($tabpages as $field => $label) {
        $link = array(
          'title' => $label,
          'href' => 'views_ui_basic/' . arg(1) . '/' . arg(2) . '/' . $field,
          'type' => MENU_LOCAL_TASK,
        );
        $item_link = theme('menu_item_link', $link);
        $tabs .= theme('menu_local_task', $item_link, strpos($item_link, 'active'));
      }
    }
    $vars['tabs'] = "<ul class=\"tabs primary clearfix\">\n" . $tabs . "</ul>\n";
  }
}

/**
 * Views save/submit handler (overrides Views UI)
 * Redirects afer save.
 * @see views_ui_basic_form_alter().
 */
function views_ui_basic_submit($form, &$form_state) {

  // Views 3.x config item
  if ($form_state['form_id'] == 'views_ui_config_item_form') {

    // @todo Defaults override
    views_ui_config_item_form_submit($form, $form_state);
  }
  else {
    $display =& $form_state['view']->display[$form_state['display_id']];

    // Do not save as default Views value; instead save field value as "override"
    $display->display_options['defaults'][$form_state['section']] = NULL;
    $display->handler->options['defaults'][$form_state['section']] = NULL;
    $display->handler
      ->options_submit($form, $form_state);
  }
  $form_state['view']
    ->save();
  drupal_set_message(t('The !section has been updated.', array(
    '!section' => str_replace('_', ' ', $form_state['section']),
  )));

  // Clear the views cache.
  cache_clear_all('*', 'cache_views');

  // Clear the page cache.
  cache_clear_all();

  // Remove this view from cache so we can edit it properly.
  views_object_cache_clear('view', $form_state['view']->name);

  // Redirect back to view page or admin page
  if (_views_ui_basic_is_tab()) {
    $menuitem = menu_get_item();
    drupal_goto($menuitem['tab_root']);
  }
  else {
    drupal_goto("admin/content/views_ui_basic");
  }
}

/**
 * Edit a View's setting (e.g., header/footer/empty text, etc)
 * @return string (rendered views UI form).
 * @see views_ui_basic_form_alter() for form tweaks
 */
function views_ui_basic_edit_form($view_name, $display_name, $type) {
  $output = '';
  $fields = variable_get('views_ui_basic_fields', array());
  if (!isset($fields[$type])) {
    return FALSE;
  }
  $path = drupal_get_path('module', 'views_ui');
  require_once "{$path}/includes/admin.inc";
  $view = views_get_view($view_name);
  $view
    ->init_display();

  // Views 3.x config items (not a "display" setting)
  if (_views_ui_basic_ver() == 3) {
    $config_item = array(
      'header',
      'footer',
      'empty',
    );
    $config_area = 'area';
    $view_area = $view->display[$display_name]->display_options[$type];

    // If empty config item, auto-create add form.
    if (in_array($type, $config_item) && empty($view_area)) {

      // Replicate keys needed for views_ui_add_item_form_submit().
      $form_state = array(
        'view' => $view,
        'type' => $type,
        'display_id' => $display_name,
        'values' => array(
          'name' => array(
            'views.area' => 'views.area',
          ),
          'op' => t('Add'),
        ),
      );
      views_ui_add_item_form_submit($form, $form_state);
    }
    else {
      if (is_array($view_area) && count($view_area) > 1) {

        // Get area from URL
        $args = arg();
        $last_arg = $args[count($args) - 1];
        if (strpos($last_arg, 'area') !== FALSE) {
          $config_area = $last_arg;
        }
        foreach ($view_area as $key => $area) {
          if (isset($area['ui_name']) && $area['ui_name']) {
            $title = $area['ui_name'];
          }
          else {
            if (isset($area['label']) && $area['label']) {
              $title = $area['label'];
            }
            else {
              $title = t('Text area');
            }
          }
          $options[$key] = $title;
        }
        $output .= drupal_get_form('views_ui_basic_switch_form', $type, $options, $config_area);
      }
    }
  }
  else {
    $config_item = array();
    $config_area = NULL;
  }
  $form_state['section'] = $display_name;
  $key = in_array($type, $config_item) ? 'config-item' : 'display';
  $output .= views_ui_ajax_form(FALSE, $key, $view, $display_name, $type, $config_area);
  return $output;
}

/**
 * Switch between config items (for Views 3.x)
 * @param $options
 *   Select drop-down values
 */
function views_ui_basic_switch_form($form_state, $view_type, $options, $default_value = NULL) {
  $form['#suffix'] = '<hr/>';
  $form['#view_type'] = $view_type;
  $form['area'] = array(
    '#type' => 'select',
    '#options' => $options,
    '#default_value' => $default_value,
    '#prefix' => '<div style="float:left;">',
    '#suffix' => '</div>',
    '#attributes' => array(
      'onchange' => 'this.form.submit();',
    ),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#attributes' => array(
      'style' => 'margin:1em 0.5em',
    ),
    '#value' => t('Switch Area'),
  );
  return $form;
}

/**
 * Submit handler for switch area form.
 */
function views_ui_basic_switch_form_submit($form, &$form_state) {
  if (arg(0) == 'views_ui_basic') {
    $prefix = arg(0) . '/' . arg(1) . '/' . arg(2);
  }
  else {
    $base = str_replace(base_path(), '', $form['#action']);
    $prefix = substr($base, 0, strpos($base, 'views_ui_edit') + 13);
  }
  $form_state['redirect'] = "{$prefix}/{$form['#view_type']}/{$form_state['values']['area']}";
}

/**
 * List Views that site administer has selected.
 * @return string (HTML)
 */
function views_ui_basic_list_page() {
  $fields = _views_ui_basic_fields();
  $fields_allowed = variable_get('views_ui_basic_fields', array());
  $views = views_get_all_views();
  $items = array();

  // For theme_item_list
  $allowed = variable_get('views_ui_basic', array());
  foreach ($views as $view_key => $view_object) {
    if (isset($allowed[$view_key])) {
      $title = isset($view_object->display['page']) ? l($view_key, $view_object->display['page']->display_options['path']) : $view_key;
      $items[$view_key][] = "<h4>{$title}</h4>";
      foreach ($view_object->display as $display_key => $views_display) {
        if (in_array($display_key, $allowed[$view_key])) {
          $editlink = array();
          foreach ($fields_allowed as $field) {
            $defaults = isset($views_display->display_options['defaults']) ? $views_display->display_options['defaults'] : array();
            if (!isset($defaults[$field])) {
              $value = isset($view_object->display['default']->display_options[$field]) ? $view_object->display['default']->display_options[$field] : '';
            }
            else {
              $value = isset($views_display->display_options[$field]) ? $views_display->display_options[$field] : '';
            }
            $value = $value && !is_array($value) ? substr(strip_tags($value), 0, 100) : '';
            $editlink[] = l("{$fields[$field]}", "views_ui_basic/{$view_key}/{$display_key}/{$field}", array(
              'attributes' => array(
                'title' => $value,
              ),
            ));
          }
          $item = "{$display_key} ({$views_display->display_title}) Edit: " . implode(' | ', $editlink);

          /*
          //print_r($views_display);
          $item =
            "$display_key ($views_display->display_title) " .
            l("edit header", "views_ui_basic/$view_key/$display_key/header") . ' | ' .
            l("edit footer", "views_ui_basic/$view_key/$display_key/footer");
          */
          if (_views_ui_basic_ver() == 2) {
            if ($header = node_teaser($views_display->display_options['header'], 1)) {
              $header = check_markup($header, $views_display->display_options['header_format']);
              $item .= "<fieldset><legend>" . l("Header", "views_ui_basic/{$view_key}/{$display_key}/header") . "</legend>{$header}</fieldset>";
            }
            if ($footer = node_teaser($views_display->display_options['footer'], 1)) {
              $footer = check_markup($footer, $views_display->display_options['footer_format']);
              $item .= "<fieldset><legend>" . l("Footer", "views_ui_basic/{$view_key}/{$display_key}/footer") . "</legend>{$footer}</fieldset>";
            }
          }
          $items[$view_key]['children'][$display_key][] = $item;
        }
      }
    }
  }
  if (!empty($items)) {
    return theme('item_list', $items);
  }
  else {
    return 'No Views configured. Please ' . l('select the views', 'admin/build/views/views_ui_basic') . ' you wish to use.';
  }
}

//
// Internal helper functions
//

/**
 * Retrieve Views pages
 * @todo if default selected, check if overriden view is also selected
 */
function _views_ui_basic_get_pages() {
  $views = views_get_all_views();
  $allowed = variable_get('views_ui_basic', array());
  $items = array();
  foreach ($views as $view_key => $view_object) {
    if (isset($allowed[$view_key])) {
      foreach ($view_object->display as $display_key => $view_display) {

        // If default selected, return all pages
        if ($view_display->display_plugin == 'page' && (in_array($display_key, $allowed[$view_key]) || $allowed[$view_key][0] == 'default')) {
          $items[$view_display->display_options['path']] = array(
            'view_name' => $view_key,
            'display_name' => $display_key,
          );
        }
      }
    }
  }
  return $items;
}

/**
 * Is the current page the edit form with a tab (local task)?
 * @return boolen
 */
function _views_ui_basic_is_tab() {
  $menuitem = menu_get_item();

  // accessed via our edit tab?
  return arg(0) != 'views_ui_basic' && isset($menuitem['page_callback']) && $menuitem['page_callback'] == 'views_ui_basic_edit_form';
}

/**
 * Generate local tasks (menu tabs) for View pages
 */
function _views_ui_basic_define_menu(&$items) {

  // Determine tabs
  $fields = _views_ui_basic_fields();
  foreach (variable_get('views_ui_basic_fields', array()) as $field) {
    $tabs[$field] = $fields[$field];
  }
  if (!isset($tabs)) {
    return;
  }
  $first_field = key($tabs);
  $weight = 10;
  $views_pages = _views_ui_basic_get_pages();

  // views_ui_basic/test/default/header
  foreach ($views_pages as $path => $viewinfo) {

    // View/Edit tabs
    $items["{$path}/view_ui_view"] = array(
      'title' => t('View'),
      'type' => MENU_DEFAULT_LOCAL_TASK,
      'weight' => -10,
    );
    $items["{$path}/views_ui_edit"] = array(
      'title' => t('Edit'),
      'page callback' => 'views_ui_basic_edit_form',
      'page arguments' => array(
        $viewinfo['view_name'],
        $viewinfo['display_name'],
        $first_field,
      ),
      'type' => MENU_LOCAL_TASK,
      'weight' => ++$weight,
      'access arguments' => array(
        'edit views basic settings',
      ),
    );

    // Sub tabs
    foreach ($tabs as $field => $label) {
      if ($field == $first_field) {
        $items["{$path}/views_ui_edit/{$first_field}"] = array(
          'title' => $label,
          'type' => MENU_DEFAULT_LOCAL_TASK,
          'weight' => -10,
          'access arguments' => array(
            'edit views basic settings',
          ),
        );
      }
      else {
        $items["{$path}/views_ui_edit/{$field}"] = array(
          'title' => $label,
          'page callback' => 'views_ui_basic_edit_form',
          'page arguments' => array(
            $viewinfo['view_name'],
            $viewinfo['display_name'],
            $field,
          ),
          'access arguments' => array(
            'edit views basic settings',
          ),
          'type' => MENU_LOCAL_TASK,
          'weight' => ++$weight,
        );
      }
    }
  }
}

Functions

Namesort descending Description
views_ui_basic_edit_form Edit a View's setting (e.g., header/footer/empty text, etc)
views_ui_basic_form_alter Implements hook_form_alter().
views_ui_basic_list_page List Views that site administer has selected.
views_ui_basic_menu Implements hook_menu().
views_ui_basic_perm Implements hook_perm().
views_ui_basic_preprocess_page Preprocess page hook.
views_ui_basic_submit Views save/submit handler (overrides Views UI) Redirects afer save.
views_ui_basic_switch_form Switch between config items (for Views 3.x)
views_ui_basic_switch_form_submit Submit handler for switch area form.
_views_ui_basic_define_menu Generate local tasks (menu tabs) for View pages
_views_ui_basic_fields Return list of editable fields.
_views_ui_basic_get_pages Retrieve Views pages @todo if default selected, check if overriden view is also selected
_views_ui_basic_is_tab Is the current page the edit form with a tab (local task)?
_views_ui_basic_ver Return Views API major version number.