2012-08-02 10 views
5

Obtuve un formulario con un solo campo. Este campo es del tipo 'managed_field'. Al hacer clic en el botón "Subir", una barra de progreso le mostrará el progreso de la carga del archivo. Después de eso, deberá enviar el formulario para guardar el archivo.Drupal 7 - formulario de envío automático después de la carga de archivos con tipo de archivo administrado

Dado que la barra de progreso no se mostrará cuando seleccione un archivo y luego haga clic en el botón de enviar formulario en lugar del botón "Cargar". Me gustaría activar un envío de formulario después de que se haya completado la carga (a través del botón "Subir").

Mi forma actual es el siguiente:

$form['#attributes'] = array('enctype' => "multipart/form-data"); 

$form['pdf_upload'] = array(
    '#title' => t('Upload PDF'), 
    '#type' => 'managed_file', 
    '#required' => TRUE, 
    '#progress_message' => t('Please wait...'), 
    '#progress_indicator' => 'bar', 
    '#upload_validators' => array(
     'file_validate_extensions' => array('pdf'), 
    ) 

); 

$form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
); 

El módulo de archivos maneja los archivos a través de una devolución de llamada Ajax en el fichero/ajax/* uri. La devolución de llamada devuelve comandos ajax.

Básicamente quiero agregar un comando ajax adicional que activa el envío del formulario después de que se haya completado la carga del archivo.

+1

Eso podría ser complicado. Una alternativa es cargar automáticamente el archivo en la selección, por lo que el usuario solo tiene que hacer clic en un botón. Ver http://drupal.stackexchange.com/questions/31121 – Clive

Respuesta

2

@Clive Esa no era una opción para mí, ya que quería que los usuarios comenzaran la carga ellos mismos. Tu respuesta me dio algunas ideas y se me ocurrió la siguiente solución.

Drupal.behaviors.fileUpload = { 
    attach: function(context, settings) { 
     jQuery("body").ajaxComplete(function(event,request, settings){ 
      // Only do something when on the orders page of a user 
      // This is where I use the upload functionality 
      if(window.location.pathname.match(/user\/\d+\/orders/)) { 
       // Check if the AjaxComplete was triggered by the managed file upload 
       // pdf_upload_XXX is my form name 
       // Get the form-build-id from the URL 
       if (form_build_id = settings.url.match(/file\/ajax\/pdf_upload_\d*\/(.*)$/)) { 
        // Check if the upload has completed by checking if there is a Delete button in the form that has the form-build-id 
        if(jQuery('[value="'+form_build_id[1]+'"]').closest('form').find('[id$=remove-button]').length) { 
         // Click the submit button 
         jQuery('[value="'+form_build_id[1]+'"]').closest('form').find('[id^=edit-submit]').click(); 
        } 
       } 
      } 
     }); 

    } 
} 

Espero que esto también sea útil para otros usuarios.

Thnx Clive para ponerme en el camino correcto.

Cuestiones relacionadas