t('Upload test'), 'page callback' => 'drupal_get_form', 'page arguments' => array('_file_test_form'), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } /** * Form to test file uploads. */ function _file_test_form(&$form_state) { $form['#attributes'] = array('enctype' => 'multipart/form-data'); $form['file_test_upload'] = array( '#type' => 'file', '#title' => t('Upload an image'), ); $form['file_test_replace'] = array( '#type' => 'select', '#title' => t('Replace existing image'), '#options' => array( FILE_EXISTS_RENAME => t('Appends number until name is unique'), FILE_EXISTS_REPLACE => t('Replace the existing file'), FILE_EXISTS_ERROR => t('Fail with an error'), ), '#default_value' => FILE_EXISTS_RENAME, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } /** * Process the upload. */ function _file_test_form_submit(&$form, &$form_state) { // Process the upload and validate that it is an image. Note: we're using the // form value for the $replace parameter. $file = file_save_upload('file_test_upload', array('file_validate_is_image' => array()), FALSE, $form_state['values']['file_test_replace']); if ($file) { $form_state['values']['file_test_upload'] = $file; drupal_set_message(t('File @filepath was uploaded.', array('@filepath' => $file->filepath))); drupal_set_message(t('You WIN!')); } elseif ($file === FALSE) { drupal_set_message(t('Epic upload FAIL!'), 'error'); } } /** * Reset/initialize the history of calls to the file_* hooks. * * @see the getter/setter functions file_test_get_calls() and file_test_reset(). */ function file_test_reset() { // Keep track of calls to these hooks $results = array( 'load' => array(), 'validate' => array(), 'download' => array(), 'references' => array(), 'insert' => array(), 'update' => array(), 'copy' => array(), 'move' => array(), 'delete' => array(), ); variable_set('file_test_results', $results); // These hooks will return these values, @see file_test_set_return(). $return = array( 'validate' => array(), 'download' => NULL, 'references' => NULL, ); variable_set('file_test_return', $return); } /** * Get the arguments passed to invocation of a given hook since * file_test_reset() was last called. * * @param $op * One of the hook_file_* operations: 'load', 'validate', 'download', * 'references', 'insert', 'update', 'copy', 'move', 'delete'. * @returns * Array of the parameters passed to each call. * @see _file_test_log_call() and file_test_reset() */ function file_test_get_calls($op) { $results = variable_get('file_test_results', array()); return $results[$op]; } /** * Get an array with the calls for all hooks. * * @return * An array keyed by hook name ('load', 'validate', 'download', * 'references', 'insert', 'update', 'copy', 'move', 'delete') with values * being arrays of parameters passed to each call. */ function file_test_get_all_calls() { return variable_get('file_test_results', array()); } /** * Store the values passed to a hook invocation. * * @param $op * One of the hook_file_* operations: 'load', 'validate', 'download', * 'references', 'insert', 'update', 'copy', 'move', 'delete'. * @param $args * Values passed to hook. * @see file_test_get_calls() and file_test_reset() */ function _file_test_log_call($op, $args) { $results = variable_get('file_test_results', array()); $results[$op][] = $args; variable_set('file_test_results', $results); } /** * Load the appropriate return value. * * @param $op * One of the hook_file_[validate,download,references] operations. * @return * Value set by file_test_set_return(). * @see file_test_set_return() and file_test_reset(). */ function _file_test_get_return($op) { $return = variable_get('file_test_return', array($op => NULL)); return $return[$op]; } /** * Assign a return value for a given operation. * * @param $op * One of the hook_file_[validate,download,references] operations. * @param $value * Value for the hook to return. * @see _file_test_get_return() and file_test_reset(). */ function file_test_set_return($op, $value) { $return = variable_get('file_test_return', array()); $return[$op] = $value; variable_set('file_test_return', $return); } /** * Implementation of hook_file_load(). */ function file_test_file_load($files) { foreach ($files as $file) { _file_test_log_call('load', array($file)); // Assign a value on the object so that we can test that the $file is passed // by reference. $file->file_test['loaded'] = TRUE; } } /** * Implementation of hook_file_validate(). */ function file_test_file_validate($file) { _file_test_log_call('validate', array($file)); return _file_test_get_return('validate'); } /** * Implementation of hook_file_download(). */ function file_test_file_download($file) { _file_test_log_call('download', array($file)); return _file_test_get_return('download'); } /** * Implementation of hook_file_references(). */ function file_test_file_references($file) { _file_test_log_call('references', array($file)); return _file_test_get_return('references'); } /** * Implementation of hook_file_insert(). */ function file_test_file_insert($file) { _file_test_log_call('insert', array($file)); } /** * Implementation of hook_file_update(). */ function file_test_file_update($file) { _file_test_log_call('update', array($file)); } /** * Implementation of hook_file_copy(). */ function file_test_file_copy($file, $source) { _file_test_log_call('copy', array($file, $source)); } /** * Implementation of hook_file_move(). */ function file_test_file_move($file, $source) { _file_test_log_call('move', array($file, $source)); } /** * Implementation of hook_file_delete(). */ function file_test_file_delete($file) { _file_test_log_call('delete', array($file)); }