【TP5】根据数据库字段注释使用同一模板进行增删查

举报
原来是咔咔 发表于 2022/03/27 01:25:44 2022/03/27
【摘要】 author:咔咔 wechat:fangkangfk 有没有在添加跟修改的时候很烦,需要写很多页面,修改还需要追加数据,很烦,很烦 下来就解决这样的问题,所有模块的添加,修改,查看,都使用同一个模板 首先从数据库设计开始 注释解释: 域名地址:这个在添加或者修改时在lable标签里边写的 add=text:这个最...

author:咔咔

wechat:fangkangfk

有没有在添加跟修改的时候很烦,需要写很多页面,修改还需要追加数据,很烦,很烦

下来就解决这样的问题,所有模块的添加,修改,查看,都使用同一个模板

首先从数据库设计开始

注释解释:

域名地址:这个在添加或者修改时在lable标签里边写的

add=text:这个最终会以这个判断这个字段是什么类型,并且显示不同的标签

这里放一个写的比较全的 

 

下来咱们先写一个获取数据库注释的方法

第一个方法是获取数据库注释,第二个方法是对注释进行业务需求的组装


  
  1. /**
  2. * author:咔咔
  3. *
  4. * 获取字段注释类型
  5. * @param $table 表名
  6. * @param bool $includePrimary
  7. * @return array
  8. */
  9. public function getFileCommon($table, $includePrimary = false)
  10. {
  11. $prefix = config('database.prefix');
  12. $data = Db::query('SHOW FULL COLUMNS FROM '.$prefix.$table);
  13. foreach($data as $row){
  14. if ($row['Comment']) {
  15. $row = array_merge($row, $this->_parse_comments($row['Comment']));
  16. }else {
  17. $row['DisplayName'] = $row['Field'];
  18. }
  19. $type = $row['Type'];
  20. if (preg_match('/^varchar/i', $type)) {
  21. $type = str_replace('varchar', '字符串', $type);
  22. } else if (preg_match('/^int/i', $type)) {
  23. $type = str_replace('int', '数字', $type);
  24. } else if (preg_match('/^tinyint/i', $type)) {
  25. $type = str_replace('tinyint', '数字', $type);
  26. preg_match('/\((\d+)\)/i', $type, $matches);
  27. $length = $matches[1];
  28. } else if (preg_match('/^text/i', $type)) {
  29. $type = str_replace('text', '文本', $type);
  30. } else if (preg_match('/^datetime/i', $type)) {
  31. $type = str_replace('datetime', '时间:YYY-MM-DD HH:II:SS', $type);
  32. }
  33. $row['DisplayType'] = $type;
  34. if ($includePrimary) {
  35. $fields[] = $row;
  36. } else {
  37. if ($row['Key'] != 'PRI') {
  38. $fields[] = $row;
  39. }
  40. }
  41. }
  42. // 整理:以name为key
  43. $new_fields = array();
  44. foreach ($fields as $value) {
  45. $name = $value['Field'];
  46. $new_fields[$name] = $value;
  47. }
  48. return $new_fields;
  49. }
  50. /**
  51. * author:咔咔
  52. *
  53. * 提取字段注释跟显示类型
  54. * @param $comments 注释
  55. * @return array
  56. */
  57. protected function _parse_comments($comments)
  58. {
  59. $parts = explode("|", $comments);
  60. $comment = $parts[0];
  61. $params_string = $parts[1];
  62. if ($params_string) {
  63. parse_str($params_string, $params);
  64. foreach ($params as $key => $value) {
  65. if ($value == 'true') {
  66. $value = true;
  67. }
  68. if ($value == 'false') {
  69. $value = false;
  70. }
  71. $params[$key] = $value;
  72. }
  73. } else {
  74. $params = array();
  75. }
  76. $result = array('DisplayName' => $comment, 'Params' => $params);
  77. return $result;
  78. }

怎么使用?

我的domain控制器继承了base控制器,上面俩个方法在base控制器

我们来看看数据

 

这个时候是不是纳闷了,怎么就一个数据,那个ID哪去了。我们可以看看第一个方法,下图我框出来的这块

