2017-08-11 3 views
3

J'ai une fonction csv d'exportation, cela a bien fonctionné avec laravel. Mais maintenant je veux appeler la fonction d'exportation via ajax et utiliser la méthode post, mais je n'y ai pas de respone. Je peux envoyer une variable du contrôleur laravel à la réponse, mais je ne peux pas envoyer un téléchargement de fichier.Exporter CSV en utilisant Laravel via Ajax

Voici mon code:

route.php

Route::get('/title/show', '[email protected]'); 
    Route::post('/title/show', '[email protected]'); 

show.blade.php

<script> 
$(document).ready(function() { 
    $('#exportFromDB').click(function() { 
     $.ajax({ 
      url: "", 
      type: "post", 
      headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, 
      data: {}, 
      success: function (response) { 
       var a = document.createElement("a"); 
       a.href = response.file; 
       a.download = response.name; 
      } 
     }) 
    }) 
}) 

Titl eController.php:

$dataExport['Oversea'] = $dataOversea; 
    $this->titleRepository->export('csv', $properties, $dataExport); 

TitleRepository.php

public function export($type, $properties, $data) 
{ 
    if (in_array($type, self::EXPORT_TYPE)) { 
     try { 
      return Excel::create($properties['_title'], function ($excel) use ($data, $properties) { 

       $excel->setTitle($properties['_title']); 
       $excel->setCreator($properties['_creator']) 
        ->setCompany($properties['_company']); 
       $excel->setDescription($properties['_description']); 

       $excel->sheet('Sheet', function ($sheet) use ($data) { 
        foreach ($data as $item) { 
         $sheet->fromArray($item); 
        } 
       }); 
      })->export($type); 
     } catch (Exception $error) { 
      throw $error; 
     } 
    } 
} 

Comment puis-je les corriger? Merci!

Répondre

2

Essayez ceci -

  1. Ne pas écrivez le code pour l'exportation dans votre méthode de contrôleur, sauvez simplement le dossier d'Excel dans votre dossier public.

  2. Votre méthode de contrôleur doit renvoyer le nom de fichier.

  3. Sur votre succès ajax faire -

location.href = path/to/file/property_title.xls

donc remplacer cette ligne

->export($type); 

avec

->store($type, 'public/reports/', true); 
+0

tks tellement, votre idée est géniale, mais je ne peux toujours pas retourner le nom du fichier.Je change -> export() en -> store() et var_dump ($ this-> titleRepository-> export ('csv ', $ properties, $ dataExport)) mais il retourne null; Pouvez-vous me montrer comment réécrire mon contrôleur et référentiel en détail s'il vous plaît :( –

+0

Au lieu de retourner Excel :: créer, l'assigner à la variable. Excel :: create et than dd ($ export) Après cela if ($ export) { return $ export ['full']; } else { $ message = empty ($ data)? 'Il n'y a aucun enregistrement exporter ': "Quelque chose s'est mal passé s'il vous plaît essayez againg"; \ Session :: flash (' erreur ', $ message); return redirect (' liste-client '); } –

+0

S'il vous plaît a ccept ma réponse si ça marche. –

0

Je vois votre ajax url valeur null

Modifier à

url : "{{ action('[email protected]') }}" 

Après cela, la réponse est les données que vous revenez dans le contrôleur

success: function (response) {} 
+0

Je pense que l'adresse null n'est pas un problème parce que je peux passer une variable du contrôleur à la réponse par return ("a") et die(); :( –

0

J'ai installé le paquet maatwebsite/excel et j'ai pu le faire sans écrire de javascript. Tout ce que vous devez faire est de configurer un lien (ou poste de forme typique si vous préférez) à une action comme ceci:

public downloadItemsExcel() { 
    $items = Item::all(); 
    Excel::create('items', function($excel) use($items) { 
     $excel->sheet('ExportFile', function($sheet) use($items) { 
      $sheet->fromArray($items); 
     }); 
    })->export('xls'); 
} 

Cela fonctionne pour csv/Excel fichiers semblables. Il n'y a pas de rechargement d'une page dans le navigateur.