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['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } /** * Process the upload. */ function _file_test_form_submit(&$form, &$form_state) { // Validate the uploaded picture. $file = file_save_upload('file_test_upload', array('file_validate_is_image' => array())); if ($file) { $form_state['values']['file_test_upload'] = $file; drupal_set_message(t('File @filepath was uploaded.', array('@filepath' => $file->filepath))); } else { 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]; } /** * 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($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)); } /** * Implemenation of hook_file_copy(). */ function file_test_file_copy($file, $source) { _file_test_log_call('copy', array($file, $source)); } /** * Implemenation 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)); }