|  | @@ -88,6 +88,8 @@ function tripal_fields_layout_form_field_ui_display_overview_form_alter(&$form,
 | 
	
		
			
				|  |  |      '#value' => 'Add Panel',
 | 
	
		
			
				|  |  |      '#name' => 'add-panel-submit'
 | 
	
		
			
				|  |  |    );
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Layout Panels
 | 
	
		
			
				|  |  |    $form['te_layout_panels'] = array(
 | 
	
		
			
				|  |  |      '#type' => 'fieldset',
 | 
	
		
			
				|  |  |      '#title' => 'Order Panels',
 | 
	
	
		
			
				|  | @@ -95,6 +97,42 @@ function tripal_fields_layout_form_field_ui_display_overview_form_alter(&$form,
 | 
	
		
			
				|  |  |      '#collapsed' => TRUE,
 | 
	
		
			
				|  |  |      '#group' => 'overview_vert_tabs'
 | 
	
		
			
				|  |  |    );
 | 
	
		
			
				|  |  | +  $form['te_layout_panels']['instructions'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'item',
 | 
	
		
			
				|  |  | +    '#markup' => t('Drag and drop the panel to change its order.')
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +  $form['te_layout_panels']['panel_items']['#tree'] = TRUE;
 | 
	
		
			
				|  |  | +  // Get available panels
 | 
	
		
			
				|  |  | +  $result = db_query('SELECT panel_id, name, label, weight FROM {tripal_panels} ORDER BY weight ASC');
 | 
	
		
			
				|  |  | +  foreach ($result as $item) {
 | 
	
		
			
				|  |  | +    $form['te_layout_panels']['panel_items'][$item->panel_id] = array(
 | 
	
		
			
				|  |  | +      'name' => array(
 | 
	
		
			
				|  |  | +        '#markup' => check_plain($item->name),
 | 
	
		
			
				|  |  | +      ),
 | 
	
		
			
				|  |  | +      'label' => array(
 | 
	
		
			
				|  |  | +        '#markup' => check_plain($item->label),
 | 
	
		
			
				|  |  | +      ),
 | 
	
		
			
				|  |  | +      'weight' => array(
 | 
	
		
			
				|  |  | +        '#type' => 'weight',
 | 
	
		
			
				|  |  | +        '#title' => t('Weight'),
 | 
	
		
			
				|  |  | +        '#default_value' => $item->weight,
 | 
	
		
			
				|  |  | +        '#delta' => 50,
 | 
	
		
			
				|  |  | +        '#title_display' => 'invisible',
 | 
	
		
			
				|  |  | +      ),
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  $form['te_layout_panels']['panel_items']['#theme_wrappers'] = array('tripal_fields_layout_form_draggable_panel_table');
 | 
	
		
			
				|  |  | +  // Now we add our submit button, for submitting the form results.
 | 
	
		
			
				|  |  | +  //
 | 
	
		
			
				|  |  | +  // The 'actions' wrapper used here isn't strictly necessary for tabledrag,
 | 
	
		
			
				|  |  | +  // but is included as a Form API recommended practice.
 | 
	
		
			
				|  |  | +  $form['te_layout_panels']['add_button'] = array(
 | 
	
		
			
				|  |  | +    '#type' => 'submit',
 | 
	
		
			
				|  |  | +    '#value' => 'Save Panel Order',
 | 
	
		
			
				|  |  | +    '#name' => 'order-panel-submit'
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Configure Panels
 | 
	
		
			
				|  |  |    $form['te_configure_panels'] = array(
 | 
	
		
			
				|  |  |      '#type' => 'fieldset',
 | 
	
		
			
				|  |  |      '#title' => 'Configure Panels',
 | 
	
	
		
			
				|  | @@ -214,17 +252,41 @@ function tripal_fields_layout_field_ui_row_region($row) {
 | 
	
		
			
				|  |  |    $default_panel =  'te_base';
 | 
	
		
			
				|  |  |    $panel = '';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // Get field
 | 
	
		
			
				|  |  |    $field_name = $row['#parents'][1];
 | 
	
		
			
				|  |  |    $field = field_info_field($field_name);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // Get field instance
 | 
	
		
			
				|  |  | +  $field_id = $field['id'];
 | 
	
		
			
				|  |  | +  $bundle_keys = array_keys($field['bundles']);
 | 
	
		
			
				|  |  | +  $entity_type = $bundle_keys[0];
 | 
	
		
			
				|  |  | +  $bundle = $field['bundles'][$entity_type][0];
 | 
	
		
			
				|  |  | +  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Get panel_id
 | 
	
		
			
				|  |  | +  $panel_id = db_select('tripal_panel_fields', 'tpf')
 | 
	
		
			
				|  |  | +  ->fields('tpf', array('panel_id'))
 | 
	
		
			
				|  |  | +  ->condition('field_id', $field_instance['id'])
 | 
	
		
			
				|  |  | +  ->execute()
 | 
	
		
			
				|  |  | +  ->fetchField();
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Get panel name
 | 
	
		
			
				|  |  | +  if ($panel_id) {
 | 
	
		
			
				|  |  | +    $panel = db_select('tripal_panels', 'tp')
 | 
	
		
			
				|  |  | +    ->fields('tp', array('name'))
 | 
	
		
			
				|  |  | +    ->condition('panel_id', $panel_id)
 | 
	
		
			
				|  |  | +    ->execute()
 | 
	
		
			
				|  |  | +    ->fetchField();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // First get the panel
 | 
	
		
			
				|  |  |    if (!$panel) {
 | 
	
		
			
				|  |  |      $panel = $default_panel;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |    // See if there is a record in the tripal_panel_fields for this field.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  return $default_panel;
 | 
	
		
			
				|  |  | +  return $panel;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  /**
 | 
	
	
		
			
				|  | @@ -234,7 +296,33 @@ function tripal_fields_layout_field_ui_row_region($row) {
 | 
	
		
			
				|  |  |   * @param $form_state
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_fields_layout_field_ui_validate($form, &$form_state) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  if ($form_state ['clicked_button'] ['#name'] == 'add-panel-submit') {
 | 
	
		
			
				|  |  | +    // Check if a valide panel name is provided
 | 
	
		
			
				|  |  | +    $name = $form_state ['values'] ['panel_name'];
 | 
	
		
			
				|  |  | +    if (! $name) {
 | 
	
		
			
				|  |  | +      form_set_error ( 'panel_name', t ( "Please provide a name for the new panel." ) );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else if (preg_match ( '/^\d+/', $name )) {
 | 
	
		
			
				|  |  | +      form_set_error ( 'panel_name', t ( "Panel name must not begin with a number." ) );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else if (preg_match ( '/\s+/', $name )) {
 | 
	
		
			
				|  |  | +      form_set_error ( 'panel_name', t ( "Panel name should only contain alphanumeric values and underscores." ) );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // Check if a panel label is provided
 | 
	
		
			
				|  |  | +    $label = $form_state ['values'] ['panel_label'];
 | 
	
		
			
				|  |  | +    if (! $label) {
 | 
	
		
			
				|  |  | +      form_set_error ( 'panel_label', t ( "Please provide a label for the new panel." ) );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else if ($form_state ['clicked_button'] ['#name'] == 'order-panel-submit') {
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else if ($form_state ['clicked_button'] ['#name'] == 'op') {
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Responds to a submit from the field UI form for saving panel assignments.
 | 
	
	
		
			
				|  | @@ -243,5 +331,176 @@ function tripal_fields_layout_field_ui_validate($form, &$form_state) {
 | 
	
		
			
				|  |  |   * @param $form_state
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_fields_layout_field_ui_submit($form, &$form_state) {
 | 
	
		
			
				|  |  | +  // Add a new panel
 | 
	
		
			
				|  |  | +  if ($form_state ['clicked_button'] ['#name'] == 'add-panel-submit') {
 | 
	
		
			
				|  |  | +    $bundle_id = $form_state['build_info']['args'][1]->id;
 | 
	
		
			
				|  |  | +    $name      = $form_state['values']['panel_name'];
 | 
	
		
			
				|  |  | +    $label     = $form_state['values']['panel_label'];
 | 
	
		
			
				|  |  | +    $message   = $form_state['values']['message'];
 | 
	
		
			
				|  |  | +    $settings = array(
 | 
	
		
			
				|  |  | +      'message' => $message,
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    db_insert('tripal_panels')
 | 
	
		
			
				|  |  | +    ->fields(array(
 | 
	
		
			
				|  |  | +      'bundle_id' => $bundle_id,
 | 
	
		
			
				|  |  | +      'name' => $name,
 | 
	
		
			
				|  |  | +      'label' => $label,
 | 
	
		
			
				|  |  | +      'settings' => serialize($settings),
 | 
	
		
			
				|  |  | +      'weight' => 0
 | 
	
		
			
				|  |  | +    ))
 | 
	
		
			
				|  |  | +    ->execute();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Order panel
 | 
	
		
			
				|  |  | +  else if ($form_state ['clicked_button'] ['#name'] == 'order-panel-submit') {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    $panels = $form_state['values']['panel_items'];
 | 
	
		
			
				|  |  | +    foreach ($panels AS $id => $panel) {
 | 
	
		
			
				|  |  | +      db_query(
 | 
	
		
			
				|  |  | +        'UPDATE {tripal_panels} SET weight = :weight WHERE panel_id = :id',
 | 
	
		
			
				|  |  | +        array(
 | 
	
		
			
				|  |  | +          ':weight' => $panel['weight'],
 | 
	
		
			
				|  |  | +          ':id' => $id
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Save field regions
 | 
	
		
			
				|  |  | +  else if ($form_state ['clicked_button'] ['#name'] == 'op') {
 | 
	
		
			
				|  |  | +    $fields = $form_state['values']['fields'];
 | 
	
		
			
				|  |  | +    foreach($fields AS $field_name => $field_data){
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      // Get field instance id
 | 
	
		
			
				|  |  | +      $field = field_info_field($field_name);
 | 
	
		
			
				|  |  | +      $field_id = $field['id'];
 | 
	
		
			
				|  |  | +      $bundle_keys = array_keys($field['bundles']);
 | 
	
		
			
				|  |  | +      $entity_type = $bundle_keys[0];
 | 
	
		
			
				|  |  | +      $bundle = $field['bundles'][$entity_type][0];
 | 
	
		
			
				|  |  | +      $field_instance = field_info_instance($entity_type, $field_name, $bundle);
 | 
	
		
			
				|  |  | +      $field_instance_id = $field_instance['id'];
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      // Get region panel_id
 | 
	
		
			
				|  |  | +      $region = $field_data['region'];
 | 
	
		
			
				|  |  | +      $panel_id = db_select('tripal_panels', 'tp')
 | 
	
		
			
				|  |  | +      ->fields('tp', array('panel_id'))
 | 
	
		
			
				|  |  | +      ->condition('name', $region)
 | 
	
		
			
				|  |  | +      ->execute()
 | 
	
		
			
				|  |  | +      ->fetchField();
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      // Save
 | 
	
		
			
				|  |  | +      $penal_field_id = db_select('tripal_panel_fields', 'tpf')
 | 
	
		
			
				|  |  | +      ->fields('tpf', array('panel_field_id'))
 | 
	
		
			
				|  |  | +      ->condition('field_id', $field_instance_id)
 | 
	
		
			
				|  |  | +      ->condition('panel_id', $panel_id)
 | 
	
		
			
				|  |  | +      ->execute()
 | 
	
		
			
				|  |  | +      ->fetchField();
 | 
	
		
			
				|  |  | +      if ($penal_field_id) {
 | 
	
		
			
				|  |  | +        db_query(
 | 
	
		
			
				|  |  | +          'UPDATE tripal_panel_fields SET panel_id = :panel_id WHERE panel_field_id = :panel_field_id',
 | 
	
		
			
				|  |  | +          array(
 | 
	
		
			
				|  |  | +            ':panel_id' => $panel_id,
 | 
	
		
			
				|  |  | +            ':panel_field_id' => $penal_field_id
 | 
	
		
			
				|  |  | +          )
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        ->execute();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      else {
 | 
	
		
			
				|  |  | +        db_insert('tripal_panel_fields')
 | 
	
		
			
				|  |  | +        ->fields(array(
 | 
	
		
			
				|  |  | +          'panel_id' => $panel_id,
 | 
	
		
			
				|  |  | +          'field_id' => $field_instance_id
 | 
	
		
			
				|  |  | +        ))
 | 
	
		
			
				|  |  | +        ->execute();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + *  Theme the Panel Order Table as a draggable table
 | 
	
		
			
				|  |  | + *  
 | 
	
		
			
				|  |  | + * @param unknown $variables
 | 
	
		
			
				|  |  | + * @return unknown
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function theme_tripal_fields_layout_form_draggable_panel_table ($variables) {
 | 
	
		
			
				|  |  | +  $element = $variables['element'];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $rows = array();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  foreach (element_children($element) as $id) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Before we add our 'weight' column to the row, we need to give the
 | 
	
		
			
				|  |  | +    // element a custom class so that it can be identified in the
 | 
	
		
			
				|  |  | +    // drupal_add_tabledrag call.
 | 
	
		
			
				|  |  | +    //
 | 
	
		
			
				|  |  | +    // This could also have been done during the form declaration by adding
 | 
	
		
			
				|  |  | +    // '#attributes' => array('class' => 'example-item-weight'),
 | 
	
		
			
				|  |  | +    // directy to the 'weight' element in tabledrag_example_simple_form().
 | 
	
		
			
				|  |  | +    $element[$id]['weight']['#attributes']['class'] = array('panel-item-weight');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $element[$id]['name']['#printed'] = FALSE;
 | 
	
		
			
				|  |  | +    $element[$id]['label']['#printed'] = FALSE;
 | 
	
		
			
				|  |  | +    $element[$id]['weight']['#printed'] = FALSE;
 | 
	
		
			
				|  |  | +    // We are now ready to add each element of our $form data to the $rows
 | 
	
		
			
				|  |  | +    // array, so that they end up as individual table cells when rendered
 | 
	
		
			
				|  |  | +    // in the final table.  We run each element through the drupal_render()
 | 
	
		
			
				|  |  | +    // function to generate the final html markup for that element.
 | 
	
		
			
				|  |  | +    $rows[] = array(
 | 
	
		
			
				|  |  | +      'data' => array(
 | 
	
		
			
				|  |  | +        // Add our 'name' column.
 | 
	
		
			
				|  |  | +        drupal_render($element[$id]['name']),
 | 
	
		
			
				|  |  | +        // Add our 'description' column.
 | 
	
		
			
				|  |  | +        drupal_render($element[$id]['label']),
 | 
	
		
			
				|  |  | +        // Add our 'weight' column.
 | 
	
		
			
				|  |  | +        drupal_render($element[$id]['weight']),
 | 
	
		
			
				|  |  | +      ),
 | 
	
		
			
				|  |  | +      // To support the tabledrag behaviour, we need to assign each row of the
 | 
	
		
			
				|  |  | +      // table a class attribute of 'draggable'. This will add the 'draggable'
 | 
	
		
			
				|  |  | +      // class to the <tr> element for that row when the final table is
 | 
	
		
			
				|  |  | +      // rendered.
 | 
	
		
			
				|  |  | +      'class' => array('draggable'),
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // We now define the table header values.  Ensure that the 'header' count
 | 
	
		
			
				|  |  | +  // matches the final column count for your table.
 | 
	
		
			
				|  |  | +  $header = array(t('Name'), t('Label'), t('Weight'));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // We also need to pass the drupal_add_tabledrag() function an id which will
 | 
	
		
			
				|  |  | +  // be used to identify the <table> element containing our tabledrag form.
 | 
	
		
			
				|  |  | +  // Because an element's 'id' should be unique on a page, make sure the value
 | 
	
		
			
				|  |  | +  // you select is NOT the same as the form ID used in your form declaration.
 | 
	
		
			
				|  |  | +  $table_id = 'panel-items-table';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // We can render our tabledrag table for output.
 | 
	
		
			
				|  |  | +  $output = theme('table', array(
 | 
	
		
			
				|  |  | +    'header' => $header,
 | 
	
		
			
				|  |  | +    'rows' => $rows,
 | 
	
		
			
				|  |  | +    'attributes' => array('id' => $table_id),
 | 
	
		
			
				|  |  | +  ));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // And then render any remaining form elements (such as our submit button).
 | 
	
		
			
				|  |  | +  //$output .= drupal_render_children($element);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // We now call the drupal_add_tabledrag() function in order to add the
 | 
	
		
			
				|  |  | +  // tabledrag.js goodness onto our page.
 | 
	
		
			
				|  |  | +  //
 | 
	
		
			
				|  |  | +  // For a basic sortable table, we need to pass it:
 | 
	
		
			
				|  |  | +  // - the $table_id of our <table> element,
 | 
	
		
			
				|  |  | +  // - the $action to be performed on our form items ('order'),
 | 
	
		
			
				|  |  | +  // - a string describing where $action should be applied ('siblings'),
 | 
	
		
			
				|  |  | +  // - and the class of the element containing our 'weight' element.
 | 
	
		
			
				|  |  | +  drupal_add_tabledrag($table_id, 'order', 'sibling', 'panel-item-weight');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return $output;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Implements hook_theme().
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function tripal_fields_layout_theme($existing, $type, $theme, $path) {
 | 
	
		
			
				|  |  | +  return array(
 | 
	
		
			
				|  |  | +    'tripal_fields_layout_form_draggable_panel_table' => array(
 | 
	
		
			
				|  |  | +      'render element' => 'element',
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  |  }
 |