Commit 8e245f63 authored by wangtao's avatar wangtao

增加后台文章管理

parent 69bc4795
<?php
/**
* ===========================================================================
* Veitool 快捷开发框架系统
* Author: Niaho 26843818@qq.com
* Copyright (c)2019-2025 www.veitool.com All rights reserved.
* Licensed: 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
* ---------------------------------------------------------------------------
*/
namespace app\admin\controller;
use app\model\system\SystemDict as Dict;
use app\model\system\SystemMenus as Menus;
use app\model\system\SystemCategory as Category;
use think\App;
use think\facade\Db;
use app\model\ArticleModel;
use tool\Tree;
/**
* 后台主控制器
*/
class Article extends AdminBase
{
protected $article;
public function __construct(App $app)
{
parent::__construct($app);
$this->article = new ArticleModel();
}
//文章列表
public function index(string $do='')
{
$limit = 10;
if ($do == 'json') {
$post = input();
$post['page'] = isset($post['page']) ? $post['page'] : 1;
$post['limit'] = isset($post['limit']) ? $post['limit'] : $limit;
$map[] = ['is_del', '=', 0];
$list = $this->article->where($map)->page($post['page'], $post['limit'])->select()->append(['cate_name','adminname'])->toArray();
return $this->returnMsg('',0,$list);
}
$category = Db::name('article_category')->field('*,pid as parentid')->order('sort desc')->select()->toArray();
$this->assign('category', json_encode($category));
$this->assign('limit', $limit);
return $this->fetch('', '', false);
}
//编辑新增文章
public function edit()
{
if($this->request->isPost()){
$post = input();
print_r($post);exit;
}
$category = Db::name('article_category')->order('sort desc')->select()->toArray();
$tree = new Tree();
$tree->icon = ['&nbsp;&nbsp;│ ', '&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;└─ '];
$tree->nbsp = '&nbsp;&nbsp;';
$str = "<option value=@id @selected @disabled>@spacer @title</option>";
$tree->init($category);
$categorydata = $tree->getTree(0, $str, 0);
$this->assign('categorydata', $categorydata);
return $this->fetch('', '', false);
}
public function maind()
{
return $this->fetch('', '', false);
}
}
\ No newline at end of file
......@@ -27,7 +27,6 @@ class Index extends AdminBase
public function index()
{
ECHO 11;
$this->assign([
"appMap" => $this->appMap,
"tokenName" => $this->tokenName
......
......@@ -42,6 +42,7 @@ class Manager extends AdminBase
return $this->redirect($this->appMap);
}
$organ = Organ::order(['listorder'=>'asc'])->column('*');
if($do){
if($do=='json'){ //异步管理员列表数据
$where = [[],[['username', '=', $this->manUser['username']]]];
......
{extend name="base/header" /}
{block name="body"}
<div style="margin: 0px 10px">
<form class="layui-form " style="margin-top: 20px;">
<div class="layui-form-item">
<label class="layui-form-label"> 选择分类 </label>
<div class="layui-input-block">
<select name="cate_id">
<option value="0">请选择分类</option>
{:$categorydata}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文章标题</label>
<div class="layui-input-block">
<input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文章简介</label>
<div class="layui-input-block">
<textarea placeholder="请输入文章简介" name="description" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文章图片</label>
<div class="layui-input-block" id="thumbup">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读量</label>
<div class="layui-input-block">
<input type="text" name="click" placeholder="请输入阅读量" autocomplete="off" class="layui-input"
value="0">
</div>
</div>
<div id="contentup">
</div>
</form>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
layui.use(['buildItems', 'form', 'laydate', 'util'], function () {
/*解析顶部分组选项*/
var str = [{
"name": "thumb",
"title": "上传图片",
"value": "",
"type": "imagewt"
}];
layui.buildItems.build({
bid: 'thumbup',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data: str
});
var str = [{
"name": "content",
"title": "文章内容",
"value": "",
"type": "ueditor",
"style": "height:500px",
}];
layui.buildItems.build({
bid: 'contentup',
url: '',
map: layui.cache.maps + 'system.upload/',
gid: 1,
data: str
});
var form = layui.form;
form.render();
});
var callbackdata = function () {
var data = $(".layui-form").serialize();
return data;
};
</script>
{/block}
\ No newline at end of file
<style>
#organizationTreeBar{padding:10px 15px;border:1px solid #e6e6e6;background-color:#f2f2f2}
#organizationTree{border:1px solid #e6e6e6;border-top:none;padding:10px 5px;overflow:auto;height:-webkit-calc(100vh - 260px);height:-moz-calc(100vh - 260px);height:calc(100vh - 260px)}
.layui-tree-entry .layui-tree-txt{padding:0 5px;border:1px transparent solid;text-decoration:none!important}
.layui-tree-entry.organ-tree-click .layui-tree-txt{background-color:#fff3e0;border:1px #ffe6b0 solid}
.files_item{width:30px;height:30px;line-height:30px;cursor:pointer;padding:1px;border:1px solid #ddd;background:#fff;display:-webkit-box;-moz-box-align:center;-webkit-box-align:center;-moz-box-pack:center;-webkit-box-pack:center;}
.files_item img{max-width:28px;max-height:28px;border:0}
</style>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md2">
<div class="layui-card">
<div class="layui-card-body" style="padding:10px;">
<!-- 树工具栏 -->
<!-- 左树 -->
<div id="organizationTree"></div>
</div>
</div>
</div>
<div class="layui-col-md10">
<div class="layui-card">
<div class="layui-card-header">
<form class="layui-form render">
<input type="hidden" name="groupid" id="manager-groupid" value=""/>
<div class="layui-form-item">
<div class="layui-inline" style="width:72px;">
<select name="fields">
<option value="">属性</option>
<option value="0">帐号</option>
<option value="1">姓名</option>
<option value="2">电话</option>
<option value="3">IP</option>
</select>
</div>
<div class="layui-inline" style="width:150px;"><input type="text" name="kw" placeholder="关键词" autocomplete="off" class="layui-input" lay-affix="clear"/></div>
<div class="layui-inline" style="width:200px;"><input type="text" name="sotime" date-render placeholder="登录时间" class="layui-input" lay-affix="clear"/></div>
<div class="layui-inline" style="width:110px;"><select name="roleid" id="search_roles_select"></select></div>
<div class="layui-inline">
<div class="layui-btn-group">
<button class="layui-btn" lay-submit lay-filter="search-manager"><i class="layui-icon layui-icon-search"></i> 搜索</button>
<a class="layui-btn" lay-submit lay-filter="search-manager-all" onclick="$('#manager-groupid').val('')"><i class="layui-icon layui-icon-light"></i>全部</a>
</div>
</div>
</div>
</form>
</div>
<div class="layui-card-body">
<div class="layui-card-box">
<div class="layui-btn-group">
<a class="layui-btn" id="manager-add" v-show="@system.manager/add"><i class="layui-icon layui-icon-add-circle"></i> 添加</a>
<a class="layui-btn" id="manager-del" v-show="@system.manager/del"><i class="layui-icon layui-icon-delete"></i> 删除</a>
</div>
</div>
<div class="layui-card-body">
<table lay-filter="manager" id="manager"></table>
</div>
</div>
</div>
</div>
</div>
</div>
<!--JS部分-->
<script>
layui.use(['vinfo', 'buildItems'], function(){
var map_root = layui.cache.maps;
var app_root = map_root + 'article/';
var layer = layui.layer,table=layui.table,form=layui.form,admin=layui.admin;
organData = admin.util.toTree({$category|raw});
doTree(organData,'');
function doTree(data,load){
layui.tree.render({
id: 'organTree',
elem: '#organizationTree',
data: data,
onlyIconControl: true,
click: function(obj){
$('#organizationTree').find('.organ-tree-click').removeClass('organ-tree-click');
$(obj.elem).children('.layui-tree-entry').addClass('organ-tree-click');
organObj = obj.data;
$('#manager-groupid').val(obj.data.id);
table.reloadData('manager',{where:{groupid:obj.data.id},page:{curr:1}});
}
});
var item = $('#organizationTree .layui-tree-entry:first');
load ? item.find('.layui-tree-main>.layui-tree-txt').trigger('click') : item.addClass('organ-tree-click');
}
/*初始渲染*/
/*==============左树结构END==============*/
/*渲染数据*/
table.render({
elem: '#manager',
page: true,
limit:{$limit},
url: app_root+"index?&do=json",
cols: [[
{type:'checkbox',fixed:'left'},
{field:'id',width:50,unresize:true,align:'center',title:'ID',sort:!0},
{field:'thumb',width:80,height:80,align:'center',title:'缩略图',templet:'<div class="files_item"><img src="{{d.thumb}}" lay-event="article-event-image" /></div>'},
{field:'title',align:'center',title:'标题',edit:'text'},
{field:'cate_name',width:100,align:'center',title:'类别'},
{field:'createtime',width:100,align:'center',title:'发布时间'},
{field:'click',width:50,align:'center',title:'阅读'},
{field:'sort',width:50,align:'center',title:'排序'},
{field:"adminname",width:68,align:'center',title:"编辑"},
{fixed:'right',width:130,align:'center',toolbar:'<div><a class="layui-btn layui-btn-xs" v-show="@system.manager/edit" lay-event="edit">编辑</a><a class="layui-btn layui-btn-xs layui-btn-danger" v-show="@system.manager/del" lay-event="del">删除</a></div>',title:'操作'}
]],
done: function(){ admin.vShow($('[lay-table-id="manager"]')); }
});
/*快编监听*/
table.on('edit(manager)',function(obj){
admin.req(app_root+"edit?do=up",{userid:obj.data.userid,av:obj.value,af:obj.field},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:500});
},'post',{headersToken:true});
});/**/
/*状态*/
form.on('switch(manager-chang)',function(obj){
var json = JSON.parse(decodeURIComponent($(this).data('json')));
var av = obj.elem.checked ? 1 : 0;
admin.req(app_root+"edit?do=up",{userid:json.userid,av:av,af:obj.elem.name},function(res){
layer.tips(res.msg,obj.othis,{time:1000});
if(res.code === 0) obj.elem.checked = parseInt(obj.value);
},'post',{headersToken:true});
});/**/
/*工具条监听*/
table.on('tool(manager)', function(obj){
var data = obj.data;
var userid = data.userid;
if(obj.event === 'edit'){
managerOpen(data);
}else if(obj.event === 'del'){
del(userid);
}else if(obj.event === 'article-event-image'){
var src = $(this).attr('src'), alt = $(this).attr('alt');
layer.photos({photos:{data:[{alt:alt,src:src}],start:'0'},anim:5,shade:[0.4,'#000']});
}
});/**/
/*删除*/
function del(ids){
layer.confirm('确定要删除所选文章吗?', function(){
admin.req(app_root+"del",{userid:ids},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) table.reloadData('manager');
});
},'post',{headersToken:true});
});
}/**/
$('#manager-add').on('click',function(){managerOpen();});/**/
/*弹出窗*/
function managerOpen(){
layer.open({
type: 2,
area: ['900px', '900px'],
title: '添加文章',
btn: ['确定', '关闭'],
fixed: false, //不固定
content: '/admin/article/edit',
yes: function(index, layero){
// var data = window["layui-layer-iframe" + index].callbackdata();
var data = window["layui-layer-iframe" + index];
var form = data.find(".layui-form");
var formData = new FormData(form[0]);
$.ajax({
method: "post",
url: layui.cache.maps+'/article/edit',
data: formData,
processData: false,
contentType: false,
dataType: "json",
success: function (res){
if(res.code==1) {
}else{
// layer.msg(res.msg,{icon:2,shade:[0.4,'#000'],time:1500});
}
layer.close(loadIndex);
}
});
},
});
}/**/
});
</script>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="{STATIC__PATH}layui/css/layui.css"/>
<link rel="stylesheet" href="{STATIC__PATH}admin/admin.css"/>
</head>
<body style="background: #f5f7f9;">
{block name="body"}{/block}
<script src="{STATIC__PATH}layui/layui.js"></script>
<script>
var $ = jQuery = layui.$;
layui.config({
base: "{STATIC__PATH}admin/module/",
maps: "/admin/", // 映射后的后台根路径
static: "{STATIC__PATH}", // 静态资源根路径 buildItems.js中有用
version: "{:VT_VERSION}", // 框架版本
bins: {
baseServer: '', // 接口地址,实际项目请换成http形式的地址
pageTabs: true, // 是否开启多标签
cacheTab: false, // 是否记忆Tab
defaultTheme: '', // 默认主题
openTabCtxMenu: true, // 是否开启Tab右键菜单
maxTabNum: 12, // 最多打开多少个tab
viewPath: '', // 视图位置
viewSuffix: '', // 视图后缀
reqPutToPost: true, // req请求put方法变成post
apiNoCache: true, // ajax请求json数据不带版本号
tabAutoRefresh: true, // 是否每点击菜单都刷新
tableName: 'vadmin', // 存储表名
token: '321321321321321321', // CSRF-TOKEN
}
}).extend({
Cropper: "Cropper/Cropper", //图片裁剪
tagsInput: "tagsInput/tagsInput", //标签
fileLibrary: "fileLibrary/fileLibrary", //资源库管理
buildItems: "buildItems/buildItems", //构建项
cascader: "cascader/cascader", //无限级联 地区
orgCharts: 'orgCharts/orgCharts', //组织结构图
zTree: 'zTree/zTree' //树形结构
})
</script>
{block name="script"}{/block}
</body>
</html>
\ No newline at end of file
......@@ -84,14 +84,18 @@ layui.use(['vinfo', 'buildItems'], function(){
/*==============左树结构===============*/
var organObj, organData, Organ = {}, organArr = {$organ|raw}; /*左树 选中数据 和 总树数据*/
for(let v of organArr){Organ[v.id] = v.title}
function renderTree(data,load){
if(!load) organObj = data[0];
if(data){
organData = admin.util.toTree(data);
doTree(organData,load);
}else{
admin.req(app_root + "index?do=organ",function(res){
organData = admin.util.toTree(res);
doTree(organData,load);
});
}
......@@ -115,21 +119,7 @@ layui.use(['vinfo', 'buildItems'], function(){
}
/*初始渲染*/
renderTree(organArr);
/*左树添加按钮*/
$('#organ-add').on('click',function(){organOpen();});/**/
/*左树编辑按钮*/
$('#organ-edit').on('click',function(){organOpen(organObj);});/**/
/*左树删除按钮*/
$('#organ-del').on('click', function(){
if(!organObj) return layer.msg('未选择机构');
layer.confirm('确定要删除所选机构吗?',function(){
admin.req(app_root+"odel",{id:organObj.id},function(res){
layer.msg(res.msg,{shade:[0.4,'#000'],time:1500},function(){
if(res.code==1) renderTree(res.data,true);
});
},'post',{headersToken:true});
});
});/**/
/*树形编辑弹窗*/
function organOpen(Dt){
admin.open({
......
<?php
/**
* ===========================================================================
* Veitool 快捷开发框架系统
* Author: Niaho 26843818@qq.com
* Copyright (c)2019-2025 www.veitool.com All rights reserved.
* Licensed: 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
* ---------------------------------------------------------------------------
*/
namespace app\model;
use think\facade\Db;
use think\Model;
/**
* 模型公用类
*/
class ArticleModel extends Model
{
protected $name = 'article';
public function getCateNameAttr($value,$data){
return Db::name('article_category')->where('id',$data['cate_id'])->value('title');
}
public function getCreatetimeAttr($value,$data){
return date('Y-m-d H:i:s',$data['createtime']);
}
//获取发布者
public function getAdminnameAttr($value,$data){
return Db::name('system_manager')->where('userid',$data['admin_id'])->value('username');
}
}
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | Yzncms [ 御宅男工作室 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2018 http://yzncms.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 御宅男 <530765310@qq.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 通用的树型类,可以生成任何树型结构
// +----------------------------------------------------------------------
namespace tool;
class Tree
{
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $arr = array();
protected static $instance;
public $options = [];
/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public $icon = array('│', '├', '└');
public $nbsp = "&nbsp;";
public $id = "id";
public $pidname = 'pid';
public $child = 'child';
public $ret = '';
/**
* 初始化.
*
* @param array $options 参数
*
* @return Tree
*/
public static function instance($options = [])
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
return self::$instance;
}
/**
* 构造函数,初始化类
* @param array 2维数组,例如:
* array(
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
* )
*/
public function init($arr = [], $pidname = null, $nbsp = null)
{
$this->arr = $arr;
if (!is_null($pidname)) {
$this->pidname = $pidname;
}
if (!is_null($nbsp)) {
$this->nbsp = $nbsp;
}
$this->ret = '';
return $this;
}
/**
* 得到子级数组
* @param int
* @return array
*/
public function getChild($myid)
{
$a = $newarr = array();
if (is_array($this->arr)) {
foreach ($this->arr as $id => $a) {
if ($a[$this->pidname] == $myid) {
$newarr[$id] = $a;
}
}
}
return $newarr;
}
/**
* 读取指定节点的所有孩子节点
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public function getChildren($myid, $withself = false)
{
$newarr = [];
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
}
if ($value[$this->pidname] == $myid) {
$newarr[] = $value;
$newarr = array_merge($newarr, $this->getChildren($value['id']));
} elseif ($withself && $value['id'] == $myid) {
$newarr[] = $value;
}
}
return $newarr;
}
/**
* 读取指定节点的所有孩子节点ID
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public function getChildrenIds($myid, $withself = false)
{
$childrenlist = $this->getChildren($myid, $withself);
$childrenids = [];
foreach ($childrenlist as $k => $v) {
$childrenids[] = $v['id'];
}
return $childrenids;
}
/**
* 得到当前位置父辈数组
* @param int
* @return array
*/
public function getParent($myid)
{
$pid = 0;
$newarr = [];
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
}
if ($value['id'] == $myid) {
$pid = $value[$this->pidname];
break;
}
}
if ($pid) {
foreach ($this->arr as $value) {
if ($value['id'] == $pid) {
$newarr[] = $value;
break;
}
}
}
return $newarr;
}
/**
* 得到当前位置所有父辈数组
* @param int
* @param bool $withself 是否包含自己
* @return array
*/
public function getParents($myid, $withself = false)
{
$pid = 0;
$newarr = [];
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
}
if ($value['id'] == $myid) {
if ($withself) {
$newarr[] = $value;
}
$pid = $value[$this->pidname];
break;
}
}
if ($pid) {
$arr = $this->getParents($pid, true);
$newarr = array_merge($arr, $newarr);
}
return $newarr;
}
/**
* 读取指定节点所有父类节点ID
* @param int $myid
* @param boolean $withself
* @return array
*/
public function getParentsIds($myid, $withself = false)
{
$parentlist = $this->getParents($myid, $withself);
$parentsids = [];
foreach ($parentlist as $k => $v) {
$parentsids[] = $v['id'];
}
return $parentsids;
}
/**
* 树型结构Option
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<option value=@id @selected @disabled>@spacer@name</option>"
* @param mixed $selectedids 被选中的ID,比如在做树型下拉框的时候需要用到
* @param mixed $disabledids 被禁用的ID,比如在做树型下拉框的时候需要用到
* @param string $itemprefix 每一项前缀
* @param string $toptpl 顶级栏目的模板
* @return string
*/
public function getTree($myid, $itemtpl = '', $selectedids = '', $disabledids = '', $itemprefix = '', $toptpl = '')
{
if (!$itemtpl) {
$itemtpl = '<option value=@id @selected @disabled>@spacer @title</option>';
}
$ret = '';
$number = 1;
$childs = $this->getChild($myid);
if ($childs) {
$total = count($childs);
foreach ($childs as $value) {
$id = $value['id'];
$j = $k = '';
if ($number == $total) {
$j .= $this->icon[2];
$k = $itemprefix ? $this->nbsp : '';
} else {
$j .= $this->icon[1];
$k = $itemprefix ? $this->icon[0] : '';
}
$spacer = $itemprefix ? $itemprefix . $j : '';
if ('' !== $selectedids) {
$selected = $selectedids && in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$value = array_merge($value, ['selected' => $selected]);
}
if ('' !== $disabledids) {
$disabled = $disabledids && in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, ['disabled' => $disabled]);
}
$value = array_merge($value, array('spacer' => $spacer));
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$nstr = strtr((($value["@{$this->pidname}"] == 0 || $this->getChild($id)) && $toptpl ? $toptpl : $itemtpl), $value);
$ret .= $nstr;
$ret .= $this->getTree($id, $itemtpl, $selectedids, $disabledids, $itemprefix . $k . $this->nbsp, $toptpl);
$number++;
}
}
return $ret;
}
/**
* 树型结构UL
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<li value=@id @selected @disabled>@name @childlist</li>"
* @param string $selectedids 选中的ID
* @param string $disabledids 禁用的ID
* @param string $wraptag 子列表包裹标签
* @param string $wrapattr 子列表包裹属性
* @return string
*/
public function getTreeUl($myid, $itemtpl, $selectedids = '', $disabledids = '', $wraptag = 'ul', $wrapattr = '')
{
$str = '';
$childs = $this->getChild($myid);
if ($childs) {
foreach ($childs as $value) {
$id = $value['id'];
unset($value['child']);
$selected = $selectedids && in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$disabled = $disabledids && in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled));
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$nstr = strtr($itemtpl, $value);
$childdata = $this->getTreeUl($id, $itemtpl, $selectedids, $disabledids, $wraptag, $wrapattr);
$childlist = $childdata ? "<{$wraptag} {$wrapattr}>" . $childdata . "</{$wraptag}>" : "";
$str .= strtr($nstr, array('@childlist' => $childlist));
}
}
return $str;
}
/**
* 将数据集格式化成层次结构
* @param int $pid 父级id
* @param int $max_level 最多返回多少层,0为不限制
* @param int $curr_level 当前层数
* @author 蔡伟明 <314013107@qq.com>
* @return array
*/
public function toLayer($pid = 0, $max_level = 0, $curr_level = 0)
{
$trees = [];
$lists = $this->getChild($pid);
foreach ($lists as $key => $value) {
if ($value[$this->pidname] == $pid) {
if ($max_level > 0 && $curr_level == $max_level) {
return $trees;
}
unset($lists[$key]);
$child = $this->toLayer($value[$this->id], $max_level, $curr_level + 1);
if (!empty($child)) {
$value[$this->child] = $child;
}
$trees[$key] = $value;
}
}
return $trees;
}
/**
*
* 获取树状数组
* @param string $myid 要查询的ID
* @param string $nametpl 名称条目模板
* @param string $itemprefix 前缀
* @return string
*/
public function getTreeArray($myid, $itemprefix = '')
{
$child = $this->getChild($myid);
$n = 0;
$data = [];
$number = 1;
if (is_array($child)) {
$total = count($child);
foreach ($child as $id => $value) {
$j = $k = '';
if ($number == $total) {
$j .= $this->icon[2];
$k = $itemprefix ? $this->nbsp : '';
} else {
$j .= $this->icon[1];
$k = $itemprefix ? $this->icon[0] : '';
}
$spacer = $itemprefix ? $itemprefix . $j : '';
$value['spacer'] = $spacer;
$data[$n] = $value;
$data[$n]['childlist'] = $this->getTreeArray($value[$this->id], $itemprefix . $k . $this->nbsp);
$n++;
$number++;
}
}
return $data;
}
/**
* 将getTreeArray的结果返回为二维数组
* @param array $data
* @return array
*/
public function getTreeList($data = [], $field = 'name')
{
$arr = [];
foreach ($data as $k => $v) {
$childlist = isset($v['childlist']) ? $v['childlist'] : [];
unset($v['childlist']);
$v[$field] = $v['spacer'] . ' ' . $v[$field];
$v['haschild'] = $childlist ? 1 : 0;
if ($v[$this->id]) {
$arr[] = $v;
}
if ($childlist) {
$arr = array_merge($arr, $this->getTreeList($childlist, $field));
}
}
return $arr;
}
private function have($list, $item)
{
return (strpos(',,' . $list . ',', ',' . $item . ','));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment