当前位置: 首页 > news >正文

关于表格中复选框、设置、名称,最后统计的实现

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

参考网页:

  • http://webtips.krajee.com/setup-editable-column-grid-view-manipulate-records/
  • http://demos.krajee.com/grid-demo
  • http://demos.krajee.com/editable
  • http://stackoverflow.com/questions/31622044/yii-2-customize-column-with-form-field-for-editing-with-gridview-widget
  • http://stackoverflow.com/questions/31149977/yii2-gridview-set-checkboxcolumn-checked
  • http://stackoverflow.com/questions/37473895/how-i-can-process-a-checkbox-column-from-yii2-gridview
  • http://www.dyn-web.com/tutorials/forms/checkbox/group.php
  • http://thecodeplayer.com/walkthrough/javascript-css3-calculator
  • http://www.yii-china.com/post/detail/297.html

一、引言

设置一个人的假期天数,需要填很多信息。比如有哪些假期,每个假期多少天。即使同一种假期,因为人员性质的不同,假期天数也不同。这就要求为该员工提供选择哪些假期的能力,而且还要设置对应假期的天数。选择好后,最好加一个按钮,计算所需天数。而且,复选框可以提前确定选谁,复选过程中,可以实时调整数字大小。这样就可以粗略的实现设置假期天数的功能了。在加减法的时候遇到困难了。

另外,对于基本信息的显示,考虑改版,采用 DetailView,原来的全程 HTML 界面太丑了。

二、准备

想了好几天了,最终决定采用类似下方的实现方式。

<table width="1065"> <tbody> <tr class="firstRow"> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 序号<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 复选框<br/> </td> <td style="border-width: 1px; border-style: solid;" valign="top" width="248"> 名称<br/> </td> <td style="border-width: 1px; border-style: solid;" valign="top" width="248"> 天数<br/> </td> </tr> <tr> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 1<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 复选框 </td> <td style="border-width: 1px; border-style: solid;" valign="top" width="248"> 假期一<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 300(可编辑)<br/> </td> </tr> <tr> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 2<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 复选框 </td> <td style="border-width: 1px; border-style: solid;" valign="top" width="248"> 假期二<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 300(可编辑) </td> </tr> <tr> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 3<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 复选框 </td> <td style="border-width: 1px; border-style: solid;" valign="top" width="248"> 假期三<br/> </td> <td style="word-break: break-all; border-width: 1px; border-style: solid;" valign="top" width="248"> 300(可编辑) </td> </tr> </tbody> </table> <p> <br/> </p>

搜索良久,发现采用 http://demos.krajee.com/grid-demo 和 http://demos.krajee.com/editable 能较好的解决该问题,但是并没有想象中那么完美。为了尽快完成网站,暂时这么决定了。

三、实现方法

这里主要参考网页 http://webtips.krajee.com/setup-editable-column-grid-view-manipulate-records/ 最后放弃了该方案,采用如下方式。(原谅,有些代码不能直接复制出来,只好看着屏幕抄写过来,如有异常,请及时联系,谢谢)

1、安装插件 GridView

使用 composer 安装,可能需要一些依赖,请自行解决。


composer.phar require kartik-v/yii2-editable "*"
composer.phar require kartik-v/yii2-grid "@dev"

2、在 view 里(一)

假设该文件为 ./frontend/views/personinfo/_form_path.php,也即 PersoninfoController 的某个动作调用该文件。

