? nodequeue-234004-45.patch Index: nodequeue.css =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.css,v retrieving revision 1.2 diff -u -p -r1.2 nodequeue.css --- nodequeue.css 28 May 2008 06:48:16 -0000 1.2 +++ nodequeue.css 13 Aug 2009 11:48:39 -0000 @@ -1,52 +1,14 @@ -/* Animated throbber */ -html.js a.nodequeue-ajax-toggle.throbbing { - background:url(images/status-active.gif) no-repeat right center; - padding-right:18px; -} - -html.js td.throbbing { - background:url(images/status-active.gif) no-repeat left center; - padding-left:18px; -} - -.nodequeue-hide-if-not-js { - display: none; -} - -html.js .nodequeue-hide-if-not-js { - display: block; -} +/* $Id$ */ -.nodequeue-operation { - width: 30%; - text-align: right; - padding-right: .2em; +.nodequeue-dragdrop .position { + font-weight: bold; + color: #999; } -.nodequeue-in-queue { - width: 20%; - text-align: right; - padding-right: .2em; +#edit-add-nid { + color: #999; } -.nodequeue-max-nodes { - text-align: right; - padding-right: .2em; +td.nodequeue-add-submit { + width: 80%; } - -#nodequeue-table tbody, -#nodequeue-table th { - border: none; -} - -#nodequeue-table .nodequeue-author { - width: 100px; -} -#nodequeue-table .nodequeue-date { - width: 175px; -} - -#nodequeue-table .nodequeue-operation { - width: 79px; -} - Index: nodequeue.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v retrieving revision 1.87 diff -u -p -r1.87 nodequeue.module --- nodequeue.module 8 Jul 2009 15:04:34 -0000 1.87 +++ nodequeue.module 13 Aug 2009 11:48:39 -0000 @@ -1,11 +1,20 @@ 'Nodequeue', + 'title' => 'Nodequeue', 'access callback' => '_nodequeue_access_admin_or_manipulate', - 'page callback' => 'nodequeue_view_queues', - 'description' => 'Create and maintain simple nodequeues.', - 'type' => MENU_NORMAL_ITEM + 'page callback' => 'nodequeue_view_queues', + 'description' => 'Create and maintain simple nodequeues.', + 'type' => MENU_NORMAL_ITEM, ); $items['admin/content/nodequeue/list'] = array( - 'title' => 'List', + 'title' => 'List', 'access callback' => '_nodequeue_access_admin_or_manipulate', - 'page callback' => 'nodequeue_view_queues', - 'weight' => -1, - 'type' => MENU_DEFAULT_LOCAL_TASK + 'page callback' => 'nodequeue_view_queues', + 'weight' => -1, + 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/content/nodequeue/settings'] = array( - 'title' => 'Settings', + 'title' => 'Settings', 'access arguments' => $admin_access, - 'page callback' => 'drupal_get_form', - 'page arguments' => array('nodequeue_admin_settings'), - 'type' => MENU_LOCAL_TASK - ); - $items['nodequeue/autocomplete'] = array( - 'title' => 'Autocomplete', - 'access arguments' => $access, - 'page callback' => 'nodequeue_autocomplete', - 'type' => MENU_CALLBACK - ); - $items['nodequeue/ajax/add'] = array( - 'title' => 'ajax add', - 'access arguments' => $access, - 'page callback' => 'nodequeue_ajax_add', - 'type' => MENU_CALLBACK - ); - $info = nodequeue_api_info(); - foreach ($info as $key => $data) { - $items['admin/content/nodequeue/add/'. $key] = array( - 'title' => 'Add @type', - 'title arguments' => array('@type' => strtolower($data['title'])), - 'access arguments' => $admin_access, - 'page callback' => 'drupal_get_form', - 'page arguments' => array('nodequeue_edit_queue_form', $key), - 'type' => MENU_LOCAL_TASK - ); - } - - // Note: This path used to set up with a call to nodequeue_load_queues_by_type, passing the result in. Now, that function is called inside of nodequeue_node_tab. - - $items['node/%node/nodequeue'] = array( - 'title' => '@tab', - 'title arguments' => array('@tab' => variable_get('nodequeue_tab_name', 'Nodequeue')), - 'access callback' => 'nodequeue_node_tab_access', - 'access arguments' => array(1), - 'page callback' => 'nodequeue_node_tab', - 'page arguments' => array(1), - 'type' => MENU_LOCAL_TASK, - 'weight' => 5 + 'page callback' => 'drupal_get_form', + 'page arguments' => array('nodequeue_admin_settings'), + 'type' => MENU_LOCAL_TASK, ); - // Administrative items for an individual queue. + // administrative items for an individual queue. $items['admin/content/nodequeue/%nodequeue'] = array( 'access arguments' => array(3), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_view', - 'page arguments' => array(3), - 'type' => MENU_CALLBACK + 'access callback' => 'nodequeue_queue_access', + 'page callback' => 'nodequeue_admin_view', + 'page arguments' => array(3), + 'type' => MENU_CALLBACK, ); $items['admin/content/nodequeue/%nodequeue/view/%subqueue'] = array( - 'title' => 'View', + 'title' => 'View', 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_view', - 'page arguments' => array(3, 5), - 'weight' => -10, - 'type' => MENU_DEFAULT_LOCAL_TASK + 'access callback' => 'nodequeue_queue_access', + 'page callback' => 'nodequeue_admin_view', + 'page arguments' => array(3, 5), + 'weight' => -10, + 'type' => MENU_DEFAULT_LOCAL_TASK, ); - // Actual administrative items. $items['admin/content/nodequeue/%nodequeue/edit'] = array( - 'title' => 'Edit', + 'title' => 'Edit', 'access arguments' => $admin_access, - 'page callback' => 'drupal_get_form', - 'page arguments' => array('nodequeue_edit_queue_form', 3), - 'type' => MENU_LOCAL_TASK + 'page callback' => 'drupal_get_form', + 'page arguments' => array('nodequeue_edit_queue_form', 3), + 'type' => MENU_LOCAL_TASK, ); $items['admin/content/nodequeue/%nodequeue/delete'] = array( - 'title' => 'Delete', + 'title' => 'Delete', 'access arguments' => $admin_access, - 'page callback' => 'drupal_get_form', - 'page arguments' => array('nodequeue_admin_delete', 3), - 'weight' => 5, - 'type' => MENU_CALLBACK + 'page callback' => 'drupal_get_form', + 'page arguments' => array('nodequeue_admin_delete', 3), + 'weight' => 5, + 'type' => MENU_CALLBACK, ); - - /*$sqid = arg(5); - if (is_numeric($sqid) && $subqueue = nodequeue_load_subqueue($sqid)) { - // The following operations require a sqid and a nid. - $nid = arg(6); - if (in_array(arg(4), array('add', 'remove-node')) && - is_numeric($nid)) { - $node = node_load($nid); - }*/ - $items["admin/content/nodequeue/%nodequeue/add/%subqueue/%node"] = array( 'access arguments' => array(6, 3, 5), - 'access callback' => 'nodequeue_node_and_queue_access', - 'page callback' => 'nodequeue_admin_add_node', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK + 'access callback' => 'nodequeue_node_and_queue_access', + 'page callback' => 'nodequeue_admin_add_node', + 'page arguments' => array(3, 5, 6), + 'type' => MENU_CALLBACK, ); + // FIXME: do we still need this? $items["admin/content/nodequeue/%nodequeue/remove-node/%subqueue/%node"] = array( 'access arguments' => array(6, 3, 5), - 'access callback' => 'nodequeue_node_and_queue_access', - 'page callback' => 'nodequeue_admin_remove_node', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK - ); - $items["admin/content/nodequeue/%nodequeue/up/%subqueue/%"] = array( - 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_up', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK - ); - $items["admin/content/nodequeue/%nodequeue/down/%subqueue/%"] = array( - 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_down', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK + 'access callback' => 'nodequeue_node_and_queue_access', + 'page callback' => 'nodequeue_admin_remove_node', + 'page arguments' => array(3, 5, 6), + 'type' => MENU_CALLBACK ); - $items["admin/content/nodequeue/%nodequeue/front/%subqueue/%"] = array( + $items["admin/content/nodequeue/%nodequeue/clear/%subqueue"] = array( + 'title' => 'Clear', 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_front', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK + 'access callback' => 'nodequeue_queue_access', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('nodequeue_clear_confirm', 3, 5), + 'type' => MENU_CALLBACK ); - $items["admin/content/nodequeue/%nodequeue/back/%subqueue/%"] = array( - 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_back', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK + + $items['node/%node/nodequeue'] = array( + 'title' => '@tab', + 'title arguments' => array('@tab' => variable_get('nodequeue_tab_name', 'Nodequeue')), + 'access callback' => 'nodequeue_node_tab_access', + 'access arguments' => array(1), + 'page callback' => 'nodequeue_node_tab', + 'page arguments' => array(1), + 'type' => MENU_LOCAL_TASK, + 'weight' => 5, ); - $items["admin/content/nodequeue/%nodequeue/remove/%subqueue/%"] = array( - 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'nodequeue_admin_remove', - 'page arguments' => array(3, 5, 6), - 'type' => MENU_CALLBACK + + // add an "add" callback for each available queue type + $info = nodequeue_api_info(); + foreach ($info as $key => $data) { + $items['admin/content/nodequeue/add/'. $key] = array( + 'title' => 'Add @type', + 'title arguments' => array('@type' => drupal_strtolower($data['title'])), + 'access arguments' => $admin_access, + 'page callback' => 'drupal_get_form', + 'page arguments' => array('nodequeue_edit_queue_form', $key), + 'type' => MENU_LOCAL_TASK, + ); + } + + $items['nodequeue/autocomplete'] = array( + 'title' => 'Autocomplete', + 'access arguments' => $access, + 'page callback' => 'nodequeue_autocomplete', + 'type' => MENU_CALLBACK, ); - $items["admin/content/nodequeue/%nodequeue/clear/%subqueue"] = array( - 'title' => 'Clear', - 'access arguments' => array(3, 5), - 'access callback' => 'nodequeue_queue_access', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('nodequeue_clear_confirm', 3, 5), - 'type' => MENU_CALLBACK + $items['nodequeue/ajax/add'] = array( + 'title' => 'ajax add', + 'access arguments' => $access, + 'page callback' => 'nodequeue_ajax_add', + 'type' => MENU_CALLBACK, ); return $items; } + /** - * Implementation of hook_nodeapi + * Implementation of hook_nodeapi(). */ function nodequeue_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { @@ -226,20 +181,19 @@ function nodequeue_nodeapi(&$node, $op, // If there is only one node remaining, track by nid rather than tnid. // Otherwise, use the new tnid. $content_id = $node->translation_change['new_tnid'] == 0 ? $node->translation_change['remaining_nid'] : $node->translation_change['new_tnid']; - db_query("UPDATE {nodequeue_nodes} SET nid = %d WHERE nid = %d", $content_id, $node->translation_change['old_tnid']); + db_query('UPDATE {nodequeue_nodes} SET nid = %d WHERE nid = %d', $content_id, $node->translation_change['old_tnid']); } + break; } } /** - * Implementation of hook_link + * Implementation of hook_link(). */ function nodequeue_link($type, $node = NULL, $teaser = FALSE) { $links = array(); - if ($type == 'node' && - variable_get('nodequeue_links', FALSE) && - user_access('manipulate queues')) { + if ($type == 'node' && variable_get('nodequeue_links', FALSE) && user_access('manipulate queues')) { $queues = nodequeue_load_queues_by_type($node->type, 'links'); $subqueues = nodequeue_get_subqueues_by_node($queues, $node); if (empty($subqueues)) { @@ -247,8 +201,8 @@ function nodequeue_link($type, $node = N } // resort the subqueues to retain consistent ordering: - ksort($subqueues); + // Due to caching, we can accidentally get positions leftover // from previous iterations on teaser list pages, so we must // remove any existing positions here. @@ -256,43 +210,66 @@ function nodequeue_link($type, $node = N unset($subqueues[$id]->position); } - if(!module_exists('translation')) { + if (!module_exists('translation')) { nodequeue_set_subqueue_positions($subqueues, $node->nid); } foreach ($subqueues as $subqueue) { $queue = $queues[$subqueue->qid]; $id = nodequeue_get_content_id($queue, $node); - if(module_exists('translation')) { + if (module_exists('translation')) { $subqueue = array($subqueue->sqid => $subqueue); nodequeue_set_subqueue_positions($subqueue, $id); $subqueue = array_shift($subqueue); } $query_string = nodequeue_get_query_string($id, TRUE); - $class = 'nodequeue-ajax-toggle nodequeue-toggle-q-'. $queue->qid. ' nodequeue-toggle-sq-'. $subqueue->sqid .' nodequeue-toggle-ref-'. $subqueue->reference; + $class = 'nodequeue-ajax-toggle nodequeue-toggle-q-'. $queue->qid .' nodequeue-toggle-sq-'. $subqueue->sqid .' nodequeue-toggle-ref-'. $subqueue->reference; if (!isset($subqueue->position)) { $links[$class] = array( - 'title' => nodequeue_title_substitute($queue->link, $queue, $subqueue), - 'href' => "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$id", - 'attributes' => array('class' => $class . ' toggle-add'), - 'query' => $query_string); + 'title' => nodequeue_title_substitute($queue->link, $queue, $subqueue), + 'href' => 'admin/content/nodequeue/'. $queue->qid .'/add/'. $subqueue->sqid .'/'. $id, + 'attributes' => array('class' => $class .' toggle-add'), + 'query' => $query_string, + ); } else if ($queue->link_remove) { $links[$class] = array( - 'title' => nodequeue_title_substitute($queue->link_remove, $queue, $subqueue), - 'href' => "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$id", + 'title' => nodequeue_title_substitute($queue->link_remove, $queue, $subqueue), + 'href' => 'admin/content/nodequeue/'. $queue->qid .'/remove-node/'. $subqueue->sqid .'/'. $id, 'attributes' => array('class' => $class .' toggle-remove'), - 'query' => $query_string); + 'query' => $query_string, + ); } } drupal_add_js(drupal_get_path('module', 'nodequeue') .'/nodequeue.js'); drupal_add_css(drupal_get_path('module', 'nodequeue') .'/nodequeue.css'); } + return $links; } /** - * Implementation of hook_views_api() + * Implementation of hook_theme(). + */ +function nodequeue_theme() { + return array( + 'nodequeue_arrange_subqueue_form' => array( + 'arguments' => array('form'), + ), + 'nodequeue_subqueue_empty_text' => array( + 'arguments' => array(), + ), + 'nodequeue_subqueue_full_text' => array( + 'arguments' => array(), + ), + 'nodequeue_subqueue_count_text' => array( + 'arguments' => array(), + ), + ); +} + +/** + * Implementation of hook_views_api(). */ function nodequeue_views_api() { return array( @@ -309,26 +286,25 @@ function nodequeue_form_apachesolr_searc $weights = drupal_map_assoc(array('21.0', '13.0', '8.0', '5.0', '3.0', '2.0', '1.0', '0.8', '0.5', '0.3', '0.2', '0.1')); $weights['0'] = t('Normal'); $queues = nodequeue_load_subqueues_by_queue(array_keys(nodequeue_get_all_qids())); - + // build the form $form['biasing']['nodequeue_boost'] = array( - '#type' => 'fieldset', - '#title' => t('Nodequeue Biasing'), - '#weight' => -5, - '#collapsible' => TRUE, - '#collapsed' => TRUE, + '#type' => 'fieldset', + '#title' => t('Nodequeue Biasing'), + '#weight' => -5, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ); $form['biasing']['nodequeue_boost']['nodequeue_apachesolr_boost'] = array( - '#type' => 'item', - '#description' => t("Specify to bias the search result when a node is in a queue. Any value except Normal will increase the socre for the given queue in the search results"), + '#type' => 'item', + '#description' => t('Specify to bias the search result when a node is in a queue. Any value except Normal will increase the socre for the given queue in the search results'), ); foreach ($queues as $sqid => $queue) { - $boost = variable_get("nodequeue_apachesolr_boost_$sqid", 0); - // add in setting for each queue - $form['biasing']['nodequeue_boost']['nodequeue_apachesolr_boost']["nodequeue_apachesolr_boost_$sqid"] = array( - '#type' => 'select', - '#title' => t('Weight for %title nodequeue', array('%title' => $queue->title)), - '#options' => $weights, + $boost = variable_get('nodequeue_apachesolr_boost_'. $sqid, 0); + $form['biasing']['nodequeue_boost']['nodequeue_apachesolr_boost']['nodequeue_apachesolr_boost_'. $sqid] = array( + '#type' => 'select', + '#title' => t('Weight for %title nodequeue', array('%title' => $queue->title)), + '#options' => $weights, '#default_value' => $boost, ); } @@ -351,61 +327,68 @@ function nodequeue_apachesolr_update_ind } /** - * return the apachesolr index key for group id - */ -function _nodequeue_solr_qid_key() { - $qid_key = array( - 'index_type' => 'sint', - 'multiple' => TRUE, - 'name' => "nodequeue", - ); - - return apachesolr_index_key($qid_key); -} - -/** * Implementation of hook_apachesolr_modify_query(). */ function nodequeue_apachesolr_modify_query($query, &$params, $caller) { $queues = nodequeue_load_subqueues_by_queue(array_keys(nodequeue_get_all_qids())); foreach ($queues as $sqid => $queue) { - $boost = variable_get("nodequeue_apachesolr_boost_$sqid", 0); + $boost = variable_get('nodequeue_apachesolr_boost_'. $sqid, 0); if (!empty($boost)) { - $params['bq'][] = _nodequeue_solr_qid_key() . ":$sqid^$boost"; + $params['bq'][] = _nodequeue_solr_qid_key() .':'. $sqid .'^'. $boost; $params['facet.field'][] = _nodequeue_solr_qid_key(); } } } -// -------------------------------------------------------------------------- -// Nodequeue Admin operations +/** + * Implementation of hook_elements(). + */ +function nodequeue_elements() { + $type = array(); + + $type['position'] = array( + '#input' => TRUE, + '#delta' => 10, + '#default_value' => 0, + '#process' => array('process_position', 'form_expand_ahah'), + ); + + return $type; +} /** - * Print the JSON output for our AJAX calls. + * Expand position elements into selects. Works like the weight element, except + * only positive values are allowed. */ -function nodequeue_js_output($label, $href, $count = NULL, $sqid = NULL) { - $return = new stdClass(); - $return->status = 1; - $return->label = check_plain($label); - $return->href = $href; - if (isset($count)) { - $return->count = $count; - } - if (isset($sqid)) { - $return->sqid = $sqid; +function process_position($element) { + for ($n = 1; $n <= $element['#delta']; $n++) { + $positions[$n] = $n; } - drupal_json($return); - exit; + $element['#options'] = $positions; + $element['#options']['r'] = t('Remove'); + $element['#type'] = 'select'; + + // add default properties for the select element + $element += _element_info('select'); + + return $element; } /** - * Return content id based on i18n settings + * If no default value is set for position select boxes, use 1. */ -function nodequeue_get_content_id($queue, $node) { - return ($queue->i18n && !empty($node->tnid)) ? $node->tnid : $node->nid; +function position_value(&$form) { + if (isset($form['#default_value'])) { + $form['#value'] = $form['#default_value']; + } + else { + $form['#value'] = 1; + } } +/* --- CALLBACKS ------------------------------------------------------------ */ + /** * Page callback to add a node to a queue. */ @@ -419,14 +402,17 @@ function nodequeue_admin_add_node($queue // Provide a response if this is javascript. if (!empty($_POST['js'])) { if (isset($_GET['tab'])) { - nodequeue_js_output(t('Remove from queue'), - url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))), + nodequeue_js_output( + t('Remove from queue'), + url('admin/content/nodequeue/'. $queue->qid .'/remove-node/'. $subqueue->sqid .'/'. $node->nid, array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))), nodequeue_subqueue_size_text($queue->size, $queue->size ? min($subqueue->count, $queue->size) : $subqueue->count, FALSE), - $subqueue->sqid); + $subqueue->sqid + ); } else { - nodequeue_js_output(nodequeue_title_substitute($queue->link_remove, $queue, $subqueue), - url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE)))); + nodequeue_js_output( + nodequeue_title_substitute($queue->link_remove, $queue, $subqueue), + url('admin/content/nodequeue/'. $queue->qid .'/remove-node/'. $subqueue->sqid .'/'. $node->nid, array('query' => nodequeue_get_query_string($node->nid, TRUE)))); } } @@ -448,13 +434,13 @@ function nodequeue_admin_remove_node($qu if (!empty($_POST['js'])) { if (isset($_GET['tab'])) { nodequeue_js_output(t('Add to queue'), - url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))), + url('admin/content/nodequeue/'. $queue->qid .'/add/'. $subqueue->sqid .'/'. $node->nid, array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))), nodequeue_subqueue_size_text($queue->size, $subqueue->count - 1, FALSE), $subqueue->sqid); } else { nodequeue_js_output(nodequeue_title_substitute($queue->link, $queue, $subqueue), - url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE)))); + url('admin/content/nodequeue/'. $queue->qid .'/add/'. $subqueue->sqid .'/'. $node->nid, array('query' => nodequeue_get_query_string($node->nid, TRUE)))); } } @@ -490,36 +476,33 @@ function nodequeue_node_tab($node) { $rows = array(); foreach ($subqueues as $subqueue) { $queue = $queues[$subqueue->qid]; + $attributes = array( + 'attributes' => array( + 'class' => 'nodequeue-ajax-toggle', + ), + 'query' => drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid), + ); if (empty($subqueue->position)) { - $op = l( - t('Add to queue'), - "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", - array('attributes' => array('class' => 'nodequeue-ajax-toggle'), - 'query' => drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid)) - ); + $op = l(t('Add to queue'), 'admin/content/nodequeue/'. $queue->qid .'/add/'. $subqueue->sqid .'/'. $node->nid, $attributes); } else { - $op = l( - t('Remove from queue'), - "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", - array('attributes' => array('class' => 'nodequeue-ajax-toggle'), - 'query' => drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid)) - ); + $op = l(t('Remove from queue'), 'admin/content/nodequeue/'. $queue->qid .'/remove-node/'. $subqueue->sqid .'/'. $node->nid, $attributes); } $row = array(); $row[] = array( 'class' => 'nodequeue-title', - 'data' => l(nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue), "admin/content/nodequeue/$queue->qid/view/$subqueue->sqid"), + 'data' => l(nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue), 'admin/content/nodequeue/'. $queue->qid .'/view/'. $subqueue->sqid), ); if (variable_get('nodequeue_tab_display_max', 1)) { $row[] = array('class' => 'nodequeue-max-nodes', 'data' => $queue->size ? $queue->size : t('Infinite')); } $row[] = array( - 'id' => 'nodequeue-count-'. $subqueue->sqid, + 'id' => 'nodequeue-count-'. $subqueue->sqid, 'class' => 'nodequeue-in-queue', - 'data' => nodequeue_subqueue_size_text($queue->size, $subqueue->count, FALSE) + 'data' => nodequeue_subqueue_size_text($queue->size, $subqueue->count, FALSE) ); $row[] = array('class' => 'nodequeue-operation', 'data' => $op); + $rows[] = $row; } @@ -533,7 +516,8 @@ function nodequeue_node_tab($node) { * Display a list of queues and their status for the administrator. */ function nodequeue_view_queues() { - $output = theme('advanced_help_topic', 'nodequeue', 'about', 'icon') . ' ' . theme('advanced_help_topic', 'nodequeue', 'about', t('Click here for information about this module')); + $output = theme('advanced_help_topic', 'nodequeue', 'about', 'icon') .' '. theme('advanced_help_topic', 'nodequeue', 'about', t('Click here for information about this module')); + // Fetch all of the queues. $queues = nodequeue_load_queues(nodequeue_get_all_qids(25)); foreach ($queues as $queue) { @@ -586,13 +570,13 @@ function nodequeue_view_queues() { $subqueues = nodequeue_load_subqueues_by_queue($qids); // Relate all the subqueues we loaded back to our queues. foreach ($subqueues as $subqueue) { - if (nodequeue_api_subqueue_access($subqueue, NULL, $queues[$subqueue->qid])) { - $queues[$subqueue->qid]->subqueue = $subqueue; - } + if (nodequeue_api_subqueue_access($subqueue, NULL, $queues[$subqueue->qid])) { + $queues[$subqueue->qid]->subqueue = $subqueue; + } } if (!empty($table_sort)) { - if (strtolower($table_sort['sort']) == 'desc') { + if (drupal_strtolower($table_sort['sort']) == 'desc') { array_multisort($sort_primary, $sort_direction['desc'], $sort_secondary, $queues); // Re-indexes array keys; key no longer equals qid. } else { @@ -604,20 +588,20 @@ function nodequeue_view_queues() { foreach ($queues as $queue) { $sub_text = $queue->subqueues; if ($sub_text == 1) { - $sub_text .= " (". nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) .")"; + $sub_text .= ' ('. nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) .')'; } - $operations = array(l(t('View'), "admin/content/nodequeue/$queue->qid/view")); + $operations = array(l(t('View'), 'admin/content/nodequeue/'. $queue->qid .'/view')); if (user_access('administer nodequeue')) { - $operations[] = l(t('Edit'), "admin/content/nodequeue/$queue->qid/edit"); - $operations[] = l(t('Delete'), "admin/content/nodequeue/$queue->qid/delete"); + $operations[] = l(t('Edit'), 'admin/content/nodequeue/'. $queue->qid .'/edit'); + $operations[] = l(t('Delete'), 'admin/content/nodequeue/'. $queue->qid .'/delete'); } $rows[] = array( - array('class' => 'nodequeue-title', 'data' => check_plain($queue->title)), + array('class' => 'nodequeue-title', 'data' => check_plain($queue->title)), array('class' => 'nodequeue-max-nodes', 'data' => $queue->size == 0 ? t('Infinite') : $queue->size), array('class' => 'nodequeue-subqueues', 'data' => $sub_text), - array('class' => 'nodequeue-operation', 'data' => implode(' | ', $operations)), + array('class' => 'nodequeue-operation', 'data' => implode('   ', $operations)), ); } @@ -641,14 +625,14 @@ function nodequeue_view_subqueues($queue if (nodequeue_api_subqueue_access($subqueue, NULL, $queue)) { $sub_text = nodequeue_subqueue_size_text($queue->size, $subqueue->count, FALSE); $rows[] = array( - array('class' => 'nodequeue-title', 'data' => check_plain($subqueue->title)), + array('class' => 'nodequeue-title', 'data' => check_plain($subqueue->title)), array('class' => 'nodequeue-subqueues', 'data' => $sub_text), - array('class' => 'nodequeue-operation', 'data' => l(t('View'), "admin/content/nodequeue/$queue->qid/view/$subqueue->sqid")) + array('class' => 'nodequeue-operation', 'data' => l(t('View'), 'admin/content/nodequeue/'. $queue->qid .'/view/'. $subqueue->sqid)) ); } } - $output = '

'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) .'

'; + $output = '

'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t('Infinite'))) .'

'; $output .= theme('table', $header, $rows); $output .= theme('pager', NULL, 20); @@ -664,11 +648,11 @@ function nodequeue_edit_queue_form(&$for // For adding queues. if (is_string($queue)) { // If the $queue is a string - name of a queue type, basically - then we test that it's a valid queue type. - $queue = strtolower($queue); + $queue = drupal_strtolower($queue); if (!isset($info[$queue])) { - return false; + return FALSE; } - drupal_set_title(t('Add @type', array('@type' => strtolower($info[$queue]['title'])))); + drupal_set_title(t('Add @type', array('@type' => drupal_strtolower($info[$queue]['title'])))); $queue = new nodequeue_queue($queue); } else { @@ -676,25 +660,25 @@ function nodequeue_edit_queue_form(&$for } $form['description'] = array( - '#type' => 'fieldset', - '#title' => $info[$queue->owner]['title'], + '#type' => 'fieldset', + '#title' => $info[$queue->owner]['title'], '#description' => $info[$queue->owner]['description'], ); $form['title'] = array( - '#type' => 'textfield', - '#title' => t('Title'), + '#type' => 'textfield', + '#title' => t('Title'), '#default_value' => $queue->title, - '#size' => 50, - '#maxlength' => 64, - '#description' => t('Enter the name of the queue'), + '#size' => 50, + '#maxlength' => 64, + '#description' => t('Enter the name of the queue'), ); // This is a value; as the default nodequeue implementation has just one // queue per nodequeue, this field is totally redundant. Plugins can // override this. $form['subqueue_title'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->subqueue_title, ); // The placeholder is put here so that modifiers have an easy way to put @@ -703,40 +687,38 @@ function nodequeue_edit_queue_form(&$for $form['placeholder'] = array(); $form['size'] = array( - '#type' => 'textfield', - '#title' => t('Queue size'), + '#type' => 'textfield', + '#title' => t('Queue size'), '#default_value' => $queue->size, - '#size' => 2, - '#maxlength' => 2, - '#description' => t('The maximum number of nodes will appear in the queue. Enter 0 for no limit'), + '#size' => 2, + '#maxlength' => 2, + '#description' => t('The maximum number of nodes will appear in the queue. Enter 0 for no limit'), ); $form['reverse'] = array( - '#type' => 'checkbox', - '#title' => t('Reverse in admin view'), + '#type' => 'checkbox', + '#title' => t('Reverse in admin view'), '#default_value' => $queue->reverse, - '#description' => t('Ordinarily queues are arranged with the front of the queue (where items will be removed) on top and the back (where items will be added) on the bottom. If checked, this will display the queue such that items will be added to the top and removed from the bottom.'), + '#description' => t('Ordinarily queues are arranged with the front of the queue (where items will be removed) on top and the back (where items will be added) on the bottom. If checked, this will display the queue such that items will be added to the top and removed from the bottom.'), ); $form['link'] = array( - '#type' => 'textfield', - '#title' => t('Link "add to queue" text'), + '#type' => 'textfield', + '#title' => t('Link "add to queue" text'), '#default_value' => $queue->link, - '#size' => 40, - '#maxlength' => 40, - '#description' => t('If you want a link to add a node to a queue in the "links" section (next to "add new comment"), enter the text here. If left blank no link will be given; note that enabling this feature for any queue will cause an extra query to be run every time a node is loaded. "%subqueue" will be replaced with the subqueue title, if applicable.'), + '#size' => 40, + '#maxlength' => 40, + '#description' => t('If you want a link to add a node to a queue in the "links" section (next to "add new comment"), enter the text here. If left blank no link will be given; note that enabling this feature for any queue will cause an extra query to be run every time a node is loaded. "%subqueue" will be replaced with the subqueue title, if applicable.'), ); - $form['link_remove'] = array( - '#type' => 'textfield', - '#title' => t('Link "remove from queue" text'), + '#type' => 'textfield', + '#title' => t('Link "remove from queue" text'), '#default_value' => $queue->link_remove, - '#size' => 40, - '#maxlength' => 40, - '#description' => t('Enter the text for the corresponding link to remove a node from a queue. This may be blank (in which case no link will appear) but a remove link will only appear if link, above, is set.'), + '#size' => 40, + '#maxlength' => 40, + '#description' => t('Enter the text for the corresponding link to remove a node from a queue. This may be blank (in which case no link will appear) but a remove link will only appear if link, above, is set.'), ); - $result = db_query("SELECT r.* FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%manipulate queues%' ORDER BY r.name"); $roles = array(); @@ -746,16 +728,16 @@ function nodequeue_edit_queue_form(&$for if (!empty($roles)) { $form['roles'] = array( - '#type' => 'checkboxes', - '#title' => t('Roles'), + '#type' => 'checkboxes', + '#title' => t('Roles'), '#default_value' => is_array($queue->roles) ? $queue->roles : array(), - '#options' => $roles, - '#description' => t('Check each role that can add nodes to the queue. Be sure that roles you want to appear here have "manipulate queues" access in the main access control panel.'), + '#options' => $roles, + '#description' => t('Check each role that can add nodes to the queue. Be sure that roles you want to appear here have "manipulate queues" access in the main access control panel.'), ); } else { $form['roles'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => array(), ); @@ -767,73 +749,68 @@ function nodequeue_edit_queue_form(&$for $nodes = node_get_types('names'); $form['types'] = array( - '#type' => 'checkboxes', - '#title' => t('Types'), + '#type' => 'checkboxes', + '#title' => t('Types'), '#default_value' => $queue->types, - '#options' => $nodes, - '#description' => t('Check each node type that can be added to this queue.'), + '#options' => $nodes, + '#description' => t('Check each node type that can be added to this queue.'), ); $form['i18n'] = array( - '#type' => 'radios', - '#title' => t('Internationalization'), - '#options' => array( + '#type' => 'radios', + '#title' => t('Internationalization'), + '#options' => array( '1' => t('Treat translation nodes as a single node'), '0' => t('Manually manage translated nodes'), ), '#default_value' => empty($queue->qid) && module_exists('translation_helpers') ? 0 : $queue->i18n, - '#description' => t('Treating translations as a single node allows users to add, remove and manipulate a node + '#access' => module_exists('translation_helpers'), + '#description' => t('Treating translations as a single node allows users to add, remove and manipulate a node in the queue regardless of which translation is acted upon; nodequeue will only act on the original node. - When manually managing translation nodes, Nodequeue will ignore the relationship between node translations; - each translation node must be added to the queue separately and will occupy a separate spot in the queue. + When manually managing translation nodes, Nodequeue will ignore the relationship between node translations; + each translation node must be added to the queue separately and will occupy a separate spot in the queue. Changing this setting will not update content that is already in the queue.'), - '#access' => module_exists('translation_helpers'), ); $form['submit'] = array( - '#type' => 'submit', + '#type' => 'submit', '#value' => t('Submit'), ); $form['owner'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->owner, ); - $form['show_in_links'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->show_in_links, ); - $form['show_in_tab'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->show_in_tab, ); - $form['show_in_ui'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->show_in_ui, ); - $form['reference'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->reference, ); - $form['subqueues'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->subqueues, ); if (isset($queue->qid)) { $form[] = array( - '#type' => 'submit', - '#value' => t('Delete'), + '#type' => 'submit', + '#value' => t('Delete'), '#validate' => array('nodequeue_edit_queue_form_delete_validate'), - '#submit' => array('nodequeue_edit_queue_form_delete_submit'), + '#submit' => array('nodequeue_edit_queue_form_delete_submit'), ); $form['qid'] = array( - '#type' => 'value', + '#type' => 'value', '#value' => $queue->qid, ); $form['count'] = array( @@ -911,18 +888,20 @@ function nodequeue_edit_queue_form_delet * Delete-submit function for the nodequeue_queue form. */ function nodequeue_edit_queue_form_delete_submit($formid, &$form_state) { - $form_state['redirect'] = "admin/content/nodequeue/". $form_state['values']['qid'] ."/delete"; + $form_state['redirect'] = 'admin/content/nodequeue/'. $form_state['values']['qid'] .'/delete'; } /** * Confirm form to delete a queue */ function nodequeue_admin_delete(&$form_state, $queue) { - drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title))); - $form['qid'] = array('#type' => 'value', '#value' => $queue->qid); + $form['qid'] = array( + '#type' => 'value', + '#value' => $queue->qid + ); return confirm_form($form, t('Are you sure you want to delete "%title"?', array('%title' => $queue->title)), - $_GET['destination'] ? $_GET['destination'] : 'admin/content/nodequeue', + isset($_GET['destination']) ? $_GET['destination'] : 'admin/content/nodequeue', t('This action cannot be undone.'), t('Delete'), t('Cancel') ); @@ -947,7 +926,7 @@ function nodequeue_admin_view($queue, $s $qid = $queue->qid; // If the queue has just one subqueue, it gets special treatment. - if (!$subqueue->sqid) { + if (empty($subqueue->sqid)) { if ($queue->subqueues == 1) { $subqueues = nodequeue_load_subqueues_by_queue($queue->qid); $subqueue = array_shift($subqueues); @@ -958,20 +937,21 @@ function nodequeue_admin_view($queue, $s } } else if ($subqueue->sqid) { - if (!nodequeue_api_subqueue_access($subqueue, NULL, $queue)) { + if (!nodequeue_api_subqueue_access($subqueue, NULL, $queue)) { return drupal_not_found(); } // Adjust properties of the page so our subqueue is in the right // visual place. - drupal_set_title(t("Subqueue '@title'", - array('@title' => nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue)))); + drupal_set_title(t("Subqueue '@title'", array('@title' => nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue)))); $breadcrumb = drupal_get_breadcrumb(); - $breadcrumb[] = l($queue->title, "admin/content/nodequeue/$queue->qid"); + $breadcrumb[] = l($queue->title, 'admin/content/nodequeue/'. $queue->qid); drupal_set_breadcrumb($breadcrumb); } + return nodequeue_arrange_subqueue($queue, $subqueue); } +// FIXME: WULFF: remove this function? function nodequeue_arrange_subqueue_entry($queue, $subqueue, $node, $nids_visible = array()) { $qid = $queue->qid; $sqid = $subqueue->sqid; @@ -1018,7 +998,7 @@ function nodequeue_arrange_subqueue_entr $output .= ''. l($node->title, "node/$node->nid") .''; } else { - $output .= '' . t('Restricted Node - NID: @nid', array('@nid' => $node->nid)) .''; + $output .= ''. t('Restricted Node - NID: @nid', array('@nid' => $node->nid)) .''; } $output .= ''. theme('username', $node) .''; $output .= ''. format_date($node->created) .''; @@ -1030,415 +1010,308 @@ function nodequeue_arrange_subqueue_entr /** * View the contents of a subqueue, with links to re-order the queue. */ -function nodequeue_arrange_subqueue($queue, $subqueue) { - $qid = $queue->qid; - $sqid = $subqueue->sqid; - $output = ''; - $body = ''; +function nodequeue_arrange_subqueue($queue, $subqueue = NULL) { + // set title and load subqueue if it's not provided + drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title))); + if (!$subqueue->sqid) { + if ($queue->subqueues == 1) { + $subqueues = nodequeue_load_subqueues_by_queue($queue->qid); + $subqueue = array_shift($subqueues); + } + else { + return drupal_not_found(); + } + } + else if ($subqueue->sqid) { + if (!nodequeue_api_subqueue_access($subqueue, NULL, $queue)) { + return drupal_not_found(); + } + drupal_set_title(t("Subqueue '@title'", array('@title' => nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue)))); + } + + // get nodes from the queue + $nodes = _nodequeue_dragdrop_get_nodes($queue, $subqueue); + + return drupal_get_form('nodequeue_arrange_subqueue_form', $queue, $nodes, $subqueue); +} + +/** + * Return a list of nodes in a specific subqueue. + */ +function _nodequeue_dragdrop_get_nodes($queue, $subqueue) { $order = $queue->reverse ? 'DESC' : 'ASC'; - //Get the list of nodes in the subqueue. - //First, get a list of nodes taking into account node access restrictions. - $nids_visible = nodequeue_nids_visible($subqueue->sqid); - //Then, get an unrestricted list of nodes in the subqueue. - //Titles are not displayed for nodes that are not present in the result set of both queries. - $result = db_query("SELECT DISTINCT(n.nid), n.title, n.uid, u.name, n.created, nq.position FROM {node} n LEFT JOIN {users} u on n.uid = u.uid LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d ORDER BY nq.position $order", $sqid); - $nids = array(); - while ($node = db_fetch_object($result)) { - $nids[$node->position] = $node->nid; - $body .= nodequeue_arrange_subqueue_entry($queue, $subqueue, $node, $nids_visible); + // get a list of nodes taking into account node access restrictions + // titles of restricted nodes are not displayed in the nodequeue table + $node_status_sql = ''; + if (!user_access('administer nodes')) { + $node_status_sql = ' AND n.status = 1'; } + $result = db_query(db_rewrite_sql('SELECT DISTINCT(n.nid) FROM {node} n LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d '. $node_status_sql .' ORDER BY nq.position '. $order), $subqueue->sqid); - $output = '

'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) .'

'; + $visible = array(); + while ($node = db_fetch_object($result)) { + $visible[$node->nid] = $node->nid; + } - $output .= '

'; - $output .= t('Changes made to the queue order and queue removals will not be active until you click Save, below. If you add more nodes than the queue can hold, they will be removed from the @end when you save!', array('@end' => $queue->reverse ? t('bottom') : t('top'))); - $output .= '

'; - - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''. $body .''; - $output .= '
'. t('Node') .''. t('Author') .''. t('Date Created') .''. t('Operation') .'
'; + // get a list of all nodes in the subqueue, regardless of access restrictions + $result = db_query('SELECT DISTINCT(n.nid), n.title, n.uid, u.name, n.created, nq.position FROM {node} n LEFT JOIN {users} u on n.uid = u.uid LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d ORDER BY nq.position '. $order, $subqueue->sqid); - $output .= drupal_get_form('nodequeue_arrange_subqueue_form', $queue, $sqid, $nids); - drupal_add_js(drupal_get_path('module', 'nodequeue') .'/nodequeue.js'); + $nodes = array(); + while ($node = db_fetch_object($result)) { + $node->visible = isset($visible[$node->nid]) ? TRUE : FALSE; + $nodes[] = $node; + } - return $output; + return $nodes; } /** - * Form used for arranging a queue + * Form definition for nodequeue drag'n'drop form. */ -//TODO: Form - Revise for D6 -function nodequeue_arrange_subqueue_form($form_state, $queue, $sqid, $nids) { - $form['qid'] = array( - '#type' => 'value', - '#value' => $queue->qid, - ); +function nodequeue_arrange_subqueue_form($form_state, $queue, $nodes, $subqueue) { + $form = array('#tree' => TRUE); - $form['sqid'] = array( - '#type' => 'hidden', - '#value' => $sqid, - ); + // save queue and subqueue objects for later use + $form['#queue'] = (array) $queue; + $form['#subqueue'] = (array) $subqueue; - $form['order'] = array( - '#type' => 'hidden', - '#id' => 'nodequeue-order', - '#default_value' => implode(',', array_keys($nids)), - ); + // prepare the main part of the form which will be themed as a table + $count = count($nodes); + foreach ($nodes as $node) { + if ($node->visible) { + $title = l($node->title, 'node/'. $node->nid); + } + else { + $title = t('Restricted node, NID: @nid', array('@nid' => $node->nid)); + } + $form[$node->nid]['#node'] = (array) $node; + $form[$node->nid]['title'] = array('#value' => $title); + $form[$node->nid]['author'] = array('#value' => theme('username', $node)); + $form[$node->nid]['date'] = array('#value' => format_date($node->created)); + $form[$node->nid]['edit'] = array('#value' => l(t('edit'), 'node/'. $node->nid .'/edit', array('attributes' => array('title' => t('Edit this node'))))); + $form[$node->nid]['position'] = array( + '#type' => 'position', + '#delta' => $count, + '#default_value' => $node->position, + '#attributes' => array( + 'class' => 'node-position', + ), + ); + + $attr = array( + 'attributes' => array( + 'title' => t('Remove from queue'), + 'style' => 'display: none;', + 'class' => 'nodequeue-remove', + 'id' => 'nodequeue-remove-'. $node->nid, + ), + ); + $form[$node->nid]['remove'] = array('#value' => l(t('remove'), '', $attr)); + } + + // add a textfield for adding nodes to the queue $form['add'] = array( + '#type' => 'markup', + ); + $form['add']['nid'] = array( '#type' => 'textfield', - '#title' => t('Select title to add'), - '#autocomplete_path' => "nodequeue/autocomplete/$sqid", - '#default_value' => '', - ); - - // For use by the validate handler - $form['nid'] = array( - '#type' => 'value', - '#value' => 0, - ); - - $form['add_submit'] = array( - '#type' => 'submit', - '#attributes' => array('class' => 'nodequeue-add'), - '#value' => t('Add'), - '#validate' => array('nodequeue_arrange_subqueue_form_add_validate'), - '#submit' => array('nodequeue_arrange_subqueue_form_add_submit'), + '#autocomplete_path' => 'nodequeue/autocomplete/'. $subqueue->sqid, + '#default_value' => 'Enter the title of a node to add it to the queue', ); - - $form['save'] = array( - '#type' => 'submit', - '#attributes' => array('class' => 'nodequeue-hide-if-not-js-hide nodequeue-save'), - '#value' => t('Save'), - '#validate' => array('nodequeue_arrange_subqueue_form_save_validate'), + $form['add']['submit'] = array( + '#type' => 'submit', + '#value' => t('Add'), + '#submit' => array('nodequeue_arrange_subqueue_form_add_submit'), ); - $form['clear'] = array( - '#type' => 'submit', - '#attributes' => array('class' => 'nodequeue-clear'), - '#value' => t('Clear'), - '#submit' => array('nodequeue_arrange_subqueue_form_clear_submit'), + // add submit, reverse, shuffle, and clear buttons + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save') ); - - $form['reverse_click'] = array( - '#type' => 'submit', - '#attributes' => array('class' => 'nodequeue-reverse'), - '#value' => t('Reverse'), - '#submit' => array('nodequeue_arrange_subqueue_form_submit'), + $form['reverse'] = array( + '#type' => 'submit', + '#value' => t('Reverse'), + '#submit' => array('nodequeue_arrange_subqueue_form_reverse_submit'), ); - $form['shuffle'] = array( - '#type' => 'submit', - '#attributes' => array('class' => 'nodequeue-shuffle'), - '#value' => t('Shuffle'), + '#type' => 'submit', + '#value' => t('Shuffle'), '#submit' => array('nodequeue_arrange_subqueue_form_shuffle_submit'), ); - - // Store the original order. - $form['nids'] = array( - '#type' => 'value', - '#value' => $nids, - ); - - $form['added_nids'] = array( - '#type' => 'hidden', - '#default_value' => '', - ); - - $settings = array( - 'nodequeue-table' => array( - // The gadget that stores our the order of items. - 'order' => 'input#nodequeue-order', - // The buttons that do stuff. - 'up' => 'a.nodequeue-move-up', - 'down' => 'a.nodequeue-move-down', - 'top' => 'a.nodequeue-move-front', - 'bottom' => 'a.nodequeue-move-back', - 'remove' => 'a.nodequeue-remove', - - // The button that adds an item - 'add' => 'input.nodequeue-add', - // The buttom to clear the queue - 'clear_list' => 'input.nodequeue-clear', - // Path for js to shuffle the queue - 'shuffle' => 'input.nodequeue-shuffle', - // Path for js to reverse the queue - 'reverse' => 'input.nodequeue-reverse', - // Path for ajax on adding an item - 'path' => url('nodequeue/ajax/add', array('absolute' => TRUE)), - // Which items to post when adding - 'post' => array('#edit-sqid', '#edit-add'), - // Where to get the id of an item - 'tr' => 'nodequeue-row-', - 'row_class' => 'tr.nodequeue-row', - // Where to put the extra (we're storing a nid) - 'extra' => '#edit-added-nids', - // What item to focus on ready - 'focus' => '#edit-add', - // What item(s) to clear after add - 'clear' => array('#edit-add'), - // What hidden class to show as soon as anything has changed that needs saving. - 'hidden' => '.nodequeue-js-hide', - // Do we add to the top or the bottom? - 'add_location' => $queue->reverse ? 'top' : 'bottom', - ), - ); - drupal_add_js(array('nodequeue' => $settings), 'setting'); - drupal_add_css(drupal_get_path('module', 'nodequeue') .'/nodequeue.css'); - - return $form; -} - -/** - * Implements hook_theme. - * - * @return unknown - */ -function nodequeue_theme() { - return array( - 'nodequeue_arrange_subqueue_form' => array( - 'arguments' => array('form'), - ), - 'nodequeue_subqueue_empty_text' => array( - 'arguments' => array(), - ), - 'nodequeue_subqueue_full_text' => array( - 'arguments' => array(), - ), - 'nodequeue_subqueue_count_text' => array( - 'arguments' => array(), - ), - ); -} - -//TODO: Theme function for Form - do we need to revise? -function theme_nodequeue_arrange_subqueue_form($form) { - $header = array( - check_plain($form['add']['#title']), - '', + $form['clear'] = array( + '#type' => 'submit', + '#value' => t('Clear'), + '#submit' => array('nodequeue_arrange_subqueue_form_clear_submit'), ); - unset($form['add']['#title']); - $rows = array( - drupal_render($form['add']), - array('data' => drupal_render($form['add_submit']), 'width' => '80%'), - ); + // disable all buttons if the queue is empty + if ($count == 0) { + $form['submit']['#disabled'] = TRUE; + $form['reverse']['#disabled'] = TRUE; + $form['shuffle']['#disabled'] = TRUE; + $form['clear']['#disabled'] = TRUE; + } - $output = theme('table', $header, array($rows)); - $output .= drupal_render($form); - return $output; + return $form; } /** - * Validate handler for nodequeue_arrange_subqueue_form + * Validate handler for nodequeue_arrange_subqueue_form. */ function nodequeue_arrange_subqueue_form_validate($form, &$form_state) { - // Default Validator - does nothing -} - -/** - * Validate handler for nodequeue_arrange_subqueue_form for 'Add' button. - * - * @param unknown_type $form_id - * @param unknown_type $form_state - * @param unknown_type $form - */ -function nodequeue_arrange_subqueue_form_add_validate($form, &$form_state) { - $queue = nodequeue_load($form_state['values']['qid']); - $subqueue = nodequeue_load($form_state['values']['sqid']); - $nodes = nodequeue_api_autocomplete($queue, $subqueue, $form_state['values']['add']); - if (empty($nodes) || !is_array($nodes)) { - form_error($form['add'], t('Invalid node')); - return; - } - if (count($nodes) > 1) { - form_error($form['add'], t('That matches too many nodes')); - return; + $positions = array(); + foreach ($form_state['values'] as $nid => $element) { + if (is_numeric($nid) && is_numeric($element['position'])) { + $positions[$nid] = $element['position']; + } } - $keys = array_keys($nodes); - $nid = array_pop($keys); - form_set_value($form['nid'], $nid, $form_state); -} - -/** - * Validate handler for nodequeue_arrange_subqueue_form for 'Save' button. - * - * @param unknown_type $form_id - * @param unknown_type $form_state - * @param unknown_type $form - */ -function nodequeue_arrange_subqueue_form_save_validate($form, &$form_state) { - $nids = $form_state['values']['nids']; - - // We can't use array_merge because it'll reset our keys and we can't - // use + because it will overwrite. - if ($form_state['values']['added_nids']) { - foreach (explode(',', $form_state['values']['added_nids']) as $nid) { - if (empty($nids)) { - $nids[1] = $nid; - } - else { - $nids[max(array_keys($nids)) + 1] = $nid; + if (count(array_unique($positions)) < count($positions)) { + $seen = array(); + foreach ($positions as $nid => $position) { + if (isset($seen[$position])) { + form_set_error($nid .'][position', t('Duplicate position value.')); } + $seen[$position] = TRUE; } } - form_set_value($form['nids'], $nids, $form_state); } /** - * Submit function for nodequeue_arrange_subqueue_form on 'Reverse' button. - * - * Yeah, this just calls the below function with a different parameter, but in D6 we're not supposed to use the $form['ops']. + * Submit handler for nodequeue drag'n'drop reverse button. */ function nodequeue_arrange_subqueue_form_reverse_submit($form, &$form_state) { - nodequeue_arrange_subqueue_form_submit($form, $form_state, TRUE, FALSE); + nodequeue_arrange_subqueue_form_submit($form, $form_state, TRUE); } +/** + * Submit handler for nodequeue drag'n'drop shuffle button. + */ function nodequeue_arrange_subqueue_form_shuffle_submit($form, &$form_state) { nodequeue_arrange_subqueue_form_submit($form, $form_state, FALSE, TRUE); } /** - * Submit function for nodequeue_arrange_subqueue_form + * Submit handler for nodequeue drag'n'drop form. Updates node positions in {nodequeue_nodes}. */ -//TODO: Form Submit - Revise for D6 -function nodequeue_arrange_subqueue_form_submit($form, &$form_state, $reverse=FALSE, $shuffle=FALSE) { - // Add a node to the queue if that's the intention. - $queue = nodequeue_load($form_state['values']['qid']); - $subqueue = nodequeue_load_subqueue($form_state['values']['sqid']); - - db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d", $form_state['values']['sqid']); - if ($form_state['values']['order']) { - $now = time(); - $sql = ''; - $args = array(); - $nids = $form_state['values']['nids']; - $subqueue->count = 0; - $order = explode(',', $form_state['values']['order']); - if ($queue->reverse xor $reverse) { - $order = array_reverse($order); +function nodequeue_arrange_subqueue_form_submit($form, &$form_state, $reverse = FALSE, $shuffle = FALSE) { + $nodes = array(); + foreach ($form_state['values'] as $nid => $element) { + if (is_numeric($nid)) { + $nodes[$form_state['values'][$nid]['position']] = $nid; } + } - foreach ($order as $new_pos => $old_pos) { - if ($sql) { - $sql .= ', '; - } - $sql .= ' (%d, %d, %d, %d, %d)'; - $args[] = $form_state['values']['sqid']; - $args[] = $form_state['values']['qid']; - $args[] = $nids[$old_pos]; - - // $new_pos starts from 0 but we start from 1. - $args[] = $new_pos + 1; - $args[] = $now; - $subqueue->count++; - } - $sql = "INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES $sql"; - db_query($sql, $args); - if ($queue->size) { - // 0 means infinity so never do this if false - nodequeue_check_subqueue_size($queue, $subqueue); + $message = t('The queue has been updated.'); + + if ($reverse || $shuffle) { + $keys = array_keys($nodes); + $values = array_values($nodes); + + // reverse the list if the reverse button was pressed + if ($reverse) { + $values = array_reverse($values); + $message = t('The queue has been reversed.'); } - if ($shuffle) { //$form_values['op'] == t('Shuffle')) { - nodequeue_subqueue_shuffle($subqueue); + + // shuffle the list if the shuffle button was pressed. + if ($shuffle) { + shuffle($values); + $message = t('The queue has been shuffled.'); } + + $nodes = array_combine($keys, $values); } - drupal_set_message(t('The queue has been updated')); -} -function nodequeue_arrange_subqueue_form_clear_submit($form, &$form_state) { - $form_state['redirect'] = 'admin/content/nodequeue/'. $form_state['values']['qid'] .'/clear/'. $form_state['values']['sqid']; -} + $qid = $form['#queue']['qid']; + $sqid = $form['#subqueue']['sqid']; + nodequeue_save_subqueue_order($nodes, $qid, $sqid); -function nodequeue_arrange_subqueue_form_add_submit($form, &$form_state) { - $queue = nodequeue_load($form_state['values']['qid']); - $subqueue = nodequeue_load_subqueue($form_state['values']['sqid']); - - nodequeue_subqueue_add($queue, $subqueue, $form_state['values']['nid']); + drupal_set_message($message); } /** - * Page callback to move an item up in a queue. This will be used only if - * javascript is disabled in the client, and is a fallback technique. - */ -function nodequeue_admin_up($queue, $subqueue, $pos) { - if (!is_numeric($pos) || !is_object($subqueue) || !nodequeue_check_token($pos)) { - return drupal_goto(); - } - // This function is safe if $pos is out of bounds. - if (!$queue->reverse) { - nodequeue_queue_up($subqueue, $pos); - } - else { - nodequeue_queue_down($subqueue, $pos); - } + * Validates new subqueue order information and if it passes validation, + * deletes the old subqueue data from the database and saves the new data. + * + * @param $nodes: + * an array of nodes, keyed on the subqueue position. + * @param $qid + * the queue id + * @param unknown_type $sqid + * the subqueue id + * @return An array where the first element is a numeric status code + * (0 means successfully saved) and the second element is a status message. + */ +function nodequeue_save_subqueue_order($nodes, $qid, $sqid) { + $positions = array(); + $now = time(); - drupal_goto(); -} + $queue = nodequeue_load($qid); + $subqueue = nodequeue_load_subqueue($sqid); -/** - * Page callback to move an item down in a queue. This will be used only if - * javascript is disabled in the client, and is a fallback technique. - */ -function nodequeue_admin_down($queue, $subqueue, $pos) { - if (!is_numeric($pos) || !is_object($subqueue) || !nodequeue_check_token($pos)) { - return drupal_goto(); - } - // This function is safe if $pos is out of bounds. - if ($queue->reverse) { - nodequeue_queue_up($subqueue, $pos); + // cleanup the node array + $clean = array(); + $count = 1; + ksort($nodes); + foreach ($nodes as $pos => $nid) { + if (!is_numeric($nid) || $nid < 1) { + return array(NODEQUEUE_INVALID_NID, 'Invalid nid value. New subqueue order not saved.'); + } + if (is_numeric($pos)) { + $clean[$count] = $nid; + $count++; + } + else if ($pos != 'r') { + return array(NODEQUEUE_INVALID_POSITION, 'Invalid position value. New subqueue order not saved.'); + } } - else { - nodequeue_queue_down($subqueue, $pos); + $nodes = $clean; + + if (count(array_unique($nodes)) < count($nodes)) { + return array(NODEQUEUE_DUPLICATE_POSITION, 'Duplicate position values are not allowed. New subqueue order not saved.'); } - drupal_goto(); -} + // clear the queue and save the new positions + db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d', $sqid); + foreach ($nodes as $pos => $nid) { + $args = array(); + if ($pos != 'r') { + $positions[] = $pos; + $placeholders = ' (%d, %d, %d, %d, %d)'; + $args = array($sqid, $qid, $nid, $pos, $now); + } -/** - * Page callback to move an item to the front of a queue. This will be used - * only if javascript is disabled in the client, and is a fallback technique. - */ -function nodequeue_admin_front($queue, $subqueue, $pos) { - if (!is_numeric($pos) || !is_object($subqueue) || !nodequeue_check_token($pos)) { - return drupal_goto(); - } - // This function is safe if $pos is out of bounds. - if (!$queue->reverse) { - nodequeue_queue_front($subqueue, $pos); + if (!empty($args)) { + $sql = 'INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES '. $placeholders; + db_query($sql, $args); + } } - else { - nodequeue_queue_back($subqueue, $pos); + + if ($queue->size) { + // only necessary if the subqueue is of finite length + nodequeue_check_subqueue_size($queue, $subqueue); } - drupal_goto(); + return array(NODEQUEUE_OK, 'The queue has been updated.'); } -/** - * Page callback to move an item to the back of a queue. This will be used - * only if javascript is disabled in the client, and is a fallback technique. - */ -function nodequeue_admin_back($queue, $subqueue, $pos) { - if (!is_numeric($pos) || !is_object($subqueue) || !nodequeue_check_token($pos)) { - return drupal_goto(); - } - // This function is safe if $pos is out of bounds. - if ($queue->reverse) { - nodequeue_queue_front($subqueue, $pos); - } - else { - nodequeue_queue_back($subqueue, $pos); +function nodequeue_arrange_subqueue_form_clear_submit($form, &$form_state) { + $form_state['redirect'] = 'admin/content/nodequeue/'. $form['#queue']['qid'] .'/clear/'. $form['#subqueue']['sqid']; +} + +function nodequeue_arrange_subqueue_form_add_submit($form, &$form_state) { + $queue = nodequeue_load($form['#queue']['qid']); + $subqueue = nodequeue_load_subqueue($form['#subqueue']['sqid']); + + if (!empty($form_state['values']['add']['nid'])) { + preg_match('/\[nid: (\d+)\]$/', $form_state['values']['add']['nid'], $matches); + $nid = $matches[1]; } - drupal_goto(); + nodequeue_subqueue_add($queue, $subqueue, $nid); } /** @@ -1461,18 +1334,20 @@ function nodequeue_admin_remove($queue, /** * Confirm form to clear a queue. */ -//TODO: Form - Revise for D6. function nodequeue_clear_confirm(&$form_state, $queue, $subqueue) { - if (!is_numeric($subqueue)) { - return false; + if (empty($subqueue)) { + return; } + drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title))); + + $form['qid'] = array('#type' => 'value', '#value' => $queue->qid); $form['sqid'] = array('#type' => 'value', '#value' => $subqueue->sqid); - $form['qid'] = array('#type' => 'value', '#value' => $queue->qid); + return confirm_form($form, - t('Clearing queue "%s" is irreversible. You sure?', array('%s' => nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue))), - $_GET['destination'] ? $_GET['destination'] : "admin/content/nodequeue/$queue->qid/view/$subqueue->sqid", - t('This action cannot be undone.'), + t('Are you sure you want to clear the nodequeue %queue?', array('%queue' => nodequeue_title_substitute($queue->subqueue_title, $queue, $subqueue))), + isset($_GET['destination']) ? $_GET['destination'] : 'admin/content/nodequeue/'. $queue->qid .'/view/'. $subqueue->sqid, + t('This action will remove all nodes from the queue and cannot be undone.'), t('Clear'), t('Cancel') ); } @@ -1480,11 +1355,11 @@ function nodequeue_clear_confirm(&$form_ /** * Submit function for nodequeue clear confirm */ -//TODO: Form Submit - Revise for D6 function nodequeue_clear_confirm_submit($form, &$form_state) { if ($form_state['values']['confirm']) { nodequeue_queue_clear($form_state['values']['sqid']); - $form_state['redirect'] = "admin/content/nodequeue/". $form_state['values']['qid'] ."/view/". $form_state['values']['sqid']; + drupal_set_message(t('The queue has been cleared.')); + $form_state['redirect'] = 'admin/content/nodequeue/'. $form_state['values']['qid'] .'/view/'. $form_state['values']['sqid']; } } @@ -1492,10 +1367,8 @@ function nodequeue_clear_confirm_submit( * Page callback for autocomplete. */ function nodequeue_autocomplete($sqid = NULL, $string = NULL) { - $output = _nodequeue_autocomplete($sqid, $string); - - drupal_json(drupal_map_assoc($output)); - exit; + $matches = _nodequeue_autocomplete($sqid, $string); + drupal_json(drupal_map_assoc($matches)); } function _nodequeue_autocomplete($sqid, $string) { @@ -1532,6 +1405,7 @@ function nodequeue_ajax_add() { exit; } +// FIXME: WULFF: re-add this to the nodequeue form function _nodequeue_ajax_add($sqid, $position, $string) { if (!$string) { return array('error' => t('Invalid input')); @@ -1554,7 +1428,7 @@ function _nodequeue_ajax_add($sqid, $pos if (!nodequeue_api_subqueue_access($subqueue)) { return array('error' => t('Access denied')); } - + $nodes = nodequeue_api_autocomplete($queue, $subqueue, $string); if (empty($nodes) || !is_array($nodes)) { return array('error' => t('Invalid node')); @@ -1575,14 +1449,15 @@ function _nodequeue_ajax_add($sqid, $pos $nids_visible = nodequeue_nids_visible($subqueue->sqid); return array( 'status' => 1, - 'extra' => $node->nid, - 'max' => $queue->size, - 'data' => nodequeue_arrange_subqueue_entry($queue, $subqueue, $node, $nids_visible), + 'extra' => $node->nid, + 'max' => $queue->size, + 'data' => nodequeue_arrange_subqueue_entry($queue, $subqueue, $node, $nids_visible), ); } -/* - * Get the list of nodes in the subqueue, taking into account node access restrictions. +/** + * Get the list of nodes in the subqueue, taking into account node access + * restrictions. */ function nodequeue_nids_visible($sqid = -1, $account = NULL) { if (!$account) { @@ -1594,14 +1469,14 @@ function nodequeue_nids_visible($sqid = $node_status_sql = ' AND n.status = 1'; } - $query_restricted = db_query(db_rewrite_sql("SELECT DISTINCT(n.nid) FROM {node} n LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d $node_status_sql ORDER BY nq.position $order"), $sqid); + $query_restricted = db_query(db_rewrite_sql("SELECT DISTINCT(n.nid) FROM {node} n LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d $node_status_sql ORDER BY nq.position $order"), $sqid); while ($result_restricted = db_fetch_object($query_restricted)) { $nids_visible[$result_restricted->nid] = $result_restricted->nid; } return $nids_visible; } -// -------------------------------------------------------------------------- -// Nodequeue manipulation API. + +/* --- NODEQUEUE MANIPULATION API ------------------------------------------- */ /** * @defgroup nodequeue_api @@ -1693,12 +1568,12 @@ function nodequeue_load_queues_by_type($ * @param unknown_type $queue * @return unknown */ -function nodequeue_node_and_queue_access($node, $queue, $subqueue = NULL) { +function nodequeue_node_and_queue_access($node, $queue, $subqueue = NULL) { return nodequeue_node_access($node->type) && nodequeue_queue_access($queue, $subqueue); } function nodequeue_node_tab_access($node) { - if (!user_access('manipulate queues')) { + if (!user_access('manipulate queues')) { //For performance reasons: If the user can't manipulate queues, there is no reason to run the rest of these queries. return FALSE; } @@ -1738,7 +1613,8 @@ function nodequeue_node_access($type, $l * Filter a list of qids returned by nodequeue_get_qids to a location. * * @param $qids - * An array of $qids from @see nodequeue_get_qids() + * An array of $qids from + * @see nodequeue_get_qids() * @param $location * One of: * - 'links': Only check for queues that have node links. @@ -1746,7 +1622,7 @@ function nodequeue_node_access($type, $l * - 'ui': Only check for queues that appear in the UI. */ function nodequeue_filter_qids(&$qids, $location) { - $var = "show_in_$location"; + $var = 'show_in_'. $location; foreach ($qids as $qid => $info) { if (empty($info->$var)) { unset($qids[$qid]); @@ -1765,7 +1641,7 @@ function nodequeue_filter_qids(&$qids, $ * @return $qids * An array in the format: @code { array($qid => array('qid' => $qid, 'show_in_tab' ' * => true/false, 'show_in_links' => true/false } - * + * * @param $bypass_cache * Boolean value indicating whether to bypass the cache or not. */ @@ -1782,10 +1658,10 @@ function nodequeue_get_qids($type, $acco // superuser always has access. if (!user_access('manipulate all queues', $account)) { - $roles_join = "INNER JOIN {nodequeue_roles} nr ON nr.qid = nq.qid "; + $roles_join = 'INNER JOIN {nodequeue_roles} nr ON nr.qid = nq.qid '; $roles = array_keys((array) $account->roles) + array(DRUPAL_AUTHENTICATED_RID); - $roles_where .= "AND nr.rid IN (". db_placeholders($roles, 'int') .")"; + $roles_where .= 'AND nr.rid IN ('. db_placeholders($roles, 'int') .')'; } $sql = 'SELECT nq.qid, nq.show_in_tab, nq.show_in_links, nq.show_in_ui, nq.i18n '. @@ -1852,7 +1728,7 @@ function nodequeue_get_all_qids($page_si * * @param $qids * An array of queue IDs to load. - * + * * @param $bypass_cache * Boolean value indicating whether to bypass the cache or not. */ @@ -1868,7 +1744,7 @@ function nodequeue_load_queues($qids = a if (!empty($to_load)) { $placeholders = db_placeholders($to_load, 'int'); - $result = db_query("SELECT q.*, COUNT(s.sqid) AS subqueues FROM {nodequeue_queue} q LEFT JOIN {nodequeue_subqueue} s ON q.qid = s.qid WHERE q.qid IN ($placeholders) GROUP BY q.qid", $to_load); + $result = db_query('SELECT q.*, COUNT(s.sqid) AS subqueues FROM {nodequeue_queue} q LEFT JOIN {nodequeue_subqueue} s ON q.qid = s.qid WHERE q.qid IN ('. $placeholders .') GROUP BY q.qid', $to_load); while ($queue = db_fetch_object($result)) { $loaded[$queue->qid] = $queue; // ensure valid defaults: @@ -1877,12 +1753,12 @@ function nodequeue_load_queues($qids = a $loaded[$queue->qid]->count = 0; } - $result = db_query("SELECT qid, rid FROM {nodequeue_roles} WHERE qid IN ($placeholders)", $to_load); + $result = db_query('SELECT qid, rid FROM {nodequeue_roles} WHERE qid IN ('. $placeholders .')', $to_load); while ($obj = db_fetch_object($result)) { $loaded[$obj->qid]->roles[] = $obj->rid; } - $result = db_query("SELECT qid, type FROM {nodequeue_types} WHERE qid IN ($placeholders)", $to_load); + $result = db_query('SELECT qid, type FROM {nodequeue_types} WHERE qid IN ('. $placeholders .')', $to_load); while ($obj = db_fetch_object($result)) { $loaded[$obj->qid]->types[] = $obj->type; } @@ -1952,7 +1828,7 @@ function nodequeue_load_subqueues($sqids if (!empty($to_load)) { $placeholders = db_placeholders($to_load, 'int'); - $result = db_query("SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.sqid IN ($placeholders) GROUP BY s.sqid", $to_load); + $result = db_query('SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.sqid IN ('. $placeholders .') GROUP BY s.sqid', $to_load); while ($obj = db_fetch_object($result)) { // Sometimes we want to get to subqueues by reference, sometimes by sqid. // sqid is always unique, but reference is sometimes more readily available. @@ -1981,7 +1857,6 @@ function nodequeue_load_subqueue($sqid, if ($subqueues) { return array_shift($subqueues); } - } /** @@ -2005,7 +1880,7 @@ function nodequeue_load_subqueues_by_que return array(); } - $query = "SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN (". db_placeholders($qids, 'int') .") GROUP BY s.sqid"; + $query = 'SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN ('. db_placeholders($qids, 'int') .') GROUP BY s.sqid'; if ($page_size) { $result = pager_query($query, $page_size, 0, $qids); } @@ -2072,7 +1947,7 @@ function nodequeue_load_subqueues_by_ref $where .= 's.qid = %d AND s.reference IN ('. implode(', ', $key_list) .')'; } - $result = db_query("SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE $where GROUP BY s.sqid", $values); + $result = db_query('SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE '. $where .' GROUP BY s.sqid', $values); while ($subqueue = db_fetch_object($result)) { $cache[$subqueue->qid][$subqueue->reference] = $subqueues[$subqueue->sqid] = $subqueue; @@ -2095,13 +1970,13 @@ function nodequeue_save(&$queue) { } else { db_query("UPDATE {nodequeue_queue} set size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid); - db_query("DELETE FROM {nodequeue_roles} WHERE qid = %d", $queue->qid); - db_query("DELETE FROM {nodequeue_types} WHERE qid = %d", $queue->qid); + db_query('DELETE FROM {nodequeue_roles} WHERE qid = %d', $queue->qid); + db_query('DELETE FROM {nodequeue_types} WHERE qid = %d', $queue->qid); } if (is_array($queue->roles)) { foreach ($queue->roles as $rid) - db_query("INSERT INTO {nodequeue_roles} (qid, rid) VALUES (%d, %d)", $queue->qid, $rid); + db_query('INSERT INTO {nodequeue_roles} (qid, rid) VALUES (%d, %d)', $queue->qid, $rid); } if (is_array($queue->types)) { @@ -2135,11 +2010,11 @@ function nodequeue_save(&$queue) { * Delete a nodequeue. */ function nodequeue_delete($qid) { - db_query("DELETE FROM {nodequeue_queue} WHERE qid = %d", $qid); - db_query("DELETE FROM {nodequeue_roles} WHERE qid = %d", $qid); - db_query("DELETE FROM {nodequeue_types} WHERE qid = %d", $qid); - db_query("DELETE FROM {nodequeue_nodes} WHERE qid = %d", $qid); - db_query("DELETE FROM {nodequeue_subqueue} WHERE qid = %d", $qid); + db_query('DELETE FROM {nodequeue_queue} WHERE qid = %d', $qid); + db_query('DELETE FROM {nodequeue_roles} WHERE qid = %d', $qid); + db_query('DELETE FROM {nodequeue_types} WHERE qid = %d', $qid); + db_query('DELETE FROM {nodequeue_nodes} WHERE qid = %d', $qid); + db_query('DELETE FROM {nodequeue_subqueue} WHERE qid = %d', $qid); } /** @@ -2153,7 +2028,7 @@ function nodequeue_delete($qid) { */ function nodequeue_add_subqueue(&$queue, $title, $reference = NULL) { if (empty($reference)) { - $insert_reference = ""; + $insert_reference = ''; } else { $insert_reference = $reference; @@ -2192,11 +2067,10 @@ function nodequeue_subqueue_update_title */ function nodequeue_remove_subqueue($sqid) { nodequeue_queue_clear($sqid); - db_query("DELETE FROM {nodequeue_subqueue} WHERE sqid = %d", $sqid); + db_query('DELETE FROM {nodequeue_subqueue} WHERE sqid = %d', $sqid); } -// -------------------------------------------------------------------------- -// Queue position control +/* --- QUEUE POSITION CONTROL ----------------------------------------------- */ /** * Add a node to a queue. @@ -2213,12 +2087,12 @@ function nodequeue_subqueue_add($queue, // If adding this would make the queue too big, pop the front node // (or nodes) out. - if ($queue->size) { + if (!empty($queue->size)) { // 0 means infinity so never do this if false nodequeue_check_subqueue_size($queue, $subqueue, $queue->size - 1); } - db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)", $subqueue->sqid, $queue->qid, $nid, $subqueue->count + 1, time()); + db_query('INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)', $subqueue->sqid, $queue->qid, $nid, $subqueue->count + 1, time()); $subqueue->count++; if (module_exists('apachesolr')) { apachesolr_mark_node($nid); @@ -2243,11 +2117,14 @@ function nodequeue_subqueue_remove_node( } } } + /** * Remove a node or node(s) from a nodequeue by position. * * If you know the nid but but not the position, use - * @see nodequeue_subqueue_remove_node() instead. + * nodequeue_subqueue_remove_node() instead. + * + * @see nodequeue_subqueue_remove_node() * * @param $sqid * The subqueue to remove nodes from. @@ -2265,8 +2142,8 @@ function nodequeue_subqueue_remove($sqid } $diff = $end - $start + 1; - db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position >= %d AND position <= %d", $sqid, $start, $end); - db_query("UPDATE {nodequeue_nodes} SET position = position - %d WHERE sqid = %d AND position > %d", $diff, $sqid, $end); + db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position >= %d AND position <= %d', $sqid, $start, $end); + db_query('UPDATE {nodequeue_nodes} SET position = position - %d WHERE sqid = %d AND position > %d', $diff, $sqid, $end); } /** @@ -2276,7 +2153,7 @@ function nodequeue_subqueue_remove($sqid * The sqid to empty. */ function nodequeue_queue_clear($sqid) { - db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d", $sqid); + db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d', $sqid); } /** @@ -2323,13 +2200,13 @@ function nodequeue_check_subqueue_sizes( */ function nodequeue_queue_swap($subqueue, $pos1, $pos2) { // Grab the nid off one of the positions so we can more easily swap. - $nid = db_result(db_query("SELECT nid FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d", $subqueue->sqid, $pos1)); + $nid = db_result(db_query('SELECT nid FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d', $subqueue->sqid, $pos1)); if (!$nid) { return; } - db_query("UPDATE {nodequeue_nodes} SET position = %d WHERE position = %d AND sqid = %d", $pos1, $pos2, $subqueue->sqid); - db_query("UPDATE {nodequeue_nodes} SET position = %d WHERE nid = %d AND sqid = %d", $pos2, $nid, $subqueue->sqid); + db_query('UPDATE {nodequeue_nodes} SET position = %d WHERE position = %d AND sqid = %d', $pos1, $pos2, $subqueue->sqid); + db_query('UPDATE {nodequeue_nodes} SET position = %d WHERE nid = %d AND sqid = %d', $pos2, $nid, $subqueue->sqid); } /** @@ -2356,10 +2233,10 @@ function nodequeue_queue_down($subqueue, function nodequeue_queue_front($subqueue, $position) { if ($position < 2 || $position > $subqueue->count) return; - $entry = db_fetch_object(db_query("SELECT * FROM {nodequeue_nodes} WHERE sqid= %d AND position = %d", $subqueue->sqid, $position)); - db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d", $subqueue->sqid, $position); - db_query("UPDATE {nodequeue_nodes} SET position = position + 1 WHERE sqid= %d AND position < %d", $subqueue->sqid, $position); - db_query("INSERT INTO {nodequeue_nodes} (qid, sqid, nid, position, timestamp) VALUES (%d, %d, %d, 1, %d)", $entry->qid, $subqueue->sqid, $entry->nid, $entry->timestamp); + $entry = db_fetch_object(db_query('SELECT * FROM {nodequeue_nodes} WHERE sqid= %d AND position = %d', $subqueue->sqid, $position)); + db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d', $subqueue->sqid, $position); + db_query('UPDATE {nodequeue_nodes} SET position = position + 1 WHERE sqid= %d AND position < %d', $subqueue->sqid, $position); + db_query('INSERT INTO {nodequeue_nodes} (qid, sqid, nid, position, timestamp) VALUES (%d, %d, %d, 1, %d)', $entry->qid, $subqueue->sqid, $entry->nid, $entry->timestamp); } /** @@ -2368,10 +2245,10 @@ function nodequeue_queue_front($subqueue function nodequeue_queue_back($subqueue, $position) { if ($position < 1 || $position >= $subqueue->count) return; - $entry = db_fetch_object(db_query("SELECT * FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d", $subqueue->sqid, $position)); - db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d", $subqueue->sqid, $position); - db_query("UPDATE {nodequeue_nodes} SET position = position - 1 WHERE sqid = %d AND position > %d", $subqueue->sqid, $position); - db_query("INSERT INTO {nodequeue_nodes} (qid, sqid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)", $entry->qid, $subqueue->sqid, $entry->nid, $subqueue->count, $entry->timestamp); + $entry = db_fetch_object(db_query('SELECT * FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d', $subqueue->sqid, $position)); + db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position = %d', $subqueue->sqid, $position); + db_query('UPDATE {nodequeue_nodes} SET position = position - 1 WHERE sqid = %d AND position > %d', $subqueue->sqid, $position); + db_query('INSERT INTO {nodequeue_nodes} (qid, sqid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)', $entry->qid, $subqueue->sqid, $entry->nid, $subqueue->count, $entry->timestamp); } /** @@ -2380,7 +2257,7 @@ function nodequeue_queue_back($subqueue, function nodequeue_get_subqueue_position($sqid, $nid) { // We use MIN to make sure we always get the closes to the front of the // queue in case the queue has nodes in it multiple times. - $pos = db_result(db_query("SELECT MIN(position) FROM {nodequeue_nodes} WHERE sqid = %d AND nid = %d", $sqid, $nid)); + $pos = db_result(db_query('SELECT MIN(position) FROM {nodequeue_nodes} WHERE sqid = %d AND nid = %d', $sqid, $nid)); return $pos; } @@ -2391,7 +2268,7 @@ function nodequeue_set_subqueue_position $placeholders = db_placeholders($subqueues, 'int'); $args = array_keys($subqueues); $args[] = $nid; - $result = db_query("SELECT sqid, MIN(position) AS position FROM {nodequeue_nodes} WHERE sqid IN ($placeholders) AND nid = %d GROUP BY sqid", $args); + $result = db_query('SELECT sqid, MIN(position) AS position FROM {nodequeue_nodes} WHERE sqid IN ('. $placeholders .') AND nid = %d GROUP BY sqid', $args); while ($obj = db_fetch_object($result)) { $subqueues[$obj->sqid]->position = $obj->position; } @@ -2419,10 +2296,11 @@ function nodequeue_get_subqueues_by_node if (empty($references)) { return; } + // only allow the static cache to be used if the nid is the same as the last $subqueues = nodequeue_load_subqueues_by_reference($references, ($last_nid != $node->nid)); $last_nid = $node->nid; - + return $subqueues; } @@ -2447,18 +2325,6 @@ function nodequeue_subqueue_size_text($m return $message; } -function theme_nodequeue_subqueue_empty_text() { - return t('Queue empty'); -} - -function theme_nodequeue_subqueue_full_text() { - return t('Queue full'); -} - -function theme_nodequeue_subqueue_count_text($count) { - return t('@count in queue', array('@count' => $count)); -} - /** * Substitute the subqueue title into some other string. * @@ -2500,11 +2366,10 @@ function nodequeue_subqueue_shuffle($sub * @} End of defgroup "nodequeue_api" */ -// -------------------------------------------------------------------------- -// Hooks to implement the default nodequeue type. +/* --- DEFAULT NODEQUEUE TYPE ----------------------------------------------- */ /** - * Implementation of hook_nodequeue_info() + * Implementation of hook_nodequeue_info(). */ function nodequeue_nodequeue_info() { return array('nodequeue' => array( @@ -2514,7 +2379,7 @@ function nodequeue_nodequeue_info() { } /** - * Implementation of hook_nodequeue_form_submit() + * Implementation of hook_nodequeue_form_submit(). */ function nodequeue_nodequeue_form_submit(&$queue, $form_state) { // This will add a single subqueue to our new queue. @@ -2524,18 +2389,17 @@ function nodequeue_nodequeue_form_submit } } -// -------------------------------------------------------------------------- -// External queue fetching +/* --- EXTERNAL QUEUE FETCHING ---------------------------------------------- */ /** * in general it's preferable to use Views for this functionality. */ -function nodequeue_node_titles($sqid, $title = '', $backward = true, $from = 0, $count = 0, $published_only = FALSE) { - $orderby = ($backward ? "DESC" : "ASC"); +function nodequeue_node_titles($sqid, $title = '', $backward = TRUE, $from = 0, $count = 0, $published_only = TRUE) { + $orderby = ($backward ? 'DESC' : 'ASC'); if ($published_only) { $published_sql = 'AND n.status = 1'; } - $sql = db_rewrite_sql("SELECT n.nid, n.title FROM {node} n LEFT JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d $published_sql ORDER BY nn.position $orderby"); + $sql = db_rewrite_sql('SELECT n.nid, n.title FROM {node} n LEFT JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d '. $published_sql .' ORDER BY nn.position '. $orderby); if ($count) { $result = db_query_range($sql, $sqid, $from, $count); } @@ -2559,12 +2423,12 @@ function nodequeue_view_nodes($sqid, $ba /** * Load an array of node objects belonging to a particular nodequeue. */ -function nodequeue_load_nodes($sqid, $backward = FALSE, $from = 0, $count = 5, $published_only = FALSE) { - $orderby = ($backward ? "DESC" : "ASC"); +function nodequeue_load_nodes($sqid, $backward = FALSE, $from = 0, $count = 5, $published_only = TRUE) { + $orderby = ($backward ? 'DESC' : 'ASC'); if ($published_only) { $published_sql = 'AND n.status = 1'; } - $sql = db_rewrite_sql("SELECT n.nid FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d $published_sql ORDER BY nn.position $orderby"); + $sql = db_rewrite_sql('SELECT n.nid FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d '. $published_sql .' ORDER BY nn.position '. $orderby); if ($count) { $result = db_query_range($sql, $sqid, $from, $count); } @@ -2597,7 +2461,7 @@ function nodequeue_load_back($sqid, $tea * View a random node from a queue */ function nodequeue_view_random_node($sqid, $teaser = TRUE, $links = TRUE) { - $count = db_result(db_query(db_rewrite_sql("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d AND n.status = 1"), $sqid)); + $count = db_result(db_query(db_rewrite_sql('SELECT COUNT(n.nid) FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d AND n.status = 1'), $sqid)); return nodequeue_view_nodes($sqid, FALSE, $teaser, $links, rand(0, $count - 1), 1); } @@ -2605,15 +2469,15 @@ function nodequeue_view_random_node($sqi * Load a random node object from a queue */ function nodequeue_load_random_node($sqid) { - $count = db_result(db_query(db_rewrite_sql("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d AND n.status = 1"), $sqid)); + $count = db_result(db_query(db_rewrite_sql('SELECT COUNT(n.nid) FROM {node} n INNER JOIN {nodequeue_nodes} nn ON n.nid = nn.nid WHERE nn.sqid = %d AND n.status = 1'), $sqid)); return array_shift(nodequeue_load_nodes($sqid, TRUE, rand(0, $count - 1), 1)); } /** -* Get the position of a node in a subqueue, or FALSE if not found. -*/ + * Get the position of a node in a subqueue, or FALSE if not found. + */ function nodequeue_subqueue_position($sqid, $nid) { - return db_result(db_query("SELECT position FROM {nodequeue_nodes} WHERE sqid = %d AND nid = %d", $sqid, $nid)); + return db_result(db_query('SELECT position FROM {nodequeue_nodes} WHERE sqid = %d AND nid = %d', $sqid, $nid)); } /** @@ -2621,12 +2485,11 @@ function nodequeue_subqueue_position($sq * subqueue or the results of this function will be unpredictable. */ function nodequeue_queue_position($qid, $nid) { - $sqid = db_result(db_query_range("SELECT sqid FROM {nodequeue_subqueue} WHERE qid = %d", $qid, 0, 1)); + $sqid = db_result(db_query_range('SELECT sqid FROM {nodequeue_subqueue} WHERE qid = %d', $qid, 0, 1)); return nodequeue_subqueue_position($sqid, $nid); } -// -------------------------------------------------------------------------- -// API for modules implementing subqueues. +/* --- API ------------------------------------------------------------------ */ /** * Send the nodequeue edit form to the owning module for modification. @@ -2636,9 +2499,8 @@ function nodequeue_queue_position($qid, * @param &$form * The form. This may be modified. */ -//TODO: Form modifying code - Modify for D6? function nodequeue_api_queue_form($queue, &$form) { - $function = $queue->owner ."_nodequeue_form"; + $function = $queue->owner .'_nodequeue_form'; if (function_exists($function)) { $function($queue, $form); } @@ -2655,7 +2517,7 @@ function nodequeue_api_queue_form($queue * The actual form object. This may be modified. */ function nodequeue_api_queue_form_validate($queue, &$form_state, &$form) { - $function = $queue->owner ."_nodequeue_form_validate"; + $function = $queue->owner .'_nodequeue_form_validate'; if (function_exists($function)) { $function($queue, $form_state, $form); } @@ -2671,7 +2533,7 @@ function nodequeue_api_queue_form_valida * The form values that were submitted. */ function nodequeue_api_queue_form_submit(&$queue, &$form_state) { - $function = $queue->owner ."_nodequeue_form_submit"; + $function = $queue->owner .'_nodequeue_form_submit'; if (function_exists($function)) { $function($queue, $form_state); } @@ -2688,7 +2550,7 @@ function nodequeue_api_queue_form_submit * The form values that were submitted. */ function nodequeue_api_queue_form_submit_finish($queue, &$form_state) { - $function = $queue->owner ."_nodequeue_form_submit_finish"; + $function = $queue->owner .'_nodequeue_form_submit_finish'; if (function_exists($function)) { $function($queue, $form_state); } @@ -2702,12 +2564,11 @@ function nodequeue_api_queue_form_submit * The queue being edited. * @param $node * The loaded node object being checked. - * * @return * An array of subqueues. This will be keyed by $sqid. */ function nodequeue_api_subqueues(&$queue, $node) { - $function = $queue->owner ."_nodequeue_subqueues"; + $function = $queue->owner .'_nodequeue_subqueues'; // This will return an array of references. if (function_exists($function)) { return $function($queue, $node); @@ -2727,7 +2588,6 @@ function nodequeue_api_subqueues(&$queue * The subqueue * @param $string * The string being matched. - * * @return * An keyed array $nid => $title */ @@ -2742,7 +2602,7 @@ function nodequeue_api_autocomplete($que $where = 'n.status = 1 AND '; } - $where .= "n.type IN (". db_placeholders($queue->types, 'varchar') .')'; + $where .= 'n.type IN ('. db_placeholders($queue->types, 'varchar') .')'; $where_args = $queue->types; // Run a match to see if they're specifying by nid. @@ -2754,7 +2614,7 @@ function nodequeue_api_autocomplete($que if ($match) { // If it found a nid via specification, reduce our resultset to just that nid. - $where .= " AND n.nid = %d"; + $where .= ' AND n.nid = %d'; array_push($where_args, $preg_matches[1]); } else { @@ -2764,14 +2624,14 @@ function nodequeue_api_autocomplete($que } // Call to the API. - $function = $queue->owner ."_nodequeue_autocomplete"; + $function = $queue->owner .'_nodequeue_autocomplete'; if (function_exists($function)) { return $function($queue, $subqueue, $string, $where, $where_args); } else { - $result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title FROM {node} n WHERE $where"), $where_args, 0, 10); + $result = db_query_range(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n WHERE '. $where), $where_args, 0, 10); while ($node = db_fetch_object($result)) { - $matches[$node->nid] = check_plain($node->title) ." [nid: $node->nid]"; + $matches[$node->nid] = check_plain($node->title) .' [nid: '. $node->nid .']'; } } @@ -2793,7 +2653,7 @@ function nodequeue_api_queue_access($que } if ($queue->owner != 'nodequeue') { // Avoids an infinite loop. - $function = $queue->owner . '_queue_access'; + $function = $queue->owner .'_queue_access'; if (function_exists($function)) { $access = $function($queue, $account); } @@ -2814,12 +2674,12 @@ function nodequeue_api_subqueue_access($ global $user; $account = $user; } - + if (!$queue) { $queue = nodequeue_load($subqueue->qid); } - $function = $queue->owner . '_subqueue_access'; + $function = $queue->owner .'_subqueue_access'; if (function_exists($function)) { $access = $function($subqueue, $account, $queue); } @@ -2830,27 +2690,30 @@ function nodequeue_api_subqueue_access($ return $access; } + /** * Form builder for the nodequeue settings tab. */ function nodequeue_admin_settings() { $form = array(); + $form['nodequeue_use_tab'] = array( - '#type' => 'checkbox', - '#title' => t('Create a menu tab for each node that could belong to any queues'), + '#type' => 'checkbox', + '#title' => t('Create a menu tab for each node that could belong to any queues'), '#default_value' => variable_get('nodequeue_use_tab', 1), ); $form['nodequeue_tab_display_max'] = array( - '#type' => 'checkbox', - '#title' => t('Include a column on the nodequeue tab for the maximum number of nodes in each queue'), + '#type' => 'checkbox', + '#title' => t('Include a column on the nodequeue tab for the maximum number of nodes in each queue'), '#default_value' => variable_get('nodequeue_tab_display_max', 1), ); $form['nodequeue_tab_name'] = array( - '#type' => 'textfield', - '#title' => t('Nodequeue tab label'), + '#type' => 'textfield', + '#title' => t('Nodequeue tab label'), '#default_value' => variable_get('nodequeue_tab_name', t('Nodequeue')), - '#description' => t('If nodes will have a menu tab for manipulating related nodequeues, what should that tab be called?'), + '#description' => t('If nodes will have a menu tab for manipulating related nodequeues, what should that tab be called?'), ); + return system_settings_form($form); } @@ -2894,3 +2757,150 @@ function nodequeue_get_token($nid) { function nodequeue_check_token($seed) { return drupal_get_token($seed) == $_GET['token']; } + +/* --- UTILITY -------------------------------------------------------------- */ + +/** + * Print the JSON output for our AJAX calls. + */ +function nodequeue_js_output($label, $href, $count = NULL, $sqid = NULL) { + $return = new stdClass(); + $return->status = 1; + $return->label = check_plain($label); + $return->href = $href; + if (isset($count)) { + $return->count = $count; + } + if (isset($sqid)) { + $return->sqid = $sqid; + } + + drupal_json($return); + exit; +} + +/** + * Return content id based on i18n settings + */ +function nodequeue_get_content_id($queue, $node) { + return ($queue->i18n && !empty($node->tnid)) ? $node->tnid : $node->nid; +} + +/** + * Helper function - since hook_menu now takes a function instead of a boolean, + * this function is used to compute the user's access. + * + * @return boolean + */ +function _nodequeue_access_admin_or_manipulate() { + return user_access('administer nodequeue') || user_access('manipulate queues'); +} + +/** + * Return the apachesolr index key for group id + */ +function _nodequeue_solr_qid_key() { + $qid_key = array( + 'index_type' => 'sint', + 'multiple' => TRUE, + 'name' => 'nodequeue', + ); + + return apachesolr_index_key($qid_key); +} + +/* --- THEME ---------------------------------------------------------------- */ + +/** + * Theme the subqueue overview as a sortable list. + * + * @ingroup themeable + */ +function theme_nodequeue_arrange_subqueue_form($form) { + $output = ''; + + $subqueue = $form['#subqueue']; + + // get css to hide some of the help text if javascript is disabled + drupal_add_css(drupal_get_path('module', 'nodequeue') .'/nodequeue.css'); + + // TODO: Would be nice to expose qid, sqid, reference as classes for more custom theming :). + // TODO: Create unique ID to make multiple tabledrag forms on a page possible + drupal_add_tabledrag('nodequeue-dragdrop', 'order', 'sibling', 'node-position'); + drupal_add_js(drupal_get_path('module', 'nodequeue') .'/nodequeue_dragdrop.js'); + + drupal_add_js(array('nodequeue' => array('reverse' => (bool) $form['#queue']['reverse'])), 'setting'); + + // render form as table rows + $rows = array(); + $counter = 1; + foreach (element_children($form) as $key) { + if (isset($form[$key]['title'])) { + $row = array(); + + $row[] = drupal_render($form[$key]['title']); + $row[] = drupal_render($form[$key]['author']); + $row[] = drupal_render($form[$key]['date']); + $row[] = drupal_render($form[$key]['position']); + $row[] = drupal_render($form[$key]['edit']); + $row[] = drupal_render($form[$key]['remove']); + $row[] = array( + 'data' => $counter, + 'class' => 'position' + ); + + $rows[] = array( + 'data' => $row, + 'class' => 'draggable', + ); + } + + $counter++; + } + if (empty($rows)) { + $rows[] = array(array('data' => t('No nodes in this queue.'), 'colspan' => '6')); + } + + // render the main nodequeue table + $header = array(t('Title'), t('Author'), t('Date'), t('Position'), array('data' => t('Operations'), 'colspan' => '2'), t('#')); + $output .= theme('table', $header, $rows, array('id' => 'nodequeue-dragdrop', 'class' => 'nodequeue-dragdrop')); + + // render the autocomplete field for adding a node to the table + $rows = $row = array(); + $row[] = drupal_render($form['add']['nid']); + $row[] = array('data' => drupal_render($form['add']['submit']), 'class' => 'nodequeue-add-submit'); + $rows[] = $row; + $output .= theme('table', array(), $rows); + + // render the remaining form elements + $output .= drupal_render($form); + + return $output; +} + +/** + * Return a "queue is empty" message. + * + * @ingroup themeable + */ +function theme_nodequeue_subqueue_empty_text() { + return t('Queue empty'); +} + +/** + * Return a "queue is full" message. + * + * @ingroup themeable + */ +function theme_nodequeue_subqueue_full_text() { + return t('Queue full'); +} + +/** + * Return a count of elements in the queue. + * + * @ingroup themeable + */ +function theme_nodequeue_subqueue_count_text($count) { + return t('@count in queue', array('@count' => $count)); +} Index: nodequeue_dragdrop.js =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue_dragdrop.js,v retrieving revision 1.1 diff -u -p -r1.1 nodequeue_dragdrop.js --- nodequeue_dragdrop.js 6 Jan 2009 15:23:00 -0000 1.1 +++ nodequeue_dragdrop.js 13 Aug 2009 11:48:39 -0000 @@ -1,20 +1,146 @@ -$(document).ready(function() { - $('a.nodequeue-remove').css("display", "block"); +// $Id$ + +Drupal.behaviors.nodequeueDrag = function(context) { + var tableDrag = Drupal.tableDrag['nodequeue-dragdrop']; + + tableDrag.onDrop = function() { + $('td.position').each(function(i){ + $(this).html(i + 1); + }); + } +} + +Drupal.behaviors.nodequeueReverse = function(context) { + $('#edit-reverse').click(function(){ + // reverse table rows... + $('tr.draggable').each(function(i){ + $('.nodequeue-dragdrop tbody').prepend(this); + }); + + // ...and update node positions + var size = $('.node-position').size(); + $('.node-position').each(function(i){ + var val = $(this).val(); + $(this).val(size - val + 1); + }); + + nodequeueInsertChangedWarning(); + nodequeueRestripeTable(); + + return false; + }); +}; + +Drupal.behaviors.nodequeueShuffle = function(context) { + $('#edit-shuffle').click(function(){ + // randomize table rows... + var rows = $('table.nodequeue-dragdrop tbody tr:not(:hidden)').get(); + rows.sort(function(){return (Math.round(Math.random())-0.5);}); + $.each(rows, function(i, row) { + $('.nodequeue-dragdrop tbody').prepend(this); + }); + + var reverse = Drupal.settings.nodequeue.reverse; + + // ...and update node positions + var size = reverse ? $('.node-position').size() : 1; + $('.node-position').each(function(i){ + var val = $(this).val(); + $(this).val(size); + reverse ? size-- : size++; + }); + + nodequeueInsertChangedWarning(); + nodequeueRestripeTable(); + + return false; + }); +}; + +Drupal.behaviors.nodequeueClear = function(context) { + $('#edit-clear').click(function(){ + // mark nodes for removal + $('.node-position').each(function(i){ + $(this).val('r'); + }); + + // remove table rows... + rows = $('table.nodequeue-dragdrop tbody tr:not(:hidden)').hide(); + + nodequeuePrependEmptyMessage(); + nodequeueInsertChangedWarning(); + + return false; + }); +}; + +Drupal.behaviors.nodequeueRemoveNode = function(context) { + $('a.nodequeue-remove').css('display', 'block'); $('a.nodequeue-remove').click(function() { a = $(this).attr('id'); - a = "#" + a.replace('nodequeue-remove-', 'edit-') + '-position'; + a = '#' + a.replace('nodequeue-remove-', 'edit-') + '-position'; $(a).val('r'); - //Hide the current row - $(this).parent().parent().addClass('hidden').hide(); - //Restripe the table - // :even and :odd are reversed because jquery counts from 0 and - // we count from 1, so we're out of sync. - $('table.nodequeue-dragdrop tr:not(:hidden)') - .filter(':odd').filter('.odd') - .removeClass('odd').addClass('even') - .end().end() - .filter(':even').filter('.even') - .removeClass('even').addClass('odd'); + + // hide the current row + $(this).parent().parent().fadeOut('fast', function(){ + if ($('table.nodequeue-dragdrop tbody tr:not(:hidden)').size() == 0) { + nodequeuePrependEmptyMessage(); + } + else { + nodequeueRestripeTable() + nodequeueInsertChangedWarning(); + } + }); + return false; }); -}); \ No newline at end of file +} + +Drupal.behaviors.nodequeueClearTitle = function(context) { + $('#edit-add-nid').focus(function(){ + if (this.value == this.defaultValue) { + this.value = ''; + $(this).css('color', '#000'); + } + }).blur(function(){ + if (!this.value.length) { + $(this).css('color', '#999'); + this.value = this.defaultValue; + } + }); +} + +/** + * Restripe the nodequeue table after removing an element or changing the + * order of the elements. + */ +function nodequeueRestripeTable() { + $('table.nodequeue-dragdrop tbody tr:not(:hidden)') + .filter(':odd') + .removeClass('odd').addClass('even') + .end() + .filter(':even') + .removeClass('even').addClass('odd') + .end(); + + $('tr:visible td.position').each(function(i){ + $(this).html(i + 1); + }); +} + +/** + * Add a row to the nodequeue table explaining that the queue is empty. + */ +function nodequeuePrependEmptyMessage() { + $('.nodequeue-dragdrop tbody').prepend('No nodes in this queue.'); +} + +/** + * Display a warning reminding the user to save the nodequeue. + */ +function nodequeueInsertChangedWarning() { + if (Drupal.tableDrag['nodequeue-dragdrop'].changed == false) { + $(Drupal.theme('tableDragChangedWarning')).insertAfter('.nodequeue-dragdrop').hide().fadeIn('slow'); + Drupal.tableDrag['nodequeue-dragdrop'].changed = true; + } +}