|
@@ -1,780 +0,0 @@
|
|
|
-<?php
|
|
|
-
|
|
|
-function tripal_extensions_form($form, &$form_state = NULL) {
|
|
|
-
|
|
|
- // Get the RSS feed XML from the tripal.info website and save it to
|
|
|
- // a temp file so that we don't have to keep pulling the XML
|
|
|
- // everythime the page is loaded. If the temp file is older than 1 hours
|
|
|
- // then we'll pull it again. The number of seconds in an hour is 3600.
|
|
|
- $tmp_file = sys_get_temp_dir() . '/tripal_rss_extensions.xml';
|
|
|
- if (!file_exists($tmp_file) or time() - filemtime($tmp_file) > 3600) {
|
|
|
- $content = file_get_contents("http://tripal.info/rss/extensions.xml");
|
|
|
- file_put_contents($tmp_file, $content);
|
|
|
- }
|
|
|
- else {
|
|
|
- $content = file_get_contents($tmp_file);
|
|
|
- }
|
|
|
- $xml = new SimpleXmlElement($content);
|
|
|
- $namespace = "http://tripal.info/rss/extensions/";
|
|
|
-
|
|
|
-
|
|
|
- $tab = array_key_exists('tab', $_GET) ? $_GET['tab'] : '';
|
|
|
-
|
|
|
- // Get any filters by categories.
|
|
|
- $filters = array();
|
|
|
- if (array_key_exists('values', $form_state)) {
|
|
|
- foreach ($form_state['values'] as $key => $value) {
|
|
|
- // Get the category to be filtered on.
|
|
|
- $matches = array();
|
|
|
- if (preg_match('/^categories-(.*?)$/', $key, $matches)) {
|
|
|
- if ($value == 'any') {
|
|
|
- continue;
|
|
|
- }
|
|
|
- $filters[$matches[1]] = $value;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Parse the items into an array indexed by type and compatible versions.
|
|
|
- $extensions = array();
|
|
|
- $types = array();
|
|
|
- $type_ids = array();
|
|
|
- $categories = array();
|
|
|
- $cvs = array();
|
|
|
- $tvs = array();
|
|
|
- foreach ($xml->channel->item as $extension) {
|
|
|
- // Get the type of extension, convert that into a machine-readable name,
|
|
|
- // and build the array of types.
|
|
|
- $type = (string) $extension->category;
|
|
|
- $type_id = preg_replace('/[^\w]/','_', strtolower($type));
|
|
|
- $type_ids[$type] = $type_id;
|
|
|
- if (!in_array($type_id, $types)) {
|
|
|
- $types[$type] = 1;
|
|
|
- }
|
|
|
-
|
|
|
- // Get the categories list for this item.
|
|
|
- $cats = preg_split('/, /', (string) $extension->children($namespace)->categories);
|
|
|
-
|
|
|
- // Get the guid for this extension
|
|
|
- $guid = (string) $extension->guid;
|
|
|
-
|
|
|
- // In order to get fields in the 'tripal_extension' name space we must
|
|
|
- // pass in the $namespace to the children function. We first get the
|
|
|
- // Tripal versions, then the chado versions and organize the elements
|
|
|
- // accordintly.
|
|
|
- $tvs_temp = preg_split('/, /', (string) $extension->children($namespace)->tripal_version);
|
|
|
- foreach($tvs_temp as $tv) {
|
|
|
- $tvs[$tv] = 1;
|
|
|
- $cvs_temp = preg_split('/, /', (string) $extension->children($namespace)->chado_version);
|
|
|
- foreach($cvs_temp as $cv) {
|
|
|
- $cvs[$cv] = 1;
|
|
|
-
|
|
|
- // Keep track of the categories this item has been assigned.
|
|
|
- foreach ($cats as $cat) {
|
|
|
- $categories[$tv][$cv][$type][$cat] = 1;
|
|
|
- $categories['any'][$cv][$type][$cat] = 1;
|
|
|
- $categories[$tv]['any'][$type][$cat] = 1;
|
|
|
- $categories['any']['any'][$type][$cat] = 1;
|
|
|
- }
|
|
|
-
|
|
|
- // If there are filters then only include extensions that match the filters.
|
|
|
- if (array_key_exists($type_id, $filters) and !in_array($filters[$type_id], $cats)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // Index the items by type, tripal version and chado version.
|
|
|
- $item = array();
|
|
|
- foreach ($extension->children() as $child) {
|
|
|
- $item[$child->getName()] = (string) $child;
|
|
|
- }
|
|
|
- foreach ($extension->children($namespace) as $child) {
|
|
|
- $item[$namespace][$child->getName()] = (string) $child;
|
|
|
- }
|
|
|
- $extensions[$tv][$cv][$type][$guid] = $item;
|
|
|
- $extensions['any'][$cv][$type][$guid] = $item;
|
|
|
- $extensions[$tv]['any'][$type][$guid] = $item;
|
|
|
- $extensions['any']['any'][$type][$guid] = $item;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Convert the arrays from an associative array into a normal array, and sort.
|
|
|
- $types = array_keys($types);
|
|
|
- sort($types);
|
|
|
- $cvs = array_keys($cvs);
|
|
|
- sort($cvs);
|
|
|
- $tvs = array_keys($tvs);
|
|
|
- sort($tvs);
|
|
|
-
|
|
|
- // Get the Chado version and convert to the expected format
|
|
|
- $chado_version = chado_get_version(TRUE);
|
|
|
- $chado_version = preg_replace('/^(\d\.\d).*$/', "v$1x", $chado_version);
|
|
|
- $my_chado_version = $chado_version;
|
|
|
- // The default value can come from the pager links (thus via $_GET) or
|
|
|
- // via ajax call (thus via $form_state).
|
|
|
- if (array_key_exists('cv', $_GET)) {
|
|
|
- $chado_version = $_GET['cv'];
|
|
|
- }
|
|
|
- if (array_key_exists('values', $form_state) and array_key_exists('cv', $form_state['values'])) {
|
|
|
- $chado_version = $form_state['values']['cv'];
|
|
|
- }
|
|
|
-
|
|
|
- // Get the Tripal version. This is the version set in the tripal.info
|
|
|
- $info = system_get_info('module', 'tripal');
|
|
|
- $tripal_version = $info['version'];
|
|
|
- $tripal_version = preg_replace('/^.*?-(\d\.\d+).*$/', "v$1", $tripal_version);
|
|
|
- $my_tripal_version = $tripal_version;
|
|
|
- if (array_key_exists('tv', $_GET)) {
|
|
|
- $tripal_version = $_GET['tv'];
|
|
|
- }
|
|
|
- if (array_key_exists('values', $form_state) and array_key_exists('tv', $form_state['values'])) {
|
|
|
- $tripal_version = $form_state['values']['tv'];
|
|
|
- }
|
|
|
-
|
|
|
- // Add the instructions.
|
|
|
- $form['instructions'] = array(
|
|
|
- '#type' => 'item',
|
|
|
- '#markup' => t('This page will help you find extensions that are available
|
|
|
- for Tripal. Select an extension type from the vertical tabs. The content
|
|
|
- of this page is constructed from an RSS feed provided by tripal.info.
|
|
|
- There may be no content if the tripal.info site is unavailable. The RSS
|
|
|
- feed will be cached for one hour.')
|
|
|
- );
|
|
|
- // Add the filters fieldset.
|
|
|
- $form['filters'] = array(
|
|
|
- '#type' => 'fieldset',
|
|
|
- '#title' => 'Filters',
|
|
|
- '#description' => t('You can filter which extensions are visible by
|
|
|
- changing the Tripal ahd Chado versions. By default only those
|
|
|
- extensions that are compatible with the currently installed Tripal
|
|
|
- and Chado verions are shown.'),
|
|
|
- '#collapsible' => TRUE,
|
|
|
- '#collapsed' => TRUE,
|
|
|
- );
|
|
|
- $summary_message = 'Currently showing extensions compatible with ';
|
|
|
- if ($tripal_version != 'any' and $chado_version != 'any') {
|
|
|
- $summary_message .= "<strong>Tripal $tripal_version</strong> and <strong>Chado $chado_version</strong>.";
|
|
|
- }
|
|
|
- elseif ($tripal_version == 'any' and $chado_version != 'any') {
|
|
|
- $summary_message .= "<strong>any Tripal</strong> version and <strong>Chado $chado_version</strong>.";
|
|
|
- }
|
|
|
- elseif ($tripal_version != 'any' and $chado_version == 'any') {
|
|
|
- $summary_message .= "<strong>Tripal $tripal_version</strong> and <strong>any Chado</strong> version.";
|
|
|
- }
|
|
|
- elseif ($tripal_version == 'any' and $chado_version == 'any') {
|
|
|
- $summary_message .= "<strong>any Tripal</strong> version and <strong>any Chado</strong> version.";
|
|
|
- }
|
|
|
- $form['filter_summary'] = array(
|
|
|
- '#type' => 'item',
|
|
|
- '#markup' => $summary_message,
|
|
|
- );
|
|
|
-
|
|
|
- // Add the Tripal version select box.
|
|
|
- $options = array();
|
|
|
- $options['any'] = '--Any--';
|
|
|
- foreach ($tvs as $tv) {
|
|
|
- $options[$tv] = $tv;
|
|
|
- }
|
|
|
- $form['filters']['tv'] = array(
|
|
|
- '#type' => 'select',
|
|
|
- '#title' => 'Tripal',
|
|
|
- '#options' => $options,
|
|
|
- '#default_value' => $tripal_version,
|
|
|
- '#ajax' => array(
|
|
|
- 'callback' => "tripal_extensions_form_ajax_callback",
|
|
|
- 'wrapper' => 'tripal_extensions',
|
|
|
- 'effect' => 'fade',
|
|
|
- 'method' => 'replace',
|
|
|
- ),
|
|
|
- '#prefix' => '<div style="float: left;">',
|
|
|
- '#suffix' => '</div>'
|
|
|
- );
|
|
|
-
|
|
|
- // Add the Chado version select box.
|
|
|
- $options = array();
|
|
|
- $options['any'] = '--Any--';
|
|
|
- foreach ($cvs as $cv) {
|
|
|
- $options[$cv] = $cv;
|
|
|
- }
|
|
|
- $form['filters']['cv'] = array(
|
|
|
- '#type' => 'select',
|
|
|
- '#title' => 'Chado',
|
|
|
- '#options' => $options,
|
|
|
- '#default_value' => $chado_version,
|
|
|
- '#ajax' => array(
|
|
|
- 'callback' => "tripal_extensions_form_ajax_callback",
|
|
|
- 'wrapper' => 'tripal_extensions',
|
|
|
- 'effect' => 'fade',
|
|
|
- 'method' => 'replace',
|
|
|
- ),
|
|
|
- '#prefix' => '<div style="float: left; padding-left: 10px">',
|
|
|
- '#suffix' => '</div>'
|
|
|
- );
|
|
|
-
|
|
|
- // Add the vertical tabs
|
|
|
- $form['extensions'] = array(
|
|
|
- '#type' => 'vertical_tabs',
|
|
|
- '#default_tab' => $tab,
|
|
|
- );
|
|
|
-
|
|
|
- // Add the fieldsets for each type
|
|
|
- foreach ($types as $type) {
|
|
|
- $form[$type] = array(
|
|
|
- '#id' => $type_ids[$type],
|
|
|
- '#type' => 'fieldset',
|
|
|
- '#title' => $type . 's',
|
|
|
- '#collapsed' => TRUE,
|
|
|
- '#collapsible' => TRUE,
|
|
|
- '#group' => 'extensions',
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- // Iterate through all of the extensions and add them to the form.
|
|
|
- $compatible_extensions = array();
|
|
|
- if (array_key_exists($tripal_version, $extensions) and
|
|
|
- array_key_exists($chado_version, $extensions[$tripal_version])) {
|
|
|
- $compatible_extensions = $extensions[$tripal_version][$chado_version];
|
|
|
- }
|
|
|
- tripal_extension_form_add_extensions($form, $form_state,
|
|
|
- $compatible_extensions, $categories, $tripal_version,
|
|
|
- $chado_version, $my_tripal_version, $my_chado_version, $type_ids,
|
|
|
- $namespace, $filters);
|
|
|
-
|
|
|
- foreach ($types as $type) {
|
|
|
- if (count(element_children($form[$type])) == 0) {
|
|
|
- $form[$type]['empty'] = array(
|
|
|
- '#type' => 'item',
|
|
|
- '#markup' => '<strong>There are no matching ' . strtolower($type) . '(s).</strong>',
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- $form['#prefix'] = '<div id="tripal_extensions">';
|
|
|
- $form['#suffix'] = '</div>';
|
|
|
- $form['#submit'][] = 'tripal_extensions_form_submit';
|
|
|
- return $form;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * Adds each extension to the form.
|
|
|
- *
|
|
|
- * This function exits to simplify the the tripal_extension_form()
|
|
|
- * function.
|
|
|
- */
|
|
|
-function tripal_extension_form_add_extensions(&$form, $form_state, $extensions,
|
|
|
- $categories, $tripal_version, $chado_version, $my_tripal_version,
|
|
|
- $my_chado_version, $type_ids, $namespace, $filters) {
|
|
|
-
|
|
|
- // Iterate through the extensions. We will add a pager for
|
|
|
- // each type of extension, and display only those that should appear
|
|
|
- // on the page.
|
|
|
- $type_index = 0;
|
|
|
- foreach ($extensions as $type => $extensions) {
|
|
|
- $total_items = count($extensions);
|
|
|
-
|
|
|
- // Indicate how many matching extensions were found
|
|
|
- $form[$type]['total_found'] = array(
|
|
|
- '#type' => 'item',
|
|
|
- '#markup' => '<strong>Found ' . $total_items . ' matching ' . strtolower($type) . '(s)</strong>',
|
|
|
- );
|
|
|
-
|
|
|
- // Add the category select box;
|
|
|
- $cats = array_keys($categories[$tripal_version][$chado_version][$type]);
|
|
|
- sort($cats);
|
|
|
- $options = array();
|
|
|
- $options['any'] = '--Any--';
|
|
|
- foreach ($cats as $cat) {
|
|
|
- $options[$cat] = $cat;
|
|
|
- }
|
|
|
- // The default value can come from the pager links (thus via $_GET) or
|
|
|
- // via ajax call (thus via $form_state).
|
|
|
- $default_filter = '';
|
|
|
- if (array_key_exists('categories-' . $type_ids[$type], $_GET)) {
|
|
|
- $default_filter = $_GET['categories-' . $type_ids[$type]];
|
|
|
- }
|
|
|
- if (array_key_exists('values', $form_state) and array_key_exists('categories-' . $type_ids[$type], $form_state['values'])) {
|
|
|
- $default_filter = $form_state['values']['categories-' . $type_ids[$type]];
|
|
|
- }
|
|
|
- $form[$type]['filters']['categories-' . $type_ids[$type]] = array(
|
|
|
- '#type' => 'select',
|
|
|
- '#title' => 'Filter by Category',
|
|
|
- '#options' => $options,
|
|
|
- '#default_value' => $default_filter,
|
|
|
- '#ajax' => array(
|
|
|
- 'callback' => "tripal_extensions_form_ajax_callback",
|
|
|
- 'wrapper' => 'tripal_extensions',
|
|
|
- 'effect' => 'fade',
|
|
|
- 'method' => 'replace',
|
|
|
- ),
|
|
|
- );
|
|
|
-
|
|
|
- // Initialize pager and gets current page
|
|
|
- $num_per_page = 5;
|
|
|
- $page = pager_default_initialize($total_items, $num_per_page, $type_index);
|
|
|
-
|
|
|
- // Gets first record and last record to show
|
|
|
- $start = ($page) * $num_per_page;
|
|
|
- $end = ($start + $num_per_page < $total_items)? $start + $num_per_page : $total_items;
|
|
|
- // Iterate through each of the elements and add them to the form if
|
|
|
- // they are within the page
|
|
|
- $extension_index = 0;
|
|
|
- foreach ($extensions as $guid => $extension) {
|
|
|
- // Skip items that aren't on our current page.
|
|
|
- if ($extension_index < $start or $extension_index >= $end) {
|
|
|
- $extension_index++;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- $extension['title'] = trim($extension['title']);
|
|
|
-
|
|
|
- // If this is an extension module then there will be a home page for it
|
|
|
- $home_page = '';
|
|
|
- if (array_key_exists('home_page', $extension[$namespace])) {
|
|
|
- $home_page = "<strong>Project Home: </strong>" . $extension[$namespace]['home_page'] . "</br>";
|
|
|
- }
|
|
|
-
|
|
|
- // Determine if this extension is compatible with this site.
|
|
|
- $incompatible = '';
|
|
|
- $tvs_temp = preg_split('/, /', $extension[$namespace]['tripal_version']);
|
|
|
- $cvs_temp = preg_split('/, /', $extension[$namespace]['chado_version']);
|
|
|
- if (!in_array($my_tripal_version, $tvs_temp)) {
|
|
|
- $incompatible .= "<li>This extension is not compatible with this version of Tripal.</li>";
|
|
|
- }
|
|
|
- if (!in_array($my_chado_version, $cvs_temp)) {
|
|
|
- $incompatible .= "<li>This extension is not compatible with the installed Chado version.</li>";
|
|
|
- }
|
|
|
- $incompatible = t($incompatible);
|
|
|
-
|
|
|
- // Determine if this extension is already installed.
|
|
|
- $is_installed = '';
|
|
|
- switch ($type) {
|
|
|
- case 'Bulk Loader Template':
|
|
|
- if (module_exists('tripal_bulk_loader')) {
|
|
|
- $blk_id = db_select('tripal_bulk_loader_template' ,'tblt')
|
|
|
- ->fields('tblt', array('template_id'))
|
|
|
- ->condition('name', $extension['title'])
|
|
|
- ->execute()
|
|
|
- ->fetchField();
|
|
|
- if ($blk_id) {
|
|
|
- $is_installed = '<li>A bulk loader template with this name is already installed.</li>';
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'Materialized View':
|
|
|
- $mview_id = chado_get_mview_id($extension[$namespace]['mview_name']);
|
|
|
- if ($mview_id) {
|
|
|
- $is_installed = '<li>A materialized view with this name is already installed.</li>';
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'Extension Module':
|
|
|
- if (array_key_exists('drupal_project', $extension[$namespace]) and
|
|
|
- module_exists($extension[$namespace]['drupal_project'])) {
|
|
|
- $is_installed = '<li>A module with this name is already installed.</li>';
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- $is_installed = t($is_installed);
|
|
|
-
|
|
|
- // Does this module appear to be available on Drupal.org?
|
|
|
- $project = '';
|
|
|
- if ($type == 'Extension Module') {
|
|
|
- // Does it have a drupal project name?
|
|
|
- if (!array_key_exists('drupal_project', $extension[$namespace])) {
|
|
|
- // Since it doesn't have a drupal project name is it in a sandbox?
|
|
|
- if (!preg_match('/www.drupal.org\/sandbox/', $extension[$namespace]['home_page'])) {
|
|
|
- $project = t("<li>This module does not appear to be available as a " .
|
|
|
- "full Drupal project and thus cannot ".
|
|
|
- "be downloaded here. You may have to manually download it.</li>");
|
|
|
- }
|
|
|
- else {
|
|
|
- $project = ("<li>This module is in a sandbox on Drupal.org, and
|
|
|
- cannot be downloaded from here. You will have to manually download
|
|
|
- this module.</li>");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Make sure the bulk loader module is installed, or we cannot provide
|
|
|
- // the bulk loader import button.
|
|
|
- $other = '';
|
|
|
- if ($type == 'Bulk Loader Template' and !module_exists('tripal_bulk_loader')) {
|
|
|
- $other = t('<li>The bulk loader
|
|
|
- module is not enabled. If you would like to import a loading template
|
|
|
- please enable it.</li>');
|
|
|
- }
|
|
|
-
|
|
|
- // If the user click's the button to import the extension then we
|
|
|
- // need the item in the submit function so we can process the import.
|
|
|
- $form[$type]['extension-' . $guid] = array(
|
|
|
- '#type' => 'value',
|
|
|
- '#value' => $extension,
|
|
|
- );
|
|
|
-
|
|
|
- $notices = '';
|
|
|
- if ($is_installed) {
|
|
|
- $notices = '<div class="messages status"><ul>' . $is_installed . '</ul></div>';
|
|
|
- }
|
|
|
- $warnings = '';
|
|
|
- if ($project or $other) {
|
|
|
- $warnings = '<div class="messages warning"><ul>' .
|
|
|
- $project . ' ' .
|
|
|
- $other . '</ul></div>';
|
|
|
- }
|
|
|
- $errors = '';
|
|
|
- if ($incompatible) {
|
|
|
- $errors = '<div class="messages error"><ul>' . $incompatible . '</ul></div>';
|
|
|
- }
|
|
|
-
|
|
|
- $state = '';
|
|
|
- if (array_key_exists('dev_stage', $extension[$namespace])) {
|
|
|
- $state = '<strong>Development State: </strong>' . $extension[$namespace]['dev_stage'] . "</br>";
|
|
|
- }
|
|
|
-
|
|
|
- // Create the form elements that we'll later theme into tables.
|
|
|
- $form[$type][$guid]['header'] = array(
|
|
|
- '#markup' => l($extension['title'], $extension['link']),
|
|
|
- );
|
|
|
- $form[$type][$guid]['details'] = array(
|
|
|
- '#markup' => "" .
|
|
|
- "<strong>Type:</strong> " . $type . "</br>" .
|
|
|
- "<strong>Categories: </strong>" . $extension[$namespace]['categories'] . "</br>" .
|
|
|
- "<strong>Authors: </strong>" . $extension[$namespace]['authors'] . "</br>" .
|
|
|
- $state .
|
|
|
- "<strong>Chado compatible versions: </strong>" . $extension[$namespace]['chado_version'] . "</br>" .
|
|
|
- "<strong>Tripal compatible versions: </strong>" . $extension[$namespace]['tripal_version'] . "</br>" .
|
|
|
- $home_page .
|
|
|
- "<strong>tripal.info Page: </strong>" . l($extension['link'], $extension['link']) . "</br>" .
|
|
|
- $notices .
|
|
|
- $warnings .
|
|
|
- $errors .
|
|
|
- "<p>" . $extension['description'] . "</p>",
|
|
|
- );
|
|
|
- // Add an import button to each of types that can support import.
|
|
|
- switch ($type) {
|
|
|
- case 'Bulk Loader Template':
|
|
|
- if (!$incompatible and !$is_installed and !$project) {
|
|
|
- $form[$type][$guid]['import'] = array(
|
|
|
- '#type' => 'submit',
|
|
|
- '#value' => "Import Loader",
|
|
|
- '#name' => "import-" . $guid,
|
|
|
- );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'Materialized View':
|
|
|
- if (!$incompatible and !$is_installed and !$project) {
|
|
|
- $form[$type][$guid]['import'] = array(
|
|
|
- '#type' => 'submit',
|
|
|
- '#value' => "Import MView",
|
|
|
- '#name' => "import-" . $guid,
|
|
|
- );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'Extension Module':
|
|
|
- if (!$incompatible and !$is_installed and !$project) {
|
|
|
- $form[$type][$guid]['import'] = array(
|
|
|
- '#type' => 'submit',
|
|
|
- '#value' => "Download Module",
|
|
|
- '#name' => "import-" . $guid,
|
|
|
- );
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- $form[$type][$guid]['#theme'] = 'tripal_extensions_form_tables';
|
|
|
- $extension_index++;
|
|
|
- }
|
|
|
-
|
|
|
- // Now create and theme the pager.
|
|
|
- $pager = array(
|
|
|
- 'tags' => array(),
|
|
|
- 'element' => $type_index,
|
|
|
- 'parameters' => array(
|
|
|
- 'tab' => $type_ids[$type],
|
|
|
- 'cv' => $chado_version,
|
|
|
- 'tv' => $tripal_version,
|
|
|
- ),
|
|
|
- 'quantity' => $num_per_page,
|
|
|
- );
|
|
|
-
|
|
|
- // now add the category filters to the params array
|
|
|
- foreach ($filters as $filter_id => $value) {
|
|
|
- $pager['parameters']['categories-' . $filter_id] = $value;
|
|
|
- }
|
|
|
-
|
|
|
- // because this may be an ajax callback, the theme_pager will set the URL to be
|
|
|
- // "system/ajax", so we need to reset that
|
|
|
- $pager = theme('pager', $pager);
|
|
|
- global $base_path;
|
|
|
- $pager = str_replace($base_path . "system/ajax", "", $pager) ;
|
|
|
-
|
|
|
- $form[$type]['pager'] = array(
|
|
|
- '#type' => 'item',
|
|
|
- '#markup' => $pager,
|
|
|
- );
|
|
|
- $type_index++;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * Process the import buttons.
|
|
|
- *
|
|
|
- * @param $form
|
|
|
- * @param $form_state
|
|
|
- */
|
|
|
-function tripal_extensions_form_submit($form, &$form_state) {
|
|
|
- // get the guid
|
|
|
- $clicked_button = $form_state['clicked_button']['#name'];
|
|
|
- $guid = preg_replace('/^import-(\d+)$/', "$1", $clicked_button);
|
|
|
- if ($guid) {
|
|
|
- $namespace = "http://tripal.info/rss/extensions/";
|
|
|
- $extension = $form_state['values']['extension-' . $guid];
|
|
|
- $type = $extension['category'];
|
|
|
- switch ($type) {
|
|
|
- case 'Bulk Loader Template':
|
|
|
- $options = array(
|
|
|
- 'template_name' => $extension['title'],
|
|
|
- 'template_array' => $extension[$namespace]['bulkldr_export'],
|
|
|
- 'strict' => TRUE,
|
|
|
- );
|
|
|
- $errors = array();
|
|
|
- $warnings = array();
|
|
|
- $success = tripal_insert_bulk_loader_template($options, $errors, $warnings);
|
|
|
- if ($success) {
|
|
|
- drupal_set_message("Bulk loader succesfully added.");
|
|
|
- }
|
|
|
- else {
|
|
|
- drupal_set_message("Error importing this bulk loader.", 'error');
|
|
|
- if (count($errors) > 0) {
|
|
|
- foreach($errors as $field => $message) {
|
|
|
- drupal_set_message($message, 'error');
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'Materialized View':
|
|
|
- $module_name = 'tripal';
|
|
|
- $mview_name = $extension[$namespace]['mview_name'];
|
|
|
- $mview_schema = $extension[$namespace]['mview_schema'];
|
|
|
- $mview_sql = $extension[$namespace]['mview_sql'];
|
|
|
-
|
|
|
- // Validate the contents of the schema array.
|
|
|
- // TODO: security issue!! Before using 'eval' on this string
|
|
|
- // we should make sure the array is valid and there is no hidden
|
|
|
- // PHP code.
|
|
|
- $schema_array = array();
|
|
|
- $success = eval("\$schema_array = $mview_schema;");
|
|
|
- $error = chado_validate_custom_table_schema($schema_array);
|
|
|
- if ($error) {
|
|
|
- drupal_set_message("Cannot import Materialized View: $error", "error");
|
|
|
- }
|
|
|
- chado_add_mview($mview_name, $module_name, $schema_array, $mview_sql);
|
|
|
- break;
|
|
|
- case 'Extension Module':
|
|
|
- if (array_key_exists('drupal_project', $extension[$namespace])) {
|
|
|
- module_load_include('module', 'update', 'update');
|
|
|
- module_load_include('inc', 'update', 'update.manager');
|
|
|
- $project = $extension[$namespace]['drupal_project'];
|
|
|
- $tar = tripal_extensions_get_latest_module_version($project);
|
|
|
- if (!$tar) {
|
|
|
- drupal_set_message('Cannot find a suitable release of this module
|
|
|
- for download. You may need to manually install this module.', 'error');
|
|
|
- }
|
|
|
- else {
|
|
|
-
|
|
|
- // Download the file from the Drupal repository
|
|
|
- $local_cache = update_manager_file_get($tar);
|
|
|
- if (!$local_cache) {
|
|
|
- drupal_set_message('Cannot download the file. Check the
|
|
|
- "Recent log messages" for relavent errors.', 'error');
|
|
|
- }
|
|
|
- else {
|
|
|
- // The following code was borrowed from the update_manager_install_form_submit()
|
|
|
- // of drupal in the modules/update/update.manager.inc file.
|
|
|
- $directory = _update_manager_extract_directory();
|
|
|
- try {
|
|
|
- $archive = update_manager_archive_extract($local_cache, $directory);
|
|
|
- }
|
|
|
- catch (Exception $e) {
|
|
|
- drupal_set_message('Cannot extract the file. Please check
|
|
|
- permissions in the modules directory', 'error');
|
|
|
- return;
|
|
|
- }
|
|
|
- $archive_errors = update_manager_archive_verify($project, $local_cache, $directory);
|
|
|
- if (!empty($archive_errors)) {
|
|
|
- foreach ($archive_errors as $error) {
|
|
|
- drupal_set_message($error, 'error');
|
|
|
- }
|
|
|
- }
|
|
|
- $project_location = $directory . '/' . $project;
|
|
|
- try {
|
|
|
- $updater = Updater::factory($project_location);
|
|
|
- }
|
|
|
- catch (Exception $e) {
|
|
|
- drupal_set_message($e->getMessage(), 'error');
|
|
|
- return;
|
|
|
- }
|
|
|
- $project_real_location = drupal_realpath($project_location);
|
|
|
- $arguments = array(
|
|
|
- 'project' => $project,
|
|
|
- 'updater_name' => get_class($updater),
|
|
|
- 'local_url' => $project_real_location,
|
|
|
- );
|
|
|
- module_load_include('inc', 'update', 'update.authorize');
|
|
|
- $filetransfer = new FileTransferLocal(DRUPAL_ROOT);
|
|
|
- call_user_func_array('update_authorize_run_install', array_merge(array($filetransfer), $arguments));
|
|
|
-
|
|
|
- drupal_set_message('It appears the module was downloaded and
|
|
|
- extracted. You can now ' . l('enable this module'. 'admin/modules') . '.');
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- drupal_set_message('Cannot download this module. The Drpual project
|
|
|
- name is not set. You may have to manually download this module, and
|
|
|
- if possible encourage the developers to set the project name if it
|
|
|
- has been fully published on Drupal.org already.', 'error');
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * The theme function for rendering each element's table.
|
|
|
- *
|
|
|
- * @param $variables
|
|
|
- */
|
|
|
-function theme_tripal_extensions_form_tables($variables) {
|
|
|
- $element = $variables['element'];
|
|
|
- $headers = array(
|
|
|
- array(
|
|
|
- 'data' => drupal_render($element['header']),
|
|
|
- 'colspan' => 2,
|
|
|
- )
|
|
|
- );
|
|
|
- $button = array_key_exists('import', $element) ? drupal_render($element['import']) : ' ';
|
|
|
- $rows = array(
|
|
|
- array(
|
|
|
- array(
|
|
|
- 'data' => drupal_render($element['details']),
|
|
|
- ),
|
|
|
- array(
|
|
|
- 'data' => $button,
|
|
|
- 'width' => '5%',
|
|
|
- 'align' => 'right',
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
-
|
|
|
- $table = array(
|
|
|
- 'header' => $headers,
|
|
|
- 'rows' => $rows,
|
|
|
- 'attributes' => array(),
|
|
|
- 'sticky' => FALSE,
|
|
|
- 'caption' => '',
|
|
|
- 'colgroups' => array(),
|
|
|
- 'empty' => '',
|
|
|
- );
|
|
|
-
|
|
|
- return theme_table($table);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * A callback function for the form
|
|
|
- *
|
|
|
- * @return unknown
|
|
|
- */
|
|
|
-function tripal_extensions_form_ajax_callback($form, $form_state) {
|
|
|
- // This function need not do anything as the form will take care of
|
|
|
- // updates needed. We just need to return the form.
|
|
|
- return $form;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * Determines the most recent downloadable package for a module.
|
|
|
- *
|
|
|
- * This function will connect to Drupal.org's RSS feed for a project and
|
|
|
- * determine the most recent version of the module and return the URL
|
|
|
- * for it's package.
|
|
|
- *
|
|
|
- * @param $project
|
|
|
- */
|
|
|
-function tripal_extensions_get_latest_module_version($project_name) {
|
|
|
- // First use the Drupal RESTful API to get the project
|
|
|
- $url = "https://www.drupal.org/api-d7/node.json?type=project_module&field_project_machine_name=$project_name";
|
|
|
- $result = json_decode(file_get_contents($url), TRUE);
|
|
|
- $project = $result['list'][0];
|
|
|
- $nid = $project['nid'];
|
|
|
-
|
|
|
- // Second get the releases for this node and find releases for this Drupal
|
|
|
- $url = "https://www.drupal.org/api-d7/node.json?type=project_release&field_release_project=$nid";
|
|
|
- $result = json_decode(file_get_contents($url), TRUE);
|
|
|
- $releases = $result['list'];
|
|
|
- $drupal_version = VERSION;
|
|
|
- $drupal_major = preg_replace('/^(\d+)\.\d+$/', "$1", $drupal_version);
|
|
|
- $best_release = NULL;
|
|
|
- foreach ($releases as $release) {
|
|
|
- // This release must match the Drupal major version or it won't
|
|
|
- // be compatiable. If it doesn't we'll skip it.
|
|
|
- $release_version = $release['field_release_version'];
|
|
|
- $release_drupal = preg_replace('/^(\d+)\.x-.*$/', "$1", $release_version);
|
|
|
- if ($release_drupal != $drupal_major) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // Set the current release to be the best one. On successive iterations
|
|
|
- // we'll check to see if that is still true.
|
|
|
- if ($best_release == NULL) {
|
|
|
- $best_release = $release;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if ($release['field_release_version_major'] > $best_release['field_release_version_major']) {
|
|
|
- $best_release = $release;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if ($release['field_release_version_patch'] > $best_release['field_release_version_patch']) {
|
|
|
- $best_release = $release;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // If the best version has no extra part then let's keep it as this is the
|
|
|
- // most stable release.
|
|
|
- if (!$best_release['field_release_version_extra']) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // Convert the 'extra' part to a numeric value that will let us compare
|
|
|
- // the ranks of the release versions.
|
|
|
- $extra_rank = array(
|
|
|
- 'unstable' => 1,
|
|
|
- 'alpha' => 2,
|
|
|
- 'beta' => 3,
|
|
|
- 'rc' => 4,
|
|
|
- );
|
|
|
- $matches = array();
|
|
|
- $this_extra = 0;
|
|
|
- if (preg_match('/^(.*?)(\d+)$/', $release['field_release_version_extra'], $matches)) {
|
|
|
- $this_extra = $extra_rank[$matches[1]] . "." . $matches[2];
|
|
|
- }
|
|
|
- $best_extra = 0;
|
|
|
- if (preg_match('/^(.*?)(\d+)$/', $best_release['field_release_version_extra'], $matches)) {
|
|
|
- $best_extra = $extra_rank[$matches[1]] . "." . $matches[2];
|
|
|
- }
|
|
|
- if ($this_extra > $best_extra) {
|
|
|
- $best_release = $release;
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- // If we have a best result then build the download string.
|
|
|
- // TODO: we may need to make another web services call to get the actual
|
|
|
- // download path, but for now we'll hard code the construction of it.
|
|
|
- if ($best_release) {
|
|
|
- return 'http://ftp.drupal.org/files/projects/' . $project_name . '-' . $best_release['field_release_version'] . '.tar.gz';
|
|
|
- }
|
|
|
- return '';
|
|
|
-}
|