$gridColumns = [
    [
        'class' => '\kartik\grid\CheckboxColumn‘,
        'checkboxOptions' => function($model, $key) {
            return ['value' => $key, 'checked' => $xxx];// $xxx可以自行设置。
        },
    ],
    [
        'attribute' => 'day_default',
        'format' => 'raw',
        'value' => function($model) {
            return Html::textInput('', $model->day_default);
        },
];
echo \kartik\grid\GridView::widget([
    'id' => 'personinfo-set-gridview',
    'dataProvider' => $dataProvider,
    'columns' => $gridColumns,
]);

解释

  • 'class' => '\kartik\grid\CheckboxColumn’, 实现复选功能。
  • 'attribute' => 'day_default', 该属性的赋值,实现了直接输入。这样给他一个默认值,也可以自行调整了。

3、在 view 里(二)

由于技术所限,不能很好的实现,点击复选框就可以自动更新目标框的数值,或者点击输入就改变目标框的数值。而且改变这些数值,可能出现原来信息的错误,遂加了一个计算的按钮,使用 javascript 计算复选过的数值,并更新目标框的数值。另外增加了一个确认按钮,用于提交。目标框有多个。

采用的 ActiveForm 类,但是默认的都是竖排,样子特别丑。想到了用HTML 表格 table 简单的排版。代码如下。

<table>
<tr>

<td>
<?= Html::button('计算', ['class' => 'btn btn-primary', 'onclick' => $js_calculate]) ?>
</td>

<td>
<?=$form->field($model, 'aim_text')->textInput() ?>
</td>

<td>
<?= Html::submitButton('确认', ['class' => 'btn btn-primary']) ?>
</td>

</tr>
</table>

解释

  • $js_calculate 在下文介绍。

4、view 中的 js

这个 js 脚本程序的作用,很简单,找到这些控件,读取这些checkbox 是否选择,决定怎么计算这些数值,并把计算的数值赋予目标控件。内容如下。

var el=document.getElementById('personinfo-set-girdview'); // here id from above setting
var keys=el.getElementsByTagName('tr');
var aim_text=0;
for (var i=0;i<keys.length;i++){
    var items=keys[i].getElementsByTagName('input');
    var need_add=false;
    for(var j in items){
        if(items[j].type==='chekbox' && items[j].checked){
            need_add=true;
        }
        if(need_add && items[j].type==='text'){
            aim_text+=parseInt(items[j].value);
        }
    }
}
document.getElementById('personinfo-aim_text').value=aim_text;

解释

  • 当然,这是内容是通过如下的方式赋值给 $js_calculate
$js_calculate=<<<JS
//这里就是上面的内容啦。
JS

四、其他问题

当然为了给 checkbox提前赋值,还需要好好的传递一个数组过来,而保存选择了哪些项目及各自的数值,还需要传递给服务器,这个仍旧需要好好考虑一下。

另外 js 的 for(var i=0;i<array.length,i++)for(var i in array) 是不一样的,尤其是在 array[i].getElementById()的时候,一个全是数字,一个还是有字母的,键值不一样。需要注意。

转载于:https://my.oschina.net/bubifengyun/blog/849663

相关文章:

  • 用C#开发Pocket PC数据库应用程序
  • [C/C++]关于C++11中的std::move和std::forward
  • ASP.NET2.0快速入门--使用母版页创建布局
  • spring session配置
  • 创建可分页、可排序的 DataGrid
  • puppet一键部署lnmt
  • Qt绘图案例
  • U3D Invoke() IsInvoking CancelInvoke方法的调用
  • 我们在压力中成长
  • ACE ADMIN中 JQGrid Table(简单实用)
  • 如何从文件读取显示位图?
  • yii2 基本的增删改查
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • Linux随机生成密码的10种方法
  • 限制用户输入的方法
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【笔记】你不知道的JS读书笔记——Promise
  • classpath对获取配置文件的影响
  • create-react-app做的留言板
  • Java超时控制的实现
  • leetcode386. Lexicographical Numbers
  • leetcode98. Validate Binary Search Tree
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • opencv python Meanshift 和 Camshift
  • 后端_MYSQL
  • 聊聊sentinel的DegradeSlot
  • 配置 PM2 实现代码自动发布
  • 前端路由实现-history
  • 人脸识别最新开发经验demo
  • 如何进阶一名有竞争力的程序员?
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 线上 python http server profile 实践
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 阿里云移动端播放器高级功能介绍
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读30/100)Convolutional Pose Machines
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)图像的%2线性拉伸
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) Android中ViewStub组件使用
  • (转)winform之ListView
  • (转)甲方乙方——赵民谈找工作
  • ****Linux下Mysql的安装和配置
  • .axf 转化 .bin文件 的方法
  • .net Application的目录
  • .net core使用ef 6
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net refrector
  • .NET 药厂业务系统 CPU爆高分析
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件