Browse Source

update exporter

jqh 5 years ago
parent
commit
57229ee389
3 changed files with 70 additions and 53 deletions
  1. 0 1
      src/Grid.php
  2. 26 43
      src/Grid/Concerns/HasExporter.php
  3. 44 9
      src/Grid/Exporter.php

+ 0 - 1
src/Grid.php

@@ -168,7 +168,6 @@ class Grid
         'show_create_button'     => true,
         'show_bordered'          => false,
         'show_toolbar'           => true,
-        'show_exporter'          => false,
         'create_mode'            => self::CREATE_MODE_DEFAULT,
         'dialog_form_area'       => ['700px', '670px'],
         'table_header_style'     => 'table-header-gray',

+ 26 - 43
src/Grid/Concerns/HasExporter.php

@@ -12,36 +12,38 @@ trait HasExporter
     /**
      * @var Exporter
      */
-    protected $exporter;
+    protected $__exporter;
 
     /**
-     * Export driver.
-     *
-     * @var string|Grid\Exporters\AbstractExporter
+     * @var bool
      */
-    protected $exportDriver;
+    protected $enableExporter = false;
 
     /**
      * Set exporter driver for Grid to export.
      *
-     * @param string|Grid\Exporters\AbstractExporter|array $exporter
+     * @param string|Grid\Exporters\AbstractExporter|array $exporterDriver
      *
-     * @return Grid\Exporters\AbstractExporter
+     * @return Exporter
      */
-    public function export($exporter = null)
+    public function export($exporterDriver = null)
     {
+        $this->enableExporter = true;
+
         $titles = [];
 
-        if (is_array($exporter) || $exporter === false) {
-            $titles = $exporter;
-            $exporter = null;
+        if (is_array($exporterDriver) || $exporterDriver === false) {
+            $titles = $exporterDriver;
+            $exporterDriver = null;
         }
 
-        $this->showExporter();
+        $exporter = $this->exporter();
 
-        $driver = $this->exportDriver ?: ($this->exportDriver = $this->exporter()->resolve($exporter));
+        if ($exporterDriver) {
+            $exporter->resolve($exporterDriver);
+        }
 
-        return $driver->titles($titles);
+        return $exporter->titles($titles);
     }
 
     /**
@@ -74,16 +76,21 @@ trait HasExporter
      */
     public function exporter()
     {
-        return $this->exporter ?: ($this->exporter = new Exporter($this));
+        return $this->__exporter ?: ($this->__exporter = new Exporter($this));
     }
 
-    public function setExporterQueryName()
+    /**
+     * @param string $name
+     *
+     * @return void
+     */
+    protected function setExporterQueryName(string $name = null)
     {
         if (! $this->allowExporter()) {
             return;
         }
 
-        $this->exporter()->setQueryName($this->getName().'_export_');
+        $this->exporter()->setQueryName(($name ?: $this->getName()).'_export_');
     }
 
     /**
@@ -93,11 +100,7 @@ trait HasExporter
      */
     protected function resolveExportDriver($scope)
     {
-        if (! $this->exportDriver) {
-            $this->exportDriver = $this->exporter()->resolve();
-        }
-
-        return $this->exportDriver->withScope($scope);
+        return $this->exporter()->driver()->withScope($scope);
     }
 
     /**
@@ -133,26 +136,6 @@ trait HasExporter
         return (new Tools\ExportButton($this))->render();
     }
 
-    /**
-     * Disable export.
-     *
-     * @return $this
-     */
-    public function disableExporter(bool $disable = true)
-    {
-        return $this->option('show_exporter', ! $disable);
-    }
-
-    /**
-     * Show export button.
-     *
-     * @return $this
-     */
-    public function showExporter(bool $val = true)
-    {
-        return $this->disableExporter(! $val);
-    }
-
     /**
      * If grid show export btn.
      *
@@ -160,6 +143,6 @@ trait HasExporter
      */
     public function allowExporter()
     {
-        return $this->options['show_exporter'];
+        return $this->enableExporter;
     }
 }

+ 44 - 9
src/Grid/Exporter.php

@@ -4,7 +4,12 @@ namespace Dcat\Admin\Grid;
 
 use Dcat\Admin\Grid;
 use Dcat\Admin\Grid\Exporters\ExporterInterface;
+use phpDocumentor\Reflection\Types\Mixed_;
 
+/**
+ * @mixin Grid\Exporters\AbstractExporter
+ * @method mixed export
+ */
 class Exporter
 {
     /**
@@ -33,6 +38,11 @@ class Exporter
      */
     protected $grid;
 
+    /**
+     * @var Grid\Exporters\AbstractExporter
+     */
+    protected $driver;
+
     /**
      * @var array
      */
@@ -52,7 +62,7 @@ class Exporter
     {
         $this->grid = $grid;
 
-        $grid->setExporterQueryName();
+        $this->setQueryName($grid->getName().$this->queryName);
     }
 
     /**
@@ -164,15 +174,27 @@ class Exporter
      */
     public function resolve($driver = null)
     {
-        if ($driver && $driver instanceof Grid\Exporters\AbstractExporter) {
-            return $driver->setGrid($this->grid);
+        if ($this->driver) {
+            return $this->driver;
         }
 
-        if ($driver && $driver instanceof ExporterInterface) {
-            return $driver;
+        if ($driver && $driver instanceof Grid\Exporters\AbstractExporter) {
+            $this->driver = $driver->setGrid($this->grid);
+        } else if ($driver && $driver instanceof ExporterInterface) {
+            $this->driver = $driver;
+        } else {
+            $this->driver = $this->newDriver($driver);
         }
 
-        return $this->exporter($driver);
+        return $this->driver;
+    }
+
+    /**
+     * @return Exporters\AbstractExporter
+     */
+    public function driver()
+    {
+        return $this->driver ?: $this->resolve();
     }
 
     /**
@@ -182,10 +204,10 @@ class Exporter
      *
      * @return Grid\Exporters\AbstractExporter
      */
-    protected function exporter($driver): ExporterInterface
+    protected function newDriver($driver): ExporterInterface
     {
         if (! $driver || ! array_key_exists($driver, static::$drivers)) {
-            return $this->makeDefaultExporter();
+            return $this->makeDefaultDriver();
         }
 
         $driver = new static::$drivers[$driver]();
@@ -202,7 +224,7 @@ class Exporter
      *
      * @return Grid\Exporters\ExcelExporter
      */
-    public function makeDefaultExporter()
+    public function makeDefaultDriver()
     {
         return Grid\Exporters\ExcelExporter::make()->setGrid($this->grid);
     }
@@ -233,4 +255,17 @@ class Exporter
 
         return [$this->queryName => $query];
     }
+
+    /**
+     * @param $method
+     * @param $arguments
+     *
+     * @return mixed
+     */
+    public function __call($method, $arguments)
+    {
+        $this->driver()->$method(...$arguments);
+
+        return $this;
+    }
 }