author:咔咔
有没有在添加跟修改的时候很烦,需要写很多页面,修改还需要追加数据,很烦,很烦
下来就解决这样的问题,所有模块的添加,修改,查看,都使用同一个模板
首先从数据库设计开始
注释解释:
域名地址:这个在添加或者修改时在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" /}
foreach ($fields as $info):
$type = $info['Params']['add'];
$validateClass = "validate[required]";
if ($info['Params']['add'] == 'ignore'):
continue;
endif;
if ($info['Params']['add'] == 'hidden'):
<input name=" echo $info['Field'];" type="hidden" value=" echo htmlspecialchars($info['Value']); " />
continue;
endif;
<tr>
<td>
if ($type == 'text'):
<div class="layui-form-item">
<label class="layui-form-label"> echo $info['DisplayName'];</label>
<div class="layui-input-block">
<input id="id_ echo $info['Field'];" lay-verify="name" class="layui-input" name=" echo $info['Field'];">
</div>
</div>
elseif ($type == 'bool'):
<label class="radio">
<input type="radio" name=" echo $info['Field'];" class=" echo $validateClass; " value="1" checked>
是
</label>
<label class="radio">
<input type="radio" name=" echo $info['Field'];" class=" echo $validateClass; " value="2">
否
</label>
elseif ($type == 'radio'):
<div class="layui-form-item">
<label class="layui-form-label">类型</label>
<div class="layui-input-block">
$items = explode(",", $info['Params']['items']);
foreach ($items as $value):
$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=" echo $info['Field'];" value=" echo $displayValue; " class=" echo $validateClass; " checked> echo $displayText;
</label>
endforeach;
</div>
</div>
elseif ($type == 'checkbox'):
$items = explode(",", $info['Params']['items']);
foreach ($items as $value):
$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=" echo $info['Field'];[]" value=" echo $displayValue;" class=" echo $validateClass; "> echo $displayText;
</label>
endforeach;
elseif ($type == 'textarea'):
<textarea name=" echo $info['Field'];" rows="10" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
elseif ($type == 'textarea_html'):
<textarea name=" echo $info['Field'];" rows="20" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
elseif ($type == 'label'):
echo htmlspecialchars($info['Default']);
elseif ($type == 'datetime'):
continue;
elseif ($type == 'image_upload'):
<input name=" echo $info['Field'];" type="file" class=" echo $validateClass; " />
elseif ($type == 'file_upload'):
<input name=" echo $info['Field'];" type="file" class=" echo $validateClass; " />
else:
<textarea name=" echo $info['Field'];" rows="10" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
endif;
</td>
</tr>
endforeach;
在公共模板的顶部我们将字段自定义类型定义了一个变量
我们的这个dn_info自定义类型是text,所以就会将这个input输出 ,不管修改还是添加都是需要name值的,所以name值也会是动态的,我们组装的数据里边也有
这个就是最终效果
上面这个是关于添加的,我们还需要做个修改的,修改是里边是有值得
跟添加的原理一样,只不过需要将字段值组装
看一下数据结构
在来一个修改的模板
{include file="../../../application/admin/view/public/head" /}
foreach ($fields as $info):
$type = $info['Params']['edit'];
$validateClass = "validate[required]";
if ($info['Params']['edit'] == 'ignore'):
continue;
endif;
if ($info['Params']['edit'] == 'hidden'):
<input name=" echo $info['Field'];" type="hidden" value=" echo htmlspecialchars($info['Value']); " />
continue;
endif;
<tr>
<td>
if ($type == 'text'):
<div class="layui-form-item">
<label class="layui-form-label"> echo $info['DisplayName'];</label>
<div class="layui-input-block">
<input id="id_ echo $info['Field'];" lay-verify="name" class="layui-input" name=" echo $info['Field'];" value=" echo $info['Value'] ">
</div>
</div>
elseif ($type == 'bool'):
<label class="radio">
<input type="radio" name=" echo $info['Field'];" value="1" class=" echo $validateClass; " if ($info[Value] == 1) echo 'checked'; >
是
</label>
<label class="radio">
<input type="radio" name=" echo $info['Field'];" value="2" class=" echo $validateClass; " if ($info[Value] == 2) echo 'checked'; >
否
</label>
elseif ($type == 'radio'):
$items = explode(",", $info['Params']['items']);
foreach ($items as $value):
$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=" echo $info['Field'];" value=" echo $displayValue; " class=" echo $validateClass; " if ($displayValue == $info['Value']) echo 'checked'; >
echo $displayText;
</label>
endforeach;
elseif ($type == 'checkbox'):
$items = explode(",", $info['Params']['items']);
$currentItems = explode(' ', $info['Value']);
foreach ($items as $value):
$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=" echo $info['Field'];[]" value=" echo $displayValue;" class=" echo $validateClass; " if (in_array($value, $currentItems)) echo 'checked'; > echo $displayText;
</label>
endforeach;
elseif ($type == 'textarea'):
<textarea name=" echo $info['Field'];" rows="10" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
elseif ($type == 'textarea_markdown'):
<textarea name=" echo $info['Field'];" rows="20" cols="100" data-provide="markdown" id='markdownArea' class="input-xxlarge md-input echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
<br /><a href='http://wowubuntu.com/markdown/' target='_blank'>Markdown 语法说明</a>
elseif ($type == 'textarea_html'):
<textarea name=" echo $info['Field'];" rows="20" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
elseif ($type == 'label'):
echo htmlspecialchars($info['Value']);
elseif ($type == 'datetime'):
<input name=" echo $info['Field'];" class="input-xxlarge echo $validateClass; " value=" echo $info['Value']; " />
elseif ($type == 'image_upload'):
<img src=" echo '/image/view/' . $info['Params']['storage'] . '/' . $info['Value'] . '/small'; " src="holder.js/200x200" alt="" style="max-height:200px;" />
<input name=" echo $info['Field'];" type="file" />
elseif ($type == 'file_upload'):
<input name=" echo $info['Field'];" type="file" />
else:
<textarea name=" echo $info['Field'];" rows="10" cols="100" class="input-xxlarge echo $validateClass; "> echo htmlspecialchars($info['Value']); </textarea>
endif;
</td>
</tr>
endforeach;
修改跟添加的模板就差一个value值