别纳闷PRi是mysql约束主键的意思,所以只有一个数据 

下来咱们准备写一下模板

最终添加模板就这样

我们还需要写公共模板,这里我就粘贴已经写好的一份


  
  1. {include file="../../../application/admin/view/public/head" /}
  2. <?php foreach ($fields as $info):?>
  3. <?php
  4. $type = $info['Params']['add'];
  5. $validateClass = "validate[required]";
  6. ?>
  7. <?php if ($info['Params']['add'] == 'ignore'): ?>
  8. <?php continue; ?>
  9. <?php endif; ?>
  10. <?php if ($info['Params']['add'] == 'hidden'): ?>
  11. <input name="<?php echo $info['Field'];?>" type="hidden" value="<?php echo htmlspecialchars($info['Value']); ?>" />
  12. <?php continue; ?>
  13. <?php endif; ?>
  14. <tr>
  15. <td>
  16. <?php if ($type == 'text'): ?>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label"><?php echo $info['DisplayName'];?></label>
  19. <div class="layui-input-block">
  20. <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>">
  21. </div>
  22. </div>
  23. <?php elseif ($type == 'bool'): ?>
  24. <label class="radio">
  25. <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="1" checked>
  26. </label>
  27. <label class="radio">
  28. <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="2">
  29. </label>
  30. <?php elseif ($type == 'radio'): ?>
  31. <div class="layui-form-item">
  32. <label class="layui-form-label">类型</label>
  33. <div class="layui-input-block">
  34. <?php $items = explode(",", $info['Params']['items']); ?>
  35. <?php foreach ($items as $value): ?>
  36. <?php
  37. $parts = explode('#', $value, 2);
  38. $displayText = $parts[0];
  39. if (count($parts) == 2) {
  40. $displayValue = $parts[1];
  41. } else {
  42. $displayValue = $parts[0];
  43. }
  44. ?>
  45. <label class="radio">
  46. <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" checked> <?php echo $displayText; ?>
  47. </label>
  48. <?php endforeach; ?>
  49. </div>
  50. </div>
  51. <?php elseif ($type == 'checkbox'): ?>
  52. <?php $items = explode(",", $info['Params']['items']); ?>
  53. <?php foreach ($items as $value): ?>
  54. <?php
  55. $parts = explode('#', $value, 2);
  56. $displayText = $parts[0];
  57. if (count($parts) == 2) {
  58. $displayValue = $parts[1];
  59. } else {
  60. $displayValue = $parts[0];
  61. }
  62. ?>
  63. <label class="checkbox">
  64. <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>"> <?php echo $displayText;?>
  65. </label>
  66. <?php endforeach; ?>
  67. <?php elseif ($type == 'textarea'): ?>
  68. <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  69. <?php elseif ($type == 'textarea_html'): ?>
  70. <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  71. <?php elseif ($type == 'label'): ?>
  72. <?php echo htmlspecialchars($info['Default']);?>
  73. <?php elseif ($type == 'datetime'): ?>
  74. <?php continue; ?>
  75. <?php elseif ($type == 'image_upload'): ?>
  76. <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />
  77. <?php elseif ($type == 'file_upload'): ?>
  78. <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />
  79. <?php else: ?>
  80. <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  81. <?php endif; ?>
  82. </td>
  83. </tr>
  84. <?php endforeach;?>

在公共模板的顶部我们将字段自定义类型定义了一个变量

我们的这个dn_info自定义类型是text,所以就会将这个input输出 ,不管修改还是添加都是需要name值的,所以name值也会是动态的,我们组装的数据里边也有

这个就是最终效果

上面这个是关于添加的,我们还需要做个修改的,修改是里边是有值得

跟添加的原理一样,只不过需要将字段值组装

看一下数据结构

