danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Content administration and module settings UI.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Menu callback: confirm rebuilding of permissions.
|
danielebarchiesi@0
|
10 *
|
danielebarchiesi@0
|
11 * @see node_configure_rebuild_confirm_submit()
|
danielebarchiesi@0
|
12 * @see node_menu()
|
danielebarchiesi@0
|
13 * @ingroup forms
|
danielebarchiesi@0
|
14 */
|
danielebarchiesi@0
|
15 function node_configure_rebuild_confirm() {
|
danielebarchiesi@0
|
16 return confirm_form(array(), t('Are you sure you want to rebuild the permissions on site content?'),
|
danielebarchiesi@0
|
17 'admin/reports/status', t('This action rebuilds all permissions on site content, and may be a lengthy process. This action cannot be undone.'), t('Rebuild permissions'), t('Cancel'));
|
danielebarchiesi@0
|
18 }
|
danielebarchiesi@0
|
19
|
danielebarchiesi@0
|
20 /**
|
danielebarchiesi@0
|
21 * Handler for wipe confirmation
|
danielebarchiesi@0
|
22 *
|
danielebarchiesi@0
|
23 * @see node_configure_rebuild_confirm()
|
danielebarchiesi@0
|
24 */
|
danielebarchiesi@0
|
25 function node_configure_rebuild_confirm_submit($form, &$form_state) {
|
danielebarchiesi@0
|
26 node_access_rebuild(TRUE);
|
danielebarchiesi@0
|
27 $form_state['redirect'] = 'admin/reports/status';
|
danielebarchiesi@0
|
28 }
|
danielebarchiesi@0
|
29
|
danielebarchiesi@0
|
30 /**
|
danielebarchiesi@0
|
31 * Implements hook_node_operations().
|
danielebarchiesi@0
|
32 */
|
danielebarchiesi@0
|
33 function node_node_operations() {
|
danielebarchiesi@0
|
34 $operations = array(
|
danielebarchiesi@0
|
35 'publish' => array(
|
danielebarchiesi@0
|
36 'label' => t('Publish selected content'),
|
danielebarchiesi@0
|
37 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
38 'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED)),
|
danielebarchiesi@0
|
39 ),
|
danielebarchiesi@0
|
40 'unpublish' => array(
|
danielebarchiesi@0
|
41 'label' => t('Unpublish selected content'),
|
danielebarchiesi@0
|
42 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
43 'callback arguments' => array('updates' => array('status' => NODE_NOT_PUBLISHED)),
|
danielebarchiesi@0
|
44 ),
|
danielebarchiesi@0
|
45 'promote' => array(
|
danielebarchiesi@0
|
46 'label' => t('Promote selected content to front page'),
|
danielebarchiesi@0
|
47 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
48 'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'promote' => NODE_PROMOTED)),
|
danielebarchiesi@0
|
49 ),
|
danielebarchiesi@0
|
50 'demote' => array(
|
danielebarchiesi@0
|
51 'label' => t('Demote selected content from front page'),
|
danielebarchiesi@0
|
52 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
53 'callback arguments' => array('updates' => array('promote' => NODE_NOT_PROMOTED)),
|
danielebarchiesi@0
|
54 ),
|
danielebarchiesi@0
|
55 'sticky' => array(
|
danielebarchiesi@0
|
56 'label' => t('Make selected content sticky'),
|
danielebarchiesi@0
|
57 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
58 'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'sticky' => NODE_STICKY)),
|
danielebarchiesi@0
|
59 ),
|
danielebarchiesi@0
|
60 'unsticky' => array(
|
danielebarchiesi@0
|
61 'label' => t('Make selected content not sticky'),
|
danielebarchiesi@0
|
62 'callback' => 'node_mass_update',
|
danielebarchiesi@0
|
63 'callback arguments' => array('updates' => array('sticky' => NODE_NOT_STICKY)),
|
danielebarchiesi@0
|
64 ),
|
danielebarchiesi@0
|
65 'delete' => array(
|
danielebarchiesi@0
|
66 'label' => t('Delete selected content'),
|
danielebarchiesi@0
|
67 'callback' => NULL,
|
danielebarchiesi@0
|
68 ),
|
danielebarchiesi@0
|
69 );
|
danielebarchiesi@0
|
70 return $operations;
|
danielebarchiesi@0
|
71 }
|
danielebarchiesi@0
|
72
|
danielebarchiesi@0
|
73 /**
|
danielebarchiesi@0
|
74 * List node administration filters that can be applied.
|
danielebarchiesi@0
|
75 *
|
danielebarchiesi@0
|
76 * @return
|
danielebarchiesi@0
|
77 * An associative array of filters.
|
danielebarchiesi@0
|
78 */
|
danielebarchiesi@0
|
79 function node_filters() {
|
danielebarchiesi@0
|
80 // Regular filters
|
danielebarchiesi@0
|
81 $filters['status'] = array(
|
danielebarchiesi@0
|
82 'title' => t('status'),
|
danielebarchiesi@0
|
83 'options' => array(
|
danielebarchiesi@0
|
84 '[any]' => t('any'),
|
danielebarchiesi@0
|
85 'status-1' => t('published'),
|
danielebarchiesi@0
|
86 'status-0' => t('not published'),
|
danielebarchiesi@0
|
87 'promote-1' => t('promoted'),
|
danielebarchiesi@0
|
88 'promote-0' => t('not promoted'),
|
danielebarchiesi@0
|
89 'sticky-1' => t('sticky'),
|
danielebarchiesi@0
|
90 'sticky-0' => t('not sticky'),
|
danielebarchiesi@0
|
91 ),
|
danielebarchiesi@0
|
92 );
|
danielebarchiesi@0
|
93 // Include translation states if we have this module enabled
|
danielebarchiesi@0
|
94 if (module_exists('translation')) {
|
danielebarchiesi@0
|
95 $filters['status']['options'] += array(
|
danielebarchiesi@0
|
96 'translate-0' => t('Up to date translation'),
|
danielebarchiesi@0
|
97 'translate-1' => t('Outdated translation'),
|
danielebarchiesi@0
|
98 );
|
danielebarchiesi@0
|
99 }
|
danielebarchiesi@0
|
100
|
danielebarchiesi@0
|
101 $filters['type'] = array(
|
danielebarchiesi@0
|
102 'title' => t('type'),
|
danielebarchiesi@0
|
103 'options' => array(
|
danielebarchiesi@0
|
104 '[any]' => t('any'),
|
danielebarchiesi@0
|
105 ) + node_type_get_names(),
|
danielebarchiesi@0
|
106 );
|
danielebarchiesi@0
|
107
|
danielebarchiesi@0
|
108 // Language filter if there is a list of languages
|
danielebarchiesi@0
|
109 if ($languages = module_invoke('locale', 'language_list')) {
|
danielebarchiesi@0
|
110 $languages = array(LANGUAGE_NONE => t('Language neutral')) + $languages;
|
danielebarchiesi@0
|
111 $filters['language'] = array(
|
danielebarchiesi@0
|
112 'title' => t('language'),
|
danielebarchiesi@0
|
113 'options' => array(
|
danielebarchiesi@0
|
114 '[any]' => t('any'),
|
danielebarchiesi@0
|
115 ) + $languages,
|
danielebarchiesi@0
|
116 );
|
danielebarchiesi@0
|
117 }
|
danielebarchiesi@0
|
118 return $filters;
|
danielebarchiesi@0
|
119 }
|
danielebarchiesi@0
|
120
|
danielebarchiesi@0
|
121 /**
|
danielebarchiesi@0
|
122 * Applies filters for node administration filters based on session.
|
danielebarchiesi@0
|
123 *
|
danielebarchiesi@0
|
124 * @param $query
|
danielebarchiesi@0
|
125 * A SelectQuery to which the filters should be applied.
|
danielebarchiesi@0
|
126 */
|
danielebarchiesi@0
|
127 function node_build_filter_query(SelectQueryInterface $query) {
|
danielebarchiesi@0
|
128 // Build query
|
danielebarchiesi@0
|
129 $filter_data = isset($_SESSION['node_overview_filter']) ? $_SESSION['node_overview_filter'] : array();
|
danielebarchiesi@0
|
130 foreach ($filter_data as $index => $filter) {
|
danielebarchiesi@0
|
131 list($key, $value) = $filter;
|
danielebarchiesi@0
|
132 switch ($key) {
|
danielebarchiesi@0
|
133 case 'status':
|
danielebarchiesi@0
|
134 // Note: no exploitable hole as $key/$value have already been checked when submitted
|
danielebarchiesi@0
|
135 list($key, $value) = explode('-', $value, 2);
|
danielebarchiesi@0
|
136 case 'type':
|
danielebarchiesi@0
|
137 case 'language':
|
danielebarchiesi@0
|
138 $query->condition('n.' . $key, $value);
|
danielebarchiesi@0
|
139 break;
|
danielebarchiesi@0
|
140 }
|
danielebarchiesi@0
|
141 }
|
danielebarchiesi@0
|
142 }
|
danielebarchiesi@0
|
143
|
danielebarchiesi@0
|
144 /**
|
danielebarchiesi@0
|
145 * Returns the node administration filters form array to node_admin_content().
|
danielebarchiesi@0
|
146 *
|
danielebarchiesi@0
|
147 * @see node_admin_nodes()
|
danielebarchiesi@0
|
148 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
149 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
150 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
151 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
152 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
153 *
|
danielebarchiesi@0
|
154 * @ingroup forms
|
danielebarchiesi@0
|
155 */
|
danielebarchiesi@0
|
156 function node_filter_form() {
|
danielebarchiesi@0
|
157 $session = isset($_SESSION['node_overview_filter']) ? $_SESSION['node_overview_filter'] : array();
|
danielebarchiesi@0
|
158 $filters = node_filters();
|
danielebarchiesi@0
|
159
|
danielebarchiesi@0
|
160 $i = 0;
|
danielebarchiesi@0
|
161 $form['filters'] = array(
|
danielebarchiesi@0
|
162 '#type' => 'fieldset',
|
danielebarchiesi@0
|
163 '#title' => t('Show only items where'),
|
danielebarchiesi@0
|
164 '#theme' => 'exposed_filters__node',
|
danielebarchiesi@0
|
165 );
|
danielebarchiesi@0
|
166 foreach ($session as $filter) {
|
danielebarchiesi@0
|
167 list($type, $value) = $filter;
|
danielebarchiesi@0
|
168 if ($type == 'term') {
|
danielebarchiesi@0
|
169 // Load term name from DB rather than search and parse options array.
|
danielebarchiesi@0
|
170 $value = module_invoke('taxonomy', 'term_load', $value);
|
danielebarchiesi@0
|
171 $value = $value->name;
|
danielebarchiesi@0
|
172 }
|
danielebarchiesi@0
|
173 elseif ($type == 'language') {
|
danielebarchiesi@0
|
174 $value = $value == LANGUAGE_NONE ? t('Language neutral') : module_invoke('locale', 'language_name', $value);
|
danielebarchiesi@0
|
175 }
|
danielebarchiesi@0
|
176 else {
|
danielebarchiesi@0
|
177 $value = $filters[$type]['options'][$value];
|
danielebarchiesi@0
|
178 }
|
danielebarchiesi@0
|
179 $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
|
danielebarchiesi@0
|
180 if ($i++) {
|
danielebarchiesi@0
|
181 $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
|
danielebarchiesi@0
|
182 }
|
danielebarchiesi@0
|
183 else {
|
danielebarchiesi@0
|
184 $form['filters']['current'][] = array('#markup' => t('where %property is %value', $t_args));
|
danielebarchiesi@0
|
185 }
|
danielebarchiesi@0
|
186 if (in_array($type, array('type', 'language'))) {
|
danielebarchiesi@0
|
187 // Remove the option if it is already being filtered on.
|
danielebarchiesi@0
|
188 unset($filters[$type]);
|
danielebarchiesi@0
|
189 }
|
danielebarchiesi@0
|
190 }
|
danielebarchiesi@0
|
191
|
danielebarchiesi@0
|
192 $form['filters']['status'] = array(
|
danielebarchiesi@0
|
193 '#type' => 'container',
|
danielebarchiesi@0
|
194 '#attributes' => array('class' => array('clearfix')),
|
danielebarchiesi@0
|
195 '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
|
danielebarchiesi@0
|
196 );
|
danielebarchiesi@0
|
197 $form['filters']['status']['filters'] = array(
|
danielebarchiesi@0
|
198 '#type' => 'container',
|
danielebarchiesi@0
|
199 '#attributes' => array('class' => array('filters')),
|
danielebarchiesi@0
|
200 );
|
danielebarchiesi@0
|
201 foreach ($filters as $key => $filter) {
|
danielebarchiesi@0
|
202 $form['filters']['status']['filters'][$key] = array(
|
danielebarchiesi@0
|
203 '#type' => 'select',
|
danielebarchiesi@0
|
204 '#options' => $filter['options'],
|
danielebarchiesi@0
|
205 '#title' => $filter['title'],
|
danielebarchiesi@0
|
206 '#default_value' => '[any]',
|
danielebarchiesi@0
|
207 );
|
danielebarchiesi@0
|
208 }
|
danielebarchiesi@0
|
209
|
danielebarchiesi@0
|
210 $form['filters']['status']['actions'] = array(
|
danielebarchiesi@0
|
211 '#type' => 'actions',
|
danielebarchiesi@0
|
212 '#attributes' => array('class' => array('container-inline')),
|
danielebarchiesi@0
|
213 );
|
danielebarchiesi@0
|
214 $form['filters']['status']['actions']['submit'] = array(
|
danielebarchiesi@0
|
215 '#type' => 'submit',
|
danielebarchiesi@0
|
216 '#value' => count($session) ? t('Refine') : t('Filter'),
|
danielebarchiesi@0
|
217 );
|
danielebarchiesi@0
|
218 if (count($session)) {
|
danielebarchiesi@0
|
219 $form['filters']['status']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
|
danielebarchiesi@0
|
220 $form['filters']['status']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
|
danielebarchiesi@0
|
221 }
|
danielebarchiesi@0
|
222
|
danielebarchiesi@0
|
223 drupal_add_js('misc/form.js');
|
danielebarchiesi@0
|
224
|
danielebarchiesi@0
|
225 return $form;
|
danielebarchiesi@0
|
226 }
|
danielebarchiesi@0
|
227
|
danielebarchiesi@0
|
228 /**
|
danielebarchiesi@0
|
229 * Form submission handler for node_filter_form().
|
danielebarchiesi@0
|
230 *
|
danielebarchiesi@0
|
231 * @see node_admin_content()
|
danielebarchiesi@0
|
232 * @see node_admin_nodes()
|
danielebarchiesi@0
|
233 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
234 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
235 * @see node_filter_form()
|
danielebarchiesi@0
|
236 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
237 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
238 */
|
danielebarchiesi@0
|
239 function node_filter_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
240 $filters = node_filters();
|
danielebarchiesi@0
|
241 switch ($form_state['values']['op']) {
|
danielebarchiesi@0
|
242 case t('Filter'):
|
danielebarchiesi@0
|
243 case t('Refine'):
|
danielebarchiesi@0
|
244 // Apply every filter that has a choice selected other than 'any'.
|
danielebarchiesi@0
|
245 foreach ($filters as $filter => $options) {
|
danielebarchiesi@0
|
246 if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
|
danielebarchiesi@0
|
247 // Flatten the options array to accommodate hierarchical/nested options.
|
danielebarchiesi@0
|
248 $flat_options = form_options_flatten($filters[$filter]['options']);
|
danielebarchiesi@0
|
249 // Only accept valid selections offered on the dropdown, block bad input.
|
danielebarchiesi@0
|
250 if (isset($flat_options[$form_state['values'][$filter]])) {
|
danielebarchiesi@0
|
251 $_SESSION['node_overview_filter'][] = array($filter, $form_state['values'][$filter]);
|
danielebarchiesi@0
|
252 }
|
danielebarchiesi@0
|
253 }
|
danielebarchiesi@0
|
254 }
|
danielebarchiesi@0
|
255 break;
|
danielebarchiesi@0
|
256 case t('Undo'):
|
danielebarchiesi@0
|
257 array_pop($_SESSION['node_overview_filter']);
|
danielebarchiesi@0
|
258 break;
|
danielebarchiesi@0
|
259 case t('Reset'):
|
danielebarchiesi@0
|
260 $_SESSION['node_overview_filter'] = array();
|
danielebarchiesi@0
|
261 break;
|
danielebarchiesi@0
|
262 }
|
danielebarchiesi@0
|
263 }
|
danielebarchiesi@0
|
264
|
danielebarchiesi@0
|
265 /**
|
danielebarchiesi@0
|
266 * Make mass update of nodes, changing all nodes in the $nodes array
|
danielebarchiesi@0
|
267 * to update them with the field values in $updates.
|
danielebarchiesi@0
|
268 *
|
danielebarchiesi@0
|
269 * IMPORTANT NOTE: This function is intended to work when called from a form
|
danielebarchiesi@0
|
270 * submission handler. Calling it outside of the form submission process may not
|
danielebarchiesi@0
|
271 * work correctly.
|
danielebarchiesi@0
|
272 *
|
danielebarchiesi@0
|
273 * @param array $nodes
|
danielebarchiesi@0
|
274 * Array of node nids to update.
|
danielebarchiesi@0
|
275 * @param array $updates
|
danielebarchiesi@0
|
276 * Array of key/value pairs with node field names and the value to update that
|
danielebarchiesi@0
|
277 * field to.
|
danielebarchiesi@0
|
278 */
|
danielebarchiesi@0
|
279 function node_mass_update($nodes, $updates) {
|
danielebarchiesi@0
|
280 // We use batch processing to prevent timeout when updating a large number
|
danielebarchiesi@0
|
281 // of nodes.
|
danielebarchiesi@0
|
282 if (count($nodes) > 10) {
|
danielebarchiesi@0
|
283 $batch = array(
|
danielebarchiesi@0
|
284 'operations' => array(
|
danielebarchiesi@0
|
285 array('_node_mass_update_batch_process', array($nodes, $updates))
|
danielebarchiesi@0
|
286 ),
|
danielebarchiesi@0
|
287 'finished' => '_node_mass_update_batch_finished',
|
danielebarchiesi@0
|
288 'title' => t('Processing'),
|
danielebarchiesi@0
|
289 // We use a single multi-pass operation, so the default
|
danielebarchiesi@0
|
290 // 'Remaining x of y operations' message will be confusing here.
|
danielebarchiesi@0
|
291 'progress_message' => '',
|
danielebarchiesi@0
|
292 'error_message' => t('The update has encountered an error.'),
|
danielebarchiesi@0
|
293 // The operations do not live in the .module file, so we need to
|
danielebarchiesi@0
|
294 // tell the batch engine which file to load before calling them.
|
danielebarchiesi@0
|
295 'file' => drupal_get_path('module', 'node') . '/node.admin.inc',
|
danielebarchiesi@0
|
296 );
|
danielebarchiesi@0
|
297 batch_set($batch);
|
danielebarchiesi@0
|
298 }
|
danielebarchiesi@0
|
299 else {
|
danielebarchiesi@0
|
300 foreach ($nodes as $nid) {
|
danielebarchiesi@0
|
301 _node_mass_update_helper($nid, $updates);
|
danielebarchiesi@0
|
302 }
|
danielebarchiesi@0
|
303 drupal_set_message(t('The update has been performed.'));
|
danielebarchiesi@0
|
304 }
|
danielebarchiesi@0
|
305 }
|
danielebarchiesi@0
|
306
|
danielebarchiesi@0
|
307 /**
|
danielebarchiesi@0
|
308 * Updates individual nodes when fewer than 10 are queued.
|
danielebarchiesi@0
|
309 *
|
danielebarchiesi@0
|
310 * @param $nid
|
danielebarchiesi@0
|
311 * ID of node to update.
|
danielebarchiesi@0
|
312 * @param $updates
|
danielebarchiesi@0
|
313 * Associative array of updates.
|
danielebarchiesi@0
|
314 *
|
danielebarchiesi@0
|
315 * @return object
|
danielebarchiesi@0
|
316 * An updated node object.
|
danielebarchiesi@0
|
317 *
|
danielebarchiesi@0
|
318 * @see node_mass_update()
|
danielebarchiesi@0
|
319 */
|
danielebarchiesi@0
|
320 function _node_mass_update_helper($nid, $updates) {
|
danielebarchiesi@0
|
321 $node = node_load($nid, NULL, TRUE);
|
danielebarchiesi@0
|
322 // For efficiency manually save the original node before applying any changes.
|
danielebarchiesi@0
|
323 $node->original = clone $node;
|
danielebarchiesi@0
|
324 foreach ($updates as $name => $value) {
|
danielebarchiesi@0
|
325 $node->$name = $value;
|
danielebarchiesi@0
|
326 }
|
danielebarchiesi@0
|
327 node_save($node);
|
danielebarchiesi@0
|
328 return $node;
|
danielebarchiesi@0
|
329 }
|
danielebarchiesi@0
|
330
|
danielebarchiesi@0
|
331 /**
|
danielebarchiesi@0
|
332 * Executes a batch operation for node_mass_update().
|
danielebarchiesi@0
|
333 *
|
danielebarchiesi@0
|
334 * @param array $nodes
|
danielebarchiesi@0
|
335 * An array of node IDs.
|
danielebarchiesi@0
|
336 * @param array $updates
|
danielebarchiesi@0
|
337 * Associative array of updates.
|
danielebarchiesi@0
|
338 * @param array $context
|
danielebarchiesi@0
|
339 * An array of contextual key/values.
|
danielebarchiesi@0
|
340 */
|
danielebarchiesi@0
|
341 function _node_mass_update_batch_process($nodes, $updates, &$context) {
|
danielebarchiesi@0
|
342 if (!isset($context['sandbox']['progress'])) {
|
danielebarchiesi@0
|
343 $context['sandbox']['progress'] = 0;
|
danielebarchiesi@0
|
344 $context['sandbox']['max'] = count($nodes);
|
danielebarchiesi@0
|
345 $context['sandbox']['nodes'] = $nodes;
|
danielebarchiesi@0
|
346 }
|
danielebarchiesi@0
|
347
|
danielebarchiesi@0
|
348 // Process nodes by groups of 5.
|
danielebarchiesi@0
|
349 $count = min(5, count($context['sandbox']['nodes']));
|
danielebarchiesi@0
|
350 for ($i = 1; $i <= $count; $i++) {
|
danielebarchiesi@0
|
351 // For each nid, load the node, reset the values, and save it.
|
danielebarchiesi@0
|
352 $nid = array_shift($context['sandbox']['nodes']);
|
danielebarchiesi@0
|
353 $node = _node_mass_update_helper($nid, $updates);
|
danielebarchiesi@0
|
354
|
danielebarchiesi@0
|
355 // Store result for post-processing in the finished callback.
|
danielebarchiesi@0
|
356 $context['results'][] = l($node->title, 'node/' . $node->nid);
|
danielebarchiesi@0
|
357
|
danielebarchiesi@0
|
358 // Update our progress information.
|
danielebarchiesi@0
|
359 $context['sandbox']['progress']++;
|
danielebarchiesi@0
|
360 }
|
danielebarchiesi@0
|
361
|
danielebarchiesi@0
|
362 // Inform the batch engine that we are not finished,
|
danielebarchiesi@0
|
363 // and provide an estimation of the completion level we reached.
|
danielebarchiesi@0
|
364 if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
|
danielebarchiesi@0
|
365 $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
|
danielebarchiesi@0
|
366 }
|
danielebarchiesi@0
|
367 }
|
danielebarchiesi@0
|
368
|
danielebarchiesi@0
|
369 /**
|
danielebarchiesi@0
|
370 * Menu callback: Reports the status of batch operation for node_mass_update().
|
danielebarchiesi@0
|
371 *
|
danielebarchiesi@0
|
372 * @param bool $success
|
danielebarchiesi@0
|
373 * A boolean indicating whether the batch mass update operation successfully
|
danielebarchiesi@0
|
374 * concluded.
|
danielebarchiesi@0
|
375 * @param int $results
|
danielebarchiesi@0
|
376 * The number of nodes updated via the batch mode process.
|
danielebarchiesi@0
|
377 * @param array $operations
|
danielebarchiesi@0
|
378 * An array of function calls (not used in this function).
|
danielebarchiesi@0
|
379 */
|
danielebarchiesi@0
|
380 function _node_mass_update_batch_finished($success, $results, $operations) {
|
danielebarchiesi@0
|
381 if ($success) {
|
danielebarchiesi@0
|
382 drupal_set_message(t('The update has been performed.'));
|
danielebarchiesi@0
|
383 }
|
danielebarchiesi@0
|
384 else {
|
danielebarchiesi@0
|
385 drupal_set_message(t('An error occurred and processing did not complete.'), 'error');
|
danielebarchiesi@0
|
386 $message = format_plural(count($results), '1 item successfully processed:', '@count items successfully processed:');
|
danielebarchiesi@0
|
387 $message .= theme('item_list', array('items' => $results));
|
danielebarchiesi@0
|
388 drupal_set_message($message);
|
danielebarchiesi@0
|
389 }
|
danielebarchiesi@0
|
390 }
|
danielebarchiesi@0
|
391
|
danielebarchiesi@0
|
392 /**
|
danielebarchiesi@0
|
393 * Page callback: Form constructor for the content administration form.
|
danielebarchiesi@0
|
394 *
|
danielebarchiesi@0
|
395 * @see node_admin_nodes()
|
danielebarchiesi@0
|
396 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
397 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
398 * @see node_filter_form()
|
danielebarchiesi@0
|
399 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
400 * @see node_menu()
|
danielebarchiesi@0
|
401 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
402 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
403 * @ingroup forms
|
danielebarchiesi@0
|
404 */
|
danielebarchiesi@0
|
405 function node_admin_content($form, $form_state) {
|
danielebarchiesi@0
|
406 if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
|
danielebarchiesi@0
|
407 return node_multiple_delete_confirm($form, $form_state, array_filter($form_state['values']['nodes']));
|
danielebarchiesi@0
|
408 }
|
danielebarchiesi@0
|
409 $form['filter'] = node_filter_form();
|
danielebarchiesi@0
|
410 $form['#submit'][] = 'node_filter_form_submit';
|
danielebarchiesi@0
|
411 $form['admin'] = node_admin_nodes();
|
danielebarchiesi@0
|
412
|
danielebarchiesi@0
|
413 return $form;
|
danielebarchiesi@0
|
414 }
|
danielebarchiesi@0
|
415
|
danielebarchiesi@0
|
416 /**
|
danielebarchiesi@0
|
417 * Form builder: Builds the node administration overview.
|
danielebarchiesi@0
|
418 *
|
danielebarchiesi@0
|
419 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
420 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
421 * @see node_filter_form()
|
danielebarchiesi@0
|
422 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
423 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
424 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
425 *
|
danielebarchiesi@0
|
426 * @ingroup forms
|
danielebarchiesi@0
|
427 */
|
danielebarchiesi@0
|
428 function node_admin_nodes() {
|
danielebarchiesi@0
|
429 $admin_access = user_access('administer nodes');
|
danielebarchiesi@0
|
430
|
danielebarchiesi@0
|
431 // Build the 'Update options' form.
|
danielebarchiesi@0
|
432 $form['options'] = array(
|
danielebarchiesi@0
|
433 '#type' => 'fieldset',
|
danielebarchiesi@0
|
434 '#title' => t('Update options'),
|
danielebarchiesi@0
|
435 '#attributes' => array('class' => array('container-inline')),
|
danielebarchiesi@0
|
436 '#access' => $admin_access,
|
danielebarchiesi@0
|
437 );
|
danielebarchiesi@0
|
438 $options = array();
|
danielebarchiesi@0
|
439 foreach (module_invoke_all('node_operations') as $operation => $array) {
|
danielebarchiesi@0
|
440 $options[$operation] = $array['label'];
|
danielebarchiesi@0
|
441 }
|
danielebarchiesi@0
|
442 $form['options']['operation'] = array(
|
danielebarchiesi@0
|
443 '#type' => 'select',
|
danielebarchiesi@0
|
444 '#title' => t('Operation'),
|
danielebarchiesi@0
|
445 '#title_display' => 'invisible',
|
danielebarchiesi@0
|
446 '#options' => $options,
|
danielebarchiesi@0
|
447 '#default_value' => 'approve',
|
danielebarchiesi@0
|
448 );
|
danielebarchiesi@0
|
449 $form['options']['submit'] = array(
|
danielebarchiesi@0
|
450 '#type' => 'submit',
|
danielebarchiesi@0
|
451 '#value' => t('Update'),
|
danielebarchiesi@0
|
452 '#validate' => array('node_admin_nodes_validate'),
|
danielebarchiesi@0
|
453 '#submit' => array('node_admin_nodes_submit'),
|
danielebarchiesi@0
|
454 );
|
danielebarchiesi@0
|
455
|
danielebarchiesi@0
|
456 // Enable language column if translation module is enabled or if we have any
|
danielebarchiesi@0
|
457 // node with language.
|
danielebarchiesi@0
|
458 $multilanguage = (module_exists('translation') || db_query_range("SELECT 1 FROM {node} WHERE language <> :language", 0, 1, array(':language' => LANGUAGE_NONE))->fetchField());
|
danielebarchiesi@0
|
459
|
danielebarchiesi@0
|
460 // Build the sortable table header.
|
danielebarchiesi@0
|
461 $header = array(
|
danielebarchiesi@0
|
462 'title' => array('data' => t('Title'), 'field' => 'n.title'),
|
danielebarchiesi@0
|
463 'type' => array('data' => t('Type'), 'field' => 'n.type'),
|
danielebarchiesi@0
|
464 'author' => t('Author'),
|
danielebarchiesi@0
|
465 'status' => array('data' => t('Status'), 'field' => 'n.status'),
|
danielebarchiesi@0
|
466 'changed' => array('data' => t('Updated'), 'field' => 'n.changed', 'sort' => 'desc')
|
danielebarchiesi@0
|
467 );
|
danielebarchiesi@0
|
468 if ($multilanguage) {
|
danielebarchiesi@0
|
469 $header['language'] = array('data' => t('Language'), 'field' => 'n.language');
|
danielebarchiesi@0
|
470 }
|
danielebarchiesi@0
|
471 $header['operations'] = array('data' => t('Operations'));
|
danielebarchiesi@0
|
472
|
danielebarchiesi@0
|
473 $query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
|
danielebarchiesi@0
|
474 node_build_filter_query($query);
|
danielebarchiesi@0
|
475
|
danielebarchiesi@0
|
476 if (!user_access('bypass node access')) {
|
danielebarchiesi@0
|
477 // If the user is able to view their own unpublished nodes, allow them
|
danielebarchiesi@0
|
478 // to see these in addition to published nodes. Check that they actually
|
danielebarchiesi@0
|
479 // have some unpublished nodes to view before adding the condition.
|
danielebarchiesi@0
|
480 if (user_access('view own unpublished content') && $own_unpublished = db_query('SELECT nid FROM {node} WHERE uid = :uid AND status = :status', array(':uid' => $GLOBALS['user']->uid, ':status' => 0))->fetchCol()) {
|
danielebarchiesi@0
|
481 $query->condition(db_or()
|
danielebarchiesi@0
|
482 ->condition('n.status', 1)
|
danielebarchiesi@0
|
483 ->condition('n.nid', $own_unpublished, 'IN')
|
danielebarchiesi@0
|
484 );
|
danielebarchiesi@0
|
485 }
|
danielebarchiesi@0
|
486 else {
|
danielebarchiesi@0
|
487 // If not, restrict the query to published nodes.
|
danielebarchiesi@0
|
488 $query->condition('n.status', 1);
|
danielebarchiesi@0
|
489 }
|
danielebarchiesi@0
|
490 }
|
danielebarchiesi@0
|
491 $nids = $query
|
danielebarchiesi@0
|
492 ->fields('n',array('nid'))
|
danielebarchiesi@0
|
493 ->limit(50)
|
danielebarchiesi@0
|
494 ->orderByHeader($header)
|
danielebarchiesi@0
|
495 ->addTag('node_access')
|
danielebarchiesi@0
|
496 ->execute()
|
danielebarchiesi@0
|
497 ->fetchCol();
|
danielebarchiesi@0
|
498 $nodes = node_load_multiple($nids);
|
danielebarchiesi@0
|
499
|
danielebarchiesi@0
|
500 // Prepare the list of nodes.
|
danielebarchiesi@0
|
501 $languages = language_list();
|
danielebarchiesi@0
|
502 $destination = drupal_get_destination();
|
danielebarchiesi@0
|
503 $options = array();
|
danielebarchiesi@0
|
504 foreach ($nodes as $node) {
|
danielebarchiesi@0
|
505 $langcode = entity_language('node', $node);
|
danielebarchiesi@0
|
506 $l_options = $langcode != LANGUAGE_NONE && isset($languages[$langcode]) ? array('language' => $languages[$langcode]) : array();
|
danielebarchiesi@0
|
507 $options[$node->nid] = array(
|
danielebarchiesi@0
|
508 'title' => array(
|
danielebarchiesi@0
|
509 'data' => array(
|
danielebarchiesi@0
|
510 '#type' => 'link',
|
danielebarchiesi@0
|
511 '#title' => $node->title,
|
danielebarchiesi@0
|
512 '#href' => 'node/' . $node->nid,
|
danielebarchiesi@0
|
513 '#options' => $l_options,
|
danielebarchiesi@0
|
514 '#suffix' => ' ' . theme('mark', array('type' => node_mark($node->nid, $node->changed))),
|
danielebarchiesi@0
|
515 ),
|
danielebarchiesi@0
|
516 ),
|
danielebarchiesi@0
|
517 'type' => check_plain(node_type_get_name($node)),
|
danielebarchiesi@0
|
518 'author' => theme('username', array('account' => $node)),
|
danielebarchiesi@0
|
519 'status' => $node->status ? t('published') : t('not published'),
|
danielebarchiesi@0
|
520 'changed' => format_date($node->changed, 'short'),
|
danielebarchiesi@0
|
521 );
|
danielebarchiesi@0
|
522 if ($multilanguage) {
|
danielebarchiesi@0
|
523 if ($langcode == LANGUAGE_NONE || isset($languages[$langcode])) {
|
danielebarchiesi@0
|
524 $options[$node->nid]['language'] = $langcode == LANGUAGE_NONE ? t('Language neutral') : t($languages[$langcode]->name);
|
danielebarchiesi@0
|
525 }
|
danielebarchiesi@0
|
526 else {
|
danielebarchiesi@0
|
527 $options[$node->nid]['language'] = t('Undefined language (@langcode)', array('@langcode' => $langcode));
|
danielebarchiesi@0
|
528 }
|
danielebarchiesi@0
|
529 }
|
danielebarchiesi@0
|
530 // Build a list of all the accessible operations for the current node.
|
danielebarchiesi@0
|
531 $operations = array();
|
danielebarchiesi@0
|
532 if (node_access('update', $node)) {
|
danielebarchiesi@0
|
533 $operations['edit'] = array(
|
danielebarchiesi@0
|
534 'title' => t('edit'),
|
danielebarchiesi@0
|
535 'href' => 'node/' . $node->nid . '/edit',
|
danielebarchiesi@0
|
536 'query' => $destination,
|
danielebarchiesi@0
|
537 );
|
danielebarchiesi@0
|
538 }
|
danielebarchiesi@0
|
539 if (node_access('delete', $node)) {
|
danielebarchiesi@0
|
540 $operations['delete'] = array(
|
danielebarchiesi@0
|
541 'title' => t('delete'),
|
danielebarchiesi@0
|
542 'href' => 'node/' . $node->nid . '/delete',
|
danielebarchiesi@0
|
543 'query' => $destination,
|
danielebarchiesi@0
|
544 );
|
danielebarchiesi@0
|
545 }
|
danielebarchiesi@0
|
546 $options[$node->nid]['operations'] = array();
|
danielebarchiesi@0
|
547 if (count($operations) > 1) {
|
danielebarchiesi@0
|
548 // Render an unordered list of operations links.
|
danielebarchiesi@0
|
549 $options[$node->nid]['operations'] = array(
|
danielebarchiesi@0
|
550 'data' => array(
|
danielebarchiesi@0
|
551 '#theme' => 'links__node_operations',
|
danielebarchiesi@0
|
552 '#links' => $operations,
|
danielebarchiesi@0
|
553 '#attributes' => array('class' => array('links', 'inline')),
|
danielebarchiesi@0
|
554 ),
|
danielebarchiesi@0
|
555 );
|
danielebarchiesi@0
|
556 }
|
danielebarchiesi@0
|
557 elseif (!empty($operations)) {
|
danielebarchiesi@0
|
558 // Render the first and only operation as a link.
|
danielebarchiesi@0
|
559 $link = reset($operations);
|
danielebarchiesi@0
|
560 $options[$node->nid]['operations'] = array(
|
danielebarchiesi@0
|
561 'data' => array(
|
danielebarchiesi@0
|
562 '#type' => 'link',
|
danielebarchiesi@0
|
563 '#title' => $link['title'],
|
danielebarchiesi@0
|
564 '#href' => $link['href'],
|
danielebarchiesi@0
|
565 '#options' => array('query' => $link['query']),
|
danielebarchiesi@0
|
566 ),
|
danielebarchiesi@0
|
567 );
|
danielebarchiesi@0
|
568 }
|
danielebarchiesi@0
|
569 }
|
danielebarchiesi@0
|
570
|
danielebarchiesi@0
|
571 // Only use a tableselect when the current user is able to perform any
|
danielebarchiesi@0
|
572 // operations.
|
danielebarchiesi@0
|
573 if ($admin_access) {
|
danielebarchiesi@0
|
574 $form['nodes'] = array(
|
danielebarchiesi@0
|
575 '#type' => 'tableselect',
|
danielebarchiesi@0
|
576 '#header' => $header,
|
danielebarchiesi@0
|
577 '#options' => $options,
|
danielebarchiesi@0
|
578 '#empty' => t('No content available.'),
|
danielebarchiesi@0
|
579 );
|
danielebarchiesi@0
|
580 }
|
danielebarchiesi@0
|
581 // Otherwise, use a simple table.
|
danielebarchiesi@0
|
582 else {
|
danielebarchiesi@0
|
583 $form['nodes'] = array(
|
danielebarchiesi@0
|
584 '#theme' => 'table',
|
danielebarchiesi@0
|
585 '#header' => $header,
|
danielebarchiesi@0
|
586 '#rows' => $options,
|
danielebarchiesi@0
|
587 '#empty' => t('No content available.'),
|
danielebarchiesi@0
|
588 );
|
danielebarchiesi@0
|
589 }
|
danielebarchiesi@0
|
590
|
danielebarchiesi@0
|
591 $form['pager'] = array('#markup' => theme('pager'));
|
danielebarchiesi@0
|
592 return $form;
|
danielebarchiesi@0
|
593 }
|
danielebarchiesi@0
|
594
|
danielebarchiesi@0
|
595 /**
|
danielebarchiesi@0
|
596 * Validate node_admin_nodes form submissions.
|
danielebarchiesi@0
|
597 *
|
danielebarchiesi@0
|
598 * Checks whether any nodes have been selected to perform the chosen 'Update
|
danielebarchiesi@0
|
599 * option' on.
|
danielebarchiesi@0
|
600 *
|
danielebarchiesi@0
|
601 * @see node_admin_nodes()
|
danielebarchiesi@0
|
602 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
603 * @see node_filter_form()
|
danielebarchiesi@0
|
604 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
605 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
606 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
607 */
|
danielebarchiesi@0
|
608 function node_admin_nodes_validate($form, &$form_state) {
|
danielebarchiesi@0
|
609 // Error if there are no items to select.
|
danielebarchiesi@0
|
610 if (!is_array($form_state['values']['nodes']) || !count(array_filter($form_state['values']['nodes']))) {
|
danielebarchiesi@0
|
611 form_set_error('', t('No items selected.'));
|
danielebarchiesi@0
|
612 }
|
danielebarchiesi@0
|
613 }
|
danielebarchiesi@0
|
614
|
danielebarchiesi@0
|
615 /**
|
danielebarchiesi@0
|
616 * Process node_admin_nodes form submissions.
|
danielebarchiesi@0
|
617 *
|
danielebarchiesi@0
|
618 * Executes the chosen 'Update option' on the selected nodes.
|
danielebarchiesi@0
|
619 *
|
danielebarchiesi@0
|
620 * @see node_admin_nodes()
|
danielebarchiesi@0
|
621 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
622 * @see node_filter_form()
|
danielebarchiesi@0
|
623 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
624 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
625 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
626 */
|
danielebarchiesi@0
|
627 function node_admin_nodes_submit($form, &$form_state) {
|
danielebarchiesi@0
|
628 $operations = module_invoke_all('node_operations');
|
danielebarchiesi@0
|
629 $operation = $operations[$form_state['values']['operation']];
|
danielebarchiesi@0
|
630 // Filter out unchecked nodes
|
danielebarchiesi@0
|
631 $nodes = array_filter($form_state['values']['nodes']);
|
danielebarchiesi@0
|
632 if ($function = $operation['callback']) {
|
danielebarchiesi@0
|
633 // Add in callback arguments if present.
|
danielebarchiesi@0
|
634 if (isset($operation['callback arguments'])) {
|
danielebarchiesi@0
|
635 $args = array_merge(array($nodes), $operation['callback arguments']);
|
danielebarchiesi@0
|
636 }
|
danielebarchiesi@0
|
637 else {
|
danielebarchiesi@0
|
638 $args = array($nodes);
|
danielebarchiesi@0
|
639 }
|
danielebarchiesi@0
|
640 call_user_func_array($function, $args);
|
danielebarchiesi@0
|
641
|
danielebarchiesi@0
|
642 cache_clear_all();
|
danielebarchiesi@0
|
643 }
|
danielebarchiesi@0
|
644 else {
|
danielebarchiesi@0
|
645 // We need to rebuild the form to go to a second step. For example, to
|
danielebarchiesi@0
|
646 // show the confirmation form for the deletion of nodes.
|
danielebarchiesi@0
|
647 $form_state['rebuild'] = TRUE;
|
danielebarchiesi@0
|
648 }
|
danielebarchiesi@0
|
649 }
|
danielebarchiesi@0
|
650
|
danielebarchiesi@0
|
651 /**
|
danielebarchiesi@0
|
652 * Multiple node deletion confirmation form for node_admin_content().
|
danielebarchiesi@0
|
653 *
|
danielebarchiesi@0
|
654 * @see node_admin_nodes()
|
danielebarchiesi@0
|
655 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
656 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
657 * @see node_filter_form()
|
danielebarchiesi@0
|
658 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
659 * @see node_multiple_delete_confirm_submit()
|
danielebarchiesi@0
|
660 * @ingroup forms
|
danielebarchiesi@0
|
661 */
|
danielebarchiesi@0
|
662 function node_multiple_delete_confirm($form, &$form_state, $nodes) {
|
danielebarchiesi@0
|
663 $form['nodes'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
|
danielebarchiesi@0
|
664 // array_filter returns only elements with TRUE values
|
danielebarchiesi@0
|
665 foreach ($nodes as $nid => $value) {
|
danielebarchiesi@0
|
666 $title = db_query('SELECT title FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchField();
|
danielebarchiesi@0
|
667 $form['nodes'][$nid] = array(
|
danielebarchiesi@0
|
668 '#type' => 'hidden',
|
danielebarchiesi@0
|
669 '#value' => $nid,
|
danielebarchiesi@0
|
670 '#prefix' => '<li>',
|
danielebarchiesi@0
|
671 '#suffix' => check_plain($title) . "</li>\n",
|
danielebarchiesi@0
|
672 );
|
danielebarchiesi@0
|
673 }
|
danielebarchiesi@0
|
674 $form['operation'] = array('#type' => 'hidden', '#value' => 'delete');
|
danielebarchiesi@0
|
675 $form['#submit'][] = 'node_multiple_delete_confirm_submit';
|
danielebarchiesi@0
|
676 $confirm_question = format_plural(count($nodes),
|
danielebarchiesi@0
|
677 'Are you sure you want to delete this item?',
|
danielebarchiesi@0
|
678 'Are you sure you want to delete these items?');
|
danielebarchiesi@0
|
679 return confirm_form($form,
|
danielebarchiesi@0
|
680 $confirm_question,
|
danielebarchiesi@0
|
681 'admin/content', t('This action cannot be undone.'),
|
danielebarchiesi@0
|
682 t('Delete'), t('Cancel'));
|
danielebarchiesi@0
|
683 }
|
danielebarchiesi@0
|
684
|
danielebarchiesi@0
|
685 /**
|
danielebarchiesi@0
|
686 * Form submission handler for node_multiple_delete_confirm().
|
danielebarchiesi@0
|
687 *
|
danielebarchiesi@0
|
688 * @see node_admin_nodes()
|
danielebarchiesi@0
|
689 * @see node_admin_nodes_submit()
|
danielebarchiesi@0
|
690 * @see node_admin_nodes_validate()
|
danielebarchiesi@0
|
691 * @see node_filter_form()
|
danielebarchiesi@0
|
692 * @see node_filter_form_submit()
|
danielebarchiesi@0
|
693 * @see node_multiple_delete_confirm()
|
danielebarchiesi@0
|
694 */
|
danielebarchiesi@0
|
695 function node_multiple_delete_confirm_submit($form, &$form_state) {
|
danielebarchiesi@0
|
696 if ($form_state['values']['confirm']) {
|
danielebarchiesi@0
|
697 node_delete_multiple(array_keys($form_state['values']['nodes']));
|
danielebarchiesi@0
|
698 $count = count($form_state['values']['nodes']);
|
danielebarchiesi@0
|
699 watchdog('content', 'Deleted @count posts.', array('@count' => $count));
|
danielebarchiesi@0
|
700 drupal_set_message(format_plural($count, 'Deleted 1 post.', 'Deleted @count posts.'));
|
danielebarchiesi@0
|
701 }
|
danielebarchiesi@0
|
702 $form_state['redirect'] = 'admin/content';
|
danielebarchiesi@0
|
703 }
|