/[drupal]/contributions/modules/nodequeue/nodequeue_generate.module
ViewVC logotype

Contents of /contributions/modules/nodequeue/nodequeue_generate.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download) (as text)
Mon Jun 1 15:50:30 2009 UTC (5 months, 4 weeks ago) by ezrag
Branch: MAIN
CVS Tags: DRUPAL-6--2-5, DRUPAL-6--2-4, DRUPAL-6--2-3, DRUPAL-6--2-2, HEAD
Changes since 1.7: +0 -2 lines
File MIME type: text/x-php
bug #461516 by wulff: Nodequeue Generate generates out of bound positions.
1 <?php
2
3 function nodequeue_generate_menu() {
4 $items['admin/content/generate_nodequeue'] = array(
5 'page callback' => 'drupal_get_form',
6 'page arguments' => array('nodequeue_generate_form'),
7 'description' => 'Bulk add nodes into queues',
8 'title' => 'Generate nodequeue assignments',
9 'access callback' => 'user_access',
10 'access arguments' => array('manipulate all queues'),
11 );
12 return $items;
13 }
14
15 function nodequeue_generate_form() {
16 $form['help'] = array('#value' => '<p>'. t('Select which nodequeues shall be <strong>emptied</strong> and re-populated with new nodes.'). '</p>');
17
18 $queues = nodequeue_load_queues(nodequeue_get_all_qids(25));
19 if (empty($queues)) {
20 form_set_error('', t('No nodequeues exist.'));
21 return array();
22 }
23
24 $qids = array();
25 // For every queue that has exactly 1 subqueue,
26 foreach ($queues as $queue) {
27 if ($queue->subqueues == 1) {
28 $qids[] = $queue->qid;
29 }
30 }
31
32 $subqueues = nodequeue_load_subqueues_by_queue($qids);
33 // Relate all the subqueues we loaded back to our queues.
34 foreach ($subqueues as $subqueue) {
35 $queues[$subqueue->qid]->subqueue = $subqueue;
36 }
37
38 foreach ($queues as $queue) {
39 $sub_text = $queue->subqueues;
40 if ($sub_text == 1) {
41 $sub_text .= " (" . nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) . ")";
42 }
43 $form['rows']['cb'][$queue->qid] = array('#type' => 'checkbox', '#default_value' => 0);
44 $form['rows'][$queue->qid]['nodequeue-title'] = array('#value' => check_plain($queue->title));
45 $form['rows'][$queue->qid]['nodequeue-max-nodes'] = array('#value' => $queue->size == 0 ? t('Infinite') : $queue->size);
46 $form['rows'][$queue->qid]['nodequeue-subqueues'] = array('#value' => $sub_text);
47 $form['rows'][$queue->qid]['limit'] = array('#type' => 'value', '#value' => ($queue->size == 0 || $queue->size > 20) ? 10 : $queue->size);
48 }
49
50 $form['qids'] = array('#type' => 'value', '#value' => array_keys($queues));
51 $form['submit'] = array(
52 '#type' => 'submit',
53 '#value' => t('Generate'),
54 );
55 $form['#tree'] = TRUE;
56 return $form;
57 }
58
59 /**
60 * Implements hook_theme
61 *
62 * @return unknown
63 */
64 function nodequeue_generate_theme() {
65 return array(
66 'nodequeue_generate_form' => array(
67 'arguments' => array('form' => NULL),
68 ),
69 );
70 }
71
72 function theme_nodequeue_generate_form($form) {
73 $output = drupal_render($form['help']);
74 $children = element_children($form['rows']);
75 unset($children[array_search('cb', $children)]);
76 foreach ($children as $qid) {
77 $rows[] = array(
78 drupal_render($form['rows']['cb'][$qid]),
79 drupal_render($form['rows'][$qid]['nodequeue-title']),
80 drupal_render($form['rows'][$qid]['nodequeue-max-nodes']),
81 drupal_render($form['rows'][$qid]['nodequeue-subqueues']),
82 );
83 }
84 $header = array(theme('table_select_header_cell'), t('Title'), t('Max nodes'), t('Subqueues'));
85 $output .= theme('table', $header, $rows);
86 $output .= theme('pager', NULL, 25);
87 $output .= drupal_render($form);
88
89 return $output;
90 }
91
92 function nodequeue_generate_form_submit($form, &$form_state) {
93 $qids = array_keys(array_filter($form_state['values']['rows']['cb']));
94 // Empty the queue
95 $placeholders = implode(', ', array_fill(0, count($qids), '%d'));
96 db_query("DELETE FROM {nodequeue_nodes} WHERE qid IN ($placeholders)", $qids);
97
98 $queues = nodequeue_load_queues($qids);
99 $subqueues = nodequeue_load_subqueues_by_queue($qids);
100 // TODO: handle non smart_taxonomy subqueues.
101 foreach ($subqueues as $subqueue) {
102 // dpr($queues[$subqueue->qid]);
103 // we don't know what kind of nodes to out in, so skip. is this a good idea?
104 if (empty($queues[$subqueue->qid]->types)) {
105 next;
106 }
107
108 $placeholders = implode(', ', array_fill(0, count($queues[$subqueue->qid]->types), '\'%s\''));
109 $args = $queues[$subqueue->qid]->types;
110 // smartqueue_taxonomy pulls nodes from the proper terms. nodequeue type queues don't care about taxo.
111 if ($queues[$subqueue->qid]->owner == 'nodequeue') {
112 $sql = "SELECT n.nid FROM {node} n WHERE n.status = 1 AND n.type IN ($placeholders) ORDER BY RAND()";
113 $result = db_query_range($sql, $args, 0, $form_state['values']['rows'][$subqueue->qid]['limit']);
114 while ($row = db_fetch_object($result)) {
115 nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
116 }
117 }
118 elseif ($queues[$subqueue->qid]->owner == 'smartqueue_taxonomy') {
119 $args[] = $subqueue->reference;
120 $sql = "SELECT tn.nid FROM {term_node} tn INNER JOIN {node} n ON tn.nid=n.nid WHERE n.status = 1 AND n.type IN ($placeholders) AND tn.tid = %d ORDER BY RAND()";
121 $result = db_query_range($sql, $args, 0, $form_state['values']['rows'][$subqueue->qid]['limit']);
122 while ($row = db_fetch_object($result)) {
123 nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
124 }
125 }
126 }
127
128 drupal_set_message(format_plural(count($qids), '1 queue populated', '@count queues populated.'));
129 }
130
131 /**
132 * Rebuild all smartqueue_taxonomy queues. Useful after a data migration has wiped your terms.
133 * When more smartqueue modules arrive, revisit this function.
134 *
135 * @param vids
136 * An array of vocabulary ids.
137 **/
138 function nodequeue_generate_rehash($vids) {
139 // Delete existing smartqueue taxonomy subqueues
140 db_query("DELETE ns FROM nodequeue_subqueue ns INNER JOIN nodequeue_queue nq ON ns.qid=nq.qid WHERE nq.owner = 'smartqueue_taxonomy'");
141
142 // Re-add those subqueues
143 $node = new stdClass;
144 $tree = array();
145 foreach ($vids as $vid) {
146 $tree += taxonomy_get_tree($vid);
147 }
148 $node->taxonomy = $tree;
149 $queues = nodequeue_load_queues(nodequeue_get_all_qids(200));
150 foreach ($queues as $queue) {
151 if ($queue->owner == 'smartqueue_taxonomy') {
152 nodequeue_api_subqueues($queue, $node);
153 }
154 }
155 }

  ViewVC Help
Powered by ViewVC 1.1.2