|  | @@ -0,0 +1,311 @@
 | 
	
		
			
				|  |  | +<?php
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Purpose: Provide Guidance to new Tripal Admin
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @return 
 | 
	
		
			
				|  |  | + *   HTML Formatted text
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_views_integration
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_views_integration_module_description_page() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $text .= '<h3>Tripal Views Integration Administrative Tools Quick Links:</h3>';
 | 
	
		
			
				|  |  | +  $text .= "<ul>
 | 
	
		
			
				|  |  | +             <li><a href=\"".url("admin/tripal/tripal_views_integration/list") . "\">List of integrated views</a></li>
 | 
	
		
			
				|  |  | +             <li><a href=\"".url("admin/tripal/tripal_views_integration/new"). "\">Setup integration of a materialized view</a></li>
 | 
	
		
			
				|  |  | +           </ul>";
 | 
	
		
			
				|  |  | +#             <li><a href=\"".url("admin/tripal/tripal_feature/aggregate"). "\">Feature Relationship Aggegators</a></li> 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $text .= '<h3>Module Description:</h3>';
 | 
	
		
			
				|  |  | +  $text .= '<p>This module provides an interface for integrating <a href="http://drupal.org/project/views">Drupal Views</a>
 | 
	
		
			
				|  |  | +            with Tripal materialized views.  This will allow site administrators to create custom queries for the materialized views
 | 
	
		
			
				|  |  | +            and in turn provide custom content pages, custom blocks and custom search forms. The forms allow a site administrator
 | 
	
		
			
				|  |  | +            to select a materialized view and associate other Chado tables on which the view can join.  Usage of this module requires
 | 
	
		
			
				|  |  | +            a good understanding of foreign-key relationships in Chado.
 | 
	
		
			
				|  |  | +            </p>';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $text .= '<h3>Setup Instructions:</h3>';
 | 
	
		
			
				|  |  | +  $text .= '<p>After installation of the feature module.  The following tasks should be performed
 | 
	
		
			
				|  |  | +            <ol>
 | 
	
		
			
				|  |  | +              <li><b>Install Drupal Views</b>: The <a href="http://drupal.org/project/views">Drupal Views</a> module
 | 
	
		
			
				|  |  | +                must first be installed before this module can be used.  If you are reading this page then you must have
 | 
	
		
			
				|  |  | +                Drupal Views installed</li>
 | 
	
		
			
				|  |  | +              <li><b>Set Permissions</b>: To allow access to site administrators for this module, simply
 | 
	
		
			
				|  |  | +               <a href="'.url('admin/user/permissions').'">assign permissions</a> to the appropriate user roles for the
 | 
	
		
			
				|  |  | +               permission type "manage tripal_views_integration". </li>
 | 
	
		
			
				|  |  | +            </ol>
 | 
	
		
			
				|  |  | +            </p>';
 | 
	
		
			
				|  |  | +  $text .= '<h3>Usage Instructions:</h3>';
 | 
	
		
			
				|  |  | +  $text .= "<p>To use this module follow these steps:
 | 
	
		
			
				|  |  | +            <ol>
 | 
	
		
			
				|  |  | +               <li><b>Identify or create a materialized view:</b> Using the <a href=\"".url("admin/tripal/tripal_mviews") . "\">
 | 
	
		
			
				|  |  | +                 Tripal materialized View</a> interface, identify the view you would like to integrate or create a new one.</li>
 | 
	
		
			
				|  |  | +               <li><b>Setup the Views Integration</b>: Navigate to the <a href=\"".url("admin/tripal/tripal_views_integration/new") . "\">
 | 
	
		
			
				|  |  | +                 Tripal views integration setup page</a> to integrate the selected materialized view.  Provide a  user friendly name
 | 
	
		
			
				|  |  | +                 and description to help you remember the purpose for integrating the view.  Next, select the view you want to integrate
 | 
	
		
			
				|  |  | +                 from the provided select box.  If your materialized view has fields that can join with other Chado tables, you may 
 | 
	
		
			
				|  |  | +                 provide those relationships in the provided form.  Finally, if your fields require a special handler for display, you
 | 
	
		
			
				|  |  | +                 may select it from the drop down provided</li>
 | 
	
		
			
				|  |  | +               <li><b>Create custom pages/block/search form</b>:  After saving setup information from step 2 above, you will be redirected to the
 | 
	
		
			
				|  |  | +                 Drupal Views interface</a> where you can create a custom page, block or search form.</li>
 | 
	
		
			
				|  |  | +               <li><b>Review your integrated views</b>:  A page providing a  
 | 
	
		
			
				|  |  | +                 <a href=\"".url("admin/tripal/tripal_views_integration/list") . "\">list of all integrated views</a> is provided. You may
 | 
	
		
			
				|  |  | +                 view this page to see all integrated views, but also to remove any unwanted integrations.</li>
 | 
	
		
			
				|  |  | +            </ol>
 | 
	
		
			
				|  |  | +         
 | 
	
		
			
				|  |  | +            </p>";  
 | 
	
		
			
				|  |  | +  $text .= '<h3>Features of this Module:</h3>';
 | 
	
		
			
				|  |  | +  $text .= '<p>This module provides the following functionality
 | 
	
		
			
				|  |  | +            <ul>
 | 
	
		
			
				|  |  | +              <li>A dynamic form for integration of an existing materialized view with Drupal Views.  This form allows the site
 | 
	
		
			
				|  |  | +                  administrator to select an existing view and indicate Chado tables on which the fields may join.</li>
 | 
	
		
			
				|  |  | +            </ul> 
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            </p>';
 | 
	
		
			
				|  |  | +  return $text;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_views_integration
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_views_integration_admin_form(){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form = array();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['#theme'] = 'tripal';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $query_results = db_query('SELECT * FROM public.tripal_views_integration;');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $header = array('Setup ID', 'Name', 'Materialized View ID', 'Base Table Name', 'Description');
 | 
	
		
			
				|  |  | +   $rows = array();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $results = array();
 | 
	
		
			
				|  |  | +   while($result = db_fetch_object($query_results)){
 | 
	
		
			
				|  |  | +      $rows[] = array($result->setup_id, $result->name, $result->mview_id, $result->base_table_name, $result->description,);
 | 
	
		
			
				|  |  | +      $results[] = $result;
 | 
	
		
			
				|  |  | +   }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $options = array();
 | 
	
		
			
				|  |  | +   foreach ($results as $key => $value) {
 | 
	
		
			
				|  |  | +      if(!empty($value))
 | 
	
		
			
				|  |  | +      $options[] = $value->setup_id;// . ' | ' . $value->name . ' | ' . $value->mview_id . ' | ' . $value->base_table_name;
 | 
	
		
			
				|  |  | +   }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['existing_rows'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'select',
 | 
	
		
			
				|  |  | +    '#options' => $options,
 | 
	
		
			
				|  |  | +    '#description' => '<strong>Select a View Setup to delete from the database.</strong>',
 | 
	
		
			
				|  |  | +    '#prefix' => theme('table', $header, $rows),
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['submit'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'submit',
 | 
	
		
			
				|  |  | +    '#value' => t('Remove'),
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['cancel'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'markup',
 | 
	
		
			
				|  |  | +    '#value' => l(t('Cancel '), 'admin/tripal/'),
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['new'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'markup',
 | 
	
		
			
				|  |  | +    '#value' => l(t(' New'), 'admin/tripal/tripal_views_integration_new'),
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   return $form;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_views_integration
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_views_integration_admin_form_submit($form, &$form_state){
 | 
	
		
			
				|  |  | +   $value = $form['existing_rows']['#options'][$form_state['values']['existing_rows']];
 | 
	
		
			
				|  |  | +   db_query("DELETE FROM public.tripal_views_integration WHERE setup_id = $value;");
 | 
	
		
			
				|  |  | +   db_query("DELETE FROM public.tripal_views_handlers WHERE setup_id = $value;");
 | 
	
		
			
				|  |  | +   db_query("DELETE FROM public.tripal_mviews_join WHERE setup_id = $value;");
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_views_integration
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function tripal_views_integration_new_setup_form(&$form_state){
 | 
	
		
			
				|  |  | +   $form = array();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['#cache'] = TRUE;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   //ahah_helper requires this to register the form with it's module
 | 
	
		
			
				|  |  | +   ahah_helper_register($form, $form_state);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   // field for the name of the 
 | 
	
		
			
				|  |  | +   $form['row_name'] = array(
 | 
	
		
			
				|  |  | +    '#title' => t('Name'),
 | 
	
		
			
				|  |  | +    '#type' => 'textfield',
 | 
	
		
			
				|  |  | +    '#size' => 60,
 | 
	
		
			
				|  |  | +    '#maxlength' => 128,
 | 
	
		
			
				|  |  | +    '#description' => 'Name of the Views Setup',
 | 
	
		
			
				|  |  | +    '#required' => TRUE,
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['row_description'] = array(
 | 
	
		
			
				|  |  | +    '#title' => t('Description'),
 | 
	
		
			
				|  |  | +    '#type' => 'textfield',
 | 
	
		
			
				|  |  | +    '#size' => 60,
 | 
	
		
			
				|  |  | +    '#maxlength' => 255,
 | 
	
		
			
				|  |  | +    '#description' => 'Briefly describe in which view this will be used',
 | 
	
		
			
				|  |  | +    '#required' => TRUE,
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $mview_query = db_query("SELECT mview_id,name FROM {tripal_mviews} ORDER BY name;");
 | 
	
		
			
				|  |  | +   $mview_options = array();
 | 
	
		
			
				|  |  | +   $mview_options['0'] = 'Select';
 | 
	
		
			
				|  |  | +   while ($mview_option = db_fetch_array($mview_query)){
 | 
	
		
			
				|  |  | +      $mview_options[$mview_option['mview_id']] = $mview_option['name'];
 | 
	
		
			
				|  |  | +   }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['mview_id'] = array(
 | 
	
		
			
				|  |  | +      '#title' => t('Materialized View'),
 | 
	
		
			
				|  |  | +      '#type' => 'select',
 | 
	
		
			
				|  |  | +      '#options' => $mview_options,
 | 
	
		
			
				|  |  | +      '#description' => 'Which materialized view to use.',
 | 
	
		
			
				|  |  | +      '#required' => TRUE,
 | 
	
		
			
				|  |  | +      '#default_value' => $mview_default_value,
 | 
	
		
			
				|  |  | +      '#ahah' => array(
 | 
	
		
			
				|  |  | +         'path' => ahah_helper_path(array('view_setup_table')),
 | 
	
		
			
				|  |  | +         'wrapper' => 'table-rows-div',
 | 
	
		
			
				|  |  | +         'effect' => 'fade',
 | 
	
		
			
				|  |  | +         'event' => 'change',
 | 
	
		
			
				|  |  | +         'method' => 'replace',
 | 
	
		
			
				|  |  | +      ),
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   // ignore this for now... we'll come back to it later -- spf
 | 
	
		
			
				|  |  | +   //   $form['row_base_table_name'] = array(
 | 
	
		
			
				|  |  | +   //      '#title' => t('Base Table Name'),
 | 
	
		
			
				|  |  | +   //      '#type' => 'select',
 | 
	
		
			
				|  |  | +   //      // '#options' => array('stub'),
 | 
	
		
			
				|  |  | +   //      '#options' => tripal_core_get_chado_tables(),
 | 
	
		
			
				|  |  | +   //      '#description' => 'Select which chado table to use for this view.',
 | 
	
		
			
				|  |  | +   //      '#required' => TRUE,
 | 
	
		
			
				|  |  | +   //   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   $form['view_setup_table'] = array(
 | 
	
		
			
				|  |  | +     '#type' => 'item',
 | 
	
		
			
				|  |  | +       '#prefix' => '<div id="table-rows-div">',
 | 
	
		
			
				|  |  | +       '#suffix' => '</div>',
 | 
	
		
			
				|  |  | +   );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   if ($form_state['storage']['mview_id']){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $mview_id = $form_state['storage']['mview_id'];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $form['view_setup_table'] = array(
 | 
	
		
			
				|  |  | +         '#type' => 'fieldset',
 | 
	
		
			
				|  |  | +         '#title' => 'Join Selection',
 | 
	
		
			
				|  |  | +         '#prefix' => '<div id="fieldset-table-rows-wrapper">',
 | 
	
		
			
				|  |  | +         '#suffix' => '</div>',
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // get the columns in this materialized view.  They are separated by commas
 | 
	
		
			
				|  |  | +      // where the first word is the column name and the rest is the type
 | 
	
		
			
				|  |  | +      $sql = "SELECT mv_specs FROM {tripal_mviews} WHERE mview_id = $mview_id";
 | 
	
		
			
				|  |  | +      $mview = db_fetch_object(db_query($sql));
 | 
	
		
			
				|  |  | +      $columns = explode(",",$mview->mv_specs);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $i=1;
 | 
	
		
			
				|  |  | +      $chado_tables = tripal_core_get_chado_tables();
 | 
	
		
			
				|  |  | +      $chado_tables = array_merge(array('',), $chado_tables);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $handlers = array();
 | 
	
		
			
				|  |  | +      $form['view_setup_table']["instructions"] = array(
 | 
	
		
			
				|  |  | +         '#type' => 'markup',
 | 
	
		
			
				|  |  | +         '#value' => "Select an optional table to which the fields of the materialized view can join.  If a field does not need to join you may leave the selection blank.",
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +      $form['view_setup_table']["fields_headers"] = array(
 | 
	
		
			
				|  |  | +         '#type' => 'markup',
 | 
	
		
			
				|  |  | +         '#value' => "<div class=\"field-headers\">".
 | 
	
		
			
				|  |  | +              "<div class=\"column-id\">Field Name and Type</div>".
 | 
	
		
			
				|  |  | +              "<div class=\"fields-column-join\">Join Table</div>".
 | 
	
		
			
				|  |  | +              "<div class=\"fields-column-join-column\">Join Column</div>".
 | 
	
		
			
				|  |  | +              "<div class=\"fields-column-handler\">Handler</div></div>",
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      foreach ($columns as $column){
 | 
	
		
			
				|  |  | +         $column = trim($column);  // trim trailing and leading spaces
 | 
	
		
			
				|  |  | +         preg_match("/^(.*?)\ (.*?)$/",$column,$matches);
 | 
	
		
			
				|  |  | +         $column_name = $matches[1];
 | 
	
		
			
				|  |  | +         $column_type = $matches[2];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_start_$mview_id-$i"] = array(
 | 
	
		
			
				|  |  | +           '#type' => 'markup',
 | 
	
		
			
				|  |  | +           '#value' => "<div class=\"fields-new-row\">",
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_name_$mview_id-$i"] = array(
 | 
	
		
			
				|  |  | +           '#type' => 'markup',
 | 
	
		
			
				|  |  | +           '#attributes' => array('class' => 'fields-column-name'),
 | 
	
		
			
				|  |  | +           '#value' => "<div class=\"column-id\"><span class=\"column-name\">$column_name</span>".
 | 
	
		
			
				|  |  | +                       "<br><span class=\"column-type\">$column_type</span></div>",
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +         $table = $form_state['storage']["fields_join_$mview_id-$i"];
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_join_$mview_id-$i"] = array(
 | 
	
		
			
				|  |  | +            '#type' => 'select',
 | 
	
		
			
				|  |  | +            '#prefix' => "<div class=\"fields-column-join\">",
 | 
	
		
			
				|  |  | +            '#suffix' => "</div>",
 | 
	
		
			
				|  |  | +            '#options' => $chado_tables,
 | 
	
		
			
				|  |  | +            '#required' => FALSE,
 | 
	
		
			
				|  |  | +            '#default_value' => $table,
 | 
	
		
			
				|  |  | +            '#ahah' => array(
 | 
	
		
			
				|  |  | +               'path' => ahah_helper_path(array('view_setup_table',"fields_join_column_$mview_id-$i")),
 | 
	
		
			
				|  |  | +               'wrapper' => "fields-column-join-column-$mview_id-$i",
 | 
	
		
			
				|  |  | +               'effect' => 'fade',
 | 
	
		
			
				|  |  | +               'event' => 'change',
 | 
	
		
			
				|  |  | +               'method' => 'replace',
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +         if($table){
 | 
	
		
			
				|  |  | +            $table_desc = module_invoke_all('chado_'.$table.'_schema');
 | 
	
		
			
				|  |  | +            $columns = array_keys($table_desc['fields']);
 | 
	
		
			
				|  |  | +         } else {
 | 
	
		
			
				|  |  | +            $columns = array();
 | 
	
		
			
				|  |  | +         }
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_join_column_$mview_id-$i"] = array(
 | 
	
		
			
				|  |  | +            '#type' => 'select',
 | 
	
		
			
				|  |  | +            '#prefix' => "<div id=\"fields-column-join-column-$mview_id-$i\" class=\"fields-column-join-column\">",
 | 
	
		
			
				|  |  | +            '#suffix' => "</div>",
 | 
	
		
			
				|  |  | +            '#options' => $columns,
 | 
	
		
			
				|  |  | +            '#required' => FALSE,
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_handler_$mview_id-$i"] = array(
 | 
	
		
			
				|  |  | +            '#type' => 'select',
 | 
	
		
			
				|  |  | +            '#prefix' => "<div class=\"fields-column-handler\">",
 | 
	
		
			
				|  |  | +            '#suffix' => "</div>",
 | 
	
		
			
				|  |  | +            '#options' => $handlers,
 | 
	
		
			
				|  |  | +            '#required' => FALSE,
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +         $form['view_setup_table']["fields_end_$i"] = array(
 | 
	
		
			
				|  |  | +            '#type' => 'markup',
 | 
	
		
			
				|  |  | +            '#value' => "</div>",
 | 
	
		
			
				|  |  | +         );
 | 
	
		
			
				|  |  | +         $i++;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      $form['view_setup_table']['save'] = array(
 | 
	
		
			
				|  |  | +          '#type'  => 'submit',
 | 
	
		
			
				|  |  | +          '#value' => t('Save'),
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +   }
 | 
	
		
			
				|  |  | +   return $form;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ingroup tripal_views_integration
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_views_integration_new_setup_form_submit($form, &$form_state){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |