'',
'chado_column' => '',
'base_table' => '',
'semantic_web' => '',
);
// Set this to the name of the storage backend that by default will support
// this field.
public static $default_storage = 'field_chado_storage';
/**
* @see TripalField::formatterView()
*/
public function formatterView(&$element, $entity_type, $entity, $langcode, $items, $display) {
// This field should never be viewed. It's to help add new properties
// when editing an entity. So return nothing.
return '';
}
/**
* @see TripalField::widgetForm()
*/
public function widgetForm(&$widget, &$form, &$form_state, $langcode, $items, $delta, $element) {
$field_name = $widget['#field_name'];
$widget['#type'] = 'fieldset';
$widget['#title'] = $element['#title'];
$widget['#description'] = $element['#description'];
$widget['#group'] = 'entity_form_vtabs';
/* $widget['kvproperty_instructions'] = array(
'#type' => 'item',
'#markup' => t('You may add additional properties to this form by
providing a property name (from a vocabulary) in the field below
and clicking the "Add Property" button. This will add a
new field to the form above for the property you entered.
In the future, this field will be present for all records
of this type.'),
); */
$term_name = array_key_exists('values', $form_state) ? $form_state['values'][$field_name]['und'][0]['wrapper']['term_name'] : '';
$widget['wrapper'] = array(
'#prefix' => "",
'#suffix' => '',
);
// If no term has been selected yet then provide the auto complete field.
$widget['wrapper']['term_name'] = array(
'#title' => t('Term'),
'#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/",
);
$widget['wrapper']['select_button'] = array(
'#type' => 'button',
'#value' => t('Lookup Term'),
'#name' => 'select_cvterm',
'#ajax' => array(
'callback' => "tripal_chado_prop_adder_form_ajax_callback",
'wrapper' => "$field_name-lookup-form",
'effect' => 'fade',
'method' => 'replace'
),
);
if ($term_name) {
$widget['wrapper']['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;
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');
}
$widget['wrapper']['terms_list']['term-' . $term->cvterm_id] = array(
'#type' => 'checkbox',
'#title' => $term->name,
'#default_value' => $default,
'#attributes' => $attrs,
'#description' => 'Vocabulary: ' . $term->cv_id->name . ' (' . $term->dbxref_id->db_id->name . ') ' . $term->cv_id->definition .
'
Term: ' . $term->dbxref_id->db_id->name . ':' . $term->dbxref_id->accession . '. ' .
'
Definition: ' . $term->definition,
);
$num_terms++;
}
if ($num_terms == 0) {
$widget['wrapper']['terms_list']['none'] = array(
'#type' => 'item',
'#markup' => '' . t('There is no term that matches the entered text.') . ''
);
}
// Add in the button for the cases of no terms or too many.
$widget['wrapper']['submit_button'] = array(
'#type' => 'submit',
'#value' => t('Use this term'),
'#name' => 'kvproperty_adder_button'
);
}
}
/**
* @see TripalField::widgetFormValidate
*/
public function widgetFormValidate($entity_type, $entity, $langcode, $items, &$errors) {
// We will never have more than one item for this field at a time, so
// delta is always zero.
$delta = 0;
// Make sure the cvterm for this property is uniquely identified.
$kvproperty = tripal_get_field_item_keyval($items, $delta, 'value', '');
$cvterms = chado_generate_var('cvterm', array('name' => $kvproperty), $options = array('return_array' => TRUE));
dpm($kvproperty);
if (trim($kvproperty) && count($cvterms) == 1) {
// Get the table and base table.
$base_table = $this->field['settings']['base_table'];
// Generate the name for the property table and the field name that we'll
// be creating.
$prop_table = $base_table . 'prop';
$field_name = $prop_table . '__' . $cvterms[0]->cvterm_id;
// Create an instance of the field.
$instance = field_info_instance($entity_type, $field_name, $entity->bundle);
if ($instance) {
$errors[$this->field['field_name']][$langcode][$delta][] = array(
'error' => 'chado_linker__prop_adder',
'message' => t("The property already exists."),
);
}
}
if (trim($kvproperty) && count($cvterms) > 1) {
$errors[$this->field['field_name']][$langcode][$delta][] = array(
'error' => 'chado_linker__prop_adder',
'message' => t("This term is present in multiple vocabularies. Please select the appropriate one."),
);
}
if (trim($kvproperty) && count($cvterms) == 0) {
$errors[$this->field['field_name']][$langcode][$delta][] = array(
'error' => 'chado_linker__prop_adder',
'message' => t("Please provide a property type to add."),
);
}
}
/**
* @see TripalField::widgetFormSubmit()
*/
public function widgetFormSubmit($entity_type, $entity, $langcode, &$items, $form, &$form_state) {dpm($form);return;
// We will never have more than one item for this field at a time, so
// delta is always zero.
$delta = 0;
// Add the new field to the entity but only if the property adder button
// was clicked
if (!array_key_exists('triggering_element', $form_state) or
$form_state['triggering_element']['#name'] != 'kvproperty_adder_button') {
return;
}
// Because we're going to add a new property we want to rebuild the form
// rather than have it fully submit.
$form_state['rebuild'] = TRUE;
// Get the table and base table.
$base_table = $this->field['settings']['base_table'];
// Get the term for the property
$kvproperty = tripal_get_field_item_keyval($items, $delta, 'value', '');
$cvterm = chado_generate_var('cvterm', array('name' => $kvproperty));
// Generate the name for the property table and the field name that we'll
// be creating.
$prop_table = $base_table . 'prop';
$field_name = $prop_table . '__' . $cvterm->cvterm_id;
// The field name is the table name in this case. We want to get the
// primary key as this should be the field that maps th the value.
$schema = chado_get_schema($prop_table);
$pkey = $schema['primary key'][0];
// Add the field if it doesn't already exists.
$field = field_info_field($field_name);
if (!$field) {
$field = field_create_field(array(
'field_name' => $field_name,
'type' => 'chado_linker__prop',
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
'locked' => FALSE,
'storage' => array(
'type' => 'field_chado_storage',
),
'settings' => array(
'chado_table' => $prop_table,
'chado_column' => $pkey,
'base_table' => $base_table,
'semantic_web' => $cvterm->dbxref_id->db_id->name . ':' . $cvterm->dbxref_id->accession,
),
));
}
// Create an instance of the field.
$instance = field_info_instance($entity_type, $field_name, $entity->bundle);
if (!$instance) {
$instance = field_create_instance(array(
'field_name' => $field_name,
'entity_type' => 'TripalEntity',
'bundle' => $entity->bundle,
'label' => ucfirst(preg_replace('/_/', ' ', $cvterm->name)),
'description' => $cvterm->definition ? $cvterm->definition : '',
'required' => FALSE,
'settings' => array(),
'widget' => array(
'type' => $field_name . '_widget',
'settings' => array(
'display_label' => 1,
),
),
'display' => array(
'default' => array(
'label' => 'inline',
'type' => $field_name . '_formatter',
'settings' => array(),
),
),
));
}
}
}
/**
*
*/
function tripal_chado_prop_adder_form_ajax_callback($form, $form_state) {
$field_name = $form_state['triggering_element']['#parents'][0];
return $form[$field_name]['und'][0]['wrapper'];
}