d3yii2 / d3data
交叉报表
dev-master
2020-01-31 10:53 UTC
Requires
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-08-27 05:50:12 UTC
README
#D3 数据"
Yii2 模块,用于交叉报表。
功能
- 通过查询从数据库获取数据
- 定义列
- 从记录创建交叉表。
- 输出交叉字段的唯一值列表作为过滤器
- 过滤数据
安装
安装此扩展的首选方式是通过 composer。
可以运行
$ composer require d3yii2/d3data "*"
或者添加
"d3yii2/d3data": "*"
到您的 composer.json
文件的 require
部分。
用法
<?php class ReportGrid { public const F_STORE = 'store'; public const F_MANUFACTURED = 'manufactured'; public const F_PRODUCT = 'product'; public const F_PACKS_COUNT = 'packsCount'; /** @var D3DataProvider */ public $dataProvider; public function __construct(int $productId, string $manufacturedDate ) { $storeList = StoreDictionary::getList($this->sysCompanyId); $this->dataProvider = new D3DataProvider([ 'rowKeyColumns' => [self::F_PRODUCT,self::F_MANUFACTURED], 'tableColumnFields' => [self::F_STORE], 'tableAggregateColumns' => [self::F_PACKS_COUNT], 'query' => $this->query(), 'filter' => [ self::F_PRODUCT => (string)$productId, self::F_MANUFACTURED => $manufacturedDate, ], 'columns' => [ self::F_STORE => [ 'class' => D3DataListColumn::class, 'name' => self::F_STORE, 'label' => 'Noliktava', 'list' => StoreDictionary::getList($this->sysCompanyId) ], self::F_MANUFACTURED => [ 'class' => D3DataDateColumn::class, 'name' => self::F_MANUFACTURED, 'label' => 'Ražots', ], self::F_PRODUCT => [ 'class' => D3DataListColumn::class, 'name' => self::F_PRODUCT, 'label' => 'Produkts', 'list' => CwclProductsDictionary::getListAll() ], self::F_PACKS_COUNT => [ 'name' => self::F_PACKS_COUNT, 'label' => static function(string $value) use ($storeList){ return $storeList[$value] ?? $value; } ], ] ]); } public function getTable(): array { return $this->dataProvider->getTable(); } public function getProductFilterItems(int $selectedId, string $manufacturedDate): array { $items = []; $filterList = [ 0 => 'Visi'] + $this ->dataProvider ->columns[self::F_PRODUCT] ->getFilterList(); foreach($filterList as $id => $label ){ $items[] = [ 'label' => $label, 'url' => [ '', 'productId' => $id, 'manufacturedDate' => $manufacturedDate ], 'selected' => $id === $selectedId ]; } return $items; } public function getManufacturedFilterItems(string $selected, int $productId): array { $items = []; $filterList = [ '' => 'Visi'] + $this ->dataProvider ->columns[self::F_MANUFACTURED] ->getFilterList(); foreach($filterList as $id => $label ){ $items[] = [ 'label' => $label, 'url' => [ '', 'manufacturedDate' => $id, 'productId' => $productId ], 'selected' => $id === $selected ]; } return $items; } public function getColumns(): array { return $this->dataProvider->getGeneratedColumns(); } public function query(): StoreTransactionsQuery { return StoreTransactions::find() ->select([ self::F_STORE => 'stack.store_id', self::F_PRODUCT => 'product.product_id', self::F_MANUFACTURED => 'product.manufacture_date', self::F_PACKS_COUNT => 'COUNT(*)' ]) ; } }
控制器
/** * @param int $productId * @param string $manufacturedDate * @return string|Response * @throws Exception */ public function actionStackGrid(int $productId = 0, string $manufacturedDate = '') { $logic = new ReportGrid( $productId, $manufacturedDate); return $this->render('stack_grid', [ 'data' => $logic->getTable(), 'columns' => $logic->getColumns(), 'productFilterItems' => $logic->getProductFilterItems($productId, $manufacturedDate), 'manufacturedFilterItems' => $logic->getManufacturedFilterItems($manufacturedDate, $productId), ]); }