yzmcms自定义字段时,如果自定义一个单选框字段,备选选项,将以标题存储在数据库中。
例如:如果做个模板站,新建个字段叫 模板颜色{mbcolor},对应的单选框有:红色、绿色、蓝色等10种颜色,那么在每篇文章中,mbcolor字段内容将是红色,或蓝色,这种varchar型的文本。
当数据量过大时,前端利用这些信息筛选时,效率就会明显下降。
那么,如何优化查询效率,其实很简单,让mbcolor使用数字来存储颜色。即红色就存1,绿色就存成2..
然后将mbcolor字段的字段类型修改成数值/布尔/选择类型,根据具体的可以变动,并设置成索引。
那么,一串数字,前台调用和后台录入,不可能记录每个颜色对应的数值,怎么办如何录入?
接下来简单改造即可。
让系统单选框中选择红色,自动向数据库存储为数字1,等等,操作方法如下:
1、打开文件 /yzmphp/core/class/form.class.php,将单选框的函数修改成如下:
/**
* 单选框
*
* @param $name name
* @param $val 默认选中值 如:1
* @param $array 一维数组 如:array('交易成功', '交易失败', '交易结果未知');
*/
public static function radio($name, $val = '', $array = array()) {
$string = '';
foreach($array as $value) {
$tmpstr=explode('::',$value,2);
$value=$tmpstr[0];
$vname=empty($tmpstr[1])?$value:$tmpstr[1];
$checked = trim($val)==trim($value) ? 'checked' : '';
$string .= '<label class="option_label option_radio" >';
$string .= '<input type="radio" class="yzm-radio" name="'.$name.'" id="'.$name.'_'.$value.'" '.$checked.' value="'.$value.'">'.$vname;
$string .= '</label>';
}
return $string;
}
将复选框函数修改成:
/**
* 复选框
*
* @param $name name
* @param $val 默认选中值,多个用 '逗号'分割 如:'1,2'
* @param $array 一维数组 如:array('交易成功', '交易失败', '交易结果未知');
*/
public static function chec**ox($name, $val = '', $array = array()) {
$string = '';
$val = trim($val);
if($val != '') $val = strpos($val, ',') ? explode(',', $val) : array($val);
$i = 1;
foreach($array as $value) {
$value = trim($value);
$tmpstr=explode('::',$value,2);
$value=$tmpstr[0];
$vname=empty($tmpstr[1])?$value:$tmpstr[1];
$checked = ($val && in_array($value, $val)) ? 'checked' : '';
$string .= '<label class="option_label option_box" >';
$string .= '<input type="chec**ox" class="yzm-chec**ox" name="'.$name.'[]" id="'.$name.'_'.$i.'" '.$checked.' value="'.$value.'">'.$vname;
$string .= '</label>';
$i++;
}
return $string;
}
即可在单选框与复选框中定义2个参数,即录入标题,和录入数值
2、自定义字段为单选框和复选框时,默认的选项列表格式为:用“|”分开,如“男|女|人妖”
修改后则为:用“|”分开,如“1::男|2::女|3::人妖”,即表示,后台录入时选择男,录入到数据库值为1。
当然修改后,兼容老格式,你仍然可以使用男|女|人妖这种格式,只不过仍然用汉字存储到数据库。同时,试试下拉框,如何修改?
3、根据上文说的,修改对应字段的类型,比如改成布尔型
后台录入搞定,那么前台调用如何调用成汉字?
4、if else 或者 case switch总会用吧。再或者定义个数组,如 mbcolor[1]='红色';
即可完美提升效率。