日常生活中常见的课程表到了PHP里确实是一个小难题,这里分享一些我设计课程表的经验,下列方式只列出大体实现方式,具体的大家要自己学习哦。
首先,我们先要搞定表结构
设计字段:id(自增) class_id:班级ID teacher_id:上课老师的ID(通过该老师能查到他的课程) day:星期几 section:第几节
字段设计好后,我们发现一周,每天按照八节课算,5天的话一共有40节课,那就要给数据库插入40条记录。楼主对比了很多方式后发现,其实这种方式除了插入的多一些,别的都比其他的方式更简单一些。
那么创建完数据表,我们就要创建我们的表格了,创建表格要求你能给表格每个格子或格子里的东西加上标识(数字),并且自己能够操控这些标识,这里$t就是我的标识,我每创建一个格子,都有他的序号,到时候操作这个序号,就是操作对应的格子。有了这个基础,你会得心应手!!!
<table border='1'>
<tr>
<th>时间</th>
<th>节次</th>
<th>周一</th>
<th>周二</th>
<th>周三</th>
<th>周四</th>
<th>周五</th>
<th>周六</th>
<th>周日</th>
</tr>
<?php
for ($i=0; $i < 8; $i++) {
echo "<tr>";
for ($k=0; $k < 9; $k++) {
$t = $i*9+$k;
if($t == $i*9+1){
echo "<td>".($i+1)."</td>";
}else if($t == $i*9){
echo "<td>"."TIME"."</td>";
}else if($t == $i*9+2){
echo "<td>"."周一".$i."</td>";
}else if($t == $i*9+3){
echo "<td>"."周二"."</td>";
}else if($t == $i*9+4){
echo "<td>"."周三"."</td>";
}else if($t == $i*9+5){
echo "<td>"."周四"."</td>";
}else if($t == $i*9+6){
echo "<td>"."周五"."</td>";
}else if($t == $i*9+7){
echo "<td>"."周六"."</td>";
}else if($t == $i*9+8){
echo "<td>"."周日"."</td>";
}
}
echo "</tr>";
}
?>
</table>
接下来,我们设计创建课程表的表单,teachers我是从后台拿到老师然后传到模版,别忘了把class_id也传过来!
<form action="{{ URL('schedule') }}" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="class_id" value='{{$classid}}'>
<table border='1'>
<tr>
<th>时间</th>
<th>节次</th>
<th>周一</th>
<th>周二</th>
<th>周三</th>
<th>周四</th>
<th>周五</th>
<th>周六</th>
<th>周日</th>
</tr>
<?php
for ($i=1; $i <= 8; $i++) {
$w[$i] = "w".$i;
echo "<tr>";
for ($k=0; $k < 9; $k++) {
$t = $i*9+$k;
$sd = 'sd'.$t;//每个select上的坐标,section day简写
if($t == $i*9+1){
echo "<td>".($i)."</td>";
}else if($t == $i*9){
echo "<td>".$time[$w[$i]]."</td>";
}else if($t == $i*9+7 || $t==$i*9+8){
echo "<td>休息</td>";
}else {
echo "<td>";
echo "<select name=".$sd.">";
echo "<option value='1'>请选择</option>";
foreach($teachers as $t){
echo "<option value=".$t['value'].">";
echo $t['name'];
echo "</option>";
}
echo "</select>";
echo "</td>";
}
}
echo "</tr>";
}
?>
</table>
<input type="submit" value="保存" class='btn btn-success'>
</form>
然后我们有遇到了难题,怎么存储呢?其实就是根据你的格子序号来操作的,不同的序号对应不同的星期和节次,规律很好找!
public function store(Request $request){
$exist = Schedule::where("class_id",Input::get('class_id'))->first();
if($exist){
return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'已有课程表,只允许修改,不允许重复创建');
return false;
}else{
for($i = 1;$i<=79;$i++){
$sd = 'sd'.$i;
if(!Input::get($sd) || Input::get($sd)==0 || Input::get($sd)==''){
}else{
$schedule = new Schedule;
if($i%9 ==2){ //计算周是周几
$schedule->days = 1; //周一
}else if($i%9 == 3){
$schedule->days = 2; //周二
}else if($i%9 == 4){
$schedule->days = 3; //周三
}else if($i%9 == 5){
$schedule->days = 4; //周四
}else if($i%9 == 6){
$schedule->days = 5; //周五
}else{
}
if($i>= 11 && $i<=15){ //计算是第几节
$schedule->section =1;
$schedule->teacher_id = Input::get($sd);
}else if($i>=20 && $i<=24){
$schedule->section =2;
$schedule->teacher_id = Input::get($sd);
}else if($i>=29 && $i<=33){
$schedule->section =3;
$schedule->teacher_id = Input::get($sd);
}else if($i>=38 && $i<=42){
$schedule->section =4;
$schedule->teacher_id = Input::get($sd);
}else if($i>=47 && $i<=51){
$schedule->section =5;
$schedule->teacher_id = Input::get($sd);
}else if($i>=56 && $i<=60){
$schedule->section =6;
$schedule->teacher_id = Input::get($sd);
}else if($i>=65 && $i<=69){
$schedule->section =7;
$schedule->teacher_id = Input::get($sd);
}else if($i>=74 && $i<=78){
$schedule->section =8;
$schedule->teacher_id = Input::get($sd);
}else{
}
$schedule->class_id = Input::get('class_id');
$schedule->save();
}
}
return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'课表创建成功');
}
}
创建好了,那么,修改时候,我想要选好的课程就在那,不用再次点选,怎么让选框默认选好我选中的课程呢?毕竟我的记录有40条。。那我们就要设置一个自增的key(我这里叫做$s),让他从0增加到39(一共40个)
首先,跳转到修改页:
public function edit($id){
$class_id = $id;
$time = CourseTime::where("school_id",userSchool())->first();
$teachers = ClassTeacher::where("class_id",$class_id)->get();
foreach($teachers as $key=>$t){
$teacher[$key]['value'] = $t->teacher_id;
$teacher[$key]['name'] = TeacherToCourse($t->teacher_id).":".TeacherConvert($t->teacher_id);
}
$schedules = Schedule::where("class_id",$class_id)->get();
$k = 1;
foreach($schedules as $s){
$schedule[$k]['value'] = $s->teacher_id;
$schedule[$k]['name'] = TeacherToCourse($s->teacher_id).":".TeacherConvert($s->teacher_id);
$k++;
}
return view("home.schedule.edit")
->withClassid($class_id)
->withTime($time)
->withTeachers($teacher)
->withSchedules($schedule);
}
接下来,模版里面:
<table border='1'>
<tr>
<th>时间</th>
<th>节次</th>
<th>周一</th>
<th>周二</th>
<th>周三</th>
<th>周四</th>
<th>周五</th>
<th>周六</th>
<th>周日</th>
</tr>
<?php
$s = 1; //课程计数,这里从1开始是因为我跳转修改页时设置的第一项是1
for ($i=1; $i <= 8; $i++) {
$w[$i] = "w".$i;
echo "<tr>";
for ($k=0; $k < 9; $k++) {
$t = $i*9+$k;
$sd = 'sd'.$t;//每个select上的坐标,section day简写
if($t == $i*9+1){
echo "<td>".($i)."</td>";
}else if($t == $i*9){
echo "<td>".$time[$w[$i]]."</td>";
}else if($t == $i*9+7 || $t==$i*9+8){
echo "<td>休息</td>";
}else { //进来这里s才会增加,因为40节课所以进来40次,所以s一共增加40次,对应40条记录
echo "<td>";
echo "<select name=".$sd.">";
foreach($teachers as $t){
if( $t['value'] == $schedules[$s]['value']){ //<span style="font-family: Arial, Helvetica, sans-serif;">让每条记录去匹配选项里的老师的id,如果一样就selected</span>
echo "<option selected value=".$t['value'].">";
echo $t['name'];
echo "</option>";
}else{
echo "<option value=".$t['value'].">";
echo $t['name'];
echo "</option>";
}
}
echo "</select>";
echo "</td>";
$s++;
}
}
echo "</tr>";
}
?>
</table>
<input type="submit" value="保存" class='btn btn-success'>
</form>
public function update(Request $request){
//最简单的方法是删除原来的重新建一个,没有之一,但我们这里还是去修改数据
$class_id = Input::get('class_id');
$schedules = Schedule::where('class_id',$class_id)->get();//把那40条数据找出来
$k=0;
for($i = 1;$i<=79;$i++){
$sd = 'sd'.$i;
if(!Input::get($sd) || Input::get($sd)==0 || Input::get($sd)==''){
}else{
$schedules[$k]->teacher_id = Input::get($sd); //传40个值,所以进来40次,第一个传给$k=0的,下一个传给$k=1的,以此类推,逐条完成修改
$schedules[$k]->save();
$k++;
}
}
return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'课表修改成功');
}
版权声明:本文为amazingdyd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。