You are here

view_custom_table.admin.inc in Views Custom Table 7

File for administrative functions.

File

view_custom_table.admin.inc
View source
<?php

/**
 * @file
 * File for administrative functions.
 */

/**
 * Form to add custom table in table information table.
 */
function view_custom_table_add_custom_table_to_view_form($form, &$form_state) {
  if (!empty($form_state['page_num']) && $form_state['page_num'] == 2) {
    return view_custom_table_add_custom_table_column_relationship_form($form, $form_state);
  }

  // Display table name form if not set yet.
  $form_state['page_num'] = 1;
  $form['table_name'] = array(
    '#title' => t('Table Name'),
    '#type' => 'textfield',
    '#required' => TRUE,
    '#description' => t('Don not enter drupal core tables. it will create conflict.'),
  );
  $form['table_description'] = array(
    '#title' => t('Description'),
    '#type' => 'textarea',
    '#rows' => 5,
  );
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['next'] = array(
    '#type' => 'submit',
    '#value' => t('Next >>'),
    '#validate' => array(
      'view_custom_table_add_custom_table_to_view_form_validate',
    ),
    '#submit' => array(
      'view_custom_table_add_custom_table_to_view_form_submit',
    ),
  );
  $form['actions']['cancel'] = array(
    '#type' => 'markup',
    '#markup' => l(t('Cancel'), 'admin/structure/views/custom_table'),
  );
  return $form;
}

/**
 * Validate add_custom_table_to_view_form.
 */
function view_custom_table_add_custom_table_to_view_form_validate($form, &$form_state) {
  $values = $form_state['values'];
  if (isset($values['table_name'])) {
    if (!db_table_exists($values['table_name'])) {
      form_set_error('table_name', t('Table "@table" do not exist in database.', array(
        '@table' => $values['table_name'],
      )));
    }
    if (db_table_exists('custom_table_view_data')) {
      $query = db_select('custom_table_view_data', 'ctvd')
        ->fields('ctvd', array(
        'id',
      ))
        ->condition('table_name', $values['table_name']);
      $custom_table_id = $query
        ->execute()
        ->fetchField();
      if ($custom_table_id) {
        form_set_error('table_name', t('@table is already available in views.', array(
          '@table' => $values['table_name'],
        )));
      }
    }
    else {
      drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
    }
  }
}

/**
 * Submit and save add_custom_table_to_view_form.
 */
function view_custom_table_add_custom_table_to_view_form_submit($form, &$form_state) {

  // Save table name to form state.
  // to carry forward to subsequent pages in the form.
  $form_state['table_name'] = $form_state['values']['table_name'];
  $form_state['table_description'] = $form_state['values']['table_description'];

  // If we have table name rebuild form and show table settings form.
  $form_state['page_num'] = 2;
  $form_state['rebuild'] = TRUE;
  drupal_set_message(t('Add columns relationship for @table.', array(
    '@table' => $form_state['values']['table_name'],
  )));
}

/**
 * Form to add table's column relationship with drupal tables.
 */
function view_custom_table_add_custom_table_column_relationship_form($form, &$form_state) {
  $form = array();
  $table_name = $form_state['table_name'];
  $all_entities = entity_get_info();
  $entities[''] = t('--None--');
  foreach ($all_entities as $entity_name => $all_entities_item) {
    $entities[$entity_name] = $all_entities_item['label'];
  }
  $form['columns'] = array(
    '#type' => 'fieldset',
    '#title' => t('"@table" Int Type Columns', array(
      '@table' => $table_name,
    )),
    '#tree' => TRUE,
  );
  $int_types = array(
    'tinyint',
    'smallint',
    'mediumint',
    'int',
    'bigint',
  );
  $text_query = format_string('DESCRIBE { @table_name }', array(
    '@table_name' => $table_name,
  ));
  $query = db_query($text_query);
  foreach ($query as $row) {
    $row_type = explode('(', $row->Type);
    if (in_array($row_type[0], $int_types)) {
      $form['columns']['column_' . $row->Field] = array(
        '#type' => 'fieldset',
        '#title' => t('Relation of "@field_name" with', array(
          '@field_name' => ucfirst($row->Field),
        )),
        '#tree' => TRUE,
        '#attributes' => array(
          'class' => array(
            'container-inline',
          ),
        ),
      );
      $form['columns']['column_' . $row->Field]['entity'] = array(
        '#type' => 'select',
        '#title' => t('Entity'),
        '#options' => $entities,
      );
      $form['columns']['column_' . $row->Field]['field'] = array(
        '#type' => 'hidden',
        '#value' => $row->Field,
      );
    }
  }
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['save'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
    '#submit' => array(
      'view_custom_table_add_custom_table_column_relationship_form_submit',
    ),
  );
  $form['actions']['cancel'] = array(
    '#type' => 'markup',
    '#markup' => l(t('Cancel'), 'admin/structure/views/custom_table'),
  );
  return $form;
}

