|  | @@ -198,6 +198,7 @@ function chado_add_node_form_relationships(&$form, &$form_state, $details) {
 | 
	
		
			
				|  |  |    $details['base_name_field'] = (isset($details['base_name_field'])) ? $details['base_name_field'] : 'uniquename';
 | 
	
		
			
				|  |  |    $details['subject_field_name'] = (isset($details['subject_field_name'])) ? $details['subject_field_name'] : 'subject_id';
 | 
	
		
			
				|  |  |    $details['object_field_name'] = (isset($details['object_field_name'])) ? $details['object_field_name'] : 'object_id';
 | 
	
		
			
				|  |  | +  $details['form_element_name'] = (isset($details['form_element_name'])) ? $details['form_element_name'] : $details['base_name_field'];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Some relationship tables don't have a rank
 | 
	
		
			
				|  |  |    // thus we need to first check this table has a rank before trying to set it
 | 
	
	
		
			
				|  | @@ -517,15 +518,16 @@ function chado_add_node_form_relationships(&$form, &$form_state, $details) {
 | 
	
		
			
				|  |  |      // No other fields will be validated (ie: no fields from the main form or any other api
 | 
	
		
			
				|  |  |      // added form).
 | 
	
		
			
				|  |  |      '#limit_validation_errors' => array(
 | 
	
		
			
				|  |  | -      array('relationship_table')  // Validate all fields within $form_state['values']['relationship_table']
 | 
	
		
			
				|  |  | +      array('relationships'),  // Validate all fields within $form_state['values']['relationships']
 | 
	
		
			
				|  |  | +      array('relationship_table')  // Ensure relationship table results are not discarded.
 | 
	
		
			
				|  |  |      )
 | 
	
		
			
				|  |  |    );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * Validate the user input for creating a new relationship
 | 
	
		
			
				|  |  | - * Called by the add button in chado_add_node_form_relationships
 | 
	
		
			
				|  |  | + * Validate the user input for creating a new relationship.
 | 
	
		
			
				|  |  | + * Called by the add button in chado_add_node_form_relationships.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * @ingroup tripal_core
 | 
	
		
			
				|  |  |   */
 | 
	
	
		
			
				|  | @@ -533,14 +535,14 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    $details = unserialize($form_state['values']['relationship_table']['details']);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // First deal with autocomplete fields
 | 
	
		
			
				|  |  | -  // extract the base_id assuming '(###) NAME FIELD'
 | 
	
		
			
				|  |  | +  // First deal with autocomplete fields.
 | 
	
		
			
				|  |  | +  // Extract the base_id assuming '(###) NAME FIELD'.
 | 
	
		
			
				|  |  |    if (!empty($form_state['values']['relationship_table']['new']['subject_name'])) {
 | 
	
		
			
				|  |  |      if (preg_match('/\((\d+)\) .*/', $form_state['values']['relationship_table']['new']['subject_name'], $matches)) {
 | 
	
		
			
				|  |  |        $form_state['values']['relationship_table']['new']['subject_id'] = $matches[1];
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  | -      form_set_error('subject_name', 'You need to select the subject from the autocomplete drop-down');
 | 
	
		
			
				|  |  | +      form_set_error('relationship_table][new][subject_name', 'You need to select the subject from the autocomplete drop-down');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (!empty($form_state['values']['relationship_table']['new']['object_name'])) {
 | 
	
	
		
			
				|  | @@ -548,33 +550,56 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |        $form_state['values']['relationship_table']['new']['object_id'] = $matches[1];
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  | -      form_set_error('object_name', 'You need to select the subject from the autocomplete drop-down');
 | 
	
		
			
				|  |  | +      form_set_error('relationship_table][new][object_name', 'You need to select the object from the autocomplete drop-down');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // At least one of the participants must be the current node
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // NOTE: The only way to specify the current node is via checkbox. This is by
 | 
	
		
			
				|  |  | +  // design since guessing if they meant the current node by name is a
 | 
	
		
			
				|  |  | +  // chicken-egg problem due to the name field only being set to just the name
 | 
	
		
			
				|  |  | +  // only happens once it has been determined which germplasm is the current
 | 
	
		
			
				|  |  | +  // one. Furthermore, we can't use the primary key since this will not have
 | 
	
		
			
				|  |  | +  // been set on insert.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // At least one of the participants must be the current node.
 | 
	
		
			
				|  |  |    if (!($form_state['values']['relationship_table']['new']['subject_is_current'] OR $form_state['values']['relationship_table']['new']['object_is_current'])) {
 | 
	
		
			
				|  |  | -    // If the checkbox isn't set then check to see if either has the same uniquename as the node
 | 
	
		
			
				|  |  | -    if ($form_state['values']['relationship_table']['new']['subject_name'] == $form_state['values']['uniquename']) {
 | 
	
		
			
				|  |  | -      $form_state['values']['relationship_table']['new']['subject_is_current'] = 1;
 | 
	
		
			
				|  |  | -      form_set_error('subject_is_current', 'To set the current '.$details['nodetype'].', select the
 | 
	
		
			
				|  |  | -        checkbox. You entered the unique name of the current '.$details['nodetype'].' as the subject,
 | 
	
		
			
				|  |  | -        is this what you meant to do?');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    elseif ($form_state['values']['relationship_table']['new']['subject_name'] == $form_state['values']['uniquename']) {
 | 
	
		
			
				|  |  | -      $form_state['values']['relationship_table']['new']['object_is_current'] = 1;
 | 
	
		
			
				|  |  | -      form_set_error('subject_is_current', 'To set the current '.$details['nodetype'].', select the
 | 
	
		
			
				|  |  | -        checkbox. You entered the unique name of the current '.$details['nodetype'].' as the subject,
 | 
	
		
			
				|  |  | -        is this what you meant to do?');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    else {
 | 
	
		
			
				|  |  | -      form_set_error('object_is_current', 'At least one member of the relationship must be
 | 
	
		
			
				|  |  | -        the current '.$details['nodetype'].'. This is specified by checking the "Current '.$details['nodetype'].'"
 | 
	
		
			
				|  |  | -        checkbox for either the subject or object.');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    form_set_error('relationship_table][new][object_is_current', 'At least one member of the relationship must be
 | 
	
		
			
				|  |  | +      the current '.$details['nodetype'].'. This is specified by checking the "Current '.$details['nodetype'].'"
 | 
	
		
			
				|  |  | +      checkbox for either the subject or object.');
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Only one of the participants may be the current node.
 | 
	
		
			
				|  |  | +  // We do not support circular relationships.
 | 
	
		
			
				|  |  | +  if ($form_state['values']['relationship_table']['new']['subject_is_current']
 | 
	
		
			
				|  |  | +    AND $form_state['values']['relationship_table']['new']['object_is_current']) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    form_set_error('relationship_table][new][object_is_current', 'Only one member of the relationship may be
 | 
	
		
			
				|  |  | +      the current '.$details['nodetype'].'. This is specified by checking the "Current '.$details['nodetype'].'"
 | 
	
		
			
				|  |  | +      checkbox for either the subject or object.');
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // If it was determined current via checkbox, we need to ensure the name
 | 
	
		
			
				|  |  | +  // provided actually matches the current node.
 | 
	
		
			
				|  |  | +  if ($form_state['values']['relationship_table']['new']['subject_is_current']
 | 
	
		
			
				|  |  | +    AND !empty($form_state['values']['relationship_table']['new']['subject_name'])
 | 
	
		
			
				|  |  | +    AND $form_state['values']['relationship_table']['new']['subject_name'] != $form_state['values'][$details['form_element_name']]) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    form_set_error('relationship_table][new][subject_name',
 | 
	
		
			
				|  |  | +      'The name you supplied for the current '.$details['nodetype'].' doesn\'t match the actual name
 | 
	
		
			
				|  |  | +      of this '.$details['nodetype'].'. If you really meant the subject should be the current '.$details['nodetype'].',
 | 
	
		
			
				|  |  | +      simply leave the textfield empty and re-add this relationship.');
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  if ($form_state['values']['relationship_table']['new']['object_is_current']
 | 
	
		
			
				|  |  | +    AND !empty($form_state['values']['relationship_table']['new']['object_name'])
 | 
	
		
			
				|  |  | +    AND $form_state['values']['relationship_table']['new']['object_name'] != $form_state['values'][$details['form_element_name']]) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    form_set_error('relationship_table][new][object_name',
 | 
	
		
			
				|  |  | +      'The name you supplied for the current '.$details['nodetype'].' doesn\'t match the actual name
 | 
	
		
			
				|  |  | +      of this '.$details['nodetype'].'. If you really meant the object should be the current '.$details['nodetype'].',
 | 
	
		
			
				|  |  | +      simply leave the textfield empty and re-add this relationship.');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // The non-current uniquename must be exist in the base table (subject)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // The non-current uniquename must be exist in the base table (subject).
 | 
	
		
			
				|  |  |    if (!($form_state['values']['relationship_table']['new']['subject_is_current'])) {
 | 
	
		
			
				|  |  |      $result = chado_select_record(
 | 
	
		
			
				|  |  |        $details['base_table'],
 | 
	
	
		
			
				|  | @@ -582,7 +607,7 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |        array($details['base_foreign_key'] => $form_state['values']['relationship_table']['new']['subject_id'])
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |      if (!isset($result[0])) {
 | 
	
		
			
				|  |  | -      form_set_error('subject_name', 'The subject must be the unique name of an
 | 
	
		
			
				|  |  | +      form_set_error('relationship_table][new][subject_name', 'The subject must be the unique name of an
 | 
	
		
			
				|  |  |          existing '.$details['nodetype'].' unless the "Current '.$details['nodetype'].'" checkbox is selected');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
	
		
			
				|  | @@ -590,7 +615,7 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // The non-current uniquename must exist in the base table (object)
 | 
	
		
			
				|  |  | +  // The non-current uniquename must exist in the base table (object).
 | 
	
		
			
				|  |  |    if (!($form_state['values']['relationship_table']['new']['object_is_current'])) {
 | 
	
		
			
				|  |  |      $result = chado_select_record(
 | 
	
		
			
				|  |  |        $details['base_table'],
 | 
	
	
		
			
				|  | @@ -598,7 +623,7 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |        array($details['base_foreign_key'] => $form_state['values']['relationship_table']['new']['object_id'])
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |      if (!isset($result[0])) {
 | 
	
		
			
				|  |  | -      form_set_error('object_name', 'The object must be the unique name of an
 | 
	
		
			
				|  |  | +      form_set_error('relationship_table][new][object_name', 'The object must be the unique name of an
 | 
	
		
			
				|  |  |          existing '.$details['nodetype'].' unless the "Current '.$details['nodetype'].'" checkbox is selected');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
	
		
			
				|  | @@ -606,7 +631,7 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // The type must be a valid cvterm
 | 
	
		
			
				|  |  | +  // The type must be a valid cvterm.
 | 
	
		
			
				|  |  |    if ($form_state['values']['relationship_table']['new']['type_name']) {
 | 
	
		
			
				|  |  |      $form_state['values']['relationship_table']['new']['type_id'] = $form_state['values']['relationship_table']['new']['type_name'];
 | 
	
		
			
				|  |  |      $result = chado_select_record(
 | 
	
	
		
			
				|  | @@ -615,14 +640,14 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |        array('cvterm_id' => $form_state['values']['relationship_table']['new']['type_id'])
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |      if (!isset($result[0])) {
 | 
	
		
			
				|  |  | -      form_set_error('type_id', 'The select type is not a valid controlled vocabulary term.');
 | 
	
		
			
				|  |  | +      form_set_error('relationship_table][new][type_id', 'The select type is not a valid controlled vocabulary term.');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  |        $form_state['values']['relationship_table']['new']['type_name'] = $result[0]->name;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    else {
 | 
	
		
			
				|  |  | -    form_set_error('type_id', 'Please select a type of relationship');
 | 
	
		
			
				|  |  | +    form_set_error('relationship_table][new][type_id', 'Please select a type of relationship');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -636,6 +661,7 @@ function chado_add_node_form_relationships_add_button_validate($form, &$form_sta
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function chado_add_node_form_relationships_add_button_submit(&$form, &$form_state) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    $details = unserialize($form_state['values']['relationship_table']['details']);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // if the chado_relationships array is not set then this is the first time modifying the
 | 
	
	
		
			
				|  | @@ -646,9 +672,6 @@ function chado_add_node_form_relationships_add_button_submit(&$form, &$form_stat
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    $name = (isset($form_state['node']->{$details['base_table']}->uniquename)) ? $form_state['node']->{$details['base_table']}->uniquename : 'CURRENT';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    // get details for the new relationship
 | 
	
		
			
				|  |  |    if ($form_state['values']['relationship_table']['new']['subject_is_current']) {
 | 
	
		
			
				|  |  |      $relationship = array(
 | 
	
	
		
			
				|  | @@ -966,14 +989,20 @@ function chado_add_node_form_relationships_name_to_id_callback($base_table, $nam
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    $base_key = $base_table.'_id';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  $result = db_select('chado.'.$base_table, 'b')
 | 
	
		
			
				|  |  | +  $query = db_select('chado.'.$base_table, 'b')
 | 
	
		
			
				|  |  |      ->fields('b', array($base_key, $name_field))
 | 
	
		
			
				|  |  | -    ->condition($name_field, '%' . db_like($string) . '%', 'LIKE')
 | 
	
		
			
				|  |  | -    ->execute();
 | 
	
		
			
				|  |  | +    ->condition($name_field, '%' . db_like($string) . '%', 'LIKE');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $result = $query->execute();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // save the query to matches
 | 
	
		
			
				|  |  |    foreach ($result as $row) {
 | 
	
		
			
				|  |  | -    $key = '('.$row->{$base_key}.') '.substr($row->{$name_field},0,50) . '...';
 | 
	
		
			
				|  |  | +    if (strlen($row->{$name_field}) > 50) {
 | 
	
		
			
				|  |  | +      $key = '('.$row->{$base_key}.') ' . substr($row->{$name_field}, 0, 50) . '...';
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else {
 | 
	
		
			
				|  |  | +      $key = '('.$row->{$base_key}.') ' . $row->{$name_field};
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      $matches[$key] = check_plain($row->{$name_field});
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 |