先说一下使用场景:一个数码网站,会有 “品牌介绍”栏目,同时也有“手机资讯”栏目,又可能还有“资源下载”栏目
所以我们会创建3个栏目:品牌介绍、手机资讯、资源下载。
品牌介绍,类似于聚合页的专题性质,里面包含该品牌各个维度的介绍等信息。自定义个模型即可实现。
在手机资讯发内容时,将资讯与品牌页关联起来要怎么实现?
所以最方法方法就是自定义个字段,所有品牌写进去,发文章直接下拉选择即可(当然也可把每个品牌都建立个栏目,这种用法灵活,如果新建个品牌栏目,还要创建对应的资讯、下载子栏目,过于麻烦)。
即:新增一个叫手机品牌的字段,那么,正常情况下,品牌应该是单选框或下拉框,选择里有苹果,华为,小米
如果有一天,手机又加了“板砖”牌手机,需要在自定义字段,增加一组“板砖”数据。同时也在品牌模型下发个板砖品牌的文章。
可以看到这2步是重复工作。如果多个模型都使用了品牌这字段(比如资源下载模型),那么这样需要在每个品牌字段,都增加一组数据,是不是觉得复杂很多?
时间长,可能自己都不记得这个品牌数据是否是完整的。漏加。
所以基于当前情况,我们就需要把自定义字段的数据,将设定的sql语句查询的结果,作为自定义数据的选项,是不是解决了这一点?
实现这个功能,首先自定义字段得可填sql语句,其次要本着尽量少改动系统文件的原则。校验未通过的提示信息的字段似乎不常用,就把它作为sql语句的设置处。
假如我们的手机品牌表名叫 pinpai,那么sql语句就是 select id,title from yzmcms_pinpai 填到设置处。因为我们只要品牌id和品牌标识。所以只需查id,title二字段。
选项列表,因为动态sql调用,所以设置处已不再需要,可随便填。
字段类型,我用下拉框。当然可以用单选框及多选框,凭自已使用场景来选择。
自定义设置处已经完成,到目前没有改动系统核心文件。下面就是文件修改了。
打开文件:/application/admin/common/lib/content_form.class.php
在新增文章的函数content_add()处,找到elseif($fieldtype == 'select'){
即修改下位列表框数据控制处。
1、增加sql调用,如果未通过提示设置不空,那么代表调用sql数据,否则仍使用固定选项数据。
$sqlarr='';
if($val['errortips']<>''){
$db = D('test');
$arr_db=$db->fetch_all($db->query($val['errortips']));
foreach ($arr_db as $arr_tmp){
$sqlarr[]=implode(':',$arr_tmp);
}
}else{
$sqlarr=string2array($val['setting']);
}
2、调用的将调用的固定数据,修改成上面的数据
将红色部分改成 $sqlarr
$string .= $this->tag_start($val['name'], $val['isrequired']).'<span class="select-box">'.form::select($val['field'],$val['defaultvalue'],string2array($val['setting'])).'</span>'.$this->tag_end();
3、按上面方法把编辑文章时的content_edit($data)函数,也改一下即可。
下面是content_add的完整代码:
public function content_add() {
$modelinfo = $this->get_modelinfo();
$string = getcache($this->modelid.'_model_string');
if($string === false){
$string = '';
foreach($modelinfo as $val){
// print_r($val);
$fieldtype = $val['fieldtype'];
if($fieldtype == 'input' || $fieldtype == 'number'){
$errortips = !empty($val['errortips']) ? $val['errortips'] : '必填项不能为空';
$required = $val['isrequired'] ? ' required" errortips="'.$errortips : '';
$string .= $this->tag_start($val['name'], $val['isrequired']).'<input type="text" class="input-text'.$required.'" value="'.$val['defaultvalue'].'" name="'.$val['field'].'" placeholder="'.$val['tips'].'">'.$this->tag_end();
}elseif($fieldtype == 'textarea'){
$errortips = !empty($val['errortips']) ? $val['errortips'] : '必填项不能为空';
$required = $val['isrequired'] ? ' required" errortips="'.$errortips : '';
$string .= $this->tag_start($val['name'], $val['isrequired']).'<textarea name="'.$val['field'].'" class="textarea'.$required.'" placeholder="'.$val['tips'].'" >'.$val['defaultvalue'].'</textarea>'.$this->tag_end();
}elseif($fieldtype == 'select'){
$sqlarr='';
if($val['errortips']<>''){
$db = D('test');
$arr_db=$db->fetch_all($db->query($val['errortips']));
foreach ($arr_db as $arr_tmp){
$sqlarr[]=implode(':',$arr_tmp);
}
}else{
$sqlarr=string2array($val['setting']);
}
$string .= $this->tag_start($val['name'], $val['isrequired']).'<span class="select-box">'.form::select($val['field'],$val['defaultvalue'],$sqlarr).'</span>'.$this->tag_end();
}elseif($fieldtype == 'radio' || $fieldtype == 'checkbox'){
$sqlarr='';
if($val['errortips']<>''){
$db = D('test');
$arr_db=$db->fetch_all($db->query($val['errortips']));
foreach ($arr_db as $arr_tmp){
$sqlarr[]=implode(':',$arr_tmp);
}
}else{
$sqlarr=string2array($val['setting']);
}
$string .= $this->tag_start($val['name'], $val['isrequired']).form::$fieldtype($val['field'],$val['defaultvalue'],$sqlarr).$this->tag_end();
}elseif($fieldtype == 'datetime'){
$string .= $this->tag_start($val['name'], $val['isrequired']).form::datetime($val['field'], '', $val['setting']).$this->tag_end();
}else{
$string .= $this->tag_start($val['name'], $val['isrequired']).form::$fieldtype($val['field']).$this->tag_end();
}
}
setcache($this->modelid.'_model_string', $string);
}
return $string;
}
好了,下拉框的已经实现。通过这种方法,试着把单选框也改一下!
这种数据用着很灵活,可以在发文章时任意调用所有表的数据。比如下拉选作者,专题等。可以关联任意数据。