Как закончить пакет и перенаправить затем

Как закончить пакет и перенаправить затем

22.04.2014 12:03:18 Просмотров 46 Источник

Я работаю над проектом 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

nitin.k

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;

}
https://stackoverflow.com/questions/23213871/how-to-finish-batch-and-redirect-then/23216524#comment35525546_23216524
Спасибо за ваш ответ. Я уже пробовал, но проблема в том, что функция readfile() не выполняется без этого exit(). Итак, я перенаправлен, возвращая true, но мой файл не загружен...
Является ответом!
Funky Dude

23.04.2014 12:12:33

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

https://stackoverflow.com/questions/23213871/how-to-finish-batch-and-redirect-then/23229258#comment85260945_23229258
Я не думаю, что это совершенно точно, чтобы сказать, что вы не должны хотеть, чтобы загрузить файл на пакетное завершение. В настоящее время я обрабатываю пакет и сохраняю его в файловой системе drupal, а затем, когда пакет будет завершен, он должен быть загружен, и пользователь перенаправит его обратно. Я чувствую, что это допустимый случай использования, который Drupal не справляется хорошо.
Закрыть X