Это не проблема как таковая, а скорее запрос на оптимальный способ экспорта запроса из 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()
, но я просто не могу думать в этот поздний час о способе объединить два в представлении (или что-то еще) 🙁
Я принял довольно простое решение, основанное на третьем решении вопроса «Скачать 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 ().
Цитата в модели
$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);
вам просто нужно это скачать CSV файл помощника для codeigniter и запустить скрипт, как это
$this->db->select('*')->from('*');
$query = $this->db->get('your_table');
$this->load->helper('csv');
query_to_csv($query, TRUE, 'filename.csv');