author:咔咔
wechat:fangkangfk
有没有在添加跟修改的时候很烦,需要写很多页面,修改还需要追加数据,很烦,很烦
下来就解决这样的问题,所有模块的添加,修改,查看,都使用同一个模板首先从数据库设计开始
注释解释:
域名地址:这个在添加或者修改时在lable标签里边写的
add=text:这个最终会以这个判断这个字段是什么类型,并且显示不同的标签
这里放一个写的比较全的
下来咱们先写一个获取数据库注释的方法
第一个方法是获取数据库注释,第二个方法是对注释进行业务需求的组装
/** * author:咔咔 * * 获取字段注释类型 * @param $table 表名 * @param bool $includePrimary * @return array */ public function getfileCommon($table,$includePrimary = false) { $prefix = config('database.prefix'); $data = Db::query('SHOW FulL ColUMNS FROM '.$prefix.$table); foreach($data as $row){ if ($row['Comment']) { $row = array_merge($row,$this->_parse_comments($row['Comment'])); }else { $row['displayname'] = $row['FIEld']; } $type = $row['Type']; if (preg_match('/^varchar/i',$type)) { $type = str_replace('varchar','字符串',$type); } else if (preg_match('/^int/i',$type)) { $type = str_replace('int','数字',$type); } else if (preg_match('/^tinyint/i',$type)) { $type = str_replace('tinyint',$type); preg_match('/\((\d+)\)/i',$type,$matches); $length = $matches[1]; } else if (preg_match('/^text/i',$type)) { $type = str_replace('text','文本',$type); } else if (preg_match('/^datetime/i',$type)) { $type = str_replace('datetime','时间:YYY-MM-DD HH:II:SS',$type); } $row['displayType'] = $type; if ($includePrimary) { $fIElds[] = $row; } else { if ($row['Key'] != 'PRI') { $fIElds[] = $row; } } } // 整理:以name为key $new_fIElds = array(); foreach ($fIElds as $value) { $name = $value['FIEld']; $new_fIElds[$name] = $value; } return $new_fIElds; } /** * author:咔咔 * * 提取字段注释跟显示类型 * @param $comments 注释 * @return array */ protected function _parse_comments($comments) { $parts = explode("|",$comments); $comment = $parts[0]; $params_string = $parts[1]; if ($params_string) { parse_str($params_string,$params); foreach ($params as $key => $value) { if ($value == 'true') { $value = true; } if ($value == 'false') { $value = false; } $params[$key] = $value; } } else { $params = array(); } $result = array('displayname' => $comment,'Params' => $params); return $result; }
怎么使用?
我的domain控制器继承了base控制器,上面俩个方法在base控制器
我们来看看数据
这个时候是不是纳闷了,怎么就一个数据,那个ID哪去了。我们可以看看第一个方法,下图我框出来的这块
别纳闷PRi是MysqL约束主键的意思,所以只有一个数据下来咱们准备写一下模板
最终添加模板就这样
我们还需要写公共模板,这里我就粘贴已经写好的一份
{include file="../../../application/admin/vIEw/public/head" /}<?PHP foreach ($fIElds as $info):?><?PHP $type = $info['Params']['add']; $valIDateClass = "valIDate[required]"; ?><?PHP if ($info['Params']['add'] == 'ignore'): ?><?PHP continue; ?><?PHP endif; ?><?PHP if ($info['Params']['add'] == 'hIDden'): ?><input name="<?PHP echo $info['FIEld'];?>" type="hIDden" value="<?PHP echo HTMLspecialchars($info['Value']); ?>" /><?PHP continue; ?><?PHP endif; ?><tr> <td> <?PHP if ($type == 'text'): ?> <div > <label ><?PHP echo $info['displayname'];?></label> <div > <input ID="ID_<?PHP echo $info['FIEld'];?>" lay-verify="name" name="<?PHP echo $info['FIEld'];?>"> </div> </div> <?PHP elseif ($type == 'bool'): ?> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="1" checked> 是 </label> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="2"> 否 </label> <?PHP elseif ($type == 'radio'): ?> <div > <label >类型</label> <div > <?PHP $items = explode(",",$info['Params']['items']); ?> <?PHP foreach ($items as $value): ?> <?PHP $parts = explode('#',$value,2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="<?PHP echo $displayValue; ?>" checked> <?PHP echo $displayText; ?> </label> <?PHP endforeach; ?> </div> </div> <?PHP elseif ($type == 'checkBox'): ?> <?PHP $items = explode(",2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label > <input type="checkBox" name="<?PHP echo $info['FIEld'];?>[]" value="<?PHP echo $displayValue;?>" > <?PHP echo $displayText;?> </label> <?PHP endforeach; ?> <?PHP elseif ($type == 'textarea'): ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="10" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP elseif ($type == 'textarea_HTML'): ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="20" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP elseif ($type == 'label'): ?> <?PHP echo HTMLspecialchars($info['Default']);?> <?PHP elseif ($type == 'datetime'): ?> <?PHP continue; ?> <?PHP elseif ($type == 'image_upload'): ?> <input name="<?PHP echo $info['FIEld'];?>" type="file" /> <?PHP elseif ($type == 'file_upload'): ?> <input name="<?PHP echo $info['FIEld'];?>" type="file" /> <?PHP else: ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="10" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP endif; ?> </td></tr><?PHP endforeach;?>
在公共模板的顶部我们将字段自定义类型定义了一个变量
我们的这个dn_info自定义类型是text,所以就会将这个input输出 ,不管修改还是添加都是需要name值的,所以name值也会是动态的,我们组装的数据里边也有
这个就是最终效果
上面这个是关于添加的,我们还需要做个修改的,修改是里边是有值得
跟添加的原理一样,只不过需要将字段值组装
看一下数据结构
在来一个修改的模板
{include file="../../../application/admin/vIEw/public/head" /} <?PHP foreach ($fIElds as $info):?> <?PHP $type = $info['Params']['edit']; $valIDateClass = "valIDate[required]"; ?> <?PHP if ($info['Params']['edit'] == 'ignore'): ?> <?PHP continue; ?> <?PHP endif; ?> <?PHP if ($info['Params']['edit'] == 'hIDden'): ?> <input name="<?PHP echo $info['FIEld'];?>" type="hIDden" value="<?PHP echo HTMLspecialchars($info['Value']); ?>" /> <?PHP continue; ?> <?PHP endif; ?> <tr> <td> <?PHP if ($type == 'text'): ?> <div > <label ><?PHP echo $info['displayname'];?></label> <div > <input ID="ID_<?PHP echo $info['FIEld'];?>" lay-verify="name" name="<?PHP echo $info['FIEld'];?>" value="<?PHP echo $info['Value'] ?>"> </div> </div> <?PHP elseif ($type == 'bool'): ?> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="1" <?PHP if ($info[Value] == 1) echo 'checked'; ?>> 是 </label> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="2" <?PHP if ($info[Value] == 2) echo 'checked'; ?>> 否 </label> <?PHP elseif ($type == 'radio'): ?> <?PHP $items = explode(",$info['Params']['items']); ?> <?PHP foreach ($items as $value): ?> <?PHP $parts = explode('#',2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label > <input type="radio" name="<?PHP echo $info['FIEld'];?>" value="<?PHP echo $displayValue; ?>" <?PHP if ($displayValue == $info['Value']) echo 'checked'; ?>> <?PHP echo $displayText; ?> </label> <?PHP endforeach; ?> <?PHP elseif ($type == 'checkBox'): ?> <?PHP $items = explode(",$info['Params']['items']); $currentItems = explode(' ',$info['Value']); ?> <?PHP foreach ($items as $value): ?> <?PHP $parts = explode('#',2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label > <input type="checkBox" name="<?PHP echo $info['FIEld'];?>[]" value="<?PHP echo $displayValue;?>" <?PHP if (in_array($value,$currentItems)) echo 'checked'; ?>> <?PHP echo $displayText;?> </label> <?PHP endforeach; ?> <?PHP elseif ($type == 'textarea'): ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="10" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP elseif ($type == 'textarea_markdown'): ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="20" cols="100" data-provIDe="markdown" ID='markdownArea' ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <br /><a href='http://wowubuntu.com/markdown/' target='_blank'>Markdown 语法说明</a> <?PHP elseif ($type == 'textarea_HTML'): ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="20" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP elseif ($type == 'label'): ?> <?PHP echo HTMLspecialchars($info['Value']);?> <?PHP elseif ($type == 'datetime'): ?> <input name="<?PHP echo $info['FIEld'];?>" value="<?PHP echo $info['Value']; ?>" /> <?PHP elseif ($type == 'image_upload'): ?> <img src="<?PHP echo '/image/vIEw/' . $info['Params']['storage'] . '/' . $info['Value'] . '/small'; ?>" data-src="holder.Js/200x200" alt="" /> <input name="<?PHP echo $info['FIEld'];?>" type="file" /> <?PHP elseif ($type == 'file_upload'): ?> <input name="<?PHP echo $info['FIEld'];?>" type="file" /> <?PHP else: ?> <textarea name="<?PHP echo $info['FIEld'];?>" rows="10" cols="100" ><?PHP echo HTMLspecialchars($info['Value']); ?></textarea> <?PHP endif; ?> </td> </tr> <?PHP endforeach;?>
修改跟添加的模板就差一个value值
总结以上是内存溢出为你收集整理的【TP5】根据数据库字段注释使用同一模板进行增删查全部内容,希望文章能够帮你解决【TP5】根据数据库字段注释使用同一模板进行增删查所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)