|
@@ -33,8 +33,6 @@ class TripalBundleUIController extends EntityDefaultUIController {
|
|
'page callback' => 'drupal_get_form',
|
|
'page callback' => 'drupal_get_form',
|
|
'page arguments' => array('tripal_admin_add_type_form'),
|
|
'page arguments' => array('tripal_admin_add_type_form'),
|
|
'access arguments' => array('administer tripal data types'),
|
|
'access arguments' => array('administer tripal data types'),
|
|
- 'file' => 'includes/tripal.admin.inc',
|
|
|
|
- 'file path' => drupal_get_path('module', 'tripal'),
|
|
|
|
'type' => MENU_LOCAL_ACTION,
|
|
'type' => MENU_LOCAL_ACTION,
|
|
'weight' => 2
|
|
'weight' => 2
|
|
);
|
|
);
|
|
@@ -406,24 +404,429 @@ function tripal_bundle_access($op, $type = NULL, $account = NULL) {
|
|
*/
|
|
*/
|
|
function tripal_admin_add_type_form($form, &$form_state) {
|
|
function tripal_admin_add_type_form($form, &$form_state) {
|
|
|
|
|
|
- // TODO: we need some sort of administrative interface that lets the user
|
|
|
|
- // switch to the desired vocabulary type. For now, we'll just use the
|
|
|
|
- // first one in the list.
|
|
|
|
|
|
+ // TODO: the Chado specific function calls should not be here. They need
|
|
|
|
+ // to be genericized.
|
|
$stores = module_invoke_all('vocab_storage_info');
|
|
$stores = module_invoke_all('vocab_storage_info');
|
|
- if (is_array($stores) and count($stores) > 0) {
|
|
|
|
- $keys = array_keys($stores);
|
|
|
|
- $module = $stores[$keys[0]]['module'];
|
|
|
|
- $function = $module . '_vocab_select_term_form';
|
|
|
|
- if (function_exists($function)) {
|
|
|
|
- $form = $function($form, $form_state);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
|
|
+ if (!is_array($stores) or count($stores) == 0) {
|
|
tripal_set_message('A storage backend is not enabled for managing
|
|
tripal_set_message('A storage backend is not enabled for managing
|
|
the vocabulary terms used to create content. Please enable
|
|
the vocabulary terms used to create content. Please enable
|
|
a module that supports storage of vocabualary terms (e.g. tripal_chado)
|
|
a module that supports storage of vocabualary terms (e.g. tripal_chado)
|
|
and return to create new Tripal content types.', TRIPAL_NOTICE);
|
|
and return to create new Tripal content types.', TRIPAL_NOTICE);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ $keys = array_keys($stores);
|
|
|
|
+ $module = $stores[$keys[0]]['module'];
|
|
|
|
+ $function = $module . '_vocab_select_term_form';
|
|
|
|
+ if (function_exists($function)) {
|
|
|
|
+ $form = $function($form, $form_state);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $term_name = array_key_exists('values', $form_state) ? $form_state['values']['term_name'] : '';
|
|
|
|
+
|
|
|
|
+ // If no term has been selected yet then provide the auto complete field.
|
|
|
|
+ $form['term_name'] = array(
|
|
|
|
+ '#title' => t('Content Type'),
|
|
|
|
+ '#type' => 'textfield',
|
|
|
|
+ '#description' => t("The content type must be the name of a term in
|
|
|
|
+ a controlled vocabulary and the controlled vocabulary should
|
|
|
|
+ already be loaded into Tripal. For example, to create a content
|
|
|
|
+ type for storing 'genes', use the 'gene' term from the
|
|
|
|
+ Sequence Ontology (SO)."),
|
|
|
|
+ '#required' => TRUE,
|
|
|
|
+ '#default_value' => $term_name,
|
|
|
|
+ '#autocomplete_path' => "admin/tripal/storage/chado/auto_name/cvterm/",
|
|
|
|
+ );
|
|
|
|
+ $form['select_button'] = array(
|
|
|
|
+ '#type' => 'submit',
|
|
|
|
+ '#value' => t('Lookup Term'),
|
|
|
|
+ '#name' => 'select_cvterm',
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if ($term_name) {
|
|
|
|
+ $submit_disabled = TRUE;
|
|
|
|
+ $form['terms_list'] = array(
|
|
|
|
+ '#type' => 'fieldset',
|
|
|
|
+ '#title' => t('Matching Terms'),
|
|
|
|
+ '#description' => t('Please select the term the best matches the
|
|
|
|
+ content type you want to create. If the same term exists in
|
|
|
|
+ multiple vocabularies you will see more than one option below.')
|
|
|
|
+ );
|
|
|
|
+ $match = array(
|
|
|
|
+ 'name' => $term_name,
|
|
|
|
+ );
|
|
|
|
+ $terms = chado_generate_var('cvterm', $match, array('return_array' => TRUE));
|
|
|
|
+ $terms = chado_expand_var($terms, 'field', 'cvterm.definition');
|
|
|
|
+ $num_terms = 0;
|
|
|
|
+ $selected_term_id = '';
|
|
|
|
+ foreach ($terms as $term) {
|
|
|
|
+ // Save the user a click by setting the default value as 1 if there's
|
|
|
|
+ // only one matching term.
|
|
|
|
+ $default = FALSE;
|
|
|
|
+ $attrs = array();
|
|
|
|
+ if ($num_terms == 0 and count($terms) == 1) {
|
|
|
|
+ $default = TRUE;
|
|
|
|
+ $attrs = array('checked' => 'checked');
|
|
|
|
+ }
|
|
|
|
+ $term_element_name = 'term-' . $term->cvterm_id;
|
|
|
|
+ $form['terms_list'][$term_element_name] = array(
|
|
|
|
+ '#type' => 'checkbox',
|
|
|
|
+ '#title' => $term->name,
|
|
|
|
+ '#default_value' => $default,
|
|
|
|
+ '#attributes' => $attrs,
|
|
|
|
+ '#description' => '<b>Vocabulary:</b> ' . $term->cv_id->name . ' (' . $term->dbxref_id->db_id->name . ') ' . $term->cv_id->definition .
|
|
|
|
+ '<br><b>Term: </b> ' . $term->dbxref_id->db_id->name . ':' . $term->dbxref_id->accession . '. ' .
|
|
|
|
+ '<br><b>Definition:</b> ' . $term->definition,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if (array_key_exists('values', $form_state) and array_key_exists($term_element_name, $form_state['values']) and
|
|
|
|
+ $form_state['values'][$term_element_name] == 1) {
|
|
|
|
+ $selected_term_id = $term->cvterm_id;
|
|
|
|
+ }
|
|
|
|
+ $num_terms++;
|
|
|
|
+ }
|
|
|
|
+ if ($num_terms == 0) {
|
|
|
|
+ $form['terms_list']['none'] = array(
|
|
|
|
+ '#type' => 'item',
|
|
|
|
+ '#markup' => '<i>' . t('There is no term that matches the entered text.') . '</i>'
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ $form['storage'] = array(
|
|
|
|
+ '#type' => 'fieldset',
|
|
|
|
+ '#title' => t('Storage Settings'),
|
|
|
|
+ '#description' => t('The primary record for each content of this type
|
|
|
|
+ must be stored in a single storage backend. Please select the
|
|
|
|
+ storage method and settings for this content type.')
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // TODO: we should have a default store setting so that user's have
|
|
|
|
+ // fewer clicks.
|
|
|
|
+
|
|
|
|
+ // TODO: there should be a way for each storage backend to determine if
|
|
|
|
+ // it can handle the content type. Maybe certain content types aren't
|
|
|
|
+ // yet supported by every sotrage backend.
|
|
|
|
+ $default_store = 'term_chado_storage';
|
|
|
|
+ $store_options = array(0 => '-- Select --');
|
|
|
|
+ foreach ($stores as $store_type => $store) {
|
|
|
|
+ $store_options[$store_type] = $store['label'];
|
|
|
|
+ }
|
|
|
|
+ if (array_key_exists('values', $form_state) and
|
|
|
|
+ array_key_exists('store_select', $form_state['values'])) {
|
|
|
|
+ $default_store = $form_state['values']['store_select'];
|
|
|
|
+ }
|
|
|
|
+ $form['storage']['store_select'] = array(
|
|
|
|
+ '#type' => 'select',
|
|
|
|
+ '#title' => 'Storage backend',
|
|
|
|
+ '#options' => $store_options,
|
|
|
|
+ '#default_value' => $default_store,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ '#description' => 'Select a storage background for this content type.'
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if ($default_store) {
|
|
|
|
+ if ($store_type == 'term_chado_storage') {
|
|
|
|
+ // TODO: Move this Chado-specific code out of there.
|
|
|
|
+ $default_table = '';
|
|
|
|
+ if (array_key_exists('base_chado_table', $form_state['values'])
|
|
|
|
+ and $form_state['values']['base_chado_table']) {
|
|
|
|
+ $default_table = $form_state['values']['base_chado_table'];
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ $mapped_table = chado_get_cvterm_mapping(array('cvterm_id' => $selected_term_id));
|
|
|
|
+ if ($mapped_table) {
|
|
|
|
+ $default_table = $mapped_table->chado_table;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $form['storage'][$store_type]['selected_cvterm_id'] = array(
|
|
|
|
+ '#type' => 'value',
|
|
|
|
+ '#value' => $selected_term_id,
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $base_tables = chado_get_base_tables();
|
|
|
|
+ $options = array(0 => '-- Select table --');
|
|
|
|
+ foreach ($base_tables AS $tablename) {
|
|
|
|
+ $options[$tablename] = $tablename;
|
|
|
|
+ }
|
|
|
|
+ $form['storage'][$store_type]['base_chado_table'] = array(
|
|
|
|
+ '#type' => 'select',
|
|
|
|
+ '#title' => 'Chado table',
|
|
|
|
+ '#options' => $options,
|
|
|
|
+ '#description' => 'Select the Chado table into which the primary records for this content type will be stored.',
|
|
|
|
+ '#default_value' => $default_table,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+ $form_state['input']['base_chado_table'] = $default_table;
|
|
|
|
+
|
|
|
|
+ if ($default_table) {
|
|
|
|
+
|
|
|
|
+ // There are a few places in form below where the type columns
|
|
|
|
+ // can be used to identify a record. So, we'll create the
|
|
|
|
+ // select options here so it can be used multiple places. We
|
|
|
|
+ // only want to include in our column options those fields that
|
|
|
|
+ // are foreign keys to the cvterm table
|
|
|
|
+ $schema = chado_get_schema($default_table);
|
|
|
|
+ $column_options = array('0' => '--Select column--');
|
|
|
|
+ $cvt_fkeys = array_keys($schema['foreign keys']['cvterm']['columns']);
|
|
|
|
+ foreach ($schema['fields'] as $column_name => $column_details) {
|
|
|
|
+ if (in_array($column_name, $cvt_fkeys)) {
|
|
|
|
+ $column_options[$column_name] = $column_name;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $default_has_all = 'No';
|
|
|
|
+ if (array_key_exists('chado_table_has_all', $form_state['values'])
|
|
|
|
+ and $form_state['values']['chado_table_has_all']) {
|
|
|
|
+ $default_has_all = $form_state['values']['chado_table_has_all'];
|
|
|
|
+ }
|
|
|
|
+ $form['storage'][$store_type]['chado_table_has_all'] = array(
|
|
|
|
+ '#type' => 'radios',
|
|
|
|
+ '#options' => array(
|
|
|
|
+ 'Yes' => 'Yes',
|
|
|
|
+ 'No' => 'No'
|
|
|
|
+ ),
|
|
|
|
+ '#title' => 'Are all records in the "' . $default_table .
|
|
|
|
+ '" table of type "'. $term_name . '"?',
|
|
|
|
+ '#description' => 'Select "Yes" if the "' .
|
|
|
|
+ $default_table . '" table houses more that just data of type "' .
|
|
|
|
+ $term_name . '".',
|
|
|
|
+ '#default_value' => $default_has_all,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // If the table does not contain just one single type of record.
|
|
|
|
+ if ($default_has_all == 'No') {
|
|
|
|
+
|
|
|
|
+ $default_type_column = '';
|
|
|
|
+ if (array_key_exists('type_id', $schema['fields'])) {
|
|
|
|
+ $default_type_column = 'type_id';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // If the table doesn't have an obvious type_id column then
|
|
|
|
+ // let the user specify how record types are identified.
|
|
|
|
+ if ($default_type_column) {
|
|
|
|
+
|
|
|
|
+ $default_has_type = 'Yes';
|
|
|
|
+ if (array_key_exists('chado_table_has_type', $form_state['values'])
|
|
|
|
+ and $form_state['values']['chado_table_has_type']) {
|
|
|
|
+ $default_has_type = $form_state['values']['chado_table_has_type'];
|
|
|
|
+ }
|
|
|
|
+ $form['storage'][$store_type]['chado_table_has_type'] = array(
|
|
|
|
+ '#type' => 'radios',
|
|
|
|
+ '#title' => 'Do you want to use the "' . $default_table . '.' .
|
|
|
|
+ $default_type_column . '" to distinguish between content types?',
|
|
|
|
+ '#options' => array(
|
|
|
|
+ 'Yes' => 'Yes',
|
|
|
|
+ 'No' => 'No'
|
|
|
|
+ ),
|
|
|
|
+ '#description' => t('Many tables in Chado use a "type_id" column
|
|
|
|
+ to identify specific data types. For example, the "feature.type_id"
|
|
|
|
+ column is used to distinguish between different types of
|
|
|
|
+ genomic features that are all housed in the feature table.
|
|
|
|
+ But there is sometimes a cvterm linker table where additional
|
|
|
|
+ attributes for the record can be set. Here you can specify if you
|
|
|
|
+ want to use the type_id column or select another way
|
|
|
|
+ to identify records in the "' . $default_table . '" table that
|
|
|
|
+ are of this type'),
|
|
|
|
+ '#default_value' => $default_has_type,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // If the type_id column is not wanted to differentiate between
|
|
|
|
+ // different records of this type then find out if the user wants
|
|
|
|
+ // to use a linker cvterm table, but only if one exists
|
|
|
|
+ $linker_table = $default_table . '_cvterm';
|
|
|
|
+ if ($default_has_type == "Yes") {
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ else if ($default_has_type == 'No' and chado_table_exists($linker_table)) {
|
|
|
|
+ $default_use_linker = 'Yes';
|
|
|
|
+ if (array_key_exists('chado_type_use_linker', $form_state['values'])
|
|
|
|
+ and $form_state['values']['chado_type_use_linker']) {
|
|
|
|
+ $default_use_linker = $form_state['values']['chado_type_use_linker'];
|
|
|
|
+ }
|
|
|
|
+ $form['storage'][$store_type]['chado_type_use_linker'] = array(
|
|
|
|
+ '#type' => 'radios',
|
|
|
|
+ '#title' => 'Do you want to use the "' . $linker_table . '" table
|
|
|
|
+ to distinguish between content types?',
|
|
|
|
+ '#options' => array(
|
|
|
|
+ 'Yes' => 'Yes',
|
|
|
|
+ 'No' => 'No'
|
|
|
|
+ ),
|
|
|
|
+ '#description' => t('Sometimes records can be distringuish
|
|
|
|
+ using a linker table, especially if there is no column
|
|
|
|
+ in the specified Chado table to identify the
|
|
|
|
+ record types. In these cases the linker table is
|
|
|
|
+ sometimes used.'),
|
|
|
|
+ '#default_value' => $default_use_linker,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if($default_use_linker == 'No') {
|
|
|
|
+ if (count(array_keys($column_options)) == 1) {
|
|
|
|
+ $form['storage'][$store_type]['type_column'] = array(
|
|
|
|
+ '#type' => 'item',
|
|
|
|
+ '#title' => 'Type Column',
|
|
|
|
+ '#description' => 'The "' . $default_table .
|
|
|
|
+ '" table does not have a column
|
|
|
|
+ that stores data types. You cannot map the "' .
|
|
|
|
+ $term_name . '" type to this table.',
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ $form['storage'][$store_type]['type_column'] = array(
|
|
|
|
+ '#type' => 'select',
|
|
|
|
+ '#title' => 'Type Column',
|
|
|
|
+ '#options' => $column_options,
|
|
|
|
+ '#description' => 'Please select the column in the "' .
|
|
|
|
+ $default_table . '" table that will identify a record
|
|
|
|
+ as being of type "' . $term_name . '".',
|
|
|
|
+ '#default_value' => $default_type_column,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ } // end if(!$default_use_linker) {
|
|
|
|
+ else {
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ } // end if ($default_has_type == 'No' and ...
|
|
|
|
+ } // end else if ($default_type_column) {
|
|
|
|
+ else {
|
|
|
|
+ // If the type_id column is not wanted to differentiate between
|
|
|
|
+ // different records of this type then find out if the user wants
|
|
|
|
+ // to use a linker table, but only if one exists
|
|
|
|
+ $linker_table = $default_table . '_cvterm';
|
|
|
|
+ if (chado_table_exists($linker_table)) {
|
|
|
|
+ $default_use_linker = 'Yes';
|
|
|
|
+ if (array_key_exists('chado_type_use_linker', $form_state['values'])
|
|
|
|
+ and $form_state['values']['chado_type_use_linker']) {
|
|
|
|
+ $default_use_linker = $form_state['values']['chado_type_use_linker'];
|
|
|
|
+ }
|
|
|
|
+ $form['storage'][$store_type]['chado_type_use_linker'] = array(
|
|
|
|
+ '#type' => 'radios',
|
|
|
|
+ '#title' => 'Do you want to use the "' . $linker_table . '" table
|
|
|
|
+ to distinguish between content types?',
|
|
|
|
+ '#options' => array(
|
|
|
|
+ 'Yes' => 'Yes',
|
|
|
|
+ 'No' => 'No'
|
|
|
|
+ ),
|
|
|
|
+ '#description' => t('Sometimes records can be distringuish
|
|
|
|
+ using a linker, especially if there is no column
|
|
|
|
+ in the specified Chado table to identify the
|
|
|
|
+ record types. In these cases the linker table is
|
|
|
|
+ sometimes used.'),
|
|
|
|
+ '#default_value' => $default_use_linker,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if($default_use_linker == 'No') {
|
|
|
|
+ if (count(array_keys($column_options)) == 1) {
|
|
|
|
+ $form['storage'][$store_type]['type_column'] = array(
|
|
|
|
+ '#type' => 'item',
|
|
|
|
+ '#title' => 'Type Column',
|
|
|
|
+ '#description' => 'The "' . $default_table .
|
|
|
|
+ '" table does not have a column
|
|
|
|
+ that stores data types. You cannot map the "' .
|
|
|
|
+ $term_name . '" type to this table.',
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ $form['storage'][$store_type]['type_column'] = array(
|
|
|
|
+ '#type' => 'select',
|
|
|
|
+ '#title' => 'Type Column',
|
|
|
|
+ '#options' => $column_options,
|
|
|
|
+ '#description' => 'Please select the column in the "' .
|
|
|
|
+ $default_table . '" table that will identify a record
|
|
|
|
+ as being of type "' . $term_name . '".',
|
|
|
|
+ '#default_value' => $default_type_column,
|
|
|
|
+ '#ajax' => array(
|
|
|
|
+ 'callback' => "tripal_admin_add_type_form_ajax_callback",
|
|
|
|
+ 'wrapper' => "tripal-vocab-select-form",
|
|
|
|
+ 'effect' => 'fade',
|
|
|
|
+ 'method' => 'replace'
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ } // end if(!$default_use_linker) {
|
|
|
|
+ else {
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ } // end if ($default_has_type == 'No' and ...
|
|
|
|
+ } // end else
|
|
|
|
+ } // end if ($default_has_all == 'No') {
|
|
|
|
+ else {
|
|
|
|
+ $submit_disabled = FALSE;
|
|
|
|
+ }
|
|
|
|
+ } // end if ($default_table) {
|
|
|
|
+ } // end if ($default_store) {
|
|
|
|
+ // Add in the button for the cases of no terms or too many.
|
|
|
|
+ $form['submit_button'] = array(
|
|
|
|
+ '#type' => 'submit',
|
|
|
|
+ '#value' => t('Create content type'),
|
|
|
|
+ '#name' => 'use_cvterm',
|
|
|
|
+ '#disabled' => $submit_disabled,
|
|
|
|
+ );
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ $form['#prefix'] = '<div id = "tripal-vocab-select-form">';
|
|
|
|
+ $form['#suffix'] = '</div>';
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ return $form;
|
|
|
|
+}
|
|
|
|
+/**
|
|
|
|
+ * Implements an AJAX callback for the tripal_chado_vocab_select_term_form.
|
|
|
|
+ */
|
|
|
|
+function tripal_admin_add_type_form_ajax_callback($form, $form_state) {
|
|
return $form;
|
|
return $form;
|
|
}
|
|
}
|
|
/**
|
|
/**
|
|
@@ -431,47 +834,101 @@ function tripal_admin_add_type_form($form, &$form_state) {
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
function tripal_admin_add_type_form_validate($form, &$form_state) {
|
|
function tripal_admin_add_type_form_validate($form, &$form_state) {
|
|
- // TODO: we need some sort of administrative interface that lets the user
|
|
|
|
- // switch to the desired vocabulary type. For now, we'll just use the
|
|
|
|
- // first one in the list.
|
|
|
|
$stores = module_invoke_all('vocab_storage_info');
|
|
$stores = module_invoke_all('vocab_storage_info');
|
|
- if (is_array($stores) and count($stores) > 0) {
|
|
|
|
- $keys = array_keys($stores);
|
|
|
|
- $module = $stores[$keys[0]]['module'];
|
|
|
|
- $function = $module . '_vocab_select_term_form_validate';
|
|
|
|
- if (function_exists($function)) {
|
|
|
|
- $function($form, $form_state);
|
|
|
|
|
|
+ $keys = array_keys($stores);
|
|
|
|
+ $module = $stores[$keys[0]]['module'];
|
|
|
|
+ $function = $module . '_vocab_select_term_form_validate';
|
|
|
|
+ if (function_exists($function)) {
|
|
|
|
+ $function($form, $form_state);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (array_key_exists('clicked_button', $form_state) and
|
|
|
|
+ $form_state['clicked_button']['#name'] =='use_cvterm') {
|
|
|
|
+
|
|
|
|
+ $cvterm_id = NULL;
|
|
|
|
+
|
|
|
|
+ // Make sure we have a cvterm selected
|
|
|
|
+ $num_selected = 0;
|
|
|
|
+ foreach ($form_state['values'] as $key => $value) {
|
|
|
|
+ $matches = array();
|
|
|
|
+ if (preg_match("/^term-(\d+)$/", $key, $matches) and
|
|
|
|
+ $form_state['values']['term-' . $matches[1]]) {
|
|
|
|
+ $cvterm_id = $matches[1];
|
|
|
|
+ $term = chado_generate_var('cvterm', array('cvterm_id' => $cvterm_id));
|
|
|
|
+ $num_selected++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if ($num_selected == 0) {
|
|
|
|
+ form_set_error('', 'Please select at least one term.');
|
|
|
|
+ }
|
|
|
|
+ else if ($num_selected > 1) {
|
|
|
|
+ form_set_error('term-' . $cvterm_id, 'Please select only one term from the list below.');
|
|
}
|
|
}
|
|
|
|
+ else {
|
|
|
|
+ $form_state['term']['vocabulary'] = $term->dbxref_id->db_id->name;
|
|
|
|
+ $form_state['term']['accession'] = $term->dbxref_id->accession;
|
|
|
|
+ $form_state['term']['term_name'] = $term->name;
|
|
|
|
+
|
|
|
|
+ // Make sure a default table is selected
|
|
|
|
+ // TODO: move this Chado specific code out.
|
|
|
|
+ $default_table = $form_state['values']['base_chado_table'];
|
|
|
|
+ if (!$default_table) {
|
|
|
|
+ form_set_error('base_chado_table', 'Please select a default table.');
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // For any other button click it's an AJAX call and we just want to reubild
|
|
|
|
+ // the form.
|
|
|
|
+ else {
|
|
|
|
+ $form_state['rebuild'] = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
/**
|
|
* Implements hook_submit() for the tripal_admin_add_type_form.
|
|
* Implements hook_submit() for the tripal_admin_add_type_form.
|
|
- *
|
|
|
|
- * The storage backend must set the
|
|
|
|
- *
|
|
|
|
*/
|
|
*/
|
|
function tripal_admin_add_type_form_submit($form, &$form_state) {
|
|
function tripal_admin_add_type_form_submit($form, &$form_state) {
|
|
$vocabulary = '';
|
|
$vocabulary = '';
|
|
$accession = '';
|
|
$accession = '';
|
|
- if (array_key_exists('storage', $form_state)) {
|
|
|
|
- $storage = $form_state['storage'];
|
|
|
|
- $vocabulary = array_key_exists('vocabulary', $storage) ? $storage['vocabulary'] : '';
|
|
|
|
- $accession = array_key_exists('accession', $storage) ? $storage['accession'] : '';
|
|
|
|
- $term_name = array_key_exists('term_name', $storage) ? $storage['term_name'] : '';
|
|
|
|
|
|
+ if (array_key_exists('term', $form_state)) {
|
|
|
|
+ $selected_term = $form_state['term'];
|
|
|
|
+ $vocabulary = array_key_exists('vocabulary', $selected_term) ? $selected_term['vocabulary'] : '';
|
|
|
|
+ $accession = array_key_exists('accession', $selected_term) ? $selected_term['accession'] : '';
|
|
|
|
+ $term_name = array_key_exists('term_name', $selected_term) ? $selected_term['term_name'] : '';
|
|
|
|
|
|
// Before we try to add this type, check to see if it already exists
|
|
// Before we try to add this type, check to see if it already exists
|
|
// as a bundle.
|
|
// as a bundle.
|
|
$term = tripal_load_term_entity(array('vocabulary' => $vocabulary, 'accession' => $accession));
|
|
$term = tripal_load_term_entity(array('vocabulary' => $vocabulary, 'accession' => $accession));
|
|
if (!$term) {
|
|
if (!$term) {
|
|
$error = '';
|
|
$error = '';
|
|
|
|
+ // TODO: the storage args are Chado specific. This should be made
|
|
|
|
+ // more generic to support other back-ends.
|
|
|
|
+ $storage_args = array();
|
|
|
|
+ if (array_key_exists('base_chado_table', $form_state['values'])) {
|
|
|
|
+ $storage_args['data_table'] = $form_state['values']['base_chado_table'];
|
|
|
|
+ }
|
|
|
|
+ if (array_key_exists('chado_type_use_linker', $form_state['values']) and
|
|
|
|
+ $form_state['values']['chado_type_use_linker'] == 'Yes') {
|
|
|
|
+ $storage_args['type_linker_table'] = $form_state['values']['base_chado_table'] . '_cvterm';
|
|
|
|
+ $storage_args['type_column'] = 'cvterm_id';
|
|
|
|
+ }
|
|
|
|
+ if (array_key_exists('chado_table_has_type', $form_state['values']) and
|
|
|
|
+ $form_state['values']['chado_table_has_type'] == 'Yes') {
|
|
|
|
+ $storage_args['type_column'] = 'type_id';
|
|
|
|
+ }
|
|
|
|
+ if (array_key_exists('type_column', $form_state['values']) and
|
|
|
|
+ $form_state['values']['type_column']) {
|
|
|
|
+ $storage_args['type_column'] = $form_state['values']['type_column'];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $storage_args['type_id'] = $form_state['values']['selected_cvterm_id'];
|
|
$args = array(
|
|
$args = array(
|
|
'vocabulary' => $vocabulary,
|
|
'vocabulary' => $vocabulary,
|
|
'accession' => $accession,
|
|
'accession' => $accession,
|
|
'term_name' => $term_name,
|
|
'term_name' => $term_name,
|
|
- 'form_values' => $form_state['values'],
|
|
|
|
|
|
+ 'storage_args' => $storage_args,
|
|
);
|
|
);
|
|
- $success = tripal_create_bundle($args, $error);
|
|
|
|
- if (!$success) {
|
|
|
|
|
|
+ $bundle = tripal_create_bundle($args, $error);
|
|
|
|
+ if (!$bundle) {
|
|
drupal_set_message($error, 'error');
|
|
drupal_set_message($error, 'error');
|
|
$form_state['redirect'] = "admin/structure/bio_data";
|
|
$form_state['redirect'] = "admin/structure/bio_data";
|
|
}
|
|
}
|
|
@@ -479,6 +936,10 @@ function tripal_admin_add_type_form_submit($form, &$form_state) {
|
|
drupal_set_message('New data type created.');
|
|
drupal_set_message('New data type created.');
|
|
$form_state['redirect'] = "admin/structure/bio_data";
|
|
$form_state['redirect'] = "admin/structure/bio_data";
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // TODO: move these Chado specific settings out.
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
drupal_set_message("The term '$accession' already exists as a content type.", 'warning');
|
|
drupal_set_message("The term '$accession' already exists as a content type.", 'warning');
|