/**
 * Submit and save add_custom_table_column_relationship_form.
 */
function view_custom_table_add_custom_table_column_relationship_form_submit($form, &$form_state) {
  global $user;
  $values = $form_state['values']['columns'];
  $relations = array();
  foreach ($values as $column) {
    if ($column['entity'] != '') {
      $relations[$column['field']] = $column['entity'];
    }
  }
  $serialize_relations = serialize($relations);
  if (db_table_exists('custom_table_view_data')) {
    if (isset($form_state['table_name'])) {
      $query = db_select('custom_table_view_data', 'ctvd')
        ->fields('ctvd', array(
        'id',
      ))
        ->condition('table_name', $form_state['table_name']);
      $custom_table_id = $query
        ->execute()
        ->fetchField();
      if ($custom_table_id) {
        $query = db_update('custom_table_view_data')
          ->fields(array(
          'column_relations' => $serialize_relations,
        ))
          ->condition('id', $custom_table_id)
          ->execute();
        drupal_set_message(t('Relations for "@table" are updated', array(
          '@table' => $form_state['table_name'],
        )));
      }
      else {
        $query = db_insert('custom_table_view_data')
          ->fields(array(
          'table_name' => $form_state['table_name'],
          'description' => $form_state['table_description'],
          'column_relations' => $serialize_relations,
          'created_by' => $user->uid,
        ))
          ->execute();
        drupal_set_message(t('Table "@table"s data is available in view now.', array(
          '@table' => $form_state['table_name'],
        )));
      }
      cache_clear_all();
    }
    drupal_set_message(t("Please clear all cache to start working."));
  }
  else {
    drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
  }
  $form_state['redirect'] = 'admin/structure/views/custom_table';
}

/**
 * Function to edit custom table description.
 */
function view_custom_table_edit_custom_table_form($form, &$form_state, $table_id = NULL) {
  $table_info = view_custom_table_load_table($table_id);
  $form['table_name'] = array(
    '#title' => t('Table Name'),
    '#type' => 'textfield',
    '#disabled' => TRUE,
    '#default_value' => $table_info->table_name,
    '#description' => t('Don not enter drupal core tables. it will create conflict.'),
  );
  $form['table_description'] = array(
    '#title' => t('Description'),
    '#type' => 'textarea',
    '#rows' => 5,
    '#default_value' => $table_info->description,
  );
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['save'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
    '#validate' => array(
      'view_custom_table_edit_custom_table_form_validate',
    ),
  );
  $form['actions']['cancel'] = array(
    '#type' => 'markup',
    '#markup' => l(t('Cancel'), 'admin/structure/views/custom_table'),
  );
  return $form;
}

/**
 * Function to validate custom table description.
 */
function view_custom_table_edit_custom_table_form_validate($form, &$form_state) {
  $values = $form_state['values'];
  if (isset($values['table_name'])) {
    if (!db_table_exists($values['table_name'])) {
      form_set_error('table_name', t('Table "@table" do not exist in database.', array(
        '@table' => $values['table_name'],
      )));
    }
    if (db_table_exists('custom_table_view_data')) {
      if (strlen($values['table_description']) > 255) {
        form_set_error('table_description', t('Description can not be longer then 255.'));
      }
    }
    else {
      drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
    }
  }
}

/**
 * Submit handler of view_custom_table_edit_custom_table_form()
 */
function view_custom_table_edit_custom_table_form_submit($form, &$form_state) {
  $query = db_update('custom_table_view_data')
    ->fields(array(
    'description' => $form_state['values']['table_description'],
  ))
    ->condition('table_name', $form_state['values']['table_name']);
  $result = $query
    ->execute();
  if ($result) {
    drupal_set_message(t('@table_name has been updated.', array(
      '@table_name' => $form_state['values']['table_name'],
    )));
  }
  else {
    drupal_set_message(t('Could not update @table_name. Please check error log for more information.', array(
      '@table_name' => $form_state['values']['table_name'],
    )), 'error');
  }
  $form_state['redirect'] = 'admin/structure/views/custom_table';
}

