author:咔咔php
wechat:fangkangfkhtml
有沒有在添加跟修改的時候很煩,須要寫不少頁面,修改還須要追加數據,很煩,很煩mysql
下來就解決這樣的問題,全部模塊的添加,修改,查看,都使用同一個模板
首先從數據庫設計開始sql
註釋解釋:數據庫
域名地址:這個在添加或者修改時在lable標籤裏邊寫的ubuntu
add=text:這個最終會以這個判斷這個字段是什麼類型,而且顯示不一樣的標籤markdown
這裏放一個寫的比較全的 數據結構
下來我們先寫一個獲取數據庫註釋的方法app
第一個方法是獲取數據庫註釋,第二個方法是對註釋進行業務需求的組裝dom
/** * 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 class="layui-form-item"> <label class="layui-form-label"><?php echo $info['DisplayName'];?></label> <div class="layui-input-block"> <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>"> </div> </div> <?php elseif ($type == 'bool'): ?> <label class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="1" checked> 是 </label> <label class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="2"> 否 </label> <?php elseif ($type == 'radio'): ?> <div class="layui-form-item"> <label class="layui-form-label">類型</label> <div class="layui-input-block"> <?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 class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" checked> <?php echo $displayText; ?> </label> <?php endforeach; ?> </div> </div> <?php elseif ($type == 'checkbox'): ?> <?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 class="checkbox"> <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>"> <?php echo $displayText;?> </label> <?php endforeach; ?> <?php elseif ($type == 'textarea'): ?> <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea> <?php elseif ($type == 'textarea_html'): ?> <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?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" class="<?php echo $validateClass; ?>" /> <?php elseif ($type == 'file_upload'): ?> <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" /> <?php else: ?> <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?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 class="layui-form-item"> <label class="layui-form-label"><?php echo $info['DisplayName'];?></label> <div class="layui-input-block"> <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>" value="<?php echo $info['Value'] ?>"> </div> </div> <?php elseif ($type == 'bool'): ?> <label class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" value="1" class="<?php echo $validateClass; ?>" <?php if ($info[Value] == 1) echo 'checked'; ?>> 是 </label> <label class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" value="2" class="<?php echo $validateClass; ?>" <?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('#', $value, 2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label class="radio"> <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" <?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('#', $value, 2); $displayText = $parts[0]; if (count($parts) == 2) { $displayValue = $parts[1]; } else { $displayValue = $parts[0]; } ?> <label class="checkbox"> <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;?> </label> <?php endforeach; ?> <?php elseif ($type == 'textarea'): ?> <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?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' class="input-xxlarge md-input <?php echo $validateClass; ?>"><?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" class="input-xxlarge <?php echo $validateClass; ?>"><?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'];?>" class="input-xxlarge <?php echo $validateClass; ?>" 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="" style="max-height:200px;" /> <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" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea> <?php endif; ?> </td> </tr> <?php endforeach;?>
修改跟添加的模板就差一個value值