hyperf-view/builder/View/Grid.php

477 lines
12 KiB
PHP

<?php
declare(strict_types=1);
namespace Builder\View;
use Hyperf\Utils\Str;
use Hyperf\Database\Model\Builder;
use Hyperf\Database\Model\Relations;
use Hyperf\Database\Model\Model as Eloquent;
use Builder\View\Grid\Model;
use Builder\View\Grid\Filter;
use Builder\View\Grid\Column;
use Builder\View\Grid\Actions;
use Builder\View\Grid\Toolbars;
use Builder\View\Grid\BatchActions;
use Builder\View\Grid\Table\Attributes;
use Builder\View\Grid\Concerns\HasFilter;
use Builder\View\Grid\Concerns\HasExport;
use Builder\View\Grid\Concerns\CanExportGrid;
use Builder\View\Grid\Concerns\HasQuickSearch;
use Builder\View\Grid\Concerns\HasDefaultSort;
use Builder\View\Grid\Concerns\HasGridAttributes;
use Builder\View\Grid\Concerns\HasPageAttributes;
use Builder\View\Layout\Content;
use Builder\View\Components\Component;
class Grid extends Component
{
use HasGridAttributes, HasPageAttributes, HasDefaultSort, HasQuickSearch, HasExport, CanExportGrid, HasFilter;
/**
* 组件名称
* @var string
*/
protected $componentName = 'GridTable';
/**
* @var Model
*/
protected $model;
protected $rows;
/**
* 组件字段
* @var Column[]
*/
public $columns = [];
/**
* 组件字段属性
* @var array
*/
protected $columnAttributes = [];
/**
* @var bool
*/
protected $tree = false;
/**
* 表格数据来源
* @var string
*/
protected $dataUrl;
protected $customData;
protected $isGetData = false;
private $actions;
private $batchActions;
private $toolbars;
private $top;
private $bottom;
private $table = '';
/**
* 请求方式
* @var string
*/
private $method = "get";
public function __construct(Eloquent $model = null)
{
$this->attributes = new Attributes();
$this->dataUrl = request()->path();
$this->model = new Model($model, $this);
if ($model) {
$this->table = $model->getTable();
$this->keyName = $model->getKeyName();
$this->defaultSort($model->getKeyName(), "asc");
}
$this->isGetData = request()->header('getData') == "true";
$this->toolbars = new Toolbars($this);
$this->batchActions = new BatchActions();
$this->filter = new Filter($this->model);
}
/**
* 获取自定义数据模型
* @return Model|Builder
*/
public function model()
{
return $this->model;
}
/**
* 自定义数据源路径
* @param string $dataUrl
* @return $this
*/
public function dataUrl(string $dataUrl)
{
$this->dataUrl = $dataUrl;
return $this;
}
/**
* 设置请求方式
* @param string $method
* @return $this
*/
public function method(string $method)
{
$this->method = $method;
return $this;
}
/**
* @return array
*/
public function getAppendFields(): array
{
return $this->appendFields;
}
/**
* 数据返回附加字段
* @param array $appendFields
* @return $this
*/
public function appendFields(array $appendFields)
{
$this->appendFields = $appendFields;
return $this;
}
/**
* @return bool
*/
public function isGetData(): bool
{
return $this->isGetData;
}
/**
* 设置树形表格
* @param bool $tree
* @return $this
*/
public function tree($tree = true)
{
$this->tree = $tree;
return $this;
}
/**
* Grid添加字段
* @param string $name 对应列内容的字段名
* @param string $label 显示的标题
* @param string $type 表单类型
* @return Column
*/
public function column($name, $label = '', $type ='')
{
if (Str::contains($name, '.')) {
$this->addRelationColumn($name, $label);
}
return $this->addColumn($name, $label, $type);
}
/**
* 添加多列数据
* @param array $column
* @return $this
*/
public function addColumns(array $column = [])
{
if (!empty($columns)) {
foreach ($columns as $column) {
call_user_func_array([$this, 'addColumn'], $column);
}
}
return $this;
}
/***
* 添加列
* @param string $name
* @param string $title 标题
* @param null $type 字段类型
* @param string $default
* @param array $param
* @return Column
*/
protected function addColumn($name = '', $title = '', $type ='',$default='',$param=[])
{
$column = new Column($name, $title, $type,$default,$param);
$column->setGrid($this);
$this->columns[] = $column;
return $column;
}
/**
* Add a relation column to grid.
* @param string $name
* @param string $label
* @return $this|bool|Column
*/
protected function addRelationColumn($name, $label = '')
{
if ($this->model) {
list($relation, $column) = explode('.', $name);
$model = $this->model()->eloquent();
if (!method_exists($model, $relation) || !$model->{$relation}() instanceof Relations\Relation) {
} else {
$this->model()->with($relation);
}
}
}
/**
* 获取列表属性
* @param Column[] $columns
*/
protected function columns($columns)
{
$this->columnAttributes = collect($columns)->map(function (Column $column) {
return $column->getAttributes();
})->toArray();
}
public function getColumns()
{
return $this->columns;
}
public function applyWhere()
{
//快捷搜索
$this->applyQuickSearch();
}
public function applyQuery()
{
//快捷搜索
$this->applyQuickSearch();
$this->applyFilter(false);
}
/**
* 自定义toolbars
* @param $closure
* @return $this
*/
public function toolbars($closure)
{
call_user_func($closure, $this->toolbars);
return $this;
}
/**
* 自定义行操作
* @param $closure
* @return $this
*/
public function actions($closure)
{
$this->actions = $closure;
return $this;
}
/**
* 自定义批量操作
* @param \Closure $closure
* @return $this
*/
public function batchActions(\Closure $closure)
{
call_user_func($closure, $this->batchActions);
return $this;
}
/**
* 获取行操作
* @param $row
* @param $key
* @return mixed
*/
public function getActions($row, $key)
{
$actions = new Actions($this);
$actions->row($row)->key($key);
if ($this->actions) call_user_func($this->actions, $actions);
return $actions->builderActions();
}
/**
* @param $closure
* @return $this
*/
public function top($closure)
{
$this->top = new Content();
call_user_func($closure, $this->top);
return $this;
}
/**
* @param $closure
* @return $this
*/
public function bottom($closure)
{
$this->bottom = new Content();
call_user_func($closure, $this->bottom);
return $this;
}
/**
* 自定义数据
* @param $data
* @param $current_page
* @param $per_page
* @param $last_page
* @param $total
* @return $this
*/
public function customData($data, $current_page = 0, $per_page = 0, $last_page = 0, $total = 0)
{
$this->customData = [
'current_page' => (int)$current_page,
'per_page' => (int)$per_page,
'last_page' => (int)$last_page,
'total' => (int)$total,
'items' => $data,
];
return $this;
}
/***
* 设置自定义数据
* @param $data
* @param int $current_page
* @param int $per_page
* @param int $last_page
* @param int $total
* @return $this
*/
public function setRowList($data, $current_page = 0, $per_page = 0, $last_page = 0, $total = 0)
{
$this->customData = [
'current_page' => (int)$current_page,
'per_page' => (int)$per_page,
'last_page' => (int)$last_page,
'total' => (int)$total,
'items' => $data,
];
return $this;
}
/**
* data
* @return array
*/
protected function data()
{
if ($this->customData) {
var_dump(9999);
// $this->customData['data'] = $this->model()->displayData($this->customData['data']);
return [
'code' => 200,
'data' => $this->isHidePage() ? $this->customData['data'] : $this->customData
];
}
$this->applyQuery();
$data = $this->model->buildData();
return [
'code' => 200,
'data' => $data
];
}
/**
* 输出JSON
* @inheritDoc
*/
public function jsonSerialize(): array
{
if (count($this->columnAttributes) <= 0) {
$this->columns($this->columns);
}
if ($this->isGetData) {
return $this->data();
} else {
$viewData['componentName'] = $this->componentName; //模板名
$viewData['crudOptions'] =$this->attributes; //表单参数
$viewData['dataUrl'] = $this->dataUrl; //数据请求地址
$viewData['method'] = $this->method; //请求方式
$viewData['topButtons'] = $this->top_buttons; //系统默认按钮
$viewData['rowColumn'] = $this->columnAttributes;//列表
// $viewData['attributes'] = $this->attributes;//列表
// var_dump($this->attributes);
// $viewData['ref'] = $this->getRef(); //自定义事件
// $viewData['quickSearch'] = $this->quickSearch; //快速搜索
// $viewData['toolbars'] = $this->toolbars->builderData(); //操作工具
// $viewData['batchActions'] = $this->batchActions->builderActions(); //自定义TOP操作工具
// $viewData['selection'] = $this->attributes->selection;//搜索
// 'topBottom' =>$this->top_buttons, //数据请求地址
// $viewData['keyName'] =
// $viewData['filter'] = $this->filter->buildFilter();//过滤
// $viewData['tree'] = $this->tree;//信息树
// $viewData['hidePage'] = $this->isHidePage(); //分页状态
// $viewData['pageSizes'] = $this->pageSizes;
// $viewData['perPage'] = $this->perPage; //分页默认数量
// $viewData['dialogForm'] =[
// 'dialogTitle'=> $this->dialogTitle,
// 'dialogFormWidth'=>$this->dialogFormWidth,
// 'Form'=>$this->dialogForm,
// ] ; //弹窗表单
// $viewData['pageBackground'] = $this->pageBackground; //页面背景
// $viewData['pageLayout'] = $this->pageLayout; //页面布局
// $viewData['export'] = $this->enableExport; //数据导出
// $viewData['defaultSort'] = $this->defaultSort;//默认排序
// $viewData['attributes'] = (array)$this->attributes;//属性
// $viewData['top'] = $this->top; //顶部
// $viewData['bottom'] = $this->bottom; //按钮
return $viewData;
}
}
/**
* @return string
*/
public function getComponentName(): string
{
return $this->componentName;
}
/**
* @param string $componentName
*/
public function setComponentName(string $componentName)
{
$this->componentName = $componentName;
return $this;
}
/**
* @param bool $isGetData
*/
public function setGetData(bool $isGetData): void
{
$this->isGetData = $isGetData;
}
public function getTable()
{
return $this->table;
}
}