在模型中增加字段类型为,其他模型,如果添加一个模型ID
然后在发布内容时,会出现一个下拉,可选择所选模型的所有文章。这个用aliyui的下拉搜索框就行。
这样发布文章就可以和所选模型的文章关联
这种效果 https://fly.layui.com/extend/xmSelect/
在发布内容页面,建议用这个带搜索的下拉。不然内容太多时不好直接选择
这个其实并不困难,可以自己动手的,
第一步:
首先在\YZNCMS\application\cms\controller\Field.php 创建一个新的方法:
public function getfieldinfo() { $field = $this->request->param('field/s', 0); empty($field) && $this->error('参数不能为空!'); try { $FieldInfo = Db::query("SHOW FULL COLUMNS FROM {$field}"); } catch (\Exception $e) { $this->error($e->getMessage()); } $this->success("提取成功!","",$FieldInfo); }
第二步:
在文件 \YZNCMS\application\cms\controller\Field.php 字段控制器内找到 增加字段 (add)
添加 代码:
$TABLElist = array_map('array_change_key_case', Db::query('SHOW TABLE STATUS')); //全部小写 $this->assign([ 'modelType' => $modelInfo['type'], "modelid" => $modelid, 'fieldType' => $fieldType, 'TABLElist' => $TABLElist, ]);
第四步:
找到字段添加模板文件,位置:\YZNCMS\application\cms\view\field\add.html
用最新版本的yzn ,找到下面的代码:
<div class="layui-form-item"> <label class="layui-form-label">选项</label> <div class="layui-input-inline w300"> <textarea name="setting[options]" placeholder="值:描述 值:描述 值:描述 ....." class="layui-textarea"></textarea> </div> </div>
改为:
<div class="layui-form-item"> <label class="layui-form-label">选项数据</label> <div class="layui-input-inline"> <input type="radio" lay-filter="datasource" name="setting[datastate]" value="0" title="自定义" checked> <input type="radio" lay-filter="datasource" name="setting[datastate]" value="1" title="关联数据库"> </div> </div> <div class="layui-form-item datasource" style="display:none"> <label class="layui-form-label">数据库</label> <div class="layui-input-inline w190"> <select lay-filter="datatable" name="setting[datasource][datatable]"> <option data-define="">选择数据库</option> {volist name="TABLElist" id="vo"} <option value="{$vo.name}">{$vo.comment} [{$vo.name}]</option> {/volist} </select> </div> <div class="layui-input-inline w150"> <select id="datavalue" name="setting[datasource][datavalue]"> {if condition="$FieldInfo neq null"} {volist name="FieldInfo" id="vo"} <option value="{$vo.Field}">[{$vo.Field}] {$vo.Comment}</option> {/volist}{else /} <option data-define="">选择字段【值】</option> {/if} </select> </div> <div class="layui-input-inline w150"> <select id="datadesc" name="setting[datasource][datadesc]"> {if condition="$FieldInfo neq null"} {volist name="FieldInfo" id="vo"} <option value="{$vo.Field}">[{$vo.Field}] {$vo.Comment}</option> {/volist}{else /} <option data-define="">选择字段【描述】</option> {/if} </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">选项</label> <div class="layui-input-inline w300"> <textarea name="setting[options]" placeholder="值:描述 值:描述 值:描述 ....." class="layui-textarea"></textarea> </div> </div>
在底部加上JS代码:
form.on('radio(datasource)', function(data) { if (data.value == 1) { $('.datasource').show().next().hide(); } else { $('.datasource').hide().next().show(); } }); form.on('select(datatable)', function(data) { var field = data.value; tp.request.get( { url:'{:url("getfieldinfo")}', data:{field:field} }, function(res){ var data = res.data; $('#datavalue').html('<option data-define="">选择字段【值】</option>'); $('#datadesc').html('<option data-define="">选择字段【描述】</option>'); data.map(function(i, e) { var desc = i.Comment||i.Field; var html = '<option value="'+i.Field+'">['+i.Field+'] '+desc+' </option>'; $('#datavalue,#datadesc').append(html); }); form.render(); }); });
到这,当你选择字段类型为下拉的时候,会出现下拉的选项内容是自定义还是关联数据库。当然,这也可以扩展到其他字段类型,比如radio,或者checkbox;
现在已经可以正常选择下拉的数据源了。
现在选择数据源后提交后会在字段setting自动添加datasource和datastate响应设置内容。
最后一步 找到文件\YZNCMS\application\cms\model\Cms.php
在getFieldList方法内最修改。
在 $value['setting'] = unserialize($value['setting']); 下添加代码
if ($value['type'] == 'select') if ($value['setting']['datastate']) { $datatable = $value['setting']['datasource']['datatable']; $tabledata = Db::table($datatable)->select(); foreach ($tabledata as $k => $v) { $value['setting']['options'] .= $v['id'].':'.$v['name']."\n"; } } }
好了,现在大功告成了!