YII2十三大特性
第一(框架&项目)
1. 框架安装
2. 框架扩展安装
3. 项目初始化-->php yii init
4. 美化URL配置
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<controller:[\w-]+>/<action:[\w-]+>/<id:\d+>' => '<controller>/<action>',
],
],
5. nginx的配置
server {
root D:/project/chgg-erp/backend/web/;
index index.html index.php;
server_name local.erp.backend.com;
set $yii_bootstrap "index.php";
charset utf-8;
location / {
index $yii_bootstrap;
try_files $uri $uri/ $yii_bootstrap?$args;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$1 last;
}
}
location ~ ^/(protected|framework|nbproject|themes/\w+/views) {
deny all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 7d;
}
#avoid processing of calls to unexisting static files by yii
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
set $fsn /$yii_bootstrap;
if (-f $document_root$fastcgi_script_name){
set $fsn $fastcgi_script_name;
}
#fastcgi_next_upstream error timeout invalid_header http_500 http_503 http_404;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fsn;
#PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fsn;
}
location ~ /\.ht {
deny all;
}
}
6.读取配置文件中的配置项
\Yii::$app->configItemName
第二(数据库迁移migration)
1. 创建migration-->php yii migrate/create create_table_tablename
2. 编写migration-->
例如:编写取样申请表的migration
use yii\db\Schema;
use jamband\schemadump\Migration;
class m170921_093929_create_table_wms_sampling_application extends Migration
{
const TABLE_NAME = '{{%wms_sampling_application}}';
public function safeUp()
{
if ($this->db->driverName === 'mysql') {
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB COMMENT=\'取样申请表\'';
}
$this->createTable(self::TABLE_NAME, [
//唯一标识
'id' => $this->primaryKey() . ' AUTO_INCREMENT COMMENT \'自增ID\'',
'wms_sampling_application_code' => $this->string(45)->null()->comment('取样申请表编号'),
//原料还是成品
'wms_sampling_application_type' => $this->smallInteger(1)->null()->comment('原料还是成品:1是原料,2成品'),
//加工基地
'common_producer_info_id' => $this->integer(8)->null()->comment('加工基地ID'),
'common_producer_info_name' => $this->string(32)->null()->comment('加工基地名称'),
//申请人
'wms_sampling_application_user_id' => $this->integer(8)->null()->comment('申请人ID'),
'wms_sampling_application_user_name' => $this->string(32)->null()->comment('申请人姓名'),
'wms_sampling_application_user_phone' => $this->string(20)->null()->comment('申请人手机号码'),
//申请时间
'wms_sampling_application_apply_at' => $this->integer(10)->null()->comment('申请时间'),
//申请原因
'wms_sampling_application_apply_text' => $this->text()->null()->comment('申请原因'),
//审核人
'wms_sampling_application_check_user_id' => $this->integer(8)->null()->comment('审核人ID'),
'wms_sampling_application_check_user_name' => $this->string(32)->null()->comment('审核人姓名'),
'wms_sampling_application_check_user_phone' => $this->string(20)->null()->comment('审核人手机号码'),
//审核时间
'wms_sampling_application_check_at' => $this->integer(10)->null()->comment('审核时间'),
//审核状态与备注
'wms_sampling_application_check_status' => $this->smallInteger(1)->defaultValue(0)->comment('审核状态:0未审核,1审核通过,2审核拒绝'),
'wms_sampling_application_check_text' => $this->text()->null()->comment('审核备注'),
//共有字段
'created_at' => $this->integer(10)->null(),
'updated_at' => $this->integer(10)->null(),
'is_del' => $this->boolean()->defaultValue(0),
], $tableOptions);
$this->createIndex('wms_sampling_application_code',self::TABLE_NAME,'wms_sampling_application_code');
$this->createIndex('wms_sampling_application_type',self::TABLE_NAME,'wms_sampling_application_type');
$this->createIndex('wms_sampling_application_check_status',self::TABLE_NAME,'wms_sampling_application_check_status');
}
public function safeDown()
{
$this->dropTable(self::TABLE_NAME);
}
}
3. 执行migration-->php yii migrate
4. 回退migration-->php yii migrate/down n
第三(代码生成器gii)
1. 配置gii
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
'allowedIPs' => ['127.0.0.1'],
'generators' => [
'crud' => [ //生成器名称
'class' => 'yii\gii\generators\crud\Generator',
'templates' => [ //设置我们自己的模板
//模板名 => 模板路径
'template' => '@vendor/gii_extension_template/template/crud/default',
]
]
],
];
}
2. 使用gii生成model
3. 使用gii生成curd
第四(数据模型Command/Query/ActiveRecord)
1. 使用Command即原生sql操作
例如:库存盘点清单需要查出原料入库单列表和原料出库单列表
$sql = "SELECT
id in_sheet_id,
wms_material_in_sheet_number in_sheet_number,
common_producer_info_id producer_id,
common_producer_info_name producer_name,
common_producer_herb_info_id info_id,
common_producer_herb_info_name info_name,
common_producer_herb_grade_info_id grade_id,
common_producer_herb_grade_name grade_name,
SUM(
IFNULL(
wms_material_in_sheet_package_number,
0
)
) AS sum_in_package_number,
SUM(
IFNULL(
wms_material_in_sheet_in_weight,
0
)
) AS sum_in_weight
FROM
{{%wms_material_in_sheet}}
WHERE
is_del = 0
AND wms_material_in_sheet_status = 1
AND common_producer_info_id = :common_producer_info_id
AND wms_material_in_sheet_product_in_date >= :wms_check_begin_at
AND wms_material_in_sheet_product_in_date <= :wms_check_end_at
GROUP BY
common_producer_herb_info_id,
common_producer_herb_grade_info_id,
wms_material_in_sheet_number";
$list = Yii::$app->db->createCommand($sql)
->bindValue(':common_producer_info_id', $common_producer_info_id)
->bindValue(':wms_check_begin_at', $wms_check_begin_at)
->bindValue(':wms_check_end_at', $wms_check_end_at)->queryAll();
使用原生sql带join操作的command
$sql = "SELECT
modet.wms_stock_detail_info_relation_good_in_sheet_number in_sheet_number,
mo.common_producer_info_id producer_id,
mo.common_producer_info_name producer_name,
mo.common_producer_herb_info_id info_id,
mo.common_producer_herb_info_name info_name,
mo.common_producer_herb_grade_info_id grade_id,
mo.common_producer_herb_grade_name grade_name,
SUM(
IFNULL(
modet.wms_material_out_sheet_detail_out_number,
0
)
) AS sum_out_package_number,
SUM(
IFNULL(
modet.wms_material_out_sheet_detail_out_weight,
0
)
) AS sum_out_weight,
SUM(
IFNULL(
modet.wms_material_out_sheet_detail_storage_loss_weight,
0
)
) AS sum_out_loss_weight
from {{%wms_material_out_sheet_detail}} modet
LEFT JOIN {{%wms_material_out_sheet}} mo ON mo.id = modet.wms_material_out_sheet_id
WHERE
modet.is_del = 0
AND mo.is_del = 0
AND mo.wms_material_out_sheet_status = 1
AND mo.common_producer_info_id = :common_producer_info_id
AND mo.wms_material_out_sheet_outgoing_date >= :wms_check_begin_at
AND mo.wms_material_out_sheet_outgoing_date <= :wms_check_end_at
GROUP BY
mo.common_producer_herb_info_id,
mo.common_producer_herb_grade_info_id,
modet.wms_material_out_sheet_number,
modet.wms_stock_detail_info_relation_good_in_sheet_number";
$list = Yii::$app->db->createCommand($sql)
->bindValue(':common_producer_info_id', $common_producer_info_id)
->bindValue(':wms_check_begin_at', $wms_check_begin_at)
->bindValue(':wms_check_end_at', $wms_check_end_at)->queryAll();
2. 使用Query操作数据表
例如:库存盘点清单功能需要查出成品入库列表和成品出库列表
$command = (new \yii\db\Query())->select([
'id in_sheet_id',
'wms_product_in_sheet_number in_sheet_number',
'common_producer_info_id producer_id',
'common_producer_info_name producer_name',
'common_producer_herb_info_id_product info_id',
'common_producer_herb_info_name_product info_name',
'common_producer_herb_grade_info_id_product grade_id',
'common_producer_herb_grade_name_product grade_name',
'SUM(
IFNULL(
wms_product_in_sheet_package_number,
0
)
) AS sum_in_package_number',
'SUM(
IFNULL(
wms_product_in_sheet_in_weight,
0
)
) AS sum_in_weight'
])->from('{{%wms_product_in_sheet}}')->where('is_del = 0
AND wms_product_in_sheet_status = 1
AND common_producer_info_id = :common_producer_info_id
AND wms_product_in_sheet_product_in_date >= :wms_check_begin_at
AND wms_product_in_sheet_product_in_date <= :wms_check_end_at',
[
':common_producer_info_id'=>$common_producer_info_id,
':wms_check_begin_at'=>$wms_check_begin_at,
':wms_check_end_at'=>$wms_check_end_at
])->groupBy(['common_producer_herb_info_id_product',
'common_producer_herb_grade_info_id_product',
'wms_product_in_sheet_number'])->createCommand();
$list = $command->queryAll();
//注意:成品出库详情没有成品出库ID的关联字段,只能使用成品出库单号关联
//查询的入库单号应该使用出库单性情表的入库单号,,因为主表关联多个入库单,故主表入库单号为空
//分组时不应该使用入库单号,而应该使用出库单号,因为一个入库单可以分多次出库
$command = (new \yii\db\Query())->select([
'podet.wms_product_in_sheet_number in_sheet_number',
'po.common_producer_info_id producer_id',
'po.common_producer_info_name producer_name',
'po.common_producer_herb_info_id_product info_id',
'po.common_producer_herb_info_name_product info_name',
'po.common_producer_herb_grade_info_id_product grade_id',
'po.common_producer_herb_grade_name_product grade_name',
'SUM(
IFNULL(
podet.wms_product_out_detail_info_out_number,
0
)
) AS sum_out_package_number',
'SUM(
IFNULL(
podet.wms_product_out_detail_info_out_weight,
0
)
) AS sum_out_weight',
'SUM(
IFNULL(
podet.wms_product_out_detail_info_storage_loss_weight,
0
)
) AS sum_out_loss_weight'
])->from('{{%wms_product_out_detail_info}} podet')
->leftJoin('{{%wms_product_out_sheet}} po', 'po.wms_product_out_sheet_number = podet.wms_product_out_sheet_number')
->where('podet.is_del = 0
AND po.is_del = 0
AND po.wms_product_out_sheet_status = 1
AND po.common_producer_info_id = :common_producer_info_id
AND po.wms_product_out_sheet_product_out_date >= :wms_check_begin_at
AND po.wms_product_out_sheet_product_out_date <= :wms_check_end_at',
[
':common_producer_info_id'=>$common_producer_info_id,
':wms_check_begin_at'=>$wms_check_begin_at,
':wms_check_end_at'=>$wms_check_end_at
])->groupBy(['po.common_producer_herb_info_id_product',
'po.common_producer_herb_grade_info_id_product',
'po.wms_product_out_sheet_number',
'podet.wms_product_in_sheet_number'])->createCommand();
$list = $command->queryAll();
第五 (GridView/ListView/DetailView)
例如:库存盘点中创建库存盘点时展示实时库存
<?= kartik\grid\GridView::widget([
'tableOptions' => ['class' => 'table table-striped', 'style'=>'font-size:12px;', 'id'=>'data-table'],
'layout' => "{items}",
'striped'=>false,
'hover'=>true,
'showHeader'=>true,
'showFooter'=>false,
'showPageSummary' => false,
'showOnEmpty'=>true,
'emptyText'=>'当前没有数据,请更改截止日期和存货类型后重试!',
'emptyTextOptions'=>['style'=>'color:red;font-weight:bold;text-align:center;'],
'dataProvider' => $dataProvider,
'columns' => [
[
'label'=>'存货名称',
'attribute'=>'info_id',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'group'=>true,
'value'=>function($wms){
return $wms["info_name"];
}
],
[
'label'=>'等级',
'attribute'=>'grade_id',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'group'=>true,
'subGroupOf' => 0,
'value'=>function($wms){
return $wms["grade_name"];
}
],
[
'label'=>'入库单号',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return $wms["in_sheet_number"];
}
],
[
'label'=>'系统件数(袋)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return $wms["package_number"];
}
],
[
'label'=>'盘点件数(袋)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return "";
}
],
[
'label'=>'件数差异(袋)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return "";
}
],
[
'label'=>'包装规格',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return "";
}
],
[
'label'=>'系统重量(公斤)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return \common\models\Base::weightBcdiv($wms["weight"]);
}
],
[
'label'=>'盘点重量(公斤)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return "";
}
],
[
'label'=>'重量差异(公斤)',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'value'=>function($wms){
return "";
}
],
[
'label'=>'差异说明',
'value'=>function($wms){
return "";
}
],
],
]); ?>
例如:使用GridView的导出功能,页面合计功能,表头浮动功能,列宽设置,列不换行设置
<div class="finance-detail-index">
<?php
$columns = [
[
'label'=>'基地ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'value'=>function($model){
return $model['info_id'];
}
],
[
'label'=>'品种ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'value'=>function($model){
return $model['herb_info_id'];
}
],
[
'label'=>'等级ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'value'=>function($model){
return $model['grade_info_id'];
}
],
[
'label'=>'项目ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'value'=>function($model){
return $model['detail_type'];
}
],
[
'label'=>'项目',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
$detail_type_name = \backend\models\FinanceDetailSearch::getDetailTypeName($model['detail_type']);
return $detail_type_name;
}
],
[
'label'=>'品种',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'subGroupOf' => 4,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return $model['herb_info_name'];
}
],
[
'label'=>'等级',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'subGroupOf' => 5,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return $model['grade_info_name'];
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['begin_balance_weight']) && empty($model['begin_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['begin_balance_unit_price']);
}
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['begin_balance_weight']);
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['begin_balance_weight']) && empty($model['begin_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['begin_balance_sum_price']);
}
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight']) && empty($model['going_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_unit_price']);
}
}
],
[
'label'=>'重量增加(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight_increase']);
}
],
[
'label'=>'重量减少(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight_decrease']);
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight']);
}
],
[
'label'=>'金额增加(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight_increase']) && empty($model['going_balance_sum_price_increase'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price_increase']);
}
}
],
[
'label'=>'金额减少(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight_decrease']) && empty($model['going_balance_sum_price_decrease'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price_decrease']);
}
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight']) && empty($model['going_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price']);
}
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['end_balance_weight']) && empty($model['end_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['end_balance_unit_price']);
}
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['end_balance_weight']);
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['end_balance_weight']) && empty($model['end_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['end_balance_sum_price']);
}
}
],
[
'class' => 'kartik\grid\ActionColumn',
'template' => '{view}',
'header'=>'操作',
'buttons' => [
'view' => function ($url, $model, $key) {
return Html::a('查看详情', ['view'
], ['class' => 'view',
'data-toggle' => 'modal',
'data-target' => '#view-modal',
'data-common_producer_info_id' => $model['info_id'],
'data-common_producer_herb_info_id' => $model['herb_info_id'],
'data-common_producer_grade_info_id' => $model['grade_info_id'],
]);
},
]
],
];
?>
<?= \kartik\grid\GridView::widget([
'tableOptions' => ['class' => 'table table-striped', 'style'=>'font-size:12px;', 'id'=>'finance-detail'],
'layout' => "{toolbar}{items}",
'bordered' => true,
'striped' => false,
'condensed' => false,
'responsive' => true,
'hover' => true,
'floatHeader'=>false,
'floatHeaderOptions' => ['scrollingTop' => ''],
'showHeader'=>true,
'showFooter'=>false,
'beforeHeader'=>[
[
'columns'=>[
['content'=>'基本信息', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'期初余额', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'本期发生额', 'options'=>['colspan'=>7, 'class'=>'text-center warning']],
['content'=>'期末余额', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'其他', 'options'=>['colspan'=>1, 'class'=>'text-center warning']],
],
'options'=>['class'=>'skip-export']
]
],
'showPageSummary' => true,
'showOnEmpty'=>true,
'emptyText'=>'当前没有数据!',
'emptyTextOptions'=>['style'=>'color:red;font-weight:bold;text-align:center;'],
'export' => [
'label' => '导出',
'fontAwesome' => true,
'options'=>[
'id'=>'export',
'float'=>'right',
],
],
'toolbar' => [
['content'=>
Html::a('业务统计报表', ['wms-statistics/index'], ['data-pjax'=>0, 'class' => 'btn btn-default', 'title'=>Yii::t('app', '业务统计报表')]) . ' '.
Html::button('自定义导出', ['type'=>'button', 'title'=>Yii::t('app', '自定义导出'), 'class'=>'btn btn-success', 'onclick'=>'alert("自定义导出");'])
],
'{export}',
],
// 'exportConfig' => [
// \kartik\grid\GridView::EXCEL => [],
// ],
'dataProvider' => $financeDetailArrayDataProvider,
'columns' => $columns,
]); ?>
</div>
第六(DataProvider)
1. ActiveDataProvider
例如:
public function searchByCheckId($checkId){
$query = WmsCheckDetail::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$query->where([
'wms_check_id' => $checkId,
'is_summary' =>0,
'is_del' => 0,
]);
return $dataProvider;
}
2. SqlDataProvider
3. ArrayDataProvider
例如:根据原料或成品的数据二维数组组装ArrayDataProvider
/**
* 原料列表数据提供器
* @param $common_producer_info_id
* @param int $wms_check_begin_at
* @param int $wms_check_end_at
* @return ArrayDataProvider
*/
public static function getWmsMaterialInfoListProvider($common_producer_info_id, $wms_check_begin_at=0, $wms_check_end_at=0){
$wms_check_end_at = !empty($wms_check_end_at) ? $wms_check_end_at : time();
$list = self::getWmsSumList($common_producer_info_id, $wms_check_begin_at, $wms_check_end_at, 1);
$provider = new ArrayDataProvider([
'allModels' => $list,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'attributes' => ['in_sheet_number'],
],
]);
return $provider;
}
/**
* 获取成品数据提供器
* @param $common_producer_info_id
* @param int $wms_check_begin_at
* @param int $wms_check_end_at
* @return ArrayDataProvider
*/
public static function getWmsProductInfoListProvider($common_producer_info_id, $wms_check_begin_at=0, $wms_check_end_at=0){
$wms_check_end_at = !empty($wms_check_end_at) ? $wms_check_end_at : time();
$list = self::getWmsSumList($common_producer_info_id, $wms_check_begin_at, $wms_check_end_at, 2);
$provider = new ArrayDataProvider([
'allModels' => $list,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'attributes' => ['in_sheet_number'],
],
]);
return $provider;
}
第七(验证器)
1. 必填验证器
/**
* 验证规则
*/
public function rules()
{
return [
[['common_producer_info_id', 'common_producer_herb_type', 'wms_check_user_id', 'wms_check_redo_user_id', 'created_at', 'updated_at', 'is_del'], 'integer'],
//盘点时间和复核时间必须为字符串才能兼容
[[ 'wms_check_begin_at', 'wms_check_end_at', 'wms_check_at', 'wms_redo_at', 'wms_check_note', 'wms_check_redo_note', 'wms_check_manage_note'], 'string'],
[['wms_check_code', 'wms_check_user_name', 'wms_check_redo_user_name'], 'string', 'max' => 32],
[['common_producer_info_name'], 'string', 'max' => 50],
[['wms_check_user_phone', 'wms_check_redo_user_phone'], 'string', 'max' => 20],
// ['wms_check_end_at', 'string', 'message'=>'截止日期必须是字符串', 'when' => function ($model) {
// return strpos(Yii::$app->request->pathInfo, "create");
// }],
// ['wms_check_at', 'string', 'message'=>'盘库日期必须是字符串', 'when' => function ($model) {
// return strpos(Yii::$app->request->pathInfo, "update");
// }],
// ['wms_redo_at', 'string', 'message'=>'复核日期必须是字符串', 'when' => function ($model) {
// return strpos(Yii::$app->request->pathInfo, "redo");
// }],
//自定义验证规则,验证不能为空
['wms_check_code', 'required', 'message'=>'编号不能为空', 'when' => function ($model) {
return $model->isNewRecord;
}],
['common_producer_info_id', 'required', 'message'=>'基地不能为空', 'when' => function ($model) {
return $model->isNewRecord;
}],
['common_producer_herb_type', 'required', 'message'=>'存货类别不能为空', 'when' => function ($model) {
return $model->isNewRecord;
}],
['wms_check_end_at', 'required', 'message'=>'期末不能为空', 'when' => function ($model) {
return $model->isNewRecord;
}],
['wms_check_user_id', 'required', 'message'=>'盘点人不能为空', 'when' => function ($model) {
return strpos(Yii::$app->request->pathInfo, "update");
}],
['wms_check_redo_user_id', 'required', 'message'=>'复核人不能为空', 'when' => function ($model) {
return strpos(Yii::$app->request->pathInfo, "redo");
}],
['wms_check_at', 'required', 'message'=>'盘点日期不能为空', 'when' => function ($model) {
return strpos(Yii::$app->request->pathInfo, "update");
}],
['wms_redo_at', 'required', 'message'=>'复核日期不能为空', 'when' => function ($model) {
return strpos(Yii::$app->request->pathInfo, "redo");
}],
];
}
2. 数据类型验证器
第八(Request与UrlManager)
1. Request
Yii::$app->request->get('name', '')
Yii::$app->request->pathInfo
2. UrlManager
例如:使用Url::to()方法
<input type="hidden" name="wms_url" value="<?= Url::to(['wms-check/create']) ?>"/>
<?php
$js = <<<JS
$(function() {
$('#data-table').attr('cell-specing', 20);
});
function loadWmsList() {
var url = $(":input[name=wms_url]").val();
var common_producer_herb_type = $("#wmscheck-common_producer_herb_type").val();
// var wms_check_begin_at = $("#wmscheck-wms_check_begin_at").val();
var wms_check_end_at = $("#wmscheck-wms_check_end_at").val();
// wms_check_begin_at = new Date(Date.parse(wms_check_begin_at.replace(/-/g, "/"))).getTime() / 1000;
wms_check_end_at = new Date(Date.parse(wms_check_end_at.replace(/-/g, "/"))).getTime() / 1000;
var href = url + "?common_producer_herb_type=" + common_producer_herb_type + "&wms_check_end_at=" + wms_check_end_at;
window.location.href = href;
}
JS;
$this->registerJs($js);
?>
</div>
例如:使用Html::a()生成链接
[
'class' => 'kartik\grid\ActionColumn',
'template' => '<li>{print}</li><li>{update}</li><li>{redo}</li><li>{view}</li><li>{delete}</li>',
'header'=>'操作',
'dropdown' => true,
'dropdownOptions' => ['class' => 'pull-right'],
'dropdownButton' => ['label' => '菜单','class'=>'btn btn-success'],
'buttons' => [
'print' => function ($url, $model, $key) {
if($model->is_del == 0){
return Html::a('打印', ['print', 'id' => $key], ['target'=>'_blank']);
}
},
'update' => function ($url, $model, $key) {
if($model->is_del == 0 && in_array($model->wms_check_status, array(0, 1))){
return Html::a('录入', ['update', 'id' => $key]);
}
},
'redo' => function ($url, $model, $key) {
if($model->is_del == 0 && in_array($model->wms_check_status, array(1))){
return Html::a('复核', ['redo', 'id' => $key]);
}
},
'view' => function ($url, $model, $key) {
return Html::a('查看', ['view', 'id' => $key], ['class' => ' ']);
},
'delete' => function ($url, $model, $key) {
if($model->is_del == 0){
return Html::a('作废', ['delete', 'id' => $model->id], [
'data-method' => 'post',
'data' => [
'confirm' => '废除后无法恢复,你确定要废除此单据吗?',
'method' => 'post',
],
]) ;
}
},
]
],
第九
弹出层(Modal)
<?php
Modal::begin([
'id' => 'append-modal',
'header' => '<h4 class="modal-title">选择到清单</h4>',
'footer' => '<a href="#" class="btn btn-success" id="append-ok">确定</a><a href="#" class="btn btn-default" data-dismiss="modal">关闭</a>',
]);
$requestUrl = Url::toRoute('modal-union-detail-list');
$wms_profitloss_type = isset($model->wms_profitloss_type) ? $model->wms_profitloss_type : 0;
$js = <<<JS
$("#append").click(function() {
var wms_profitloss_union_type = $("#wmsprofitloss-wms_profitloss_union_type").find("option:selected").attr("value");
var wms_profitloss_union_code = $("#wmsprofitloss-wms_profitloss_union_code").find("option:selected").attr("value");
$.get('{$requestUrl}', {
'wms_profitloss_type':'{$wms_profitloss_type}',
'wms_profitloss_union_type':wms_profitloss_union_type,
'wms_profitloss_union_code':wms_profitloss_union_code
},
function (data) {
$('.modal-body').html(data);
}
);
});
$("#append-ok").click(function() {
var keys=$('#w0').yiiGridView('getSelectedRows');
for(var i=0; i<keys.length; i++){
var key = keys[i];
var tr = $("#union-list").find("tbody").find("tr").eq(key);
var union_detail_id = $(tr).find("td").eq(0).text();
var info_id = $(tr).find("td").eq(0).text();
var info_name = $(tr).find("td").eq(1).text();
var grade_id = $(tr).find("td").eq(2).text();
var grade_name = $(tr).find("td").eq(3).text();
var diff_package_num = $(tr).find("td").eq(4).text();
var spec_name = $(tr).find("td").eq(5).text();
var diff_weight = $(tr).find("td").eq(6).text();
var diff_note = $(tr).find("td").eq(7).text();
var template_tr = $($('.template tbody').html().replace(/__union_detail_id__/g, union_detail_id));
$("#union_detail_id", template_tr).val(union_detail_id);
$("#info_id", template_tr).val(info_id);
$("#info_name", template_tr).val(info_name);
$("#info_name", template_tr).text(info_name);
$("#grade_id", template_tr).val(grade_id);
$("#grade_name", template_tr).val(grade_name);
$("#grade_name", template_tr).text(grade_name);
$("#diff_package_num", template_tr).val(diff_package_num);
$("#diff_package_num", template_tr).text(diff_package_num);
// $("#apply_package_num", template_tr).val(apply_package_num);
// $("#apply_package_num", template_tr).text(apply_package_num);
$("#spec_name", template_tr).val(spec_name);
$("#spec_name", template_tr).text(spec_name);
$("#diff_weight", template_tr).val(diff_weight);
$("#diff_weight", template_tr).text(diff_weight);
// $("#apply_weight", template_tr).val(apply_weight);
// $("#apply_weight", template_tr).text(apply_weight);
// $("#apply_note", template_tr).val(diff_note);
// $("#apply_note", template_tr).text(diff_note);
// alert(template_tr.html());
$('#detail-list').append(template_tr);
}
$("#append-modal").modal("hide");
});
JS;
$this->registerJs($js);
Modal::end();
?>
<table class="table table-bordered" id="detail-list">
<tr>
<td colspan="12" class="type_title"><i class="fa fa-plus" style="margin-right: 5px;"></i><?php
echo Html::a('添加到清单', '#', [
'id' => 'append',
'data-toggle' => 'modal',
'data-target' => '#append-modal',
]);
?></td>
</tr>
<tr>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">存货名称</label></td>
<td colspan="2" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">等级</label></td>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">损益件数(袋)</label></td>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">上报件数(袋)</label></td>
<td colspan="2" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">包装规格</label></td>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">损益重量(公斤)</label></td>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">上报重量(公斤)</label></td>
<td colspan="2" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">上报说明</label></td>
<td colspan="1" class="item-label"><label class="control-label" style="white-space:nowrap; text-align: center">操作</label></td>
</tr>
</table>
第十
图片上传与预览(FileInput)
<table class="table table-bordered">
<tr>
<td colspan="12" class="type_title">凭证</td>
</tr>
<tr>
<td class="item-label">
<label class="control-label" for="wmsprofitloss-wms_profitloss_apply_note" style="white-space:nowrap;">关联单号详情截图<span class="error">(必填)</span></label>
</td>
<td colspan="11" class="note">
<?= $form->field($model, 'wms_profitloss_apply_note[]')->widget(FileInput::classname(), [
'options' => ['multiple' => false],
'pluginOptions' => [
// 需要预览的文件格式
'previewFileType' => 'image',
// 预览的文件
// 'initialPreview' => $p1,
// 需要展示的图片设置,比如图片的宽度等
// 'initialPreviewConfig' => $p2,
// 是否展示预览图
'initialPreviewAsData' => true,
// 异步上传的接口地址设置
'uploadUrl' => Url::toRoute(['/goods/async-banner']),
// 异步上传需要携带的其他参数,比如商品id等
'uploadExtraData' => [
],
'uploadAsync' => true,
// 最少上传的文件个数限制
'minFileCount' => 1,
// 最多上传的文件个数限制
'maxFileCount' => 10,
// 是否显示移除按钮,指input上面的移除按钮,非具体图片上的移除按钮
'showRemove' => true,
// 是否显示上传按钮,指input上面的上传按钮,非具体图片上的上传按钮
'showUpload' => true,
//是否显示[选择]按钮,指input上面的[选择]按钮,非具体图片上的上传按钮
'showBrowse' => true,
// 展示图片区域是否可点击选择多文件
'browseOnZoneClick' => true,
// 如果要设置具体图片上的移除、上传和展示按钮,需要设置该选项
'fileActionSettings' => [
// 设置具体图片的查看属性为false,默认为true
'showZoom' => false,
// 设置具体图片的上传属性为true,默认为true
'showUpload' => true,
// 设置具体图片的移除属性为true,默认为true
'showRemove' => true,
],
],
]) ?>
</td>
</tr>
</table>
例如:上传图片在模板中代码如下:
<tr>
<td class="item-label">
<label class="control-label" for="wmsprofitloss-wms_profitloss_apply_certificate" style="white-space:nowrap;">关联单号详情截图<span class="error">(必填)</span></label>
</td>
<td colspan="11">
<?= $form->field($model, 'wms_profitloss_apply_certificate')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'wms_profitloss_apply_certificate_preview')->widget(\kartik\widgets\FileInput::className(), [
'value' => $model->wms_profitloss_apply_certificate,
'options' => ['accept' => 'image/*'],
'pluginOptions' => [
'previewFileType' => 'any',
'allowedFileExtensions'=>['jpg', 'jpeg', 'png', 'bmp'],
'initialPreviewAsData' => true,
'initialPreview' => [$model->wms_profitloss_apply_certificate],
'showPreview' => true,
'showCaption' => false,
'showRemove' => true,
'showUpload' => false
],
'pluginEvents' => [
"fileclear" => "function() { $('#wmsprofitloss-wms_profitloss_apply_certificate').val(''); }"
],
]) ?>
</td>
</tr>
在控制器中的代码如下:
//上传图片
if (!empty($_FILES['WmsProfitloss']['tmp_name']['wms_profitloss_apply_certificate_preview'])) {
$key = uniqid(time());
Yii::$app->qiniu->uploadFile($_FILES['WmsProfitloss']['tmp_name']['wms_profitloss_apply_certificate_preview'], $key);
$model->wms_profitloss_apply_certificate = 'http://' . Yii::$app->qiniu->getLink($key);
}
第十一
消息提示框
在控制器中的写法:
\Yii::$app->getSession()->setFlash('error', 'This is the message');
\Yii::$app->getSession()->setFlash('success', 'This is the message');
\Yii::$app->getSession()->setFlash('info', 'This is the message');
在模板中的写法:
if( Yii::$app->getSession()->hasFlash('success') ) {
echo yii\bootstrap\Alert::widget([
'options' => [
'class' => 'alert-success',
],
'body' => Yii::$app->getSession()->getFlash('success'),
]);
}
if( Yii::$app->getSession()->hasFlash('error') ) {
echo yii\bootstrap\Alert::widget([
'options' => [
'class' => 'alert-error',
],
'body' => Yii::$app->getSession()->getFlash('error'),
]);
}
第十二
导出EXCEL
1. 使用\kartik\grid\GridView的自带的导出EXCEL的功能
例如:需要配置导出EXCEL的具体配置,比如是否导出前表头,是否导出合计行,以及设置哪些列不导出。
<div class="finance-detail-index">
<?php
$columns = [
[
'label'=>'基地ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'hiddenFromExport'=>true,
'value'=>function($model){
return $model['info_id'];
}
],
[
'label'=>'品种ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'hiddenFromExport'=>true,
'value'=>function($model){
return $model['herb_info_id'];
}
],
[
'label'=>'等级ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'hiddenFromExport'=>true,
'value'=>function($model){
return $model['grade_info_id'];
}
],
[
'label'=>'项目ID',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>true,
'hiddenFromExport'=>true,
'value'=>function($model){
return $model['detail_type'];
}
],
[
'label'=>'项目',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
$detail_type_name = \backend\models\FinanceDetailSearch::getDetailTypeName($model['detail_type']);
return $detail_type_name;
}
],
[
'label'=>'品种',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'subGroupOf' => 4,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return $model['herb_info_name'];
}
],
[
'label'=>'等级',
'hAlign' => 'center',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'group'=>true,
'subGroupOf' => 5,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return $model['grade_info_name'];
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['begin_balance_weight']) && empty($model['begin_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['begin_balance_unit_price']);
}
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['begin_balance_weight']);
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['begin_balance_weight']) && empty($model['begin_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['begin_balance_sum_price']);
}
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight']) && empty($model['going_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_unit_price']);
}
}
],
[
'label'=>'重量增加(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight_increase']);
}
],
[
'label'=>'重量减少(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight_decrease']);
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['going_balance_weight']);
}
],
[
'label'=>'金额增加(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight_increase']) && empty($model['going_balance_sum_price_increase'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price_increase']);
}
}
],
[
'label'=>'金额减少(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight_decrease']) && empty($model['going_balance_sum_price_decrease'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price_decrease']);
}
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['going_balance_weight']) && empty($model['going_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['going_balance_sum_price']);
}
}
],
[
'label'=>'单价(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['end_balance_weight']) && empty($model['end_balance_unit_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['end_balance_unit_price']);
}
}
],
[
'label'=>'重量(公斤)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
return \common\models\Base::weightBcdiv($model['end_balance_weight']);
}
],
[
'label'=>'金额(元)',
'hAlign' => 'right',
'vAlign' => 'middle',
'format'=>'raw',
'noWrap'=>true,
'width'=>'200px',
// 'headerOptions'=>['class'=>'kv-sticky-column'],
// 'contentOptions'=>['class'=>'kv-sticky-column'],
'pageSummary'=>true,
'visible'=>true,
'hidden'=>false,
'value'=>function($model){
if (!empty($model['end_balance_weight']) && empty($model['end_balance_sum_price'])){
return '<span class="not-set">(未知)</span>';
}else{
return \common\models\Base::moneyBcdiv($model['end_balance_sum_price']);
}
}
],
[
'class' => 'kartik\grid\ActionColumn',
'template' => '{view}',
'header'=>'操作',
'buttons' => [
'view' => function ($url, $model, $key) {
return Html::a('查看详情', ['view'
], ['class' => 'view',
'data-toggle' => 'modal',
'data-target' => '#view-modal',
'data-common_producer_info_id' => $model['info_id'],
'data-common_producer_herb_info_id' => $model['herb_info_id'],
'data-common_producer_grade_info_id' => $model['grade_info_id'],
]);
},
]
],
];
?>
<?= \kartik\grid\GridView::widget([
'tableOptions' => ['class' => 'table table-striped', 'style'=>'font-size:12px;', 'id'=>'finance-detail'],
'layout' => "{toolbar}{items}",
'bordered' => true,
'striped' => false,
'condensed' => false,
'responsive' => true,
'hover' => true,
'floatHeader'=>false,
'floatHeaderOptions' => ['scrollingTop' => ''],
'showHeader'=>true,
'showFooter'=>false,
'beforeHeader'=>[
[
'columns'=>[
['content'=>'基本信息', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'期初余额', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'本期发生额', 'options'=>['colspan'=>7, 'class'=>'text-center warning']],
['content'=>'期末余额', 'options'=>['colspan'=>3, 'class'=>'text-center warning']],
['content'=>'其他', 'options'=>['colspan'=>1, 'class'=>'text-center warning']],
],
'options'=>['class'=>'skip-export']
]
],
'showPageSummary' => true,
'showOnEmpty'=>true,
'emptyText'=>'当前没有数据!',
'emptyTextOptions'=>['style'=>'color:red;font-weight:bold;text-align:center;'],
'export' => [
'label' => '导出',
'fontAwesome' => true,
'target'=>'_blank',
'encoding'=>'utf-8',
'options'=>[
'id'=>'export',
],
],
'toolbar' => [
['content'=>
Html::a('业务统计报表', ['wms-statistics/index'], ['data-pjax'=>0, 'class' => 'btn btn-default', 'title'=>Yii::t('app', '业务统计报表')]) . ' '.
Html::button('自定义导出', ['type'=>'button', 'title'=>Yii::t('app', '自定义导出'), 'class'=>'btn btn-success', 'onclick'=>'alert("自定义导出");'])
],
'{export}',
],
'exportConfig' => [
\kartik\grid\GridView::EXCEL => [
'label' => '导出EXCEL',
'iconOptions' => ['class' => 'text-primary'],
'showHeader' => true,
'showPageSummary' => true,
'showFooter' => true,
'showCaption' => true,
'filename' => '存货明细表('.$common_producer_info_name.')'.$searchModel->wms_statistics_begin_at.'至'.$searchModel->wms_statistics_end_at,
'alertMsg' => '确定要导出EXCEL格式文件?',
'options' => [
'title'=>'',
],
'mime' => 'application/excel',
'config' => [
'colDelimiter' => ",",
'rowDelimiter' => "\r\n",
],
],
],
'dataProvider' => $financeDetailArrayDataProvider,
'columns' => $columns,
]); ?>
</div>
2.调用php-excel自定义导出excel
代码如下:
首先,对php-excel进行封装,形成MyExcelHelper
<?php
namespace core\components;
use PHPExcel;
use PHPExcel_IOFactory;
class MyExcelHelper extends \yii\base\Component{
/**
* 将二维数组的数据转化为excel表格导出
* @param $data
* @param $excel_name
* @param $headers
* @param $options
*/
public static function array2excel($data, $excel_name, $headers, $options){
$objPHPExcel = new PHPExcel();
ob_start();
if (!isset($options['creator'])){
$objPHPExcel->getProperties()->setCreator('creator');
}else{
$objPHPExcel->getProperties()->setCreator($options['creator']);
}
if (isset($options['last_modified_by'])){
$objPHPExcel->getProperties()->setCreator('last_modified_by');
}else{
$objPHPExcel->getProperties()->setCreator($options['last_modified_by']);
}
if (isset($options['title'])){
$objPHPExcel->getProperties()->setCreator('title');
}else{
$objPHPExcel->getProperties()->setCreator($options['title']);
}
if (isset($options['subject'])){
$objPHPExcel->getProperties()->setCreator('subject');
}else{
$objPHPExcel->getProperties()->setCreator($options['subject']);
}
if (isset($options['description'])){
$objPHPExcel->getProperties()->setCreator('description');
}else{
$objPHPExcel->getProperties()->setCreator($options['description']);
}
if (isset($options['keywords'])){
$objPHPExcel->getProperties()->setCreator('keywords');
}else{
$objPHPExcel->getProperties()->setCreator($options['keywords']);
}
if (isset($options['category'])){
$objPHPExcel->getProperties()->setCreator('category');
}else{
$objPHPExcel->getProperties()->setCreator($options['category']);
}
$header_keys = array_keys($headers);
foreach ($header_keys as $header_index => $header_key){
$index_ascii = $header_index + 65;
$index_chr = chr($index_ascii);
$header_value = $headers[$header_key];
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr.'1', $header_value);
$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($index_chr)->setWidth(20);
}
$data_row_index = 2;
foreach ($data as $row_index => $row){
$data_keys = array_keys($row);
foreach ($data_keys as $column_index => $data_key){
$index_ascii = $column_index + 65;
$index_chr = chr($index_ascii);
$value = $row[$data_key];
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr . $data_row_index, $value);
}
if ($data_row_index>=26){
throw new \yii\base\Exception('EXCEL表格超过26列');
}else{
$data_row_index++;
}
}
$objPHPExcel->setActiveSheetIndex(0);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
ob_end_clean();
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $excel_name . '.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
exit;
}
/**
* 将excel表格转化为二维数组的数据
* @param $excel_path
* @param $data
* @param $header
*/
public static function excel2array($excel_path, $data, $header_keys){
if(!file_exists($excel_path)){
throw new \yii\base\Exception('该EXCEL不存在!');
}
$PHPReader = new \PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($excel_path)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($excel_path)){
throw new \yii\base\Exception('该EXCEL不可读');
}
}
$PHPExcel = $PHPReader->load($excel_path);
$currentSheet = $PHPExcel->getSheet(0);
$max_column_index = $currentSheet->getHighestColumn();
$max_row_index = $currentSheet->getHighestRow();
$data = array();
for($row_index=2; $row_index<=$max_row_index; $row_index++ ){
for($column_chr='A'; $column_chr<=$max_column_index; $column_chr++){
$column_ord = ord($column_chr);
$column_index = $column_chr - 65;
$key = $column_chr.$row_index;
$value = $currentSheet->getCell($key)->getValue();
if($value instanceof PHPExcel_RichText){ //富文本转换字符串
$value = $value->__toString();
}
$data[$row_index-1][$header_keys[$column_index]] = $value;
}
}
return $data;
}
}
其次,在模板文件中添加导出excel的导出按钮(略)
最后,编写控制器接收参数并调用MyExcelHelper工具类导出excel
/**
* 导出EXCEL
*/
public function actionExport(){
$division_id = \core\models\Division::getTopDivisionId(Yii::$app->user->identity->division_id,true);
if (!empty($division_id)) {
$common_producer_info_name = \core\models\Division::getDivisionName($division_id);
}else{
$common_producer_info_name = '未知';
}
$common_producer_info_id = \Yii::$app->request->get('common_producer_info_id');
$common_producer_herb_info_id = \Yii::$app->request->get('common_producer_herb_info_id');
$common_producer_grade_info_id = \Yii::$app->request->get('common_producer_grade_info_id');
$wms_statistics_begin_at_str = \Yii::$app->request->get('wms_statistics_begin_at', 0);
$wms_statistics_end_at_str = \Yii::$app->request->get('wms_statistics_end_at', 0);
$wms_statistics_begin_at = !empty(strtotime($wms_statistics_begin_at_str)) ? strtotime($wms_statistics_begin_at_str) : 0;
$wms_statistics_end_at = !empty(strtotime($wms_statistics_end_at_str)) ? strtotime($wms_statistics_end_at_str) + 24*3600 : time();
$statistics_list = \core\models\FinanceDetail::getFinanceDetailStatistics($common_producer_info_id, $common_producer_herb_info_id, $common_producer_grade_info_id, $wms_statistics_begin_at, $wms_statistics_end_at);
$data = [];
foreach ($statistics_list as $model){
$detail_type_name = \backend\models\FinanceDetailSearch::getDetailTypeName($model['detail_type']);
$herb_info_name = $model['herb_info_name'];
$grade_info_name = $model['grade_info_name'];
$begin_balance_unit_price = empty($model['begin_balance_unit_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['begin_balance_unit_price']);
$begin_balance_weight = $model['begin_balance_weight'];
$begin_balance_sum_price = empty($model['begin_balance_sum_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['begin_balance_sum_price']);
$going_balance_unit_price = empty($model['going_balance_unit_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['going_balance_unit_price']);
$going_balance_weight_increase = $model['going_balance_weight_increase'];
$going_balance_sum_price_increase = empty($model['going_balance_sum_price_increase']) ? '未知' : \common\models\Base::moneyBcdiv($model['going_balance_sum_price_increase']);
$going_balance_weight_decrease = $model['going_balance_weight_decrease'];
$going_balance_sum_price_decrease = empty($model['going_balance_sum_price_decrease']) ? '未知' : \common\models\Base::moneyBcdiv($model['going_balance_sum_price_decrease']);
$going_balance_weight = $model['going_balance_weight'];
$going_balance_sum_price = empty($model['going_balance_sum_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['going_balance_sum_price']);
$end_balance_unit_price = empty($model['end_balance_unit_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['end_balance_unit_price']);
$end_balance_weight = $model['end_balance_weight'];
$end_balance_sum_price = empty($model['end_balance_sum_price']) ? '未知' : \common\models\Base::moneyBcdiv($model['end_balance_sum_price']);
$data[] = [
'detail_type_name'=>$detail_type_name,
'herb_info_name'=>$herb_info_name,
'grade_info_name'=>$grade_info_name,
'begin_balance_unit_price'=>$begin_balance_unit_price,
'begin_balance_weight'=>$begin_balance_weight,
'begin_balance_sum_price'=>$begin_balance_sum_price,
'going_balance_unit_price'=>$going_balance_unit_price,
'going_balance_weight_increase'=>$going_balance_weight_increase,
'going_balance_sum_price_increase'=>$going_balance_sum_price_increase,
'going_balance_weight_decrease'=>$going_balance_weight_decrease,
'going_balance_sum_price_decrease'=>$going_balance_sum_price_decrease,
'going_balance_weight'=>$going_balance_weight,
'going_balance_sum_price'=>$going_balance_sum_price,
'end_balance_unit_price'=>$end_balance_unit_price,
'end_balance_weight'=>$end_balance_weight,
'end_balance_sum_price'=>$end_balance_sum_price,
];
}
$excel_name = '存货明细表('.$common_producer_info_name.')'.$wms_statistics_begin_at_str.'至'.$wms_statistics_end_at_str;
$headers = [
'detail_type_name'=>'项目',
'herb_info_name'=>'品种',
'grade_info_name'=>'等级',
'begin_balance_unit_price'=>'单价(元)',
'begin_balance_weight'=>'重量(公斤)',
'begin_balance_sum_price'=>'金额(元)',
'going_balance_unit_price'=>'项目',
'going_balance_weight_increase'=>'重量增加(公斤)',
'going_balance_sum_price_increase'=>'金额增加(元)',
'going_balance_weight_decrease'=>'重量减少(公斤)',
'going_balance_sum_price_decrease'=>'金额减少(元)',
'going_balance_weight'=>'重量(公斤)',
'going_balance_sum_price'=>'金额(元)',
'end_balance_unit_price'=>'单价(元)',
'end_balance_weight'=>'重量(公斤)',
'end_balance_sum_price'=>'金额(元)',
];
$options = [
'creator'=>'中国汉广集团IT信息中心',
'last_modified_by'=>'中国汉广集团IT信息中心',
'title'=>$excel_name,
'subject'=>$excel_name,
'description'=>'存货明细表',
'keywords'=>'原料成品在途',
'category'=>'存货明细表',
];
\core\components\MyExcelHelper::array2excel($data, $excel_name, $headers, $options);
}
YII2十三大特性的更多相关文章
- YII2十三大特性2
第十三 场景(scenario)的使用 例如:有三个场景,分别为创建,更新,确认回款 首先,定义所有的场景,及规则,如下所示: <?php namespace core\models; use ...
- 如何使用yii2的缓存依赖特性
目录 如何使用yii2的缓存依赖特性 概述 页面缓存 缓存依赖 链式依赖 总结 如何使用yii2的缓存依赖特性 概述 缓存是Yii2的强大特性之一,合理使用缓存技术可以有效地减小服务器的访问压力.Yi ...
- Yii2版本号新特性简单介绍
Yii2 Beta版本号在今年4月份公布.眼下正在改动问题和完好文档中. Yii2要求PHP版本号不低于5.4,主要有例如以下改进: 1)支持PHP框架间协作组制定的PSR-4标准,这简化了文件夹并提 ...
- yii2实战教程之新手入门指南-简单博客管理系统
作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...
- yii2使用相关记录
#Yii::$app->user 是指yii\web\User这个类 #yii2在命令行下执行 D: cd D:\wnmp\php5 php D:\wnmp\www\yii2\yii test/ ...
- PHP的学习--Traits新特性
在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的 ...
- Yii2初谈
Yii2发布有两个月时间了,一直没有去仔细关注过. 今天在回顾PSR标准时,稍稍扫了一眼Yii2.它的命名风格还是一如既往的与Zend那种既首字母大写又还要下划线连接的很二的命名风格格格不入.其实我看 ...
- yii2高级应用
public function searchWithRelated() { $criteria = new CDbCriteria; $criteria->together = ...
- Yii2 GridView自定义链接之重写 ActionColumn
最近刚开始用yii2,真是超棒的,但是也有许多不足的地方,今天要说的就是GridView链接问题. <?= GridView::widget([ 'dataProvider' => $ ...
随机推荐
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- solvepnp
CV_EXPORTS_W bool solvePnP( InputArray objectPoints,- 世界坐标系下的控制点的坐标,vector<Point3f>的数据类型在这里可以使 ...
- Python/Jupyter Notebook以及可视化的运用
最近陆陆续续使用Jupyter Notebook和Python可视化做了一些小工具,用于提高开发效率. 这里将其归类总结一下,作为学习的记录.
- virtualbox - 2台虚拟机之间通过ssh互访
virtualbox 5.2.12 一台虚拟机是Debian 9,另一台是Ubuntu 18.04. 注意: 2台虚拟机系统里要安装ssh ! sudo apt install ssh 然后在virt ...
- 火狐浏览器 system error code 1722 rpc服务器不可用和谷歌浏览器的插件application/x-print-ladop不支持
今天要实现打印的功能,但是火狐浏览器总是出现提示:火狐浏览器 system error code 1722 rpc服务器不可用 后来发现主要是系统服务中的一个windows服务没有打开导致的. 将wi ...
- 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game
最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...
- [Oracle]TM lock (DML enqueue) 的相容性
[Oracle]TM lock (DML enqueue) 的相容性 RS(SS): 行共享 LMODE =2 RX(SX): 行独占 LMODE =3 S: 共享 ...
- GATT服务搜索流程(一)
GATT的规范阅读起来还是比较简答, 但是这样的规范在代码上是如何实现的呢?下面就分析一下bluedroid 协议栈关于GATT的代码流程. BLE的设备都是在SMP之后进行ATT的流程的交互.从代码 ...
- Python 工程管理及 virtualenv 的迁移
virtualenv 是管理 python 工程的利器,它可以很好的帮你维护项目中的依赖,使用 virtualenv,还能保持 global 库的干净.不会被不同项目中的第三方库所污染. virtua ...
- 牛客小白月赛6-E对弈-简单搜索
https://www.nowcoder.com/acm/contest/136/E 我搜索很差啊,看了学长代码,自己在下面手敲了一遍,感觉学长的极其精巧,把我繁琐的搜索步骤给简化了不少 其实本题想法 ...