summaryrefslogtreecommitdiff
path: root/modules/file
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-11-13 14:04:08 +0000
committerDries Buytaert <dries@buytaert.net>2010-11-13 14:04:08 +0000
commitb51569528f42fbecbcefc4ffb2d9b982d43e0186 (patch)
tree8618fd6c7422b1eabd75b761c82f2108cacd4a93 /modules/file
parent6344f0379e7404b6b07f0adc3b412ccbc0a49d89 (diff)
downloadbrdo-b51569528f42fbecbcefc4ffb2d9b982d43e0186.tar.gz
brdo-b51569528f42fbecbcefc4ffb2d9b982d43e0186.tar.bz2
- Patch #745590 by justinrandell, effulgentsia, yched, quicksketch, eojthebrave: #managed_file() element does not work when #extended not TRUE, or when ancestor element doesn't have #tree=TRUE.
Diffstat (limited to 'modules/file')
-rw-r--r--modules/file/file.field.inc5
-rw-r--r--modules/file/file.module2
-rw-r--r--modules/file/tests/file.test98
-rw-r--r--modules/file/tests/file_module_test.module26
4 files changed, 124 insertions, 7 deletions
diff --git a/modules/file/file.field.inc b/modules/file/file.field.inc
index 37c192b87..d4e98fa5d 100644
--- a/modules/file/file.field.inc
+++ b/modules/file/file.field.inc
@@ -648,8 +648,9 @@ function file_field_widget_process($element, &$form_state, $form) {
// Adjust the AJAX settings so that on upload and remove of any individual
// file, the entire group of file fields is updated together.
if ($field['cardinality'] != 1) {
- $new_path = preg_replace('/\/\d+\//', '/', $element['remove_button']['#ajax']['path'], 1);
- $field_element = drupal_array_get_nested_value($form, array_slice($element['#array_parents'], 0, -1));
+ $parents = array_slice($element['#array_parents'], 0, -1);
+ $new_path = 'file/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value'];
+ $field_element = drupal_array_get_nested_value($form, $parents);
$new_wrapper = $field_element['#id'] . '-ajax-wrapper';
foreach (element_children($element) as $key) {
if (isset($element[$key]['#ajax'])) {
diff --git a/modules/file/file.module b/modules/file/file.module
index 33868bf4f..8b8b9c924 100644
--- a/modules/file/file.module
+++ b/modules/file/file.module
@@ -360,7 +360,7 @@ function file_managed_file_process($element, &$form_state, $form) {
$element['#tree'] = TRUE;
$ajax_settings = array(
- 'path' => 'file/ajax/' . implode('/', $element['#parents']) . '/' . $form['form_build_id']['#value'],
+ 'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'],
'wrapper' => $element['#id'] . '-ajax-wrapper',
'effect' => 'fade',
'progress' => array(
diff --git a/modules/file/tests/file.test b/modules/file/tests/file.test
index 22c6ca4f8..88d8afcda 100644
--- a/modules/file/tests/file.test
+++ b/modules/file/tests/file.test
@@ -13,7 +13,7 @@ class FileFieldTestCase extends DrupalWebTestCase {
protected $admin_user;
function setUp() {
- parent::setUp('file');
+ parent::setUp('file', 'file_module_test');
$this->admin_user = $this->drupalCreateUser(array('access content', 'access administration pages', 'administer site configuration', 'administer users', 'administer permissions', 'administer content types', 'administer nodes', 'bypass node access'));
$this->drupalLogin($this->admin_user);
}
@@ -32,6 +32,13 @@ class FileFieldTestCase extends DrupalWebTestCase {
}
/**
+ * Get the fid of the last inserted file.
+ */
+ function getLastFileId() {
+ return (int) db_query('SELECT MAX(fid) FROM {file_managed}')->fetchField();
+ }
+
+ /**
* Create a new file field.
*
* @param $name
@@ -201,6 +208,95 @@ class FileFieldTestCase extends DrupalWebTestCase {
}
}
+/**
+ * Test class for testing the 'managed_file' element type on its own, not as part of a file field.
+ *
+ * @todo Create a FileTestCase base class and move FileFieldTestCase methods
+ * that aren't related to fields into it.
+ */
+class FileManagedFileElementTestCase extends FileFieldTestCase {
+ public static function getInfo() {
+ return array(
+ 'name' => 'Managed file element test',
+ 'description' => 'Tests the managed_file element type.',
+ 'group' => 'File',
+ );
+ }
+
+ /**
+ * Tests the managed_file element type.
+ */
+ function testManagedFile() {
+ // Perform the tests with all permutations of $form['#tree'] and
+ // $element['#extended'].
+ foreach (array(0, 1) as $tree) {
+ foreach (array(0, 1) as $extended) {
+ $test_file = $this->getTestFile('text');
+ $path = 'file/test/' . $tree . '/' . $extended;
+ $input_base_name = $tree ? 'nested_file' : 'file';
+
+ // Submit without a file.
+ $this->drupalPost($path, array(), t('Save'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), t('Submitted without a file.'));
+
+ // Submit a new file, without using the Upload button.
+ $last_fid_prior = $this->getLastFileId();
+ $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+ $this->drupalPost($path, $edit, t('Save'));
+ $last_fid = $this->getLastFileId();
+ $this->assertTrue($last_fid > $last_fid_prior, t('New file got saved.'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), t('Submit handler has correct file info.'));
+
+ // Submit no new input, but with a default file.
+ $this->drupalPost($path . '/' . $last_fid, array(), t('Save'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), t('Empty submission did not change an existing file.'));
+
+ // Now, test the Upload and Remove buttons, with and without AJAX.
+ foreach (array(FALSE, TRUE) as $ajax) {
+ // Upload, then Submit.
+ $last_fid_prior = $this->getLastFileId();
+ $this->drupalGet($path);
+ $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+ if ($ajax) {
+ $this->drupalPostAJAX(NULL, $edit, $input_base_name . '_upload_button');
+ }
+ else {
+ $this->drupalPost(NULL, $edit, t('Upload'));
+ }
+ $last_fid = $this->getLastFileId();
+ $this->assertTrue($last_fid > $last_fid_prior, t('New file got uploaded.'));
+ $this->drupalPost(NULL, array(), t('Save'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), t('Submit handler has correct file info.'));
+
+ // Remove, then Submit.
+ $this->drupalGet($path . '/' . $last_fid);
+ if ($ajax) {
+ $this->drupalPostAJAX(NULL, array(), $input_base_name . '_remove_button');
+ }
+ else {
+ $this->drupalPost(NULL, array(), t('Remove'));
+ }
+ $this->drupalPost(NULL, array(), t('Save'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), t('Submission after file removal was successful.'));
+
+ // Upload, then Remove, then Submit.
+ $this->drupalGet($path);
+ $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+ if ($ajax) {
+ $this->drupalPostAJAX(NULL, $edit, $input_base_name . '_upload_button');
+ $this->drupalPostAJAX(NULL, array(), $input_base_name . '_remove_button');
+ }
+ else {
+ $this->drupalPost(NULL, $edit, t('Upload'));
+ $this->drupalPost(NULL, array(), t('Remove'));
+ }
+ $this->drupalPost(NULL, array(), t('Save'));
+ $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), t('Submission after file upload and removal was successful.'));
+ }
+ }
+ }
+ }
+}
/**
* Test class to test file field widget, single and multi-valued, with and without AJAX, with public and private files.
diff --git a/modules/file/tests/file_module_test.module b/modules/file/tests/file_module_test.module
index f8362dc54..7bccb4a67 100644
--- a/modules/file/tests/file_module_test.module
+++ b/modules/file/tests/file_module_test.module
@@ -22,15 +22,22 @@ function file_module_test_menu() {
return $items;
}
-function file_module_test_form($form, $form_state) {
- $form['#tree'] = TRUE;
+/**
+ * Form builder for testing a 'managed_file' element.
+ */
+function file_module_test_form($form, &$form_state, $tree = TRUE, $extended = FALSE, $default_fid = NULL) {
+ $form['#tree'] = (bool) $tree;
- $form['file'] = array(
+ $form['nested']['file'] = array(
'#type' => 'managed_file',
'#title' => t('Managed file'),
'#upload_location' => 'public://test',
'#progress_message' => t('Please wait...'),
+ '#extended' => (bool) $extended,
);
+ if ($default_fid) {
+ $form['nested']['file']['#default_value'] = $extended ? array('fid' => $default_fid) : $default_fid;
+ }
$form['textfield'] = array(
'#type' => 'textfield',
@@ -44,3 +51,16 @@ function file_module_test_form($form, $form_state) {
return $form;
}
+
+/**
+ * Form submission handler for file_module_test_form().
+ */
+function file_module_test_form_submit($form, &$form_state) {
+ if ($form['#tree']) {
+ $fid = $form['nested']['file']['#extended'] ? $form_state['values']['nested']['file']['fid'] : $form_state['values']['nested']['file'];
+ }
+ else {
+ $fid = $form['nested']['file']['#extended'] ? $form_state['values']['file']['fid'] : $form_state['values']['file'];
+ }
+ drupal_set_message(t('The file id is %fid.', array('%fid' => $fid)));
+}