/**
 * Function to update custom table relations.
 */
function view_custom_table_custom_table_update_relations_form($form, &$form_state, $table_id = NULL) {
  $table_info = view_custom_table_load_table($table_id);
  $table_name = $table_info->table_name;
  $form_state['table_name'] = $table_name;
  $table_relations = unserialize($table_info->column_relations);
  $views_info = view_custom_table_load_custom_table_views($table_info->table_name);
  if (!empty($views_info)) {
    drupal_set_message(t('views are using @table_name as base table, so presaved values can not be changed.', array(
      '@table_name' => $table_info->table_name,
    )), 'warning');
  }
  $all_entities = entity_get_info();
  $entities[''] = t('--None--');
  foreach ($all_entities as $entity_name => $all_entities_item) {
    $entities[$entity_name] = $all_entities_item['label'];
  }
  $form['columns'] = array(
    '#type' => 'fieldset',
    '#title' => t('"@table" Int Type Columns', array(
      '@table' => $table_name,
    )),
    '#tree' => TRUE,
  );
  $int_types = array(
    'tinyint',
    'smallint',
    'mediumint',
    'int',
    'bigint',
  );
  $text_query = format_string('DESCRIBE { @table_name }', array(
    '@table_name' => $table_name,
  ));
  $query = db_query($text_query);
  foreach ($query as $row) {
    $row_type = explode('(', $row->Type);
    if (in_array($row_type[0], $int_types)) {
      $form['columns']['column_' . $row->Field] = array(
        '#type' => 'fieldset',
        '#title' => t('Relation of "@field_name" with', array(
          '@field_name' => ucfirst($row->Field),
        )),
        '#tree' => TRUE,
        '#attributes' => array(
          'class' => array(
            'container-inline',
          ),
        ),
      );
      $form['columns']['column_' . $row->Field]['entity'] = array(
        '#type' => 'select',
        '#title' => t('Entity'),
        '#options' => $entities,
        '#default_value' => $table_relations[$row->Field] != NULL ? $table_relations[$row->Field] : '',
      );
      if (!empty($views_info) && isset($table_relations[$row->Field]) && $table_relations[$row->Field] != NULL) {
        $form['columns']['column_' . $row->Field]['entity']['#disabled'] = TRUE;
      }
      $form['columns']['column_' . $row->Field]['field'] = array(
        '#type' => 'hidden',
        '#value' => $row->Field,
      );
    }
  }
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['save'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  $form['actions']['cancel'] = array(
    '#type' => 'markup',
    '#markup' => l(t('Cancel'), 'admin/structure/views/custom_table'),
  );
  return $form;
}

/**
 * Submit handler for view_custom_table_custom_table_update_relations_form()
 */
function view_custom_table_custom_table_update_relations_form_submit($form, &$form_state) {
  $values = $form_state['values']['columns'];
  $relations = array();
  foreach ($values as $column) {
    if ($column['entity'] != '') {
      $relations[$column['field']] = $column['entity'];
    }
  }
  $serialize_relations = serialize($relations);
  if (db_table_exists('custom_table_view_data')) {
    if (isset($form_state['table_name'])) {
      $query = db_update('custom_table_view_data')
        ->fields(array(
        'column_relations' => $serialize_relations,
      ))
        ->condition('table_name', $form_state['table_name'])
        ->execute();
      drupal_set_message(t('Relations for "@table" are updated', array(
        '@table' => $form_state['table_name'],
      )));
    }
    drupal_set_message(t("Please clear all cache to start working."));
  }
  else {
    drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
  }
  $form_state['redirect'] = 'admin/structure/views/custom_table';
}

/**
 * Function to list all available custom tables for views.
 */
function view_custom_table_available_custom_tables_for_views() {
  global $user;
  if (db_table_exists('custom_table_view_data')) {
    drupal_add_css(drupal_get_path('module', 'views') . '/css/views-admin.seven.css', array(
      'group' => CSS_THEME,
      'every_page' => TRUE,
      'weight' => 10,
    ));
    drupal_add_css(drupal_get_path('module', 'views') . '/css/views-admin.ctools.css', array(
      'group' => CSS_THEME,
      'every_page' => TRUE,
      'weight' => 10,
    ));
    $query = db_select('custom_table_view_data', 'ctvd');
    $query
      ->leftJoin('users', 'u', 'u.uid = ctvd.created_by');
    $query
      ->fields('ctvd', array(
      'table_name',
      'description',
      'id',
    ));
    $query
      ->fields('u', array(
      'name',
      'uid',
    ));
    $query
      ->condition('ctvd.created_by', $user->uid);
    $query
      ->orderBy('ctvd.table_name');
    $all_custom_tables = $query
      ->execute()
      ->fetchAll();
    if (!empty($all_custom_tables)) {
      foreach ($all_custom_tables as $key => $custom_table) {
        $links = array(
          array(
            'title' => t('Edit'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/edit',
          ),
          array(
            'title' => t('Views'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/views',
          ),
          array(
            'title' => t('Relations'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/relations',
          ),
          array(
            'title' => t('Delete'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/delete',
          ),
        );
        $rows[] = array(
          $key,
          $custom_table->table_name,
          $custom_table->description,
          l(t('@user_name', array(
            "@user_name" => $custom_table->name,
          )), 'user/' . $custom_table->uid),
          theme('links__ctools_dropbutton', array(
            'links' => $links,
          )),
        );
      }
      $headers = array(
        '#',
        t('Table Name'),
        t('Description'),
        t('Created By'),
        t('Oprations'),
      );
      $output = theme('table', array(
        'header' => $headers,
        'rows' => $rows,
      ));
    }
    else {
      $output = "<h2 style='text-align:center;'>" . t('No Tables Available.') . "</h2>";
    }
  }
  else {
    $output = "";
    drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
  }
  return $output;
}

/**
 * Function to list all available custom tables for views.
 */
function view_custom_table_all_available_custom_tables_for_views() {
  if (db_table_exists('custom_table_view_data')) {
    drupal_add_css(drupal_get_path('module', 'views') . '/css/views-admin.seven.css', array(
      'group' => CSS_THEME,
      'every_page' => TRUE,
      'weight' => 10,
    ));
    drupal_add_css(drupal_get_path('module', 'views') . '/css/views-admin.ctools.css', array(
      'group' => CSS_THEME,
      'every_page' => TRUE,
      'weight' => 10,
    ));
    $query = db_select('custom_table_view_data', 'ctvd');
    $query
      ->leftJoin('users', 'u', 'u.uid = ctvd.created_by');
    $query
      ->fields('ctvd', array(
      'table_name',
      'description',
      'id',
    ));
    $query
      ->fields('u', array(
      'name',
      'uid',
    ));
    $query
      ->orderBy('ctvd.table_name');
    $all_custom_tables = $query
      ->execute()
      ->fetchAll();
    if (!empty($all_custom_tables)) {
      foreach ($all_custom_tables as $key => $custom_table) {
        $links = array(
          array(
            'title' => t('Edit'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/edit',
          ),
          array(
            'title' => t('Views'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/views',
          ),
          array(
            'title' => t('Relations'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/relations',
          ),
          array(
            'title' => t('Delete'),
            'href' => 'admin/structure/views/custom_table/' . $custom_table->id . '/delete',
          ),
        );
        $rows[] = array(
          $key,
          $custom_table->table_name,
          $custom_table->description,
          l(t('@user_name', array(
            "@user_name" => $custom_table->name,
          )), 'user/' . $custom_table->uid),
          theme('links__ctools_dropbutton', array(
            'links' => $links,
          )),
        );
      }
      $headers = array(
        '#',
        t('Table Name'),
        t('Description'),
        t('Created By'),
        t('Oprations'),
      );
      $output = theme('table', array(
        'header' => $headers,
        'rows' => $rows,
      ));
    }
    else {
      $output = "<h2 style='text-align:center;'>No Tables Available.</h2>";
    }
  }
  else {
    $output = "";
    drupal_set_message(t('"Views Custom Table" module is not installed properly, Please reinstall install it and try again.'), 'error');
  }
  return $output;
}

/**
 * Function to display all views used by a custom table.
 */
function view_custom_table_custom_tables_views($table_id = NULL) {
  $table_info = view_custom_table_load_table($table_id);
  $views_info = view_custom_table_load_custom_table_views($table_info->table_name);
  if (!empty($views_info)) {
    foreach ($views_info as $item) {
      $rows[] = array(
        'id' => $item->vid,
        'name' => $item->human_name . '(' . $item->name . ')',
        'description' => $item->description,
        'link' => l(t('View'), 'admin/structure/views/view/' . $item->name . '/edit'),
      );
    }
    $headers = array(
      "Id",
      "Name",
      "Description",
      "Link",
    );
    $output = l(t('Return to list'), 'admin/structure/views/custom_table');
    $output .= '<p></p>';
    $output .= theme('table', array(
      'header' => $headers,
      'rows' => $rows,
    ));
    return $output;
  }
  else {
    $output = '<h3>' . t('No views created by using @table_name.', array(
      '@table_name' => $table_info->table_name,
    )) . '</h3>';
    return $output;
  }
}

/**
 * Function to delete a custom table form views.
 */
function view_custom_table_delete_custom_table_to_view_callback($table_id) {
  if ($table_id == NULL) {
    return "<h3 style='text-align: center;'>Table id not found in records.</h3>";
  }
  $query = db_select('custom_table_view_data', 'ctvd')
    ->fields('ctvd', array(
    'table_name',
  ))
    ->condition('id', $table_id);
  $table_name = $query
    ->execute()
    ->fetchField();
  if ($table_name == NULL) {
    return "<h3 style='text-align: center;'>Table id not found in records.</h3>";
  }
  else {
    $query = db_select('views_view', 'v')
      ->fields('v', array(
      'vid',
      'human_name',
      'name',
    ))
      ->condition('base_table', $table_name);
    $views_in_uses = $query
      ->execute()
      ->fetchAll();
    if (!empty($views_in_uses)) {
      foreach ($views_in_uses as $view_info) {
        $rows[] = array(
          $view_info->vid,
          $view_info->human_name,
          l(t('View'), 'admin/structure/views/view/' . $view_info->name . '/edit'),
        );
      }
      $headers = array(
        "Vid",
        "Name",
        "View",
      );
      drupal_set_message(t('Can not delete "@tablename". Following views are using "@tablename".', array(
        '@tablename' => $table_name,
      )), 'error');
      $output = l(t('Return to list'), 'admin/structure/views/custom_table');
      $output .= '<p></p>';
      $output .= theme('table', array(
        'header' => $headers,
        'rows' => $rows,
      ));
      return $output;
    }
    else {
      $delete_form = drupal_get_form('view_custom_table_delete_custom_table_to_view_form', $table_name);
      return render($delete_form);
    }
  }
}

/**
 * Function to implement delete custom table form.
 */
function view_custom_table_delete_custom_table_to_view_form($form, &$form_state, $table_name) {
  $form = array();
  $form['message'] = array(
    '#markup' => '<p>' . t('Do you want to delete custom view table "@table_name" ?', array(
      '@table_name' => $table_name,
    )) . '</p>',
  );
  $form_state['table_name'] = $table_name;
  $form['actions']['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
  );
  $form['actions']['cancel'] = array(
    '#markup' => l(t('Cancel'), 'admin/structure/views/custom_table'),
  );
  return $form;
}

/**
 * Submit for delete_custom_table_to_view_form().
 */
function view_custom_table_delete_custom_table_to_view_form_submit($form, $form_state) {
  if (isset($form_state['table_name'])) {
    db_delete('custom_table_view_data')
      ->condition('table_name', $form_state['table_name'])
      ->execute();
    drupal_set_message(t('@table_name has been deleted.', array(
      '@table_name' => $form_state['table_name'],
    )));
  }
}

Functions

Namesort descending Description
view_custom_table_add_custom_table_column_relationship_form Form to add table's column relationship with drupal tables.
view_custom_table_add_custom_table_column_relationship_form_submit Submit and save add_custom_table_column_relationship_form.
view_custom_table_add_custom_table_to_view_form Form to add custom table in table information table.
view_custom_table_add_custom_table_to_view_form_submit Submit and save add_custom_table_to_view_form.
view_custom_table_add_custom_table_to_view_form_validate Validate add_custom_table_to_view_form.
view_custom_table_all_available_custom_tables_for_views Function to list all available custom tables for views.
view_custom_table_available_custom_tables_for_views Function to list all available custom tables for views.
view_custom_table_custom_tables_views Function to display all views used by a custom table.
view_custom_table_custom_table_update_relations_form Function to update custom table relations.
view_custom_table_custom_table_update_relations_form_submit Submit handler for view_custom_table_custom_table_update_relations_form()
view_custom_table_delete_custom_table_to_view_callback Function to delete a custom table form views.
view_custom_table_delete_custom_table_to_view_form Function to implement delete custom table form.
view_custom_table_delete_custom_table_to_view_form_submit Submit for delete_custom_table_to_view_form().
view_custom_table_edit_custom_table_form Function to edit custom table description.
view_custom_table_edit_custom_table_form_submit Submit handler of view_custom_table_edit_custom_table_form()
view_custom_table_edit_custom_table_form_validate Function to validate custom table description.