от
У меня есть кнопка модального режима, и при щелчке я хочу создать книгу Excel на основе файла шаблона xls, а затем предложить пользователю загрузить / открыть ее. Кнопка использует JavaScript, чтобы открыть новое пустое окно Событие клика просто делает
var tsUrl = baseUrl   'index.php?r=office/gen

и вызывает следующее действие контроллера

public function actionGenTSXls($proj, $leg, $driver){
    // https://phpspreadsheet.readthedocs.io/en/develop/topics/recipes/
    if(!is_numeric($proj) || !is_numeric($leg) || !is_numeric($driver)){
        echo 'Invalid entry.';
        die();
    }
    //Get the Project Model
    $model = Projects::find()
             

Теперь в общем смысле это работает. Это создает xls, пользователю предлагается открыть / загрузить. Но это выдает ошибку в моем журнале yii.


  [ошибка] [yii \ web \ HeadersAlreadySentException] исключение
  'yii \ web \ HeadersAlreadySentException' с сообщением 'Заголовки уже
  послал


Я посмотрел на бесчисленное множество похожих тем и перепробовал все виды перестановок, включая

ob_start();
if (ob_get_length()) ob_end_clean();
if (ob_get_contents()) ob_end_clean();
//etc...
кажется, ничто не может решить мою текущую проблему. Я довольно долго крутился в кругах (не из-за недостатка попыток, проводя исследования, ...) и думал, что получу совет некоторых экспертов и учусь. Я новичок, поэтому, если вы можете объяснить, чтобы я мог узнать, будет очень признателен. Обновление 1 Я решил упростить свой код, чтобы увидеть, в чем проблема, поэтому я сгенерировал файл xls, чтобы я мог временно удалить этот код, и даже при этом, имея всего 7 строк кода, я получаю ту же ошибку!
public function actionDownload(){
    $filename = "TS.xls";
    $file = "C:\Users\Dev\Downloads\TS.xls";
    $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load( $file );
    $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter( $spreadsheet, 'Xls');
    header('Content

Обновление 2 / Обходной путь

Сделал больше Googling, и нашел объявление, которое я попробовал. Добавляя die (); в самом конце моего действия ошибка исчезает ?! Может кто-нибудь объяснить. Я предполагаю, что это не правильное решение, хотя, даже если оно действительно работает.

Обновление 3 / Решение

Это оказалось подходящим способом справиться с этим

заменить следующую часть кода

header('Content

с

$response = Yii::$app

и большое спасибо всем вам, что нашли время, чтобы попытаться помочь мне. Мы ценим ваше время и усилия!
    

        

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Прямо перед вашим первым вызовом
header
добавьте:
ob_end_clean();  // clear out anything that may have already been output
Ваш код будет выглядеть примерно так:
$file = $filepath . $filename;
ob_end_clean();  // clear out anything that may have already been output
header('Content
    
...