|
@@ -5,6 +5,10 @@
|
|
|
*/
|
|
|
function tripal_core_node_toc_form($form, &$form_state, $node) {
|
|
|
|
|
|
+ // Get info about this content type
|
|
|
+ $all_types = node_type_get_types();
|
|
|
+ $type_info = $all_types[$node->type];
|
|
|
+
|
|
|
$form["#tree"] = TRUE;
|
|
|
|
|
|
$form["instructions"] = array(
|
|
@@ -13,15 +17,21 @@ function tripal_core_node_toc_form($form, &$form_state, $node) {
|
|
|
'#collapsible' => TRUE,
|
|
|
'#title' => 'Instructions',
|
|
|
);
|
|
|
+ $admin_link = l(
|
|
|
+ $type_info->name . " TOC administrative page",
|
|
|
+ "admin/tripal/chado/" . $type_info->module . "/toc",
|
|
|
+ array('attributes' => array('target' => '_blank'))
|
|
|
+ );
|
|
|
$form["instructions"]["main"] = array(
|
|
|
- '#markup' => '</p>' . t('Below is a list of the titles of
|
|
|
+ '#markup' => '<p>' . t("Below is a list of the titles of
|
|
|
content panes that can appear on this page. These titles appear in the
|
|
|
the following order in the Table of Contents (TOC). You may rename
|
|
|
the titles or drag and drop them to change the order. <b>Any changes will
|
|
|
only apply to this page</b>. If you would like to make changes apply to multiple
|
|
|
- pages of the same tpye, please visit the TOC administrative page.') . '<p>' .
|
|
|
+ pages of the same tpye, please visit the $admin_link. ") . '</p>' .
|
|
|
'<p>' . t('The list below shows all possible content panes that can appear.
|
|
|
- However, those without content are hidden and do not appear in the TOC.' . '</p>'),
|
|
|
+ However, those without content are automatically hidden and do not
|
|
|
+ appear in the TOC.' . '</p>'),
|
|
|
);
|
|
|
|
|
|
$form['node'] = array(
|
|
@@ -49,10 +59,23 @@ function tripal_core_node_toc_form($form, &$form_state, $node) {
|
|
|
$toc_title = $element['#tripal_toc_title'];
|
|
|
$toc_weight = $element['#weight'];
|
|
|
$toc_hide = $element['#hide'];
|
|
|
- $form['toc_items'][$toc_id]['title'] = array(
|
|
|
- '#type' => 'textfield',
|
|
|
- '#default_value' => $toc_title,
|
|
|
- );
|
|
|
+
|
|
|
+ // If this element is a link then we don't want to allow the user
|
|
|
+ // to change the title as the link title is changed by using the
|
|
|
+ // interface that created the link.
|
|
|
+ $is_link = array_key_exists('#is_link', $element) ? $element['#is_link'] : FALSE;
|
|
|
+ if (!$is_link) {
|
|
|
+ $form['toc_items'][$toc_id]['title'] = array(
|
|
|
+ '#type' => 'textfield',
|
|
|
+ '#default_value' => $toc_title,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $form['toc_items'][$toc_id]['title'] = array(
|
|
|
+ '#markup' => '<i>link title:</i> ' . $toc_title,
|
|
|
+ '#value' => $toc_title,
|
|
|
+ );
|
|
|
+ }
|
|
|
$form['toc_items'][$toc_id]['hide'] = array(
|
|
|
'#type' => 'checkbox',
|
|
|
'#default_value' => $toc_hide,
|
|
@@ -148,7 +171,7 @@ function theme_tripal_node_toc_items_table($variables) {
|
|
|
* @param $b
|
|
|
*/
|
|
|
function theme_tripal_node_sort_toc_items($a, $b) {
|
|
|
-
|
|
|
+
|
|
|
if ($a['weight']['#value'] < $b['weight']['#value']) {
|
|
|
return -1;
|
|
|
}
|
|
@@ -159,6 +182,7 @@ function theme_tripal_node_sort_toc_items($a, $b) {
|
|
|
return strcmp($a['title']['#value'], $b['title']['#value']);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* Implements hook_validate for the tripal_core_node_toc_form.
|
|
|
*/
|
|
@@ -167,7 +191,7 @@ function tripal_core_node_toc_form_validate($form, &$form_state) {
|
|
|
|
|
|
// Iterate through the TOC items and validate.
|
|
|
foreach ($toc_items as $toc_id => $item) {
|
|
|
- if (!$item['title']) {
|
|
|
+ if (array_key_exists('title', $item) and !$item['title']) {
|
|
|
form_set_error('toc_items][' . $toc_id, "Please provide a valid title.");
|
|
|
}
|
|
|
}
|
|
@@ -193,7 +217,7 @@ function tripal_core_node_toc_form_submit($form, &$form_state) {
|
|
|
->fields(array(
|
|
|
'node_type' => $node->type,
|
|
|
'key' => $toc_id,
|
|
|
- 'title' => $item['title'],
|
|
|
+ 'title' => array_key_exists('title', $item) ? $item['title'] : '',
|
|
|
'weight' => $item['weight'],
|
|
|
'nid' => $node->nid,
|
|
|
'hide' => $item['hide'],
|
|
@@ -281,17 +305,38 @@ function tripal_core_node_view_build_toc(&$build) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// For backwards compatibility we will handle the content type fields
|
|
|
// named 'field_resource_blocks', 'field_resource_titles', and 'field_resource_links'
|
|
|
// these fields can be added on the Drupal content types page and were
|
|
|
- // specifically recoginzed by Tripal v1.1.
|
|
|
- if ($mode != "manage_type" and $key == "field_resource_links") {
|
|
|
+ // specifically recoginzed by Tripal v1.1. If the mode type is "manage_type"
|
|
|
+ // then remove these content panes because they are node specific.
|
|
|
+ if ($mode == "manage_type" and (
|
|
|
+ $key == "field_resource_links" or
|
|
|
+ $key == "field_resource_titles" or
|
|
|
+ $key == "field_resource_blocks")) {
|
|
|
+ unset($build[$key]);
|
|
|
+ }
|
|
|
+ if ($key == "field_resource_links") {
|
|
|
// links should just appear on the sidebar as is and not open up a panel
|
|
|
foreach (element_children($build[$key]) as $index) {
|
|
|
$element = $build[$key][$index];
|
|
|
$weight = 0;
|
|
|
- $toc_item_id = "resource-$index";
|
|
|
-
|
|
|
+ $hide = 0;
|
|
|
+ $toc_item_id = "resource-link-$index";
|
|
|
+
|
|
|
+ // Get any overrides for this key.
|
|
|
+ $overrides = tripal_core_get_toc_overrides($nid, $toc_item_id, $node_type);
|
|
|
+ $weight = $overrides['weight'] ? $overrides['weight'] : $weight;
|
|
|
+ $hide = $overrides['hide'] ? $overrides['hide'] : $hide;
|
|
|
+
|
|
|
+ // If the element should be hidden then unset this key the build
|
|
|
+ // array continue to the next one
|
|
|
+ if ($mode == "display" and $overrides['hide'] == 1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add the link to the TOC
|
|
|
$parts = explode("|", $element['#markup']);
|
|
|
if (count($parts) == 2) {
|
|
|
$toc[$weight][$parts[0]] = "<div id=\"$toc_item_id\" class=\"tripal_toc_list_item\">" . l($parts[0], $parts[1], array('attributes' => array('target' => '_blank'))) . "</div>";
|
|
@@ -299,17 +344,29 @@ function tripal_core_node_view_build_toc(&$build) {
|
|
|
else {
|
|
|
$toc[$weight][$parts[0]] = "<div id=\"$toc_item_id\" class=\"tripal_toc_list_item\">" . $element['#markup'] . "</div>";
|
|
|
}
|
|
|
- // remove this link from the build array as we've moved it to appear in the TOC
|
|
|
- unset($build[$key]);
|
|
|
+
|
|
|
+ // Add to the build array but do not add markup. This way
|
|
|
+ // when the TOC is managed by the node 'TOC' menu these links can
|
|
|
+ // be ordered as well.
|
|
|
+ $build[$toc_item_id]['#toc_handled'] = TRUE;
|
|
|
+ $build[$toc_item_id]['#tripal_toc_id'] = $toc_item_id;
|
|
|
+ $build[$toc_item_id]['#tripal_toc_title'] = $parts[0];
|
|
|
+ $build[$toc_item_id]['#weight'] = $weight;
|
|
|
+ $build[$toc_item_id]['#hide'] = $hide;
|
|
|
+ $build[$toc_item_id]['#is_link'] = TRUE;
|
|
|
+
|
|
|
}
|
|
|
+ // Remove the orilink from the build array as we've moved it to
|
|
|
+ // appear in the TOC
|
|
|
+ unset($build[$key]);
|
|
|
continue;
|
|
|
}
|
|
|
- if ($mode != "manage_type" and $key == "field_resource_titles") {
|
|
|
+ if ($key == "field_resource_titles") {
|
|
|
// ignore these, we will use them in the field_resource_blocks if
|
|
|
// statement below
|
|
|
continue;
|
|
|
}
|
|
|
- if ($mode != "manage_type" and $key == "field_resource_blocks") {
|
|
|
+ if ($key == "field_resource_blocks") {
|
|
|
foreach (element_children($build[$key]) as $index) {
|
|
|
// get the details and the title
|
|
|
$weight = 0;
|
|
@@ -558,3 +615,175 @@ function tripal_core_get_toc_overrides($nid, $key, $node_type) {
|
|
|
'hide' => $override_hide,
|
|
|
);
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+function tripal_core_content_type_toc_form($form, &$form_state, $content_type) {
|
|
|
+
|
|
|
+ // Get the type details
|
|
|
+ $all_types = node_type_get_types();
|
|
|
+ $type_info = $all_types[$content_type];
|
|
|
+
|
|
|
+ $form["#tree"] = TRUE;
|
|
|
+
|
|
|
+ // Get a single node of this type so we can get all the possible content for it
|
|
|
+ $sql = "SELECT nid FROM {node} WHERE type = :type LIMIT 1 OFFSET 0";
|
|
|
+ $nid = db_query($sql, array(':type' => $content_type))->fetchField();
|
|
|
+ if (!$nid) {
|
|
|
+ $form["not_available"] = array(
|
|
|
+ '#markup' => t('Please sync at least one %type_name record. A node
|
|
|
+ must exist before customizations to the Table of Contents (TOC) can
|
|
|
+ be performed.', array('%type_name' => $type_info->name)),
|
|
|
+ );
|
|
|
+ return $form;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Load the node
|
|
|
+ $node = node_load($nid);
|
|
|
+
|
|
|
+ // Get the content array for this node, then pass it through the
|
|
|
+ // tripal_core_node_view_alter which generates the TOC. After that
|
|
|
+ // we can use the $build array to build the form. We have to add
|
|
|
+ // a 'tripal_toc_mode' to the $node because we need to give the mode
|
|
|
+ // to the tripal_core_node_view_build_toc function.
|
|
|
+ $node->tripal_toc_mode = 'manage_type';
|
|
|
+
|
|
|
+ node_build_content($node);
|
|
|
+ $build = $node->content;
|
|
|
+ $build["#node"] = $node;
|
|
|
+ tripal_core_node_view_alter($build);
|
|
|
+
|
|
|
+ $form["instructions"] = array(
|
|
|
+ '#type' => 'fieldset',
|
|
|
+ '#collapsed' => TRUE,
|
|
|
+ '#collapsible' => TRUE,
|
|
|
+ '#title' => 'Instructions',
|
|
|
+ );
|
|
|
+ $form["instructions"]["main"] = array(
|
|
|
+ '#markup' => '</p>' . t('Below is a list of the titles of
|
|
|
+ content panes that can appear on all %type_name pages. You may rename
|
|
|
+ the titles or drag and drop them to change the order. Content that appears
|
|
|
+ only on a single page can not be ordered here, but must be ordered using
|
|
|
+ the TOC tab on the page itself. If a page has customized TOC settings
|
|
|
+ then those settings will take precedent over these.',
|
|
|
+ array('%type_name' => $type_info->name)) . '</p>' .
|
|
|
+ '<p>' . t('The list below shows all possible content
|
|
|
+ panes that can appear. However, those without content are automatically
|
|
|
+ hidden and do not appear in the TOC.' . '</p>'),
|
|
|
+ );
|
|
|
+
|
|
|
+ $form['content_type'] = array(
|
|
|
+ '#type' => 'value',
|
|
|
+ '#value' => $content_type,
|
|
|
+ );
|
|
|
+
|
|
|
+ // Iterate through the built items and add form elemetns for each one.
|
|
|
+ foreach(element_children($build) as $key) {
|
|
|
+ $element = $build[$key];
|
|
|
+
|
|
|
+ if (array_key_exists('#tripal_toc_id', $element)) {
|
|
|
+ $toc_id = $element['#tripal_toc_id'];
|
|
|
+ $toc_title = $element['#tripal_toc_title'];
|
|
|
+ $toc_weight = $element['#weight'];
|
|
|
+ $toc_hide = $element['#hide'];
|
|
|
+ $form['toc_items'][$toc_id]['title'] = array(
|
|
|
+ '#type' => 'textfield',
|
|
|
+ '#default_value' => $toc_title,
|
|
|
+ );
|
|
|
+ $form['toc_items'][$toc_id]['hide'] = array(
|
|
|
+ '#type' => 'checkbox',
|
|
|
+ '#default_value' => $toc_hide,
|
|
|
+ );
|
|
|
+ $form['toc_items'][$toc_id]['weight'] = array(
|
|
|
+ '#type' => 'textfield',
|
|
|
+ '#default_value' => $toc_weight,
|
|
|
+ '#attributes' => array(
|
|
|
+ 'class' => array('tripal-node-toc-items-weights'),
|
|
|
+ ),
|
|
|
+ '#size' => 5,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $form['toc_items']['#theme'] = 'tripal_node_toc_items_table';
|
|
|
+
|
|
|
+ $form['submit'] = array(
|
|
|
+ '#type' => 'submit',
|
|
|
+ '#name' => 'toc_submit',
|
|
|
+ '#value' => t('Submit'),
|
|
|
+ );
|
|
|
+ $form['unset'] = array(
|
|
|
+ '#type' => 'submit',
|
|
|
+ '#name' => 'toc_unset',
|
|
|
+ '#value' => t('Reset to Defaults'),
|
|
|
+ );
|
|
|
+
|
|
|
+ return $form;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Implements hook_validate for the tripal_core_node_toc_form.
|
|
|
+ */
|
|
|
+function tripal_core_content_type_toc_form_validate($form, &$form_state) {
|
|
|
+ $toc_items = $form_state['values']['toc_items'];
|
|
|
+
|
|
|
+ // Iterate through the TOC items and validate.
|
|
|
+ foreach ($toc_items as $toc_id => $item) {
|
|
|
+ if (!$item['title']) {
|
|
|
+ form_set_error('toc_items][' . $toc_id, "Please provide a valid title.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+/**
|
|
|
+ * Implements hook_submit for the tripal_core_node_toc_form.
|
|
|
+ */
|
|
|
+function tripal_core_content_type_toc_form_submit($form, &$form_state) {
|
|
|
+ $toc_items = $form_state['values']['toc_items'];
|
|
|
+ $content_type = $form_state['values']['content_type'];
|
|
|
+
|
|
|
+ if ($form_state['clicked_button']['#name'] == "toc_submit") {
|
|
|
+ $transaction = db_transaction();
|
|
|
+ try {
|
|
|
+ // First delete any settings for this content type
|
|
|
+ db_delete('tripal_toc')
|
|
|
+ ->condition('node_type', $content_type)
|
|
|
+ ->isNull('nid')
|
|
|
+ ->execute();
|
|
|
+
|
|
|
+ // Second add in any new settings for this node
|
|
|
+ foreach ($toc_items as $toc_id => $item) {
|
|
|
+ db_insert('tripal_toc')
|
|
|
+ ->fields(array(
|
|
|
+ 'node_type' => $content_type,
|
|
|
+ 'key' => $toc_id,
|
|
|
+ 'title' => $item['title'],
|
|
|
+ 'weight' => $item['weight'],
|
|
|
+ 'hide' => $item['hide'],
|
|
|
+ ))
|
|
|
+ ->execute();
|
|
|
+ }
|
|
|
+ drupal_set_message("TOC changes successfully applied to this content type.");
|
|
|
+ }
|
|
|
+ catch (Exception $e) {
|
|
|
+ $transaction->rollback();
|
|
|
+ drupal_set_message("Failed to apply TOC changes.", "error");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($form_state['clicked_button']['#name'] == "toc_unset") {
|
|
|
+ $transaction = db_transaction();
|
|
|
+ try {
|
|
|
+ // First delete any settings for this node
|
|
|
+ db_delete('tripal_toc')
|
|
|
+ ->condition('node_type', $content_type)
|
|
|
+ ->isNull('nid')
|
|
|
+ ->execute();
|
|
|
+
|
|
|
+ drupal_set_message("The TOC is reset to defaults for this content type.");
|
|
|
+ }
|
|
|
+ catch (Exception $e) {
|
|
|
+ $transaction->rollback();
|
|
|
+ drupal_set_message("Failed to apply TOC changes.", "error");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|