2016-03-15 4 views
5

Sto utilizzando Laravel 5.1 e vorrei avere un modulo con poche righe di campi di testo con i relativi caricamenti di immagini.Laravel: carica i dati del modulo con le immagini in un ciclo foreach utilizzando Intervento

Forma:

<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 

Controller:

foreach($request->description as $key => $val){ 

if($val != null){ 
    $data = new Finding; 
    $data->description = $val; //save description for each loop 

    $file = array('image' => Input::file('image')); 

    if (Input::file('image')->isValid()) { 

     $destinationPath = 'uploads'; 
     $extension = Input::file('image')->getClientOriginalExtension(); 
     $fileName = rand(1000,1000).'.'.$extension; 
     Input::file('image')->move($destinationPath, $fileName); 
     $path = Input::file('image')->getRealPath(); 

     $data->image_location = $fileName[$key]; //save filename location to db 
     $data->save(); 

     flash('success', 'Uploaded Successful'); 
     return Redirect::to('/upload'); 
    } else { 
     flash('error', 'Uploaded File Is Not Valid'); 
     return Redirect::to('/upload'); 
    } 
} 

La mia domanda è, come si usa un intervento con il valore $key per salvare una nuova riga nella tabella con la descrizione testo associato alla caricamento di immagini e utilizzare ancora tutte le classi di intervento? Il mio codice è vicino?

Posso facilmente fare tutto questo con un solo modulo di input con un caricamento di immagine, ma il mio obiettivo è avere una pagina con più righe con input. Grazie!

+0

Che cos'è l'intervento? – haakym

+0

@haakym http://image.intervention.io/ –

risposta

4

Non sono sicuro di come gestisci più campi, che sia impostato su pietra o possa cambiare dinamicamente. Ho precedentemente fatto approcci dinamici con javascript e ho tenuto traccia di quanti campi dinamici ho richiesto con un campo di testo nascosto come conteggio.

Usando questo approccio il codice HTML potrebbe essere simile a questo:

<input name="imageAndDescriptionCount" type="hidden" value="2"> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 

Quindi qui abbiamo due campi di immagine e descrizione ciascuna e il contatore viene impostato a 2.

Se dovessimo sottoporre la formare e checkout la richiesta via dd() sarebbe simile a questa:

"imageAndDescriptionCount" => "2" 
"description" => array:2 [▼ 
    0 => "description" 
    1 => "description" 
] 
    "image" => array:2 [▼ 
    0 => UploadedFile {#154 ▶} 
    1 => UploadedFile {#155 ▶} 
] 

questo poi si imposta bene per un ciclo for nella vostra Controller:

$count = $request->get('imageAndDescriptionCount'); 
$description = $request->get('description'); // assign array of descriptions 
$image = $request->file('image'); // assign array of images 

// set upload path using https://laravel.com/docs/5.1/helpers#method-storage-path 
// make sure 'storage/uploads' exists first 
$destinationPath = storage_path . '/uploads'; 

for($i = 0; $i < $count; $i++) { 

    $data = new Finding; 
    $data->description = [$i]; 

    $file = $image[$i]; 

    if ($file->isValid()) { 
     $extension = $file->getClientOriginalExtension(); // file extension 
     $fileName = uniqid(). '.' .$extension; // file name with extension 
     $file->move($destinationPath, $fileName); // move file to our uploads path 

     $data->image_location = $fileName; 
     // or you could say $destinationPath . '/' . $fileName 
     $data->save(); 
    } else { 
     // handle error here 
    } 

} 

flash('success', 'Uploads Successful'); 
return Redirect::to('/upload'); 

Si prega di notare non c'è l'uso della biblioteca intervento nel codice per la mia conoscenza e ho appena scritto il codice per eseguire l'upload. Spero che questo ti aiuta!

Modifica

Se davvero si vuole utilizzare un ciclo foreach e sai che avrai una descrizione per ogni immagine si può fare in questo modo (ma io personalmente penso avere un contatore è un approccio migliore)

$descriptions = $request->get('description'); // assign array of descriptions 
$images = $request->file('image'); // assign array of images 

// loop through the descriptions array 
foreach($descriptions as $key => $val) { 

    // You can access the description like this 
    $val 
    // or this 
    $descriptions[$key] 

    // so naturally you can access the image like this: 
    $images[$key] 

} 

Si potrebbe anche verificare invece il conteggio delle descrizioni/immagini e utilizzarlo come un contatore per scorrere:

$descriptions = $request->get('description'); 
$images = $request->file('image'); // assign array of images 

$descCount = count($descriptions); 
$imgCount = count($images); 

Se tuttavia si può avere un layout diverso, ovvero non si dispone di 1 descrizione per 1 immagine, si prega di chiarire come si avrebbe bisogno di adottare un approccio diverso.

+0

Grazie per la risposta completa. Mentre la tua risposta è logica, l'unica cosa è che sul modulo html sto usando una funzione pulsante "Aggiungi un'altra immagine" che clona la "tabella tr" così dal lato controller la quantità di immagini con le descrizioni sarebbe sconosciuta quindi io Sto cercando di andare con il ciclo foreach invece di un conteggio duro come hai suggerito –

+0

Non sto dicendo di hardcarlo.Usa il valore del contatore in modo dinamico, aggiorna il suo valore quando aggiungi (fai clic su "Aggiungi un'altra immagine") o rimuovi una riga con javascript. Presumo che ogni volta che aggiungi una riga aggiungi una descrizione in più e un'immagine in più, vengono come una coppia giusta? Quindi dovrebbe funzionare bene con il mio approccio, devi solo aggiungere il codice per aggiornare il valore del contatore. – haakym

+0

Questo è vero. Lasciatemi fare un tentativo –

Problemi correlati