HasExporter.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace Dcat\Admin\Grid\Concerns;
  3. use Dcat\Admin\Grid;
  4. use Dcat\Admin\Grid\Exporter;
  5. use Dcat\Admin\Grid\Exporters\AbstractExporter;
  6. use Dcat\Admin\Grid\Tools;
  7. trait HasExporter
  8. {
  9. /**
  10. * @var Exporter
  11. */
  12. protected $exporter;
  13. /**
  14. * @var bool
  15. */
  16. protected $enableExporter = false;
  17. /**
  18. * @var bool
  19. */
  20. protected $exported = false;
  21. /**
  22. * Set exporter driver for Grid to export.
  23. *
  24. * @param string|Grid\Exporters\AbstractExporter|array $exporterDriver
  25. * @return Exporter
  26. */
  27. public function export($exporterDriver = null)
  28. {
  29. $this->enableExporter = true;
  30. $titles = [];
  31. if (is_array($exporterDriver) || $exporterDriver === false) {
  32. $titles = $exporterDriver;
  33. $exporterDriver = null;
  34. }
  35. $exporter = $this->exporter();
  36. if ($exporterDriver) {
  37. $exporter->resolve($exporterDriver);
  38. }
  39. return $titles ? $exporter->titles($titles) : $exporter;
  40. }
  41. /**
  42. * Handle export request.
  43. *
  44. * @param bool $forceExport
  45. * @return mixed
  46. */
  47. public function handleExportRequest($forceExport = false)
  48. {
  49. if (
  50. $this->exported
  51. || (
  52. (! $this->allowExporter()
  53. || ! $scope = request($this->exporter()->getQueryName()))
  54. && ! $forceExport
  55. )
  56. ) {
  57. return;
  58. }
  59. $this->exported = true;
  60. $this->callBuilder();
  61. $this->fire(new Grid\Events\Exporting([$scope]));
  62. // clear output buffer.
  63. if (ob_get_length()) {
  64. ob_end_clean();
  65. }
  66. if ($forceExport || $this->allowExporter()) {
  67. return $this->resolveExportDriver($scope)->export();
  68. }
  69. }
  70. /**
  71. * @return Exporter
  72. */
  73. public function exporter()
  74. {
  75. return $this->exporter ?: ($this->exporter = new Exporter($this));
  76. }
  77. /**
  78. * @param string $scope
  79. * @return AbstractExporter
  80. */
  81. protected function resolveExportDriver($scope)
  82. {
  83. return $this->exporter()->driver()->withScope($scope);
  84. }
  85. /**
  86. * Get the export url.
  87. *
  88. * @param int $scope
  89. * @param null $args
  90. * @return string
  91. */
  92. public function exportUrl($scope = 1, $args = null)
  93. {
  94. $input = array_merge(request()->all(), $this->exporter()->formatExportQuery($scope, $args));
  95. if ($constraints = $this->model()->getConstraints()) {
  96. $input = array_merge($input, $constraints);
  97. }
  98. return $this->resource().'?'.http_build_query($input);
  99. }
  100. /**
  101. * Render export button.
  102. *
  103. * @return string
  104. */
  105. public function renderExportButton()
  106. {
  107. if (! $this->allowExporter()) {
  108. return '';
  109. }
  110. return (new Tools\ExportButton($this))->render();
  111. }
  112. /**
  113. * If grid show export btn.
  114. *
  115. * @return bool
  116. */
  117. public function allowExporter()
  118. {
  119. return $this->enableExporter;
  120. }
  121. }