2013-03-29 2 views
6

mia abitudine codice del modulo:Come conservare e recuperare i dettagli dell'immagine in Drupal 7 Ajax Form con l'opzione Aggiungi altro?

This is the screenshot of my form

<?php 
    function my_module_menu() { 
    $items = array(); 

    $items['form-example'] = array( 
    'title' => 'My Module Form', 
    'description' => 'A form to mess around with.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('my_module_form'), 
    'access callback' => TRUE 
); 

    return $items; 
} 

function my_module_form($form, &$form_state, $no_js_use = FALSE) { 

    $form['file'] = array(
     '#type' => 'file', 
     '#title' => t('Image'), 
     '#description' => t('Upload an image'), 
); 

    $form['menu'] = array(
    '#markup' => '<b>Add More:</b>' 
    ); 

     $form['#tree'] = TRUE; 
     $form['names_fieldset'] = array(
     '#type' => 'fieldset', 
     '#title' => t('Add more images'), 
     '#prefix' => '<div id="names-fieldset-wrapper">', 
     '#suffix' => '</div>', 
    ); 

     if (empty($form_state['num_names'])) { 
     $form_state['num_names'] = 1; 
     } 

     for ($i = 0; $i < $form_state['num_names']; $i++) {  
     $form['names_fieldset']['name'][$i][0]= array(
      '#title' => t('Image'), 
      '#type' => 'file', 
      '#weight' => '5', 
      '#description' => t('Upload an image'), 
     ); 
     } 

     $form['names_fieldset']['add_name'] = array(
     '#type' => 'submit', 
     '#value' => t('Add one more'), 
     '#submit' => array('my_module_add_more_add_one'), 
     '#ajax' => array(
      'callback' => 'my_module_add_more_callback', 
      'wrapper' => 'names-fieldset-wrapper', 
     ), 
    ); 
     if ($form_state['num_names'] > 1) { 
     $form['names_fieldset']['remove_name'] = array(
      '#type' => 'submit', 
      '#value' => t('Remove one'), 
      '#submit' => array('my_module_add_more_remove_one'), 
      '#ajax' => array(
      'callback' => 'my_module_add_more_callback', 
      'wrapper' => 'names-fieldset-wrapper', 
     ), 
     ); 
     } 

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

    $form['#submit'][] = 'my_module_add_more_submit'; 
    if ($no_js_use) { 
    if (!empty($form['names_fieldset']['remove_name']['#ajax'])) { 
     unset($form['names_fieldset']['remove_name']['#ajax']); 
    } 
    unset($form['names_fieldset']['add_name']['#ajax']); 
    }  
    return $form; 
} 


function my_module_add_more_callback($form, $form_state) { 
    return $form['names_fieldset']; 
} 

function my_module_add_more_add_one($form, &$form_state) { 
    $form_state['num_names']++; 
    $form_state['rebuild'] = TRUE; 
    //$form_state['no_redirect'] = TRUE; 
} 

function my_module_add_more_remove_one($form, &$form_state) { 
    if ($form_state['num_names'] > 1) { 
    $form_state['num_names']--; 
    } 
    $form_state['rebuild'] = TRUE; 
} 

function my_module_add_more_submit($form, &$form_state) { 
    $file = $form_state['values']['file']."<br \>"; 
    $validators = array(); 
    $file = file_save_upload('file', $validators, 'public://uploads'); 
    print_r($file);  
    exit(); 
} 

Quando ho inviato il modulo, sto cercando di ottenere i dettagli di immagini, che vengono aggiunti tramite Aggiungere più opzione. Ma non sono in grado di ottenerli. Tuttavia, sono solo in grado di ottenere i dettagli della prima immagine (e in grado di caricarla).

Voglio sapere due cose qui:

  1. come posso recuperare i dettagli delle immagini che vengono aggiunti con aggiungere più opzione (fieldset), e come posso caricarle?
  2. Quando sfoglio e seleziono un'immagine nel fieldset, non viene mantenuta nel modulo, dopo aver aggiunto un altro campo immagine. Come conservare le immagini selezionate in fieldset?
+1

Potrebbe essere utile capire cosa sta accadendo eseguendo il debug attraverso il modulo 'file' di base. Per il test, aggiungi un campo file a un tipo di contenuto e carica il file. Guarda cosa succede. – Aiias

+0

Il file viene caricato correttamente. Ma il problema è con più campi immagine in un fieldset. –

risposta

4

Cosa vedi quando var_dump il campo del file che hai creato? Se ottieni tutte le informazioni insieme a quelle aggiunte utilizzando il pulsante Aggiungi un altro, puoi imparare la struttura corretta dei valori utilizzando: echo "<pre>"; print_R($form_state['values']); echo "</pre>":

+0

Quando var_dump il campo del file che ho creato (** var_dump ($ form ['file']); **), non ho potuto vedere alcun valore per le immagini selezionate nell'intero modulo. Ho potuto ottenere solo dettagli come tipo di campo, titolo e descrizione. –

+0

Nop! non è $ form ['file'] nella funzione di invio, tutti i valori inviati sono in $ form_state. –

+0

Dopo l'utilizzo ho ottenuto una pagina vuota: ** print_r ($ form_state ['values'] ['file']); ** nella funzione di invio del modulo. –

1

Ci sono un paio di problemi con il tuo codice.

Il primo problema è che la funzione di invio riguarda solo il primo campo di caricamento che è effettivamente chiamato "file". Ma assolutamente nulla per gestire gli altri campi.

Un secondo problema è che caricherà e salverà il primo campo ogni volta che clicchi su "Aggiungi un altro" che duplicherà il tuo caricamento. Non avresti riscontrato questo problema senza AJAX, ma se vuoi aggiungerlo, lo farai.

vorrei fare le seguenti modifiche:

  1. Rimuovere il $form['#tree'] = TRUE e aggiungerlo al fieldset invece. $form['names_fieldsets']['#tree'] = TRUE; dopo aver dichiarato il fieldset, ovviamente.

  2. cambiare il modo di dichiarare i campi del file nel fieldset (all'interno del ciclo for) a questo:

    for ($i = 0; $i < $form_state['num_names']; $i++) { 
        $form['names_fieldset'][$i]['name']= array(
        '#title' => t('Image'), 
        '#type' => 'file', 
        '#weight' => '5', 
        '#description' => t('Upload an image'), 
        // We need this to know which file element this is. 
        // By default drupal would name all as files[names_fieldset] 
        '#name' => 'files[names_fieldset_' . $i . '_name]', 
    ); 
    } 
    
  3. vorrei cambiare la funzione presentare come questo (notare che io presumo che anche fare il mio sopra cambiamenti suggeriti):

    function my_module_add_more_submit($form, &$form_state) { 
        if ($form_state['values']['op'] == 'Submit') { 
        $validators = array(); 
        $files = array(); 
        if (!empty($_FILES['files']['name']['file'])) { 
         $files[] = file_save_upload('file', $validators, file_default_scheme() . '://uploads'); 
        } 
        foreach ($form_state['values']['names_fieldset'] as $name => $field) { 
         if ($name != 'add_name') { 
         $file_name = implode('_', $form['names_fieldset'][$name]['name']['#parents']); 
         if (!empty($_FILES['files']['name'][$file_name])) { 
          $files[] = file_save_upload($file_name, $validators, file_default_scheme() . '://uploads'); 
         } 
         } 
        } 
        } 
    } 
    

Con questo cambia abbiamo impostato un nome di campo modulo consapevoli del fatto che è all'interno di un albero. Attiviamo i caricamenti solo quando si fa clic sul pulsante "Invia" e solo per i campi modulo a cui è stato aggiunto un file. Inoltre, carichiamo usando lo schema predefinito e non usiamo sempre quello pubblico.

Ovviamente il codice necessita di alcuni messaggi per consentire all'utente di sapere quanti file sono stati caricati, i nomi o qualsiasi altra informazione ritenuta meritevole.