Экспортируйте только выбранные строки в csv в Laravel

#php #jquery #ajax #laravel #export-to-csv

Вопрос:

Я должен экспортировать только выбранные строки с помощью флажка в csv, вот мой код. Я использую ajax для передачи нескольких идентификаторов пользователей контроллеру, но я не знаю, как экспортировать только передаваемые идентификаторы пользователей. Пожалуйста, помогите, проблема в том, что он просто возвращает пустой файл excel

введите описание изображения здесь

Кнопка Экспорт Csv

 <a data-href="/admin/export/selected/data" class="btn btn-filter btn-secondary" id="export_records">Export
            Selected</a>
 

введите описание изображения здесь

Ajax-код для множественного выбора

     <script>
    $(document).on('click', '#selectAll', function() {

        $(".user_checkbox").prop("checked", this.checked);
        $("#select_count").html($("input.user_checkbox:checked").length   " Selected");
    });
    $(document).on('click', '.user_checkbox', function() {

        if ($('.user_checkbox:checked').length == $('.user_checkbox').length) {
            $('#selectAll').prop('checked', true);
        } else {
            $('#selectAll').prop('checked', false);
        }
        $("#select_count").html($("input.user_checkbox:checked").length   " Selected");
    });
    $(document).ready(function() {
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $('#export_records').on('click', function(e) {
            var user = [];
            $(".user_checkbox:checked").each(function() {
                user.push($(this).data('user-id'));
            });
            if (user.length <= 0) {
                alert("Please select records.");
            } else {


                var selected_values = user;
                $.ajax({
                    type: "get",
                    url: "{{ route('export.csv') }}",
                    cache: false,
                    data: 'user_id='   selected_values,
                    success: function(response) {

                        let _url = $("#export_records").data('href');
                        window.location.href = _url;
                    }
                });
            }

        });

    });

</script>
 

Контроллер для загрузки csv

  public function exportCsv(Request $request)
{
    $users = User::whereIn('id', explode(",", $request->user_id))->get();
    $filename = "UsersData.csv";
    $headers = array(
        'Content-Type' => 'text/csv',
        "Content-Disposition" => "attachment; filename=$filename",
        "Pragma"              => "no-cache",
        "Cache-Control"       => "must-revalidate, post-check=0, pre-check=0",
        "Expires"             => "0"
    );
    $callback = function() use($filename, $users) {
    $handle = fopen('php://output', 'w');
    fputcsv($handle, array('name','email', 'company_name','role', 'created_at'));

    foreach ($users as $user) {
            $row['name']  = $user->name;
            $row['email']    = $user->email;
            $row['company_name']    = $user->company_name;
            $row['role']  = $user->roles->name;
            $row['created_at']  = $user->created_at;
        fputcsv($handle, array($row['name'], $row['email'], $row['company_name'], $row['role'], $row['created_at']->format('l jS of F Y')));
    }

    fclose($handle);
};
    

    return Response::stream($callback, 200, $headers);
}
 

Примечание
этот код работает для всего экспорта пользовательских данных в формате csv, например $users = User::all()
но не работает с избранными

ответ ajax

введите описание изображения здесь

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

1. Что не работает и каково значение $request->user_id, если вы dd(); это?

2. Я должен экспортировать только те данные, которые выбраны с помощью флажка

3. проверьте часть ответа ajax выше на $request->идентификатор пользователя.

Ответ №1:

Попробуйте отправить такие данные, как

 data: {user_id: selected_values}
 

вместо,

 data: 'user_id='   selected_values,
 

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

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

1. Не могли бы вы, пожалуйста, поделиться ценностью $request->user_id ?

2. вы можете проверить раздел ответа ajax выше в левой части изображения

3. Я понимаю. Это должно сработать… Можете ли вы попробовать сделать info($request->user_id) это в бэкэнде и указать значение $request->user_id из файлов журнала Laravel, просто чтобы быть уверенным.

4. [2021-06-13 15:11:08] местный. ИНФОРМАЦИЯ: массив ( 0 => ’25’, 1 =>> ’26’, 2 =>>> ’27’, 3 =>>>> ’28’, 4 =>>>>> ’24’, 5 =>>>>>> ’23’, 6 =>>>>>>> ’22’, 7 =>>>>>>>> ’21’, 8 =>>>>>>>>> ’20’, 9 =>>>>>>>>>> ’19’, )

5. info($request->идентификатор пользователя) возвращает массив? это должна быть строка, как вы ее печатаете? и где?

Ответ №2:

надеюсь, я нашел решение, в котором мне просто не хватало URL — адреса с окном.местоположение.если я также должен был передать с ним идентификатор пользователя. итак, вот измененная часть,

 $.ajax({
      type: "GET",
       url: "{{ route('exportOption.Userscsv') }}",
       cache: false,
       data: 'user_id='   selected_values,
       success: function(response) {
          let _url = $("#export_records").data('href');
          var selected_values = user;
          window.location.href = _url   '?user_id='   selected_values;

                    }
           });
 

Надеюсь, это будет полезно для вас, ребята.