|
@@ -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',
|
|
|
+ ),
|
|
|
+ );
|
|
|
}
|