Index: filefield.js =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield.js,v retrieving revision 1.26 diff -u -r1.26 filefield.js --- filefield.js 8 Aug 2010 22:23:05 -0000 1.26 +++ filefield.js 8 Dec 2010 14:54:04 -0000 @@ -4,32 +4,7 @@ * Auto-attach standard client side file input validation. */ Drupal.behaviors.filefieldValidateAutoAttach = function(context) { - $("input[type='file'][accept]", context).change( function() { - // Remove any previous errors. - $('.file-upload-js-error').remove(); - - /** - * Add client side validation for the input[type=file] accept attribute. - */ - var accept = this.accept.replace(/,\s*/g, '|'); - if (accept.length > 1 && this.value.length > 0) { - var v = new RegExp('\\.(' + accept + ')$', 'gi'); - if (!v.test(this.value)) { - var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.", - { '%filename' : this.value, '%extensions' : accept.replace(/\|/g, ', ') } - ); - // What do I prepend this to? - $(this).before('
' + error + '
'); - this.value = ''; - return false; - } - } - - /** - * Add filesize validation where possible. - */ - /* @todo */ - }); + $("input[type=file]", context).bind('change', Drupal.filefield.validateExtensions); }; @@ -72,7 +47,28 @@ * @param {Object} event */ Drupal.filefield = { - disableFields: function(event){ + validateExtensions: function(event) { + // Remove any previous errors. + $('.file-upload-js-error').remove(); + + var fieldName = this.name.replace(/^files\[([a-z0-9_]+)_\d+\]$/, '$1'); + var extensions = ''; + if (Drupal.settings.filefield && Drupal.settings.filefield[fieldName]) { + extensions = Drupal.settings.filefield[fieldName].replace(/,\s*/g, '|'); + } + if (extensions.length > 1 && this.value.length > 0) { + var extensionPattern = new RegExp('\\.(' + extensions + ')$', 'gi'); + if (!extensionPattern.test(this.value)) { + var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.", + { '%filename' : this.value, '%extensions' : extensions.replace(/\|/g, ', ') } + ); + $(this).before('
' + error + '
'); + this.value = ''; + return false; + } + } + }, + disableFields: function(event) { var clickedButton = this; // Only disable upload fields for AHAH buttons. Index: filefield_widget.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_widget.inc,v retrieving revision 1.102 diff -u -r1.102 filefield_widget.inc --- filefield_widget.inc 8 Dec 2010 05:06:11 -0000 1.102 +++ filefield_widget.inc 8 Dec 2010 14:54:04 -0000 @@ -263,8 +263,7 @@ * remove buttons, and the description field. */ function filefield_widget_process($element, $edit, &$form_state, $form) { - // The widget is being presented, so apply the JavaScript. - drupal_add_js(drupal_get_path('module', 'filefield') .'/filefield.js'); + static $settings_added; $item = $element['#value']; $field_name = $element['#field_name']; @@ -273,6 +272,18 @@ $field = $form['#field_info'][$field_name]; + // The widget is being presented, so apply the JavaScript. + drupal_add_js(drupal_get_path('module', 'filefield') .'/filefield.js'); + if (!isset($settings_added[$field_name]) && isset($element['#upload_validators']['filefield_validate_extensions'])) { + $settings_added[$field_name] = TRUE; + $settings = array( + 'filefield' => array( + $field_name => $element['#upload_validators']['filefield_validate_extensions'][0], + ), + ); + drupal_add_js($settings, 'setting'); + } + // Title is not necessary for each individual field. if ($field['multiple'] > 0) { unset($element['#title']); @@ -423,9 +434,6 @@ '#type' => 'file', '#description' => implode('
', $desc), '#size' => 22, - '#attributes' => array( - 'accept' => implode(',', array_filter(explode(' ', $field['widget']['file_extensions']))), - ), '#access' => empty($item['fid']), );