Codeigniter и создание файлов CSV

Это не проблема как таковая, а скорее запрос на оптимальный способ экспорта запроса из Codeigniter в виде загружаемого CSV. В CI я называю простой запрос (например, select * from members where country=123) из модели в контроллере (например, элементы), в соответствии с:

$data['membercountries_query'] = $this -> Queries_model -> get_members_by_country($country_id);

Это переходит к представлению, где я показываю удобочитаемую информацию о членах в стране. Я могу легко сгенерировать CSV этого результата в представлении или контроллере с $this->dbutil->csv_from_result($membercountries_query)и отобразить его в виде. Затем я хотел бы представить пользователю кнопку / гиперссылку «Результат загрузки в формате CSV», которая сгенерирует диалог сохранения файла.

Я довольно много гуглил и охотился на SO, и есть много возможных решений различной степени сложности. Я думал о возможном добавлении функции контроллера, (например, member/create_csv($data)), но не мог придумать, как передать ему данные CSV $ по ссылке на страницу (это может быть еще один вопрос).

Кто-нибудь может посоветовать, пожалуйста, самый простой и быстрый способ создать ссылку для скачивания CSV? Из соображений безопасности я бы предпочел не сохранять файл CSV на сервер, а затем создавать ссылку на сохраненный файл.

Было бы особенно полезно иметь возможность создать общий помощник / функцию, которая бы принимала любой результат запроса и создавала загружаемый CSV.

Я благодарен сотрудникам CI за создание помощников по dbutil и загрузке, и самый простой способ сделать это должен включать как csv_from_result() а также force_download(), но я просто не могу думать в этот поздний час о способе объединить два в представлении (или что-то еще) 🙁

2

Решение

Я принял довольно простое решение, основанное на третьем решении вопроса «Скачать CSV с Codeigniter MySQL«, которая должна иметь модельную функцию:

function csv($query, $filename = 'CSV_Report.csv')
{
$this->load->dbutil();
$this->load->helper('file');
$this->load->helper('download');
$delimiter = ",";
$newline = "\r\n";
$data = $this->dbutil->csv_from_result($query, $delimiter, $newline);
force_download($filename, $data);
}

В контроллере, где вы генерируете запрос, добавьте логический параметр $ csv, например:

function membercountry($country_id = NULL, $csv = false)

и иметь условие в функции контроллера, которое будет вызывать функцию модели, если $ csv равно true или 1:

    if ($csv)
{
$date = date('dmy');
$csvfile = "membercountry" . $date . ".csv";
$this -> Queries_model -> csv($data['membercountries_query'], $csvfile);
}

Затем в представлении результатов запроса, после отображения результатов в удобочитаемой форме в браузере, представьте гиперссылку:

<a href="queries/membercountry/<?=$country_id?>/1">Download result as CSV</a>

При щелчке он повторно вызывает контроллер с $ csv как истиной, который затем вызывает функцию модели csv ().

Это довольно общее решение для моего приложения, которому требуется всего несколько дополнительных строк в функции контроллера, и которое сохраняет запись файла CSV на сервер или имеет конкретное представление с подробными и сложными заголовками. Это не решение, просто довольно простое и быстрое решение, которое разработчики CI могут найти полезным. Еще раз большое спасибо сообществу CI за создание класс dbutils что делает вывод CSV пустяком.

редактировать: с точки зрения MVC может быть уместнее поместить функцию csv () в контроллер, а не в модель, и вызвать ее с помощью $ this -> csv ().

6

Другие решения

Цитата в модели

$this->load->dbutil();
$q=$this->db->query("select * from student order by idate desc");
$delimiter = ",";
$newline = "\r\n";
return $this->dbutil->csv_from_result($q,$delimiter,$newline);

В контроллере

$this->load->helper('download');
$this->load->model('mdl');
$row  = $this->mdl->getall();
$name = 'mycsv.csv';
force_download($name,$row);
2

вам просто нужно это скачать CSV файл помощника для codeigniter и запустить скрипт, как это

 $this->db->select('*')->from('*');
$query = $this->db->get('your_table');
$this->load->helper('csv');
query_to_csv($query, TRUE, 'filename.csv');
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector