卡卡站长

时间:2022-12-02   编辑:卡卡建站

先说一下使用场景:一个数码网站,会有 品牌介绍”栏目,同时也有手机资讯”栏目,又可能还有“资源下载”栏目

所以我们会创建3个栏目:品牌介绍、手机资讯、资源下载。

品牌介绍,类似于聚合页的专题性质,里面包含该品牌各个维度的介绍等信息。自定义个模型即可实现。

在手机资讯发内容时,将资讯与品牌页关联起来要怎么实现?

所以最方法方法就是自定义个字段,所有品牌写进去,发文章直接下拉选择即可(当然也可把每个品牌都建立个栏目,这种用法灵活,如果新建个品牌栏目,还要创建对应的资讯、下载子栏目,过于麻烦)。

即:新增一个叫手机品牌的字段,那么,正常情况下,品牌应该是单选框或下拉框,选择里有苹果,华为,小米

如果有一天,手机又加了“板砖牌手机,需要在自定义字段,增加一组“板砖”数据。同时也在品牌模型下发个板砖品牌的文章。

可以看到这2步是重复工作。如果多个模型都使用了品牌这字段(比如资源下载模型),那么这样需要在每个品牌字段,都增加一组数据,是不是觉得复杂很多?

时间长,可能自己都不记得这个品牌数据是否是完整的。漏加。

所以基于当前情况,我们就需要把自定义字段的数据,将设定的sql语句查询的结果,作为自定义数据的选项,是不是解决了这一点?

实现这个功能,首先自定义字段得可填sql语句,其次要本着尽量少改动系统文件的原则。校验未通过的提示信息的字段似乎不常用,就把它作为sql语句的设置处。

假如我们的手机品牌表名叫 pinpai,那么sql语句就是 select id,title from yzmcms_pinpai 填到设置处。因为我们只要品牌id和品牌标识。所以只需查id,title二字段。

image.png

选项列表,因为动态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;

}


好了,下拉框的已经实现。通过这种方法,试着把单选框也改一下!

这种数据用着很灵活,可以在发文章时任意调用所有表的数据。比如下拉选作者,专题等。可以关联任意数据。