I have a file that is generated when an AJAX button is clicked. I want to immediately have a file download prompt come up. The file is being generated and has the correct data in the file. I just don’t know how to force the download prompt to come up.
Edit#1
I have updated the generateCSV()
code to include:
$response = new BinaryFileResponse($path . $filename);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
$form_state->setResponse($response);
This is not invoking a download.
AJAX Button
$form['comp_card_dl'] = [
'#type' => 'button',
'#value' => $this->t('Download'),
'#ajax' => [
'callback' => '::generateCSV',
'progress' => [
'type' => 'throbber',
],
],
'#name' => 'comp_card_download',
];
CSV File Creation
public function generateCSV($form, FormStateInterface $form_state) {
$trigger = $form_state->getTriggeringElement();
if ($trigger['#name'] == 'gift_card_download') {
$filename = $form['#gift_card_filename'];
$data = $form['#gift_card_data'];
}
else if ($trigger['#name'] == 'comp_card_download') {
$filename = $form['#comp_card_filename'];
$data = $form['#comp_card_data'];
}
$path = Drupal::service('file_system')->realpath(file_default_scheme() . "://") . '/';
$csv = fopen($path . $filename, 'w');
foreach ($data as $id => $value) {
array_unshift($value, $id);
fputcsv($csv, $value);
}
fclose($csv);
$response = new BinaryFileResponse($path . $filename);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
$form_state->setResponse($response);
}