Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

75 строки
2.2KB

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controllers;
  4. use App\Repositories\HouseholdRepository;
  5. use App\Repositories\TerritoryRepository;
  6. use App\Services\ExportService;
  7. use Core\Controller;
  8. use Core\Request;
  9. use Core\Response;
  10. class ExportController extends Controller
  11. {
  12. public function generate(): Response
  13. {
  14. if ($redirect = $this->requireAuth()) {
  15. return $redirect;
  16. }
  17. $territories = (new TerritoryRepository(database()))->allOrdered();
  18. return $this->view('export.generate', [
  19. 'pageTitle' => 'Export Territories',
  20. 'territories' => $territories,
  21. ]);
  22. }
  23. public function download(): Response
  24. {
  25. if ($redirect = $this->requireAuth()) {
  26. return $redirect;
  27. }
  28. $request = Request::capture();
  29. if (!verify_csrf_token($request->input('_token'))) {
  30. flash('error', 'Invalid request.');
  31. return $this->redirect('/export');
  32. }
  33. $selectedIds = $request->input('territory_ids');
  34. if (!is_array($selectedIds) || empty($selectedIds)) {
  35. flash('error', 'Please select at least one territory to export.');
  36. return $this->redirect('/export');
  37. }
  38. $ids = array_map('intval', $selectedIds);
  39. $ids = array_filter($ids, fn(int $id) => $id > 0);
  40. if (empty($ids)) {
  41. flash('error', 'Please select at least one territory to export.');
  42. return $this->redirect('/export');
  43. }
  44. $territoryRepo = new TerritoryRepository(database());
  45. $territories = array_filter(
  46. array_map(fn(int $id) => $territoryRepo->find($id), $ids)
  47. );
  48. if (empty($territories)) {
  49. flash('error', 'Selected territories not found.');
  50. return $this->redirect('/export');
  51. }
  52. $households = (new HouseholdRepository(database()))->findAllByTerritories($ids);
  53. $zip = (new ExportService())->buildZip(array_values($territories), $households);
  54. $filename = 'territory_export_' . date('Ymd_His') . '.zip';
  55. return $this->fileResponse($zip, $filename, 'application/zip');
  56. }
  57. }

Powered by TurnKey Linux.