You are here

forena_query.inc in Forena Reports 8

forena.datablock.inc Data block building and testing forms.

File

forena_query/forena_query.inc
View source
<?php

/**
 * @file forena.datablock.inc
 * Data block building and testing forms.
 */

/**
 * Create new sql data form hook
 * @param array $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @return array
 */
function forena_query_create_block_form($form, &$form_state, $provider = '') {
  $providers = \Drupal\forena\Frx::instance()
    ->dataManager()->repositories;
  $form['provider'] = array(
    '#required' => TRUE,
    '#title' => t('Data Source'),
    '#type' => 'select',
    '#options' => \Drupal\forena\DataManager::instance()
      ->listRepos(),
    '#default_value' => $provider,
  );
  $form['block_name'] = array(
    '#type' => 'forena_machine_name',
    '#required' => TRUE,
    '#title' => t('Block to create'),
  );
  $form['add'] = array(
    '#type' => 'submit',
    '#value' => t('Create'),
  );
  return $form;
}

/**
 * Create a new block.
 * @param array $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 */
function forena_query_create_block_form_validate($form, &$form_state) {
  extract($form_state['values']);
  $pattern = "@^[A-Za-z0-9\\/\\_]\$@";
  if (preg_match($pattern, $block_name)) {
    form_set_error('block_name', t('Invalid characters in block name'));
  }
  else {
    $path = $provider . '/' . $block_name;
    $block = \Drupal\forena\DataManager::instance()
      ->loadBlock($path);
    if ($block) {
      form_set_error('block_name', t('Data Block already exists'));
    }
  }
}

/**
 * Submit handler that creates the block
 * @param array $form
 * @param array $form_state
 */
function forena_query_create_block_form_submit($form, &$form_state) {
  extract($form_state['values']);
  $path = $provider . '/' . $block_name;
  Frx::BlockEditor($path)
    ->update(array(
    'type' => 'sql',
    'access' => '',
    'file' => '',
    'source' => '',
  ));
  $form_state['redirect'] = 'admin/structure/forena/data/' . str_replace('/', '.', $path) . "/edit";
}

/**
 * Basic SQL Editor form hook implementation
 * @param array $form
 * @param array $form_state
 * @param string $block_name
 * @return multitype:NULL
 */
function forena_query_editor($form, &$form_state, $block_name = '') {
  static $first = TRUE;
  if ($first) {
    drupal_add_library('system', 'ui.autocomplete');
    $m_path = drupal_get_path('module', 'forena_query');
    drupal_add_js("{$m_path}/forena_query.js");
    drupal_add_css("{$m_path}/forena_query.css");
    @(list($repos, $name) = explode('.', $block_name));
    drupal_add_js(array(
      'forenaSQLEditor' => array(
        'repos' => $repos,
      ),
    ), 'setting');
    $first = FALSE;
  }
  $o = Frx::BlockEditor($block_name);
  $block = $o->block;
  if (!isset($form_state['storage'])) {
    $form_state['storage']['block_name'] = $block_name;
    $form_state['storage']['parameters'] = array();
    $form_state['storage']['block'] = $block;
  }

  // @FIXME: drupal_set_title() has been removed in Drupal 8. Setting the title is now done in different ways depending on the context. For more information, see https://www.drupal.org/node/2067859
  // drupal_set_title(str_replace('.', '/', $block_name));
  $block = $form_state['storage']['block'];
  $builder = isset($block['builder']) ? $block['builder'] : 'FrxQueryBuilder';
  $builders = $o
    ->builderList();
  $form['advanced'] = array(
    '#type' => 'fieldset',
    '#title' => t('Advanced'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['advanced']['builder'] = array(
    '#type' => 'select',
    '#title' => t('Template'),
    '#options' => $builders,
    '#access' => FALSE,
    '#default_value' => $builder,
  );
  $form['advanced']['access'] = array(
    '#title' => t('Data Security'),
    '#description' => t('Value depends on the security for the data block,
            but for drupal data, this is a right as defined by the module provided.  '),
    '#type' => 'textfield',
    '#access' => \Drupal::currentUser()
      ->hasPermission('forena data security'),
    '#default_value' => @$block['access'],
  );
  $form['config'] = $o
    ->configForm($builder, $block);
  $form['config']['#tree'] = 'true';
  $form['config']['#prefix'] = "<div id='query-builder-config'>\n";
  $form['config']['#suffix'] = '</div>';
  $form['save'] = array(
    '#type' => 'submit',
    '#value' => 'Save',
    '#validate' => array(
      'forena_query_editor_validate',
    ),
    '#submit' => array(
      'forena_query_editor_update',
      'forena_query_save_block',
    ),
  );
  $form['cancel'] = array(
    '#type' => 'submit',
    '#value' => t('Cancel'),
    '#submit' => array(
      'forena_query_close',
    ),
    '#limit_validation_errors' => array(),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Test Changes'),
    '#submit' => array(
      'forena_query_editor_update',
      'forena_query_preview',
    ),
    '#ajax' => array(
      'callback' => 'forena_query_preview_ajax',
      'wrapper' => 'forena-query-preview',
    ),
  );
  $tokens = $o
    ->tokens();
  $form['preview'] = array(
    '#prefix' => '<div id="forena-query-preview">',
    '#suffix' => '</div>',
  );
  if ($tokens) {
    $form['preview']['parameters'] = array(
      '#title' => 'Parameters',
      '#type' => 'fieldset',
      '#tree' => TRUE,
    );
    foreach ($tokens as $name) {
      $ctl = array(
        '#type' => 'textfield',
        '#title' => check_plain($name),
      );
      $form['preview']['parameters'][$name] = $ctl;
    }
  }
  $form['preview']['report'] = @$form_state['storage']['preview'];
  return $form;
}
function forena_query_preview_ajax($form) {
  drupal_get_messages('warning');
  return $form['preview'];
}
function forena_query_editor_validate($form, &$form_state) {
  $o = Frx::BlockEditor();
  $o
    ->load($form_state['storage']['block_name']);
  if (\Drupal::currentUser()
    ->hasPermission('forena data security')) {
    $r = $o
      ->repos();
    $access = $r
      ->access($form_state['values']['access']);
    if (!$access) {
      form_set_error('access', t('You must be granted access to use this right.'));
    }
  }
  if (!Frx::DataFile()
    ->isWritable(Frx::BlockEditor()->block_name . '.sql')) {
    form_set_error('block', t('Insufficient Permission to save file'));
  }
  $config = array_merge($form_state['storage']['block'], $form_state['values']['config']);
  $o
    ->configValidate($form_state['values']['builder'], $config);
  $form_state['storage']['block'] = $config;
}
function forena_query_preview($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
  $parms = $form_state['storage']['parameters'];
  if (isset($form_state['values']['parameters'])) {
    $parms = $form_state['storage']['parameters'] = $form_state['values']['parameters'];
  }
  $preview = forena_data_block_preview($form_state['storage']['block_name'], $parms, TRUE);
  $form_state['storage']['preview'] = $preview['content'];
}
function forena_query_delete_form($form, &$form_state, $block_name) {
  $block_name = str_replace('.', '/', $block_name);
  $o = Frx::BlockEditor($block_name);
  $block = $o->block;
  $file = @$block['file'];
  if ($o->modified) {
    $o
      ->cancel();
    drupal_not_found($block_name);
    exit;
  }
  $form_state['storage']['block_name'] = $block_name;
  $form['block_title'] = array(
    '#markup' => "<h2>{$block_name}</h2>",
  );
  $form['file'] = array(
    '#markup' => "<pre>{$file}</pre>",
  );
  $form['confirm'] = array(
    '#type' => 'checkbox',
    '#title' => t('Are you sure you want to delete this block?'),
    '#required' => TRUE,
  );
  $form['block_name'] = array(
    '#type' => 'value',
    '#value' => $o->block_name,
  );
  $form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#submit' => array(
      'forena_query_delete_block',
      'forena_query_close',
    ),
  );
  $form['cancel'] = array(
    '#type' => 'submit',
    '#value' => t('Cancel'),
    '#submit' => array(
      'forena_query_close',
    ),
    '#limit_validation_errors' => array(),
  );
  return $form;
}
function forena_query_save_block($form, &$form_state) {
  $form_state['rebuild'] = FALSE;
  Frx::BlockEditor()
    ->save();
}
function forena_query_delete_block($form, &$form_state) {
  $block_name = $form_state['values']['block_name'];
  Frx::RepoMan()
    ->deleteBlock($block_name);
  $form_state['redirect'] = 'admin/structure/forena/data';
  drupal_set_message(t('Deleted %s', array(
    '%s' => $block_name,
  )));
}
function forena_query_close($form, &$form_state) {
  Frx::BlockEditor($form_state['storage']['block_name'])
    ->cancel();
  $form_state['rebuild'] = FALSE;
  $form_state['redirect'] = 'admin/structure/forena/data';
}

/**
 * Function to allow all normal button submits to be for the form.
 * @param unknown_type $form
 * @param unknown_type $form_state
 */
function forena_query_editor_update($form, &$form_state) {

  // Instantiate form values
  $form_state['values']['config']['access'] = $form_state['values']['access'];
  $o = Frx::BlockEditor($form_state['storage']['block_name']);
  $config = array_merge($form_state['storage']['block'], $form_state['values']['config']);
  Frx::BlockEditor()
    ->update($config);
  $form_state['rebuild'] = TRUE;
}

/**
 * Standard drupal autocomplete that searches for tables.
 * @param string $repos
 * @param string $str
 */
function forena_query_autocomplete($repos = '', $str = '') {
  $tables = array();
  if ($repos && $str) {
    $r = Frx::RepoMan()
      ->repository($repos);
    if ($r && method_exists($r, 'searchTables')) {
      $tables = $r
        ->searchTables($str);
      $tables = array_combine($tables, $tables);
    }
  }
  print drupal_json_output($tables);
}

/**
 * Standard drupal autocomplete that searches for tables or column values if a table is specified.
 * @param string $repos
 * @param string $str
 */
function forena_query_autocomplete_simple() {
  $repos = @$_GET['repos'];
  $str = @$_GET['term'];
  $table = @$_GET['table'];
  $alias = @$_GET['alias'];
  $values = array();
  if ($repos) {

    // If we have a table query the columns
    $r = Frx::RepoMan()
      ->repository($repos);
    if ($table && $alias) {
      if ($r && method_exists($r, 'searchTableColumns')) {
        $cols = $r
          ->searchTableColumns($table, $str);
        if ($cols) {
          foreach ($cols as $col) {
            $values[] = $alias . '.' . $col;
          }
        }
      }
    }
    else {
      if ($str) {

        // Otherwise query the table
        if ($r && method_exists($r, 'searchTables')) {
          $values = $r
            ->searchTables($str);
        }
      }
    }
  }
  print drupal_json_output($values);
}

Functions

Namesort descending Description
forena_query_autocomplete Standard drupal autocomplete that searches for tables.
forena_query_autocomplete_simple Standard drupal autocomplete that searches for tables or column values if a table is specified.
forena_query_close
forena_query_create_block_form Create new sql data form hook
forena_query_create_block_form_submit Submit handler that creates the block
forena_query_create_block_form_validate Create a new block.
forena_query_delete_block
forena_query_delete_form
forena_query_editor Basic SQL Editor form hook implementation
forena_query_editor_update Function to allow all normal button submits to be for the form.
forena_query_editor_validate
forena_query_preview
forena_query_preview_ajax
forena_query_save_block