Выгрузка файла из компонента

Почти дописал компонент на основе modExtra, который собственно взял с данного сайта, компонент не сильно наварочаный функционалом, главное его действией это простой сбор телефонных номеров. Так вот такая загвоздка, сделал выгрузку данных в csv файл, все работает без проблем, файл сохроняется в папке assets/components/modextra (пока еще не понял почему именно здесь), но вот как его сохранить на комп, что бы заказчик не лазил по папкам сайта и не искал этот файл.

Так наполняю файл инфой:
// $dataArr - массив данных из БД
$implode = implode(" ", $dataArr);

$str = iconv("UTF-8", "WINDOWS-1251",  $implode);
$file = fopen("demo.csv","w");
fwrite($file," ".$str);
fclose($file);

Пробывал сделать выгрузку таким методом, но как то без успешно
header ("Content-Type: application/octet-stream");
header ("Accept-Ranges: bytes");
header ("Content-Length: ".filesize($file));
header ("Content-Disposition: attachment; filename=".$file);  
readfile($file);
Подскажите пожалуйста, как правильно это сделать в компоненте, как я понимаю на данный файл «процессор» идет ajax запрос от ExtJS, может это как то влияет, или может надо как то пути прописать правильно.
Константин
27 апреля 2014, 14:16
modx.pro
2
1 174
0

Комментарии: 2

Andrey Grachov
28 апреля 2014, 01:05
0
Если на процессор идет AJAX запрос, то окно сохранения файла не появится. Чтобы дать возможность сохранить файл, надо оставить код из вашего второго примера (отправляющий нужные заголовки) в процессоре, а в JS «вызывать» процессор таким образом:
window.location.href = ComponentName.config.connectorUrl + '?HTTP_MODAUTH=' + MODx.siteId + '&action=processor/name';
    Константин
    28 апреля 2014, 11:55
    0
    Офигеть, работает ))))
    Вот как у меня это выглядет

    // Это конец файла процессора.
    $implode = implode(" ", $dataArr);
    
    $str = iconv("UTF-8", "WINDOWS-1251",  $implode);
    
    $filename = "data.csv";
    $file = fopen($filename,"w");
    fwrite($file," ".$str);
    fclose($file);
    
    header ("Content-Type: application/octet-stream");
    header ("Accept-Ranges: bytes");
    header ("Content-Length: ".filesize($file));
    header ("Content-Disposition: attachment; filename=".$filename);  
    readfile($filename);
    
    // А так идет запрос в ExtJs 
    window.location.href = this.config.url + '?HTTP_MODAUTH=' + MODx.siteId + '&action=mgr/item/save';

    Большое спасибо тебе добрый человек!!!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2