Как закончить пакет и перенаправить затем
Я работаю над проектом Drupal 7. Я использую пакет, имплицируя некоторые операции и показывая индикатор выполнения. в моем "formulaire_finished", который выполняется в конце, как последняя операция пакета, я хочу загрузить файл, а затем перенаправить на другую страницу, потому что процесс завершен.
Однако функция readfile () использует drupal_exit (), и поэтому мое перенаправление не выполняется.
Вот мой код:
function formulaire_finished($success, $results, $operations) {
if ($success) {
$path = $results['infos']['path'];
download_file($path);
// Redirection
drupal_goto($_SESSION['my_page'], array('query' => array('details' => '1')));
} else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
drupal_set_message(t('An error occurred while processing @operation with arguments : @args', array('@operation' => $error_operation[0], '@args' => print_r($error_operation[0], TRUE), )));
}
}
функция загрузки :
function download_file($path) {
$dir = $path;
$filename = basename($dir);
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
drupal_add_http_header('Pragma', 'public');
drupal_add_http_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
} else {
drupal_add_http_header('Pragma', 'no-cache');
}
drupal_add_http_header('Expires', '0');
drupal_add_http_header('Content-Type', 'application/vnd.ms-excel');
drupal_add_http_header('Content-Disposition', 'attachment; filename=' . basename($dir) . ';');
drupal_add_http_header('Content-Transfer-Encoding', 'binary');
drupal_add_http_header('Content-Length', filesize($dir));
readfile($dir);
unlink($dir);
drupal_exit();
}
Все идеи приветствуются.
Ответы - Как закончить пакет и перенаправить затем / How to finish batch and redirect then

22.04.2014 02:10:15
В приведенной ниже функции вы можете попытаться вернуть true всегда из приведенной ниже функции.
function download_file($path) {
$dir = $path;
$filename = basename($dir);
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
drupal_add_http_header('Pragma', 'public');
drupal_add_http_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
} else {
drupal_add_http_header('Pragma', 'no-cache');
}
drupal_add_http_header('Expires', '0');
drupal_add_http_header('Content-Type', 'application/vnd.ms-excel');
drupal_add_http_header('Content-Disposition', 'attachment; filename=' . basename($dir) . ';');
drupal_add_http_header('Content-Transfer-Encoding', 'binary');
drupal_add_http_header('Content-Length', filesize($dir));
readfile($dir);
unlink($dir);
//drupal_exit();
// Can you use simple return here
return true;
}


23.04.2014 12:12:33
Я не думаю, что вы должны выводить файл для загрузки во время завершения обратного вызова пакетной операции. Вы должны сохранить файл в файловой системе drupal и сохранить ссылку на файл. Затем вы можете загрузить его после завершения пакета.