在来一个修改的模板


  
  1. {include file="../../../application/admin/view/public/head" /}
  2. <?php foreach ($fields as $info):?>
  3. <?php
  4. $type = $info['Params']['edit'];
  5. $validateClass = "validate[required]";
  6. ?>
  7. <?php if ($info['Params']['edit'] == 'ignore'): ?>
  8. <?php continue; ?>
  9. <?php endif; ?>
  10. <?php if ($info['Params']['edit'] == 'hidden'): ?>
  11. <input name="<?php echo $info['Field'];?>" type="hidden" value="<?php echo htmlspecialchars($info['Value']); ?>" />
  12. <?php continue; ?>
  13. <?php endif; ?>
  14. <tr>
  15. <td>
  16. <?php if ($type == 'text'): ?>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label"><?php echo $info['DisplayName'];?></label>
  19. <div class="layui-input-block">
  20. <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>" value="<?php echo $info['Value'] ?>">
  21. </div>
  22. </div>
  23. <?php elseif ($type == 'bool'): ?>
  24. <label class="radio">
  25. <input type="radio" name="<?php echo $info['Field'];?>" value="1" class="<?php echo $validateClass; ?>" <?php if ($info[Value] == 1) echo 'checked'; ?>>
  26. </label>
  27. <label class="radio">
  28. <input type="radio" name="<?php echo $info['Field'];?>" value="2" class="<?php echo $validateClass; ?>" <?php if ($info[Value] == 2) echo 'checked'; ?>>
  29. </label>
  30. <?php elseif ($type == 'radio'): ?>
  31. <?php $items = explode(",", $info['Params']['items']); ?>
  32. <?php foreach ($items as $value): ?>
  33. <?php
  34. $parts = explode('#', $value, 2);
  35. $displayText = $parts[0];
  36. if (count($parts) == 2) {
  37. $displayValue = $parts[1];
  38. } else {
  39. $displayValue = $parts[0];
  40. }
  41. ?>
  42. <label class="radio">
  43. <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" <?php if ($displayValue == $info['Value']) echo 'checked'; ?>>
  44. <?php echo $displayText; ?>
  45. </label>
  46. <?php endforeach; ?>
  47. <?php elseif ($type == 'checkbox'): ?>
  48. <?php
  49. $items = explode(",", $info['Params']['items']);
  50. $currentItems = explode(' ', $info['Value']);
  51. ?>
  52. <?php foreach ($items as $value): ?>
  53. <?php
  54. $parts = explode('#', $value, 2);
  55. $displayText = $parts[0];
  56. if (count($parts) == 2) {
  57. $displayValue = $parts[1];
  58. } else {
  59. $displayValue = $parts[0];
  60. }
  61. ?>
  62. <label class="checkbox">
  63. <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>" <?php if (in_array($value, $currentItems)) echo 'checked'; ?>> <?php echo $displayText;?>
  64. </label>
  65. <?php endforeach; ?>
  66. <?php elseif ($type == 'textarea'): ?>
  67. <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  68. <?php elseif ($type == 'textarea_markdown'): ?>
  69. <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" data-provide="markdown" id='markdownArea' class="input-xxlarge md-input <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  70. <br /><a href='http://wowubuntu.com/markdown/' target='_blank'>Markdown 语法说明</a>
  71. <?php elseif ($type == 'textarea_html'): ?>
  72. <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  73. <?php elseif ($type == 'label'): ?>
  74. <?php echo htmlspecialchars($info['Value']);?>
  75. <?php elseif ($type == 'datetime'): ?>
  76. <input name="<?php echo $info['Field'];?>" class="input-xxlarge <?php echo $validateClass; ?>" value="<?php echo $info['Value']; ?>" />
  77. <?php elseif ($type == 'image_upload'): ?>
  78. <img src="<?php echo '/image/view/' . $info['Params']['storage'] . '/' . $info['Value'] . '/small'; ?>" data-src="holder.js/200x200" alt="" style="max-height:200px;" />
  79. <input name="<?php echo $info['Field'];?>" type="file" />
  80. <?php elseif ($type == 'file_upload'): ?>
  81. <input name="<?php echo $info['Field'];?>" type="file" />
  82. <?php else: ?>
  83. <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>
  84. <?php endif; ?>
  85. </td>
  86. </tr>
  87. <?php endforeach;?>

修改跟添加的模板就差一个value值

文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fangkang7/article/details/85266648

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。