returnEmpty($element);
}
// Get the list of fields that are t o be shown
$fields_to_show = [];
if (array_key_exists('transcript_fields', $this->instance['settings'])) {
$fields_to_show = $this->fieldsToShow($this->instance['settings']['transcript_fields']);
}
// For backwards compatibility if the 'transcript_fields' setting
// is not available then return the default table.
if (count($fields_to_show) == 0) {
return $this->returnDefaultTable($element, $items);
}
// If any of the transcripts are not published then just provide the
// default view
foreach ($items as $delta => $item) {
// Skip empty items;
if (!$item['value']) {
continue;
}
// If any transcript is not published (i.e. it doesn't have an entity)
// then we want to just return the default table and stop.
if (!array_key_exists('entity', $item['value'])) {
return $this->returnDefaultTable($element, $items);
}
}
// Iterate through the list of fields so that we can load the mRNA
// entity with all of the field requested by the site admin. If we
// don't do this first then auto_attach fields won't be added.
$field_ids = [];
foreach ($fields_to_show as $field_name) {
$field_info = field_info_field($field_name);
$field_ids[] = $field_info['id'];
}
// For backwards compatibility if no field IDs were provided then
// return the original table of four rows.
if (count($field_ids) == 0) {
return $this->returnDefaultTable($element, $items);
}
#return $this->returnFieldsets($items, $element, $field_ids, $fields_to_show);
return $this->returnDropDown($items, $element, $field_ids, $fields_to_show);
}
/**
* Returns a list of fields names that the site admin wants to show.
*/
private function fieldsToShow($transcript_fields) {
$to_show = [];
foreach($transcript_fields as $field_name => $details) {
if ($details['show'] == 1) {
$to_show[] = $field_name;
}
}
return $to_show;
}
/**
*
*/
private function returnDropDown($items, &$element, $field_ids, $fields_to_show) {
drupal_add_js(drupal_get_path ('module', 'tripal_chado') . '/theme/js/so__transcript.js');
// Iterate through each mRNA (transcript).
$options = [0 => '--Select a transcript to view--'];
$transcripts = [];
foreach ($items as $delta => $item) {
// Skip empty items;
if (!$item['value']) {
continue;
}
list($entity_type, $mRNA_entity_id) = explode(':', $item['value']['entity']);
$result = tripal_load_entity('TripalEntity', [$mRNA_entity_id], FALSE, $field_ids);
reset($result);
$mRNA_entity = $result[$mRNA_entity_id];
$options[$mRNA_entity_id] = $mRNA_entity->title;
// Create the fieldset for this transcript.
$transcripts[$mRNA_entity_id] = [
'#type' => 'markup',
'#prefix' => '
',
'#suffix' => '
',
];
// Add a link to the mRNA page.
$feature_name = $mRNA_entity->title;
$feature_name = l($feature_name, "bio_data/" . $mRNA_entity->id, ['attributes' => ['target' => "_blank"]]);
$transcripts[$mRNA_entity_id]['mRNA_link'] = [
'#type' => 'markup',
'#markup' => "Click, " . $feature_name . ", for the full transcript page.",
'#weight' => -102
];
// Now add all fields to the fieldset.
$this->addFields($mRNA_entity, $fields_to_show, $transcripts[$mRNA_entity_id]);
}
$transcripts['transcript_dropdown'] = [
'#type' => 'select',
'#title' => 'Transcripts for this gene',
'#options' => $options,
'#weight' => -100,
'#description' => 'Select a transcript to view more details.',
'#attributes' => ['class' => ['tripal-chado-so__transcript-select']]
];
$element[0] = $transcripts;
}
/**
*
*/
private function returnFieldsets($items, &$element, $field_ids, $fields_to_show) {
// Iterate through each mRNA (transcript).
$transcripts = [];
foreach ($items as $delta => $item) {
// Skip empty items;
if (!$item['value']) {
continue;
}
list($entity_type, $mRNA_entity_id) = explode(':', $item['value']['entity']);
// Now load the mRNA entity with all of the fields.
$result = tripal_load_entity('TripalEntity', [$mRNA_entity_id], FALSE, $field_ids);
reset($result);
$mRNA_entity = $result[$mRNA_entity_id];
// Create the fieldset for this transcript.
$transcripts[$mRNA_entity_id] = [
'#type' => 'fieldset',
'#title' => $mRNA_entity->title,
'#description' => '',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attributes' => ['class' => ['collapsible', 'collapsed']],
];
drupal_add_library('system', 'drupal.collapse');
// Add a link to the mRNA page.
$feature_name = $mRNA_entity->title;
$feature_name = l($feature_name, "bio_data/" . $mRNA_entity->id, ['attributes' => ['target' => "_blank"]]);
$transcripts[$mRNA_entity_id]['mRNA_link'] = [
'#type' => 'markup',
'#markup' => "Click, " . $feature_name . ", for the full transcript page.",
];
// Now add all fields to the fieldset.
$this->addFields($mRNA_entity, $fields_to_show, $transcripts[$mRNA_entity_id]);
}
$element[0] = $transcripts;
}
/**
* Builds a fieldset for the entity.
*/
private function addFields($mRNA_entity, $fields, &$fieldset) {
// Get some settings about the transcript content type.
$mRNA_bundle = tripal_load_bundle_entity(['name'=> $mRNA_entity->bundle]);
$hide_empty = tripal_get_bundle_variable('hide_empty_field', $mRNA_bundle->id);
// Get the Entity ID for the transcript.
$entity_id = $mRNA_entity->id;
// We will use a summary table to house the fields that have a
// cardinality of one. These will appear at the top of the fieldset.
$summary_rows = [];
// Iterate through the list of fields that the site admin has indicated
// that they want to show in the transcript fieldset. They are provided
// in order that they should be shown.
foreach ($fields as $field_name) {
// Load the field instance info. We'll need this to determine the
// cardinality of the field and to render it for display.
$field_info = field_info_field($field_name);
$field_instance = field_info_instance('TripalEntity', $field_name, $mRNA_entity->bundle);
// For the display we want to honor the site admin's wishes and not
// show fields that are empty if they have that setting turned on.
$field_items = field_get_items('TripalEntity', $mRNA_entity, $field_name);
$field_is_empty = tripal_field_is_empty($field_info, $field_items);
if ($field_is_empty and $hide_empty) {
continue;
}
// If the default display is to hide this field then skip it too.
if ($field_instance['display']['default']['type'] == 'hidden') {
continue;
}
// Get the render array for this field.
$field_element = field_view_field('TripalEntity', $mRNA_entity, $field_name, $field_instance['display']['default']);
$field_element['#label_display'] = 'hidden';
// We need to know the cardinality of this field. If it has a
// cardinatliy of 1 we'll put it in the summary table for the
// transcript that appears at the top of the fieldset. If not we'll
// let it render as is, in the order it's provided to us here.
$cardinality = array_key_exists('cardinality', $field_info) ? $field_info['cardinality'] : 1;
if ($cardinality == 1) {
// add field to a special transcripts table, where fields have cardinality of 1
$summary_rows[] = [
[
'data' => $field_instance['label'],
'header' => TRUE,
],
[
'data' => drupal_render($field_element),
]
];
}
// Else add the field as is.
else {
$fieldset[$field_name . '_header'] = [
'#type' => 'markup',
'#markup' => '' . $field_instance['label'] . '
',
];
$fieldset[$field_name] = [
'#type' => 'markup',
'#markup' => drupal_render($field_element),
];
}
} // End looping over fields.
// If the summary table has values then
if (count($summary_rows) > 0) {
// display fields of single cardinality in a special transcripts table
$summary_table = [
'header' => [],
'rows' => $summary_rows,
'attributes' => [
'id' => 'tripal_feature-table-transcript-fields-object',
'class' => 'tripal-data-table',
],
'sticky' => FALSE,
'caption' => "",
'colgroups' => [],
'empty' => 'This feature has no single cardinality transcript fields',
];
$fieldset['summary_header'] = [
'#type' => 'markup',
'#markup' => 'Transcript ' . $mRNA_entity->title . '
',
'#weight' => -101,
];
$fieldset['summary_table'] = [
'#type' => 'markup',
'#markup' => theme_table($summary_table),
'#weight' => -100,
];
}
}
/**
* Returns the default table.
*
* For backwards compatibility this function returns a table
* of four columns and one row per transcript.
*/
private function returnDefaultTable(&$element, $items) {
$default_headers = ['Transcript Name', 'Identifier', 'Type', 'Location'];
$default_rows = [];
foreach ($items as $delta => $item) {
if (!$item['value']) {
continue;
}
// Get the field values.
$feature_name = $item['value']['schema:name'];
$feature_uname = $item['value']['data:0842'];
$loc = $item['value']['SO:0000735'];
$type = $item['value']['rdfs:type'];
if (array_key_exists('entity', $item['value']) and $item['value']['entity']) {
list($entity_type, $entity_id) = explode(':', $item['value']['entity']);
$feature_name = l($feature_name, "bio_data/" . $entity_id, ['attributes' => ['target' => "_blank"]]);
}
$default_rows[] = [$feature_name, $feature_uname, $type, $loc];
}
// Build the default table
$default_table = [
'header' => $default_headers,
'rows' => $default_rows,
'attributes' => [
'id' => 'tripal_feature-table-transcripts-object',
'class' => 'tripal-data-table',
],
'sticky' => FALSE,
'caption' => "",
'colgroups' => [],
'empty' => 'This feature has no transcripts',
];
$element[0] = [
'#type' => 'markup',
'#markup' => theme_table($default_table),
];
}
/**
* Returns an empty element for the view.
*/
private function returnEmpty(&$element){
$element[0] = [
'#type' => 'markup',
'#markup' => '',
];
}
}