Initial project files: BESCMS full source
This commit is contained in:
@@ -0,0 +1,383 @@
|
||||
<?php namespace Phpcmf\Field;
|
||||
/**
|
||||
* https://www.besyun.com
|
||||
* BESCMS
|
||||
* 本文件是框架系统文件,二次开发时不可以修改本文件,可以通过继承类方法来重写此文件
|
||||
**/
|
||||
|
||||
class Linkages extends \Phpcmf\Library\A_Field {
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
public function __construct(...$params) {
|
||||
parent::__construct(...$params);
|
||||
$this->fieldtype = ['TEXT' => ''];
|
||||
$this->defaulttype = 'TEXT';
|
||||
}
|
||||
|
||||
/**
|
||||
* 字段相关属性参数
|
||||
*
|
||||
* @param array $value 值
|
||||
* @return string
|
||||
*/
|
||||
public function option($option) {
|
||||
|
||||
$str = '<select class="form-control" name="data[setting][option][linkage]">';
|
||||
$data = \Phpcmf\Service::M()->table('linkage')->getAll();
|
||||
if ($data) {
|
||||
$linkage = isset($option['linkage']) ? $option['linkage'] : '';
|
||||
foreach ($data as $t) {
|
||||
$str.= '<option value="'.$t['code'].'" '.($linkage == $t['code'] ? 'selected' : '').'> '.$t['name'].'('.$t['code'].') </option>';
|
||||
}
|
||||
}
|
||||
$str.= '</select>';
|
||||
|
||||
return [$this->_search_field().'<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('选择菜单').'</label>
|
||||
<div class="col-md-9"><label>'.$str.'</label></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('最大选择数').'</label>
|
||||
<div class="col-md-9">
|
||||
<label><input type="text" class="form-control" size="10" name="data[setting][option][limit]" value="'.$option['limit'].'"></label>
|
||||
<span class="help-block">'.dr_lang('最大能选择的数量限制').'</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('强制选择最终项').'</label>
|
||||
<div class="col-md-9">
|
||||
<div class="mt-radio-inline">
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="1" name="data[setting][option][ck_child]" '.($option['ck_child'] == 1 ? 'checked' : '').' > '.dr_lang('开启').' <span></span></label>
|
||||
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="0" name="data[setting][option][ck_child]" '.($option['ck_child'] == 0 ? 'checked' : '').' > '.dr_lang('关闭').' <span></span></label>
|
||||
</div>
|
||||
<span class="help-block">'.dr_lang('开启后会强制要求用户选择最终一个选项,需要启用必须验证才会生效').'</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('折叠显示到一行').'</label>
|
||||
<div class="col-md-9">
|
||||
<div class="mt-radio-inline">
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="0" name="data[setting][option][collapse]" '.($option['collapse'] == 0 ? 'checked' : '').' > '.dr_lang('开启').' <span></span></label>
|
||||
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="1" name="data[setting][option][collapse]" '.($option['collapse'] == 1 ? 'checked' : '').' > '.dr_lang('关闭').' <span></span></label>
|
||||
|
||||
</div>
|
||||
<span class="help-block">'.dr_lang('多选模式下是否折叠显示选择值').'</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('输入框显示方式').'</label>
|
||||
<div class="col-md-9">
|
||||
<div class="mt-radio-inline">
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="1" name="data[setting][option][new]" '.($option['new'] == 1 ? 'checked' : '').' > '.dr_lang('折叠弹窗模式').' <span></span></label>
|
||||
|
||||
<label class="mt-radio mt-radio-outline"><input type="radio" value="0" name="data[setting][option][new]" '.($option['new'] == 0 ? 'checked' : '').' > '.dr_lang('经典模式').' <span></span></label>
|
||||
|
||||
</div>
|
||||
<span class="help-block">'.dr_lang('针对输入框效果的显示方式').'</span>
|
||||
</div>
|
||||
</div>
|
||||
', '<div class="form-group">
|
||||
<label class="col-md-2 control-label">'.dr_lang('控件宽度').'</label>
|
||||
<div class="col-md-9">
|
||||
<label><input type="text" class="form-control" size="10" name="data[setting][option][width]" value="'.$option['width'].'"></label>
|
||||
<span class="help-block">'.dr_lang('[整数]表示固定宽度;[整数%]表示百分比').'</span>
|
||||
</div>
|
||||
</div>'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 字段输出
|
||||
*/
|
||||
public function output($value) {
|
||||
return dr_string2array($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字段入库值
|
||||
*
|
||||
* @param array $field 字段信息
|
||||
* @return void
|
||||
*/
|
||||
public function insert_value($field) {
|
||||
|
||||
$save = [];
|
||||
$data = \Phpcmf\Service::L('Field')->post[$field['fieldname']];
|
||||
if ($data) {
|
||||
$data = dr_string2array($data);
|
||||
if ($data) {
|
||||
foreach ($data as $t) {
|
||||
if ($t) {
|
||||
$save[] = $t;
|
||||
}
|
||||
}
|
||||
$save = array_unique($save);
|
||||
}
|
||||
}
|
||||
// 判断超限
|
||||
if ($field['setting']['option']['limit'] && dr_count($save) > $field['setting']['option']['limit']) {
|
||||
$save = array_slice($save, 0, $field['setting']['option']['limit']);
|
||||
}
|
||||
|
||||
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname']] = dr_array2string($save);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证字段值
|
||||
*
|
||||
* @param string $field 字段类型
|
||||
* @param string $value 字段值
|
||||
* @return
|
||||
*/
|
||||
public function check_value($field, $value) {
|
||||
|
||||
$values = dr_string2array($value);
|
||||
if ($values) {
|
||||
foreach ($values as $value) {
|
||||
$link = dr_linkage($field['setting']['option']['linkage'], $value);
|
||||
if (!$link) {
|
||||
return dr_lang('选项无效');
|
||||
} elseif ($field['setting']['option']['ck_child'] && $link['child']) {
|
||||
return dr_lang('需要选择下级选项');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证必填字段值
|
||||
*
|
||||
* @param string $field 字段类型
|
||||
* @param string $value 字段值
|
||||
* @return
|
||||
*/
|
||||
public function check_required($field, $values) {
|
||||
|
||||
if (!$values) {
|
||||
// 验证值为空
|
||||
return dr_lang('%s不能为空', $field['name']);
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证加载变量设置
|
||||
*/
|
||||
public function set_load_js($name, $value) {
|
||||
\Phpcmf\Service::C()->loadjs['Linkage'] = \Phpcmf\Service::C()->loadjs[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 字段表单输入
|
||||
*
|
||||
* @param string $field 字段数组
|
||||
* @param array $value 值
|
||||
* @return string
|
||||
*/
|
||||
public function input($field, $value = null) {
|
||||
|
||||
// 字段禁止修改时就返回显示字符串
|
||||
if ($this->_not_edit($field, $value)) {
|
||||
return $this->show($field, $value);
|
||||
}
|
||||
|
||||
// 字段存储名称
|
||||
$name = $field['fieldname'];
|
||||
|
||||
// 字段显示名称
|
||||
$text = ($field['setting']['validate']['required'] ? '<span class="required" aria-required="true"> * </span>' : '').dr_lang($field['name']);
|
||||
|
||||
// 字段提示信息
|
||||
$tips = ($name == 'title' && APP_DIR) || $field['setting']['validate']['tips'] ? '<span class="help-block" id="dr_'.$field['fieldname'].'_tips">'.$field['setting']['validate']['tips'].'</span>' : '';
|
||||
|
||||
if ($field['setting']['option']['new']) {
|
||||
// 字段默认值
|
||||
$value = $value ? $value : $this->get_default_value($field['setting']['option']['value']);
|
||||
$value = dr_string2array($value);
|
||||
if (is_array($value)) {
|
||||
$new = [];
|
||||
foreach ($value as $t) {
|
||||
$new[] = (string)$t;
|
||||
}
|
||||
$value = json_encode($new);
|
||||
} else {
|
||||
$value = '[]';
|
||||
}
|
||||
|
||||
// 开始输出
|
||||
$str = '';
|
||||
if (!$this->is_load_js('Linkage')) {
|
||||
$str.= '
|
||||
<link rel="stylesheet" type="text/css" href="'.ROOT_THEME_PATH.'assets/layui/css/layui.css?v='.CMF_UPDATE_TIME.'"/>
|
||||
<link rel="stylesheet" type="text/css" href="'.ROOT_THEME_PATH.'assets/layui/cascader/cascader.css?v='.CMF_UPDATE_TIME.'"/>
|
||||
<script src="'.ROOT_THEME_PATH.'assets/layui/layui.js?v='.CMF_UPDATE_TIME.'"></script>
|
||||
<script src="'.ROOT_THEME_PATH.'assets/layui/cascader/cascader.js?v='.CMF_UPDATE_TIME.'"></script>
|
||||
';
|
||||
$this->set_load_js('Linkage', 1);
|
||||
}
|
||||
|
||||
// 输出js支持
|
||||
$str.= '<input type="hidden" name="data['.$name.']" id="dr_'.$name.'" value="'.$value.'" />
|
||||
<script src="'.WEB_DIR.'index.php?s=api&c=api&m=linkage&mid='.APP_DIR.'&file='.$field['setting']['option']['file'].'&code='.$field['setting']['option']['linkage'].'"></script>
|
||||
<script type="text/javascript">
|
||||
$(function (){
|
||||
layui.use(\'layCascader\', function () {
|
||||
var layCascader = layui.layCascader;
|
||||
layCascader({
|
||||
elem: \'#dr_'.$name.'\',
|
||||
value: '.$value.',
|
||||
clearable: true,
|
||||
filterable: false,
|
||||
maxSize: '.intval($field['setting']['option']['limit']).',
|
||||
collapseTags: '.($field['setting']['option']['collapse'] ? 'false' : 'true').',
|
||||
minCollapseTagsNumber: 0,
|
||||
options: linkage_'.$field['setting']['option']['linkage'].',
|
||||
props: {
|
||||
multiple: true,
|
||||
checkStrictly: '.($field['setting']['option']['ck_child'] ? 'false' : 'true').',
|
||||
}
|
||||
});
|
||||
})
|
||||
});
|
||||
</script>'.$tips;
|
||||
} else {
|
||||
// 经典模式
|
||||
// 联动菜单缓存
|
||||
$linkage = dr_linkage_list($field['setting']['option']['linkage'], 0);
|
||||
if (!$linkage) {
|
||||
if (CI_DEBUG) {
|
||||
return $this->input_format($name, $text, '<div class="form-control-static" style="color:red">联动菜单【'.$field['setting']['option']['linkage'].'】没有数据</div>');
|
||||
}
|
||||
return $this->input_format($name, $text, '');
|
||||
}
|
||||
|
||||
// 最大几层
|
||||
$linklevel = dr_linkage_level($field['setting']['option']['linkage']) + 1;
|
||||
// 开始输出
|
||||
$str = '';
|
||||
if (!$this->is_load_js($field['fieldtype'].'_LD')) {
|
||||
$str.= '<script type="text/javascript" src="'.ROOT_THEME_PATH.'assets/js/jquery.ld.js?v='.CMF_UPDATE_TIME.'"></script>';
|
||||
$this->set_load_js($field['fieldtype'].'_LD', 1);
|
||||
}
|
||||
|
||||
// 表单宽度设置
|
||||
$width = \Phpcmf\Service::IS_MOBILE_USER() ? '100%' : ($field['setting']['option']['width'] ? $field['setting']['option']['width'] : '100%');
|
||||
$str.= '<div class="dropzone-file-area" style="text-align:left" id="linkages-'.$name.'-sort-items" style="width:'.$width.(is_numeric($width) ? 'px' : '').';">';
|
||||
$level = 1;
|
||||
|
||||
// 输出默认菜单
|
||||
$tpl = '<div class="linkages_'.$name.'_row" id="dr_linkages_'.$name.'_row_{id}">';
|
||||
$tpl.= '<label style="margin-right: 10px;"><a class="btn btn-sm " href="javascript:;" onclick="$(\'#dr_linkages_'.$name.'_row_{id}\').remove()"> <i class="fa fa-close"></i> </a></label>';
|
||||
$tpl.= '<input type="hidden" name="data['.$name.'][{id}]" id="dr_'.$name.'_{id}" value="{value}" />';
|
||||
$tpl.= '<input type="hidden" id="dr_'.$name.'_{id}_default" value="" />';
|
||||
$tpl.= '<span id="dr_linkages_'.$name.'_select_{id}" style="display:{display}">';
|
||||
for ($i = 1; $i <= $linklevel; $i++) {
|
||||
$style = $i > $level ? 'style="display:none"' : '';
|
||||
$tpl.= '<label style="padding-right:10px;"><select class="form-control finecms-selects-'.$name.'-{id}" name="'.$name.'-'.$i.'-{id}" id="'.$name.'-'.$i.'-{id}" width="100" '.$style.'><option value=""> -- </option></select></label>';
|
||||
}
|
||||
$tpl.= '</span>';
|
||||
$tpl.= '</div>';
|
||||
|
||||
// 字段默认值
|
||||
$values = dr_string2array($value);
|
||||
if ($values) {
|
||||
foreach ($values as $id => $value) {
|
||||
if ($value) {
|
||||
$link = dr_linkage($field['setting']['option']['linkage'], $value);
|
||||
if (!$link) {
|
||||
continue;
|
||||
}
|
||||
$pids = substr((string)$link['pids'], 2);
|
||||
$level = substr_count($pids, ',') + 1;
|
||||
$default = !$pids ? '["'.$value.'"]' : '["'.str_replace(',', '","', $pids).'","'.$value.'"]';
|
||||
$str.= '<div class="linkages_'.$name.'_row" id="dr_linkages_'.$name.'_row_'.$id.'">';
|
||||
$str.= '<label style="margin-right: 10px;"><a class="btn btn-sm " href="javascript:;" onclick="$(\'#dr_linkages_'.$name.'_row_'.$id.'\').remove()"> <i class="fa fa-close"></i> </a></label>';
|
||||
$str.= '<input type="hidden" name="data['.$name.']['.$id.']" id="dr_'.$name.'_'.$id.'" value="'.$value.'" />';
|
||||
$str.= '<input type="hidden" id="dr_'.$name.'_'.$id.'_default" value="'.addslashes($default).'" />';
|
||||
$str.= '<span id="dr_linkages_'.$name.'_select_'.$id.'" style="display:none">';
|
||||
for ($i = 1; $i <= $linklevel; $i++) {
|
||||
$style = $i > $level ? 'style="display:none"' : '';
|
||||
$str.= '<label style="padding-right:10px;"><select class="form-control finecms-selects-'.$name.'-'.$id.'" name="'.$name.'-'.$i.'-'.$id.'" id="'.$name.'-'.$i.'-'.$id.'" width="100" '.$style.'><option value=""> -- </option></select></label>';
|
||||
}
|
||||
$str.= '</span>';
|
||||
$str.= '<label class="form-control-static" id="dr_linkages_'.$name.'_cxselect_'.$id.'">'.dr_linkagepos($field['setting']['option']['linkage'], $value, ' » ').' <a href="javascript:;" onclick="dr_linkages_select_'.$name.'('.$id.')" style="color:blue">'.dr_lang('[重新选择]').'</a></label>';
|
||||
$str.= '</div>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 整体
|
||||
$str.= '</div>';
|
||||
$str.= '<div class="margin-top-10"> <a href="javascript:;" class="btn blue btn-sm" onClick="dr_add_linkages_'.$name.'()"> <i class="fa fa-plus"></i> '.dr_lang('添加').' </a>';
|
||||
$str.= '</div>';
|
||||
$str.= '<script type="text/javascript">
|
||||
$("#linkages-'.$name.'-sort-items").sortable();
|
||||
function dr_add_linkages_'.$name.'() {
|
||||
var num = $("#linkages-'.$name.'-sort-items .linkages_'.$name.'_row").length;
|
||||
if ('.(int)$field['setting']['option']['limit'].' > 0 && num >= '.(int)$field['setting']['option']['limit'].') {
|
||||
dr_tips(0, "'.dr_lang('最多可以选择%s项', $field['setting']['option']['limit']).'");
|
||||
return;
|
||||
}
|
||||
var id=(num + 1) * 10;
|
||||
var html = "'.addslashes($tpl).'";
|
||||
html = html.replace(/\{id\}/g, id);
|
||||
html = html.replace(/\{display\}/g, "blank");
|
||||
html = html.replace(/\{value\}/g, "0");
|
||||
$("#linkages-'.$name.'-sort-items").append(html);
|
||||
dr_linkages_init_'.$name.'(id);
|
||||
}
|
||||
function dr_linkages_select_'.$name.'(id) {
|
||||
$("#dr_linkages_'.$name.'_select_"+id).show();
|
||||
$("#dr_linkages_'.$name.'_cxselect_"+id).hide();
|
||||
dr_linkages_init_'.$name.'(id);
|
||||
}
|
||||
function dr_linkages_init_'.$name.'(id) {
|
||||
var $ld5 = $(".finecms-selects-'.$name.'-"+id);
|
||||
$ld5.ld({ajaxOptions:{"url": "'.WEB_DIR.'index.php?s=api&c=api&m=linkage_ld&code='.$field['setting']['option']['linkage'].'"},defaultParentId:0})
|
||||
var ld5_api = $ld5.ld("api");
|
||||
ld5_api.selected($("#dr_'.$name.'_"+id+"_default").val());
|
||||
$ld5.bind("change", function(e){
|
||||
var $target = $(e.target);
|
||||
var index = $ld5.index($target);
|
||||
$("#dr_'.$name.'_"+id).val($ld5.eq(index).show().val());
|
||||
index ++;
|
||||
$ld5.eq(index).show();
|
||||
});
|
||||
|
||||
}
|
||||
</script><span class="help-block">'.$tips.'</span>';
|
||||
}
|
||||
|
||||
|
||||
return $this->input_format($name, $text, $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字段表单显示
|
||||
*
|
||||
* @param string $field 字段数组
|
||||
* @param array $value 值
|
||||
* @return string
|
||||
*/
|
||||
public function show($field, $value = null) {
|
||||
|
||||
$str = '';
|
||||
$values = dr_string2array($value);
|
||||
if ($values) {
|
||||
foreach ($values as $value) {
|
||||
$str.= '<div class="form-control-static">'.dr_linkagepos($field['setting']['option']['linkage'], $value, ' - ').'</div>';
|
||||
}
|
||||
}
|
||||
|
||||
return $this->input_format($field['fieldname'], $field['name'], $str);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user