comparison modules/upload/upload.module @ 9:acef7ccb09b5 6.4

Drupal 6.4
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:32:08 +0100
parents c1f4ac30525a
children 589fb7c02327
comparison
equal deleted inserted replaced
8:85cbd6048071 9:acef7ccb09b5
1 <?php 1 <?php
2 // $Id: upload.module,v 1.197.2.1 2008/02/11 15:08:09 goba Exp $ 2 // $Id: upload.module,v 1.197.2.2 2008/08/13 23:59:14 drumm Exp $
3 3
4 /** 4 /**
5 * @file 5 * @file
6 * File-handling and attaching files to nodes. 6 * File-handling and attaching files to nodes.
7 * 7 *
142 } 142 }
143 143
144 /** 144 /**
145 * Implementation of hook_file_download(). 145 * Implementation of hook_file_download().
146 */ 146 */
147 function upload_file_download($file) { 147 function upload_file_download($filepath) {
148 if (!user_access('view uploaded files')) { 148 $filepath = file_create_path($filepath);
149 return -1; 149 $result = db_query("SELECT f.*, u.nid FROM {files} f INNER JOIN {upload} u ON f.fid = u.fid WHERE filepath = '%s'", $filepath);
150 }
151 $file = file_create_path($file);
152 $result = db_query("SELECT f.* FROM {files} f INNER JOIN {upload} u ON f.fid = u.fid WHERE filepath = '%s'", $file);
153 if ($file = db_fetch_object($result)) { 150 if ($file = db_fetch_object($result)) {
154 return array( 151 if (user_access('view uploaded files') && ($node = node_load($file->nid)) && node_access('view', $node)) {
155 'Content-Type: '. $file->filemime, 152 return array(
156 'Content-Length: '. $file->filesize, 153 'Content-Type: ' . $file->filemime,
157 ); 154 'Content-Length: ' . $file->filesize,
155 );
156 }
157 else {
158 return -1;
159 }
158 } 160 }
159 } 161 }
160 162
161 /** 163 /**
162 * Save new uploads and store them in the session to be associated to the node 164 * Save new uploads and store them in the session to be associated to the node
163 * on upload_save. 165 * on upload_save.
164 * 166 *
165 * @param $node 167 * @param $node
166 * A node object to associate with uploaded files. 168 * A node object to associate with uploaded files.
167 */ 169 */
168 function upload_node_form_submit($form, &$form_state) { 170 function upload_node_form_submit(&$form, &$form_state) {
169 global $user; 171 global $user;
170 172
171 $limits = _upload_file_limits($user); 173 $limits = _upload_file_limits($user);
172 $validators = array( 174 $validators = array(
173 'file_validate_extensions' => array($limits['extensions']), 175 'file_validate_extensions' => array($limits['extensions']),
178 // Save new file uploads. 180 // Save new file uploads.
179 if (($user->uid != 1 || user_access('upload files')) && ($file = file_save_upload('upload', $validators, file_directory_path()))) { 181 if (($user->uid != 1 || user_access('upload files')) && ($file = file_save_upload('upload', $validators, file_directory_path()))) {
180 $file->list = variable_get('upload_list_default', 1); 182 $file->list = variable_get('upload_list_default', 1);
181 $file->description = $file->filename; 183 $file->description = $file->filename;
182 $file->weight = 0; 184 $file->weight = 0;
183 $_SESSION['upload_files'][$file->fid] = $file; 185 $file->new = TRUE;
184 } 186 $form['#node']->files[$file->fid] = $file;
185 187 $form_state['values']['files'][$file->fid] = (array)$file;
186 // Attach session files to node. 188 }
187 if (!empty($_SESSION['upload_files'])) { 189
188 foreach ($_SESSION['upload_files'] as $fid => $file) { 190 if (isset($form_state['values']['files'])) {
189 if (!isset($form_state['values']['files'][$fid]['filepath'])) { 191 foreach ($form_state['values']['files'] as $fid => $file) {
190 $form_state['values']['files'][$fid] = (array)$file; 192 $form_state['values']['files'][$fid]['new'] = !empty($form['#node']->files[$fid]->new);
191 }
192 } 193 }
193 } 194 }
194 195
195 // Order the form according to the set file weight values. 196 // Order the form according to the set file weight values.
196 if (!empty($form_state['values']['files'])) { 197 if (!empty($form_state['values']['files'])) {
284 '#value' => theme('upload_attachments', $node->files), 285 '#value' => theme('upload_attachments', $node->files),
285 '#weight' => 50, 286 '#weight' => 50,
286 ); 287 );
287 } 288 }
288 } 289 }
289 }
290 break;
291
292 case 'prepare':
293 // Initialize $_SESSION['upload_files'] if no post occurred.
294 // This clears the variable from old forms and makes sure it
295 // is an array to prevent notices and errors in other parts
296 // of upload.module.
297 if (!$_POST) {
298 $_SESSION['upload_files'] = array();
299 } 290 }
300 break; 291 break;
301 292
302 case 'insert': 293 case 'insert':
303 case 'update': 294 case 'update':
408 db_query('DELETE FROM {files} WHERE fid = %d', $fid); 399 db_query('DELETE FROM {files} WHERE fid = %d', $fid);
409 } 400 }
410 401
411 // Remove it from the session in the case of new uploads, 402 // Remove it from the session in the case of new uploads,
412 // that you want to disassociate before node submission. 403 // that you want to disassociate before node submission.
413 unset($_SESSION['upload_files'][$fid]); 404 unset($node->files[$fid]);
414 // Move on, so the removed file won't be added to new revisions. 405 // Move on, so the removed file won't be added to new revisions.
415 continue; 406 continue;
416 } 407 }
417 408
418 // Create a new revision, or associate a new file needed. 409 // Create a new revision, or associate a new file needed.
419 if (!empty($node->old_vid) || isset($_SESSION['upload_files'][$fid])) { 410 if (!empty($node->old_vid) || $file->new) {
420 db_query("INSERT INTO {upload} (fid, nid, vid, list, description, weight) VALUES (%d, %d, %d, %d, '%s', %d)", $file->fid, $node->nid, $node->vid, $file->list, $file->description, $file->weight); 411 db_query("INSERT INTO {upload} (fid, nid, vid, list, description, weight) VALUES (%d, %d, %d, %d, '%s', %d)", $file->fid, $node->nid, $node->vid, $file->list, $file->description, $file->weight);
421 file_set_status($file, FILE_STATUS_PERMANENT); 412 file_set_status($file, FILE_STATUS_PERMANENT);
422 } 413 }
423 // Update existing revision. 414 // Update existing revision.
424 else { 415 else {
425 db_query("UPDATE {upload} SET list = %d, description = '%s', weight = %d WHERE fid = %d AND vid = %d", $file->list, $file->description, $file->weight, $file->fid, $node->vid); 416 db_query("UPDATE {upload} SET list = %d, description = '%s', weight = %d WHERE fid = %d AND vid = %d", $file->list, $file->description, $file->weight, $file->fid, $node->vid);
426 file_set_status($file, FILE_STATUS_PERMANENT); 417 file_set_status($file, FILE_STATUS_PERMANENT);
427 } 418 }
428 } 419 }
429 // Empty the session storage after save. We use this variable to track files
430 // that haven't been related to the node yet.
431 unset($_SESSION['upload_files']);
432 } 420 }
433 421
434 function upload_delete($node) { 422 function upload_delete($node) {
435 $files = array(); 423 $files = array();
436 $result = db_query('SELECT DISTINCT f.* FROM {upload} u INNER JOIN {files} f ON u.fid = f.fid WHERE u.nid = %d', $node->nid); 424 $result = db_query('SELECT DISTINCT f.* FROM {upload} u INNER JOIN {files} f ON u.fid = f.fid WHERE u.nid = %d', $node->nid);
489 $form['files'][$key]['filename'] = array('#type' => 'value', '#value' => $file->filename); 477 $form['files'][$key]['filename'] = array('#type' => 'value', '#value' => $file->filename);
490 $form['files'][$key]['filepath'] = array('#type' => 'value', '#value' => $file->filepath); 478 $form['files'][$key]['filepath'] = array('#type' => 'value', '#value' => $file->filepath);
491 $form['files'][$key]['filemime'] = array('#type' => 'value', '#value' => $file->filemime); 479 $form['files'][$key]['filemime'] = array('#type' => 'value', '#value' => $file->filemime);
492 $form['files'][$key]['filesize'] = array('#type' => 'value', '#value' => $file->filesize); 480 $form['files'][$key]['filesize'] = array('#type' => 'value', '#value' => $file->filesize);
493 $form['files'][$key]['fid'] = array('#type' => 'value', '#value' => $file->fid); 481 $form['files'][$key]['fid'] = array('#type' => 'value', '#value' => $file->fid);
482 $form['files'][$key]['new'] = array('#type' => 'value', '#value' => FALSE);
494 } 483 }
495 } 484 }
496 485
497 if (user_access('upload files')) { 486 if (user_access('upload files')) {
498 $limits = _upload_file_limits($user); 487 $limits = _upload_file_limits($user);
514 ), 503 ),
515 '#submit' => array('node_form_submit_build_node'), 504 '#submit' => array('node_form_submit_build_node'),
516 ); 505 );
517 } 506 }
518 507
519 // This value is used in upload_js().
520 $form['current']['vid'] = array('#type' => 'hidden', '#value' => isset($node->vid) ? $node->vid : 0);
521 return $form; 508 return $form;
522 } 509 }
523 510
524 /** 511 /**
525 * Theme the attachments list. 512 * Theme the attachments list.
574 561
575 /** 562 /**
576 * Menu-callback for JavaScript-based uploads. 563 * Menu-callback for JavaScript-based uploads.
577 */ 564 */
578 function upload_js() { 565 function upload_js() {
566 $cached_form_state = array();
567 $files = array();
568
579 // Load the form from the Form API cache. 569 // Load the form from the Form API cache.
580 $cache = cache_get('form_'. $_POST['form_build_id'], 'cache_form'); 570 if (!($cached_form = form_get_cache($_POST['form_build_id'], $cached_form_state)) || !isset($cached_form['#node']) || !isset($cached_form['attachments'])) {
581 571 form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.'));
582 // We only do the upload.module part of the node validation process. 572 $output = theme('status_messages');
583 $node = (object)$_POST; 573 print drupal_to_js(array('status' => TRUE, 'data' => $output));
584 unset($node->files['upload']); 574 exit();
585 $form = $cache->data; 575 }
576
586 $form_state = array('values' => $_POST); 577 $form_state = array('values' => $_POST);
587 578
588 // Handle new uploads, and merge tmp files into node-files. 579 // Handle new uploads, and merge tmp files into node-files.
589 upload_node_form_submit($form, $form_state); 580 upload_node_form_submit($cached_form, $form_state);
590 $node_files = upload_load($node); 581
591 if (!empty($form_state['values']['files'])) { 582 if(!empty($form_state['values']['files'])) {
592 foreach ($form_state['values']['files'] as $fid => $file) { 583 foreach ($form_state['values']['files'] as $fid => $file) {
593 if (is_numeric($fid)) { 584 if (isset($cached_form['#node']->files[$fid])) {
594 $node->files[$fid] = $file; 585 $files[$fid] = $cached_form['#node']->files[$fid];
595 if (!isset($file['filepath'])) { 586 }
596 $node->files[$fid] = $node_files[$fid]; 587 }
597 } 588 }
598 } 589
599 } 590 $node = $cached_form['#node'];
600 } 591
592 $node->files = $files;
593
601 $form = _upload_form($node); 594 $form = _upload_form($node);
602 595
603 // Update the default values changed in the $_POST array. 596 unset($cached_form['attachments']['wrapper']['new']);
604 $files = isset($_POST['files']) ? $_POST['files'] : array(); 597 $cached_form['attachments']['wrapper'] = array_merge($cached_form['attachments']['wrapper'], $form);
598
599 $cached_form['attachments']['#collapsed'] = FALSE;
600
601 form_set_cache($_POST['form_build_id'], $cached_form, $cached_form_state);
602
605 foreach ($files as $fid => $file) { 603 foreach ($files as $fid => $file) {
606 if (is_numeric($fid)) { 604 if (is_numeric($fid)) {
607 $form['files'][$fid]['description']['#default_value'] = $file['description']; 605 $form['files'][$fid]['description']['#default_value'] = $form_state['values']['files'][$fid]['description'];
608 $form['files'][$fid]['list']['#default_value'] = isset($file['list']) ? 1 : 0; 606 $form['files'][$fid]['list']['#default_value'] = !empty($form_state['values']['files'][$fid]['list']);
609 $form['files'][$fid]['remove']['#default_value'] = isset($file['remove']) ? 1 : 0; 607 $form['files'][$fid]['remove']['#default_value'] = !empty($form_state['values']['files'][$fid]['remove']);
610 $form['files'][$fid]['weight']['#default_value'] = $file['weight']; 608 $form['files'][$fid]['weight']['#default_value'] = $form_state['values']['files'][$fid]['weight'];
611 } 609 }
612 } 610 }
613
614 // Add the new element to the stored form state and resave.
615 $cache->data['attachments']['wrapper'] = array_merge($cache->data['attachments']['wrapper'], $form);
616 cache_set('form_'. $_POST['form_build_id'], $cache->data, 'cache_form', $cache->expire);
617 611
618 // Render the form for output. 612 // Render the form for output.
619 $form += array( 613 $form += array(
620 '#post' => $_POST, 614 '#post' => $_POST,
621 '#programmed' => FALSE, 615 '#programmed' => FALSE,