2103 lines
77 KiB
PHP
2103 lines
77 KiB
PHP
<?php namespace Phpcmf\Model\Cms;
|
|
|
|
|
|
// 模型类
|
|
// 文档状态
|
|
// 1 ~ 8 审核流程
|
|
// 0 被退回
|
|
// 9 正常
|
|
// 10 回收站
|
|
|
|
class Content extends \Phpcmf\Model {
|
|
|
|
public $siteid; // 站点id
|
|
public $mytable; // 模块表名称
|
|
public $dirname;
|
|
public $mysharetable; // 共享模块表名称
|
|
public $is_hcategory; // 模块不使用栏目
|
|
public $is_share; // 是否共享模块
|
|
|
|
// 初始化模块
|
|
public function _init($dir, $siteid = SITE_ID, $is_share = 'null') {
|
|
$this->siteid = $siteid;
|
|
$this->dirname = $dir;
|
|
$this->mytable = dr_module_table_prefix($dir, $siteid);
|
|
$this->mysharetable = $siteid.'_share';
|
|
if ($is_share == 'null') {
|
|
$this->is_share = (int)\Phpcmf\Service::L('cache')->get('module-'.$siteid.'-'.$dir, 'share');
|
|
} else {
|
|
$this->is_share = $is_share;
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
// 兼容提示
|
|
public function save($id, $name, $value, $where = '') {
|
|
log_message('error', FC_NOW_URL.'->save()方法已经失效,请改为->save_content(),查看教程:https://www.xunruicms.com/doc/1076.html');
|
|
return dr_return_data(0, '->save()方法已经失效,请改为->save_content()');
|
|
}
|
|
|
|
// 保存内容
|
|
public function save_content($id, $data, $old = []) {
|
|
|
|
// 二次开发函数
|
|
$rt = $this->_content_post_before($id, $data, $old);
|
|
|
|
// 特殊返回值
|
|
if (isset($rt['code']) && isset($rt['msg'])) {
|
|
if ($rt['code'] == 0) {
|
|
return dr_return_data(0, $rt['msg']);
|
|
}
|
|
$data = $rt['data'];
|
|
} else {
|
|
// 兼容之前的写法
|
|
$data = $rt;
|
|
}
|
|
|
|
// 挂钩点 模块内容发布或修改之前
|
|
$rt = \Phpcmf\Hooks::trigger_callback('module_content_before', $data);
|
|
if ($rt && isset($rt['code'])) {
|
|
// 钩子中存在特殊返回值
|
|
if ($rt['code'] == 0) {
|
|
return dr_return_data(0, $rt['msg']);
|
|
}
|
|
$data = $rt['data'];
|
|
}
|
|
|
|
// 防止时间字段入库为空
|
|
!$data[1]['updatetime'] && $data[1]['updatetime'] = SYS_TIME;
|
|
|
|
$data[1]['uid'] = intval($data[1]['uid']);
|
|
$data[1]['author'] = (string)$data[1]['author'];
|
|
|
|
// 昵称为空的情况下
|
|
/*
|
|
if (!$data[1]['author'] && $data[1]['uid']) {
|
|
$user = $this->table('member')->get($data[1]['uid']);
|
|
if ($user) {
|
|
$data[1]['author'] = $user['username'];
|
|
}
|
|
}*/
|
|
|
|
if (!$id) {
|
|
// 新增
|
|
!$data[1]['inputtime'] && $data[1]['inputtime'] = $data[1]['updatetime']; // 防止时间字段入库为空
|
|
// 生成索引id
|
|
$nid = $this->index($id, $data);
|
|
if (!$nid) {
|
|
return dr_return_data(0, dr_lang('内容索引id生成失败'));
|
|
}
|
|
$data[0]['id'] = $data[1]['id'] = $nid;
|
|
$is_add = 1;
|
|
} else {
|
|
// 更新
|
|
$is_add = 0;
|
|
$this->index($id, array( 1 => array(
|
|
'uid' => $data[1]['uid'],
|
|
'catid' => $data[1]['catid'],
|
|
'status' => $data[1]['status'],
|
|
'inputtime' => $data[1]['updatetime'],
|
|
)));
|
|
$data[0]['id'] = $data[1]['id'] = $id;
|
|
// 如果来自审核页面,且本次通过
|
|
if (defined('IS_MODULE_VERIFY') && $data[1]['status'] == 9
|
|
&& !$this->db->table($this->mytable)->where('id', $id)->countAllResults()) {
|
|
$id = 0;
|
|
}
|
|
}
|
|
|
|
// 表示审核文章机制
|
|
if ($data[1]['status'] >= 0 && $data[1]['status'] < 9) {
|
|
// 存储到审核表中去
|
|
if (\Phpcmf\Service::L('input')->post('sync_cat')) {
|
|
// 同步栏目设置进审核表
|
|
$data[0]['sync_cat'] = \Phpcmf\Service::L('input')->post('sync_cat');
|
|
}
|
|
$backinfo = '';
|
|
if (IS_ADMIN) {
|
|
if (!\Phpcmf\Service::M('auth')->is_post_user()) {
|
|
$backinfo = dr_array2string([
|
|
'uid' => $this->uid,
|
|
'author' => \Phpcmf\Service::C()->admin['username'],
|
|
'optiontime' => SYS_TIME,
|
|
'flag' => $_POST['flag'],
|
|
'backcontent' => $_POST['verify']['msg']
|
|
]);
|
|
} else {
|
|
$backinfo = dr_array2string([
|
|
'flag' => $_POST['flag'],
|
|
]);
|
|
}
|
|
}
|
|
$verify = $this->table($this->mytable.'_verify')->get($data[1]['id']);
|
|
if ($verify) {
|
|
// 修改审核
|
|
// 防止空标题通知
|
|
if (!$data[1]['title']) {
|
|
if (isset($old['title']) && $old['title']) {
|
|
$data[1]['title'] = $old['title'];
|
|
} else {
|
|
$data[1]['title'] = '未知主题';
|
|
}
|
|
}
|
|
$value = array_merge($data[0], $data[1]);
|
|
$update = [
|
|
'catid' => $data[1]['catid'],
|
|
'status' => (int)$data[1]['status'],
|
|
'isnew' => $id && $this->table($this->mytable)->where('id', $id)->counts() ? 0 : 1,
|
|
'islock' => IS_ADMIN ? 1 : 0,
|
|
'content' => dr_array2string($value),
|
|
'backuid' => IS_ADMIN && !\Phpcmf\Service::M('auth')->is_post_user() ? $this->uid : 0,
|
|
'backinfo' => $backinfo,
|
|
];
|
|
$rt = $this->table($this->mytable.'_verify')->update($data[1]['id'], $update);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
// 清除以前的提醒
|
|
$this->db->table('admin_notice')->where('uri', $this->dirname.'/verify/edit:id/'.$data[1]['id'])->update([
|
|
'status' => 3,
|
|
'updatetime' => SYS_TIME,
|
|
]);
|
|
|
|
// 挂钩点 模块内容审核处理之后
|
|
$verify['old'] = $old;
|
|
$verify = array_merge($verify, $update);
|
|
\Phpcmf\Hooks::trigger('module_verify_after', $verify);
|
|
// 执行审核后的回调
|
|
$this->_call_verify($value, $verify);
|
|
// 通知管理员
|
|
if ($data[1]['status'] > 0) {
|
|
\Phpcmf\Service::M('member')->admin_notice(
|
|
$this->siteid,
|
|
'content',
|
|
IS_ADMIN ? dr_member_info($data[1]['uid']) : \Phpcmf\Service::C()->member,
|
|
dr_lang('%s【%s】审核', \Phpcmf\Service::C()->module['name'], $data[1]['title']), $this->dirname.'/verify/edit:id/'.$data[1]['id'],
|
|
$this->_get_verify_roleid($data[1]['catid'], $data[1]['status'], IS_ADMIN ? dr_member_info($data[1]['uid']) : \Phpcmf\Service::C()->member)
|
|
);
|
|
}
|
|
// 通知用户
|
|
if (IS_ADMIN && !\Phpcmf\Service::M('auth')->is_post_user() && $data[1]['status'] == 0) {
|
|
\Phpcmf\Service::M('member')->notice(
|
|
$data[1]['uid'],
|
|
3,
|
|
dr_lang('《%s》审核被拒绝', $data[1]['title']),
|
|
\Phpcmf\Service::L('router')->member_url($this->dirname.'/verify/index')
|
|
);
|
|
}
|
|
} else {
|
|
// 新增审核
|
|
$role = $this->_get_verify_roleid($data[1]['catid'], $data[1]['status'], IS_ADMIN ? dr_member_info($data[1]['uid']) : \Phpcmf\Service::C()->member);
|
|
|
|
// 防止空标题通知
|
|
if (!$data[1]['title']) {
|
|
if (isset($old['title']) && $old['title']) {
|
|
$data[1]['title'] = $old['title'];
|
|
} else {
|
|
$data[1]['title'] = '未知主题';
|
|
}
|
|
}
|
|
$value = array_merge($data[0], $data[1]);
|
|
$verify = [
|
|
'id' => (int)$data[1]['id'],
|
|
'uid' => (int)$data[1]['uid'],
|
|
'vid' => (int)$role['verify_id'],
|
|
'isnew' => $id && $this->table($this->mytable)->where('id', $id)->counts() ? 0 : 1,
|
|
'islock' => 0,
|
|
'catid' => (int)$data[1]['catid'],
|
|
'author' => $data[1]['author'],
|
|
'status' => (int)$data[1]['status'],
|
|
'content' => dr_array2string($value),
|
|
'backuid' => IS_ADMIN ? $this->uid : 0,
|
|
'backinfo' => $backinfo,
|
|
'inputtime' => SYS_TIME
|
|
];
|
|
$rt = $this->table($this->mytable.'_verify')->replace($verify);
|
|
if (!$rt['code']) {
|
|
// 删除索引
|
|
$this->table($this->mytable.'_index')->delete($data[1]['id']);
|
|
return $rt;
|
|
}
|
|
if (IS_ADMIN && defined('IS_MODULE_TG') && $data[1]['status'] == 0) {
|
|
// 后台退稿
|
|
if (\Phpcmf\Service::L('input')->get('clear')) {
|
|
$this->table($this->mytable)->delete($data[1]['id']);
|
|
// 删除文件
|
|
$this->_delete_show_file($old);
|
|
}
|
|
// 通知用户
|
|
\Phpcmf\Service::M('member')->notice(
|
|
$data[1]['uid'],
|
|
3,
|
|
dr_lang('《%s》审核被拒绝', $data[1]['title']),
|
|
\Phpcmf\Service::L('router')->member_url($this->dirname.'/verify/index')
|
|
);
|
|
|
|
} else {
|
|
// 通知管理员
|
|
\Phpcmf\Service::M('member')->admin_notice(
|
|
$this->siteid,
|
|
'content',
|
|
\Phpcmf\Service::C()->member,
|
|
dr_lang('%s【%s】审核', \Phpcmf\Service::C()->module['name'], $data[1]['title']), $this->dirname.'/verify/edit:id/'.$data[1]['id'],
|
|
$role
|
|
);
|
|
}
|
|
// 挂钩点 模块内容审核处理之后
|
|
$verify['old'] = $old;
|
|
\Phpcmf\Hooks::trigger('module_verify_after', $verify);
|
|
// 执行审核后的回调
|
|
$this->_call_verify($value, $verify);
|
|
}
|
|
return dr_return_data($verify['id'], 'ok', $verify);
|
|
} elseif (defined('IS_MODULE_VERIFY') && $data[1]['status'] == 9 &&
|
|
isset($_POST['verify_posttime']) && $_POST['verify_posttime'] ) {
|
|
// 审核完成进行定时发布的动作
|
|
$post_time = (int)strtotime(\Phpcmf\Service::L('input')->post('verify_posttime'));
|
|
if (SYS_TIME > $post_time) {
|
|
return dr_return_data(0, dr_lang('定时发布时间不正确'), $data);
|
|
}
|
|
// 保存定时发布数据
|
|
$rt = $this->save_post_time($id, $data, $post_time);
|
|
if ($rt['code']) {
|
|
$rs = $this->_verify_post($data);
|
|
if ($rs) {
|
|
return dr_return_data(0, $rs, $data);
|
|
}
|
|
$rs = $this->_verify_success($data, $old);
|
|
if ($rs) {
|
|
return dr_return_data(0, $rs, $data);
|
|
}
|
|
\Phpcmf\Service::C()->_json(1, dr_lang('操作成功,已设为定时发布'));
|
|
}
|
|
return $rt;
|
|
}
|
|
|
|
if (defined('IS_MODULE_VERIFY') && isset($old['verify']['isnew']) && $old['verify']['isnew']) {
|
|
// 新增审核成功的
|
|
$rs = $this->_verify_post($data);
|
|
if ($rs) {
|
|
return dr_return_data(0, $rs, $data);
|
|
}
|
|
}
|
|
|
|
$cdata = [];
|
|
|
|
// 筛选出来栏目模型字段
|
|
if (!$this->is_hcategory && $catfield = \Phpcmf\Service::C()->module['category_data_field']) {
|
|
foreach ($data[1] as $i => $t) {
|
|
if (strpos($i, '_lng') || strpos($i, '_lat')) {
|
|
$i = str_replace(array('_lng', '_lat'), '', $i);
|
|
if (isset($catfield[$i]) && $catfield[$i]['ismain'] == 1 && !isset($cdata[$i.'_lng'])) {
|
|
$cdata[$i.'_lng'] = $data[1][$i.'_lng'];
|
|
$cdata[$i.'_lat'] = $data[1][$i.'_lat'];
|
|
unset($data[1][$i.'_lng'], $data[1][$i.'_lat']);
|
|
}
|
|
} else {
|
|
if (isset($catfield[$i]) && $catfield[$i]['ismain'] == 1) {
|
|
$cdata[$i] = $t;
|
|
unset($data[1][$i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 主表数据
|
|
$main = isset($data[1]) ? $data[1] : $data;
|
|
if ($id) {
|
|
// 更新数据
|
|
//$main['hits'] = 0;
|
|
$rt = $this->table($this->mytable)->update($id, $main);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
$tid = intval($old['tableid']);
|
|
} else {
|
|
// 新增数据
|
|
$main['hits'] = (int)$main['hits'];
|
|
$main['tableid'] = $tid = 0;
|
|
$main['displayorder'] = (int)$main['displayorder'];
|
|
$rt = $this->table($this->mytable)->replace($main);
|
|
if (!$rt['code']) {
|
|
// 删除索引
|
|
$this->table($this->mytable.'_index')->delete($data[1]['id']);
|
|
return $rt;
|
|
}
|
|
}
|
|
|
|
// 判断附表是否存在,不存在则创建
|
|
$this->is_data_table($this->mytable.'_data_', $tid);
|
|
$table = $this->mytable.'_data_'.$tid;
|
|
if ($id) {
|
|
if ($data[0]) {
|
|
$rt = $this->table($table)->update($id, $data[0]);
|
|
if ($rt['msg']) {
|
|
// 删除主表
|
|
$this->table($this->mytable)->delete($id);
|
|
// 删除索引
|
|
$this->table($this->mytable.'_index')->delete($id);
|
|
return $rt;
|
|
}
|
|
} else {
|
|
// 有种情况就是附表没有数据;
|
|
}
|
|
} else {
|
|
$data[0]['id'] = $data[1]['id']; // 录入主表id
|
|
$rt = $this->table($table)->replace($data[0]);
|
|
if ($rt['msg']) {
|
|
// 删除主表
|
|
$this->table($this->mytable)->delete($data[1]['id']);
|
|
// 删除索引
|
|
$this->table($this->mytable.'_index')->delete($data[1]['id']);
|
|
return $rt;
|
|
}
|
|
}
|
|
|
|
// 存储栏目表
|
|
if ($cdata) {
|
|
$cdata['id'] = $cid = $data[1]['id'];
|
|
$cdata['uid'] = $data[1]['uid'];
|
|
$cdata['catid'] = $data[1]['catid'];
|
|
// 查询栏目数据表是否存在该数据
|
|
$table = $this->mytable.'_category_data';
|
|
$is_update = $this->db->table($table)->where('id', $cid)->countAllResults();
|
|
if ($is_update) {
|
|
// 更新
|
|
$this->table($table)->update($cid, $cdata);
|
|
} else {
|
|
// 新增
|
|
$this->table($table)->replace($cdata);
|
|
}
|
|
}
|
|
|
|
// 更新url
|
|
$data[1]['url'] = $this->update_url($data[1], \Phpcmf\Service::L('router')->show_url(\Phpcmf\Service::C()->module, $data[1]));
|
|
|
|
// 修改内容是更新同步栏目相关数据
|
|
if ($id && $old['link_id']) {
|
|
$this->sync_update_cat($old['link_id'], $data);
|
|
}
|
|
|
|
// 来源判断
|
|
if (defined('IS_MODULE_VERIFY')) {
|
|
// 如果来自审核页面,表示完成审核
|
|
|
|
$rs = $this->_verify_success($data, $old);
|
|
if ($rs) {
|
|
return dr_return_data(0, $rs, $data);
|
|
}
|
|
if (isset($old['verify']['isnew']) && $old['verify']['isnew']) {
|
|
$is_add = 1; // 新增审核成功的
|
|
}
|
|
} elseif (defined('IS_MODULE_RECYCLE')) {
|
|
// 如果来自回收站就删除回收站内容
|
|
$this->db->table($this->mytable.'_recycle')->where('cid', $id)->delete();
|
|
}
|
|
|
|
// 表示新发布
|
|
if ($is_add) {
|
|
$member = dr_member_info($data[1]['uid']);
|
|
if ($member && IS_USE_MEMBER) {
|
|
$this->module_content_after(\Phpcmf\Service::C()->module, $data, $member);
|
|
}
|
|
} else {
|
|
// 修改内容
|
|
if ($data[1]['catid'] != $old['catid']) {
|
|
// 变更栏目的一些联动操作
|
|
$this->_edit_category_id($data[1], $data[1]['catid']);
|
|
}
|
|
if ($data[1]['uid'] != $old['uid']) {
|
|
// 变更作者的一些联动操作
|
|
$this->_edit_author_id($data[1]);
|
|
}
|
|
}
|
|
|
|
// 挂钩点 模块内容发布或修改完成之后
|
|
\Phpcmf\Hooks::trigger('module_content_after', $data, $old);
|
|
|
|
// 二次开发函数
|
|
$this->_content_post_after($id, $data, $old);
|
|
|
|
\Phpcmf\Service::L('cache')->clear('module_'.$this->dirname.'_show_id_'.$id);
|
|
|
|
return dr_return_data($data[1]['id'], 'ok', $data);
|
|
}
|
|
|
|
/**
|
|
* 内容发布之后(金币 / 人民币 / 经验)
|
|
*/
|
|
public function module_content_after($module, $data, $member) {
|
|
|
|
// 增减金币
|
|
$score = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($module, $data[1]['catid'], 'score', $member);
|
|
$score && \Phpcmf\Service::M('member')->add_score($data[1]['uid'], $score, dr_lang('%s内容《%s》发布', $module['name'], $data[1]['title']), $data[1]['url']);
|
|
// 增减人民币
|
|
$money = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($module, $data[1]['catid'], 'money', $member);
|
|
if ($money) {
|
|
$rr = \Phpcmf\Service::M('member')->add_money($data[1]['uid'], $money);
|
|
if ($rr['code']) {
|
|
if (!dr_is_app('pay')) {
|
|
log_message('error', '模块【'.$module['name'].'】发布内容('.$data[1]['id'].')扣减人民币失败:没有安装「支付系统」插件');
|
|
} else {
|
|
\Phpcmf\Service::M('Pay', 'pay')->add_paylog([
|
|
'uid' => $member['id'],
|
|
'touid' => 0,
|
|
'mid' => 'system',
|
|
'title' => dr_lang('%s内容《%s》发布', $module['name'], $data[1]['title']),
|
|
'value' => $money,
|
|
'type' => 'finecms',
|
|
'status' => 1,
|
|
'result' => dr_url_prefix($data[1]['url'], $module['dirname'], SITE_ID, ''),
|
|
'paytime' => SYS_TIME,
|
|
'inputtime' => SYS_TIME,
|
|
]);
|
|
}
|
|
} else {
|
|
log_message('error', '模块【'.$module['name'].'】发布内容('.$data[1]['id'].')扣减人民币失败:'.$rr['msg']);
|
|
}
|
|
}
|
|
// 增减经验
|
|
$exp = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($module, $data[1]['catid'], 'exp', $member);
|
|
$exp && \Phpcmf\Service::M('member')->add_experience($data[1]['uid'], $exp, dr_lang('%s内容《%s》发布', $module['name'], $data[1]['title']), $data[1]['url']);
|
|
}
|
|
|
|
// 定时发布
|
|
public function post_time($row) {
|
|
|
|
if (!$row) {
|
|
return dr_return_data(0, dr_lang('内容不存在'));
|
|
}
|
|
|
|
$data = dr_string2array($row['content']);
|
|
if (!$data) {
|
|
return dr_return_data(0, dr_lang('内容不存在'));
|
|
}
|
|
|
|
// 主表字段
|
|
$fields[1] = \Phpcmf\Service::C()->get_cache('table-'.$this->siteid, $this->dbprefix($this->siteid.'_'.$this->dirname));
|
|
$cache = \Phpcmf\Service::C()->get_cache('table-'.$this->siteid, $this->dbprefix($this->siteid.'_'.$this->dirname.'_category_data'));
|
|
$cache && $fields[1] = array_merge($fields[1], $cache);
|
|
// 附表字段
|
|
$fields[0] = \Phpcmf\Service::C()->get_cache('table-'.$this->siteid, $this->dbprefix($this->siteid.'_'.$this->dirname.'_data_0'));
|
|
|
|
// 去重复
|
|
$fields[0] = array_unique($fields[0]);
|
|
$fields[1] = array_unique($fields[1]);
|
|
|
|
$save = [];
|
|
|
|
// 主表附表归类
|
|
foreach ($fields as $ismain => $field) {
|
|
foreach ($field as $name) {
|
|
isset($data[$name]) && $save[$ismain][$name] = $data[$name];
|
|
}
|
|
}
|
|
|
|
// 系统字段
|
|
foreach (['inputip', 'hits', 'displayorder', 'author', 'uid', 'catid'] as $name) {
|
|
$save[1][$name] = $data[$name];
|
|
}
|
|
|
|
$save[0]['uid'] = $data['uid'];
|
|
$save[0]['catid'] = $data['catid'];
|
|
|
|
$save[1]['url'] = '';
|
|
$save[1]['status'] = 9;
|
|
$save[1]['link_id'] = 0;
|
|
|
|
$time = min(SYS_TIME, $row['posttime']);
|
|
!$time && $time = SYS_TIME;
|
|
$save[1]['updatetime'] = $save[1]['inputtime'] = $time;
|
|
|
|
if ($save[1]['title'] && $this->db->table($this->mytable)->where('title', $save[1]['title'])->countAllResults()) {
|
|
$msg = dr_lang('已经有相同的%s存在', isset(\Phpcmf\Service::C()->module['field']['title']['name']) ? \Phpcmf\Service::C()->module['field']['title']['name'] : dr_lang('主题'));
|
|
$this->db->table($this->mytable.'_time')->where('id', $row['id'])->update(['result' => $msg]);
|
|
return dr_return_data(0, $msg);
|
|
}
|
|
|
|
$rt = $this->save_content(0, $save);
|
|
if ($rt['code']) {
|
|
// 发布成功
|
|
$save[1]['id'] = $rt['code'];
|
|
$this->db->table($this->mytable.'_time')->where('id', $row['id'])->delete();
|
|
$prefix = $this->dbprefix($this->siteid.'_'.$this->dirname);
|
|
$this->db->table('attachment')->where('related', $prefix.'_time-'.$row['id'])->update([
|
|
'related' => $prefix.'-'.$rt['code']
|
|
]);
|
|
$this->db->table('attachment_data')->where('related', $prefix.'_time-'.$row['id'])->update([
|
|
'related' => $prefix.'-'.$rt['code']
|
|
]);
|
|
if ($data['flag']) {
|
|
$this->delete_flag($save[1]['id'], 'all');
|
|
foreach ($data['flag'] as $i) {
|
|
if (isset(\Phpcmf\Service::C()->module['setting']['flag'][$i])) {
|
|
$this->insert_flag((int)$i, $save[1]['id'], $save[1]['uid'], $save[1]['catid']);
|
|
}
|
|
}
|
|
}
|
|
// 生成权限文件
|
|
if (\Phpcmf\Service::C()->module['category'][$data['catid']]['setting']['html']) {
|
|
// 生成列表
|
|
$atcode = 'chtml_cat_'.$this->siteid.'_'.$this->dirname.'_'.$data['catid'];
|
|
\Phpcmf\Service::L('cache')->set_auth_data($atcode, $data['catid'], $this->siteid);
|
|
dr_catcher_data(SITE_URL.'index.php?s='.MOD_DIR.'&c=html&m=categoryfile&id='.$data['catid'].'&atcode='.$atcode);
|
|
}
|
|
if (\Phpcmf\Service::C()->module['category'][$data['catid']]['setting']['chtml']) {
|
|
//$rt['data'] = dr_web_prefix('index.php?'.($this->is_share ? '' : 's='.$this->dirname.'&').'c=html&m=showfile&id='.$rt['code']);
|
|
// 生成内容
|
|
$atcode = 'chtml_'.$this->siteid.'_'.$this->dirname.'_'.$rt['code'];
|
|
\Phpcmf\Service::L('cache')->set_auth_data($atcode, $rt['code'], $this->siteid);
|
|
dr_catcher_data(SITE_URL.'index.php?s='.MOD_DIR.'&c=html&m=showfile&id='.$rt['code'].'&atcode='.$atcode);
|
|
|
|
}
|
|
} else {
|
|
$this->db->table($this->mytable.'_time')->where('id', $row['id'])->update(['result' => $rt['msg']]);
|
|
}
|
|
|
|
return $rt;
|
|
}
|
|
|
|
// 二次验证
|
|
protected function _verify_post($data) {
|
|
|
|
// 新增审核成功的 二次验证
|
|
$member = \Phpcmf\Service::M('member')->member_info($data[1]['uid']);
|
|
if ($member) {
|
|
// 金币验证
|
|
$score = \Phpcmf\Service::M('member_auth', 'cms')->category_auth(\Phpcmf\Service::C()->module, $data[1]['catid'], 'score', $member);
|
|
if ((int)$score + (int)$member['score'] < 0) {
|
|
return dr_lang(SITE_SCORE.'不足,当前栏目需要%s'.SITE_SCORE, abs($score));
|
|
}
|
|
// 金额验证
|
|
$money = \Phpcmf\Service::M('member_auth', 'cms')->category_auth(\Phpcmf\Service::C()->module, $data[1]['catid'], 'money', $member);
|
|
if ((float)$money + (float)$member['money'] < 0) {
|
|
return dr_lang('余额不足,当前栏目需要%s元', abs($money));
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
// 审核成功执行
|
|
protected function _verify_success($data, $old) {
|
|
|
|
// 通知用户
|
|
\Phpcmf\Service::L('Notice')->send_notice('module_content_verify_1', $data[1]);
|
|
$value = array_merge($data[1], $data[0]);
|
|
$verify = $this->table($this->mytable.'_verify')->get($data[1]['id']);
|
|
$verify['status'] = 9;
|
|
$verify['content'] = dr_array2string($value);
|
|
$verify['backuid'] = IS_ADMIN ? $this->uid : 0;
|
|
$verify['backinfo'] = dr_array2string($old['verify']['backinfo']);
|
|
|
|
// 删除审核表
|
|
$this->table($this->mytable.'_verify')->delete($data[1]['id']);
|
|
|
|
// 挂钩点 模块内容审核处理之后
|
|
\Phpcmf\Hooks::trigger('module_verify_after', $verify);
|
|
|
|
// 执行审核后的回调
|
|
$this->_call_verify($value, $verify);
|
|
|
|
return '';
|
|
}
|
|
|
|
// 验证栏目操作权限 后台
|
|
public function admin_category_auth($cat, $act) {
|
|
return 1;
|
|
}
|
|
|
|
// 验证栏目操作权限 会员
|
|
public function member_category_auth($cat, $act) {
|
|
return 1;
|
|
}
|
|
|
|
// 查询id
|
|
public function find_id($field, $value) {
|
|
|
|
$row = $this->db->table($this->mytable)->select('id')->where($field, $value)->get()->getRowArray();
|
|
|
|
return $row ? intval($row['id']) : 0;
|
|
}
|
|
|
|
// 删除推荐位
|
|
public function delete_flag($id, $flag) {
|
|
if (is_array($flag)) {
|
|
$this->db->table($this->mytable.'_flag')->where('id', $id)->whereIn('flag', $flag)->delete();
|
|
} elseif ($flag == 'all') {
|
|
$this->db->table($this->mytable.'_flag')->where('id', $id)->delete();
|
|
} else {
|
|
$this->db->table($this->mytable.'_flag')->where('id', $id)->where('flag', (int)$flag)->delete();
|
|
}
|
|
}
|
|
|
|
// 新增推荐位
|
|
public function insert_flag($flag, $id, $uid, $catid) {
|
|
|
|
if ($this->table($this->mytable.'_flag')
|
|
->where('id', $id)
|
|
->where('uid', $uid)
|
|
->where('flag', $flag)
|
|
->where('catid', $catid)->counts()) {
|
|
return;
|
|
}
|
|
|
|
$this->db->table($this->mytable.'_flag')->replace([
|
|
'id' => $id,
|
|
'uid' => $uid,
|
|
'flag' => $flag,
|
|
'catid' => $catid,
|
|
]);
|
|
}
|
|
|
|
// 获取推荐位
|
|
public function get_flag($id) {
|
|
|
|
$rt = [];
|
|
$data = $this->table($this->mytable.'_flag')->where('id', $id)->getAll();
|
|
if ($data) {
|
|
foreach ($data as $t) {
|
|
$rt[] = $t['flag'];
|
|
}
|
|
}
|
|
|
|
return $rt;
|
|
}
|
|
|
|
// 获取关键词列表
|
|
public function get_tag_url($name) {
|
|
return \Phpcmf\Service::L('router')->get_tag_url($name, $this->dirname);
|
|
}
|
|
|
|
/**
|
|
* 保存内容的草稿
|
|
*
|
|
* @param intval $id 草稿id
|
|
* @param array $data 数据数组
|
|
* @return intval $id 草稿id
|
|
*/
|
|
public function insert_draft($id, $data) {
|
|
|
|
$save = [
|
|
'uid' => $this->uid,
|
|
'cid' => intval($data[1]['id']),
|
|
'catid' => intval($data[1]['catid']),
|
|
'content' => dr_array2string($data[0] ? array_merge($data[0], $data[1]) : $data[1]),
|
|
'inputtime' => SYS_TIME
|
|
];
|
|
|
|
// 判断草稿是否存在,不存在就插入
|
|
if ($id && $this->db->table($this->mytable.'_draft')->where('id', $id)->countAllResults()) {
|
|
$rt = $this->table($this->mytable.'_draft')->update($id, $save);
|
|
} else {
|
|
$rt = $this->table($this->mytable.'_draft')->insert($save);
|
|
}
|
|
|
|
return $rt;
|
|
}
|
|
|
|
/**
|
|
* 保存定时发布内容
|
|
*
|
|
* @param intval $id id
|
|
* @param array $data 数据数组
|
|
* @param intval $time 发布时间
|
|
*/
|
|
public function save_post_time($id, $data, $time) {
|
|
|
|
$post = $data[0] ? array_merge($data[0], $data[1]) : $data[1];
|
|
$post['flag'] = \Phpcmf\Service::L('input')->post('flag');
|
|
|
|
$save = [
|
|
'uid' => intval($data[1]['uid']),
|
|
'catid' => intval($data[1]['catid']),
|
|
'content' => dr_array2string($post),
|
|
'result' => '',
|
|
'posttime' => $time,
|
|
'inputtime' => SYS_TIME
|
|
];
|
|
|
|
// 判断是否存在,不存在就插入
|
|
if ($id) {
|
|
$rt = $this->table($this->mytable.'_time')->update($id, $save);
|
|
} else {
|
|
$rt = $this->table($this->mytable.'_time')->insert($save);
|
|
}
|
|
|
|
return dr_return_data($rt['code'], $rt['code'] ? dr_lang('定时内容保存成功') : $rt['msg']);
|
|
}
|
|
|
|
// 更新阅读量
|
|
public function update_hits($id, $is_qx = 0) {
|
|
|
|
$data = $this->db->table($this->mytable)->where('id', $id)->select('hits,updatetime')->get()->getRowArray();
|
|
if (!$data) {
|
|
return dr_return_data(0, dr_lang('阅读统计: 模块内容不存在'));
|
|
}
|
|
|
|
$name = 'module-'.md5($this->mytable).'-'.$id;
|
|
if (!$is_qx && \Phpcmf\Service::L('input')->get_cookie($name)) {
|
|
return dr_return_data(1, $data['hits'], '不重复统计');
|
|
}
|
|
|
|
$plus = max(1, defined('IS_HITS_PLUS') && is_numeric(IS_HITS_PLUS) ? intval(IS_HITS_PLUS) : 1);
|
|
$hits = (int)$data['hits'] + $plus;
|
|
|
|
// 更新主表
|
|
$this->db->table($this->mytable)->where('id', $id)->set('hits', $hits)->update();
|
|
|
|
// 获取统计数据
|
|
$total = $this->db->table($this->mytable.'_hits')->where('id', $id)->get()->getRowArray();
|
|
if (!$total) {
|
|
$total['day_hits'] = $total['week_hits'] = $total['month_hits'] = $total['year_hits'] = 0;
|
|
$total['day_time'] = $total['week_time'] = $total['month_time'] = $total['year_time'] = SYS_TIME;
|
|
} else {
|
|
// 按类别归零
|
|
if (date('Ymd', $total['day_time']) != date('Ymd', SYS_TIME)) {
|
|
$total['day_time'] = SYS_TIME;
|
|
$total['day_hits'] = 0;
|
|
}
|
|
if (date('YW', $total['week_time']) != date('YW', SYS_TIME)) {
|
|
$total['week_time'] = SYS_TIME;
|
|
$total['week_hits'] = 0;
|
|
}
|
|
if (date('Ym', $total['month_time']) != date('Ym', SYS_TIME)) {
|
|
$total['month_time'] = SYS_TIME;
|
|
$total['month_hits'] = 0;
|
|
}
|
|
if (date('Y', $total['year_time']) != date('Y', SYS_TIME)) {
|
|
$total['year_time'] = SYS_TIME;
|
|
$total['year_hits'] = 0;
|
|
}
|
|
}
|
|
|
|
// 更新到统计表
|
|
$save = [
|
|
'id' => $id,
|
|
'hits' => $hits,
|
|
'day_hits' => $total['day_hits'] + $plus,
|
|
'day_time' => $total['day_time'],
|
|
'week_hits' => $total['week_hits'] + $plus,
|
|
'week_time' => $total['week_time'],
|
|
'month_hits' => $total['month_hits'] + $plus,
|
|
'month_time' => $total['month_time'],
|
|
'year_hits' => $total['year_hits'] + $plus,
|
|
'year_time' => $total['year_time'],
|
|
];
|
|
\Phpcmf\Service::M()->table($this->mytable.'_hits')->replace($save);
|
|
|
|
//session()->save($name, $id, 300); 考虑并发性能还是不用session了
|
|
\Phpcmf\Service::L('input')->set_cookie($name, $id, 300);
|
|
|
|
// 输出
|
|
return dr_return_data(1, $hits);
|
|
|
|
}
|
|
|
|
// 更新url
|
|
public function update_url($row, $url) {
|
|
if (!$url) {
|
|
$url = \Phpcmf\Service::L('router')->url_prefix('module_php', \Phpcmf\Service::C()->module, []) . 'c=show&id=' .$row['id'];
|
|
}
|
|
$this->table($this->mytable)->update((int)$row['id'], ['url' => $url]);
|
|
return $url;
|
|
}
|
|
|
|
// 获取草稿列表
|
|
public function get_draft_list($where) {
|
|
|
|
$rt = [];
|
|
$data = $this->table($this->mytable.'_draft')->where('uid', $this->uid)->where($where)->order_by('inputtime desc')->getAll(10);
|
|
if ($data) {
|
|
foreach ($data as $t) {
|
|
$rt[$t['id']] = dr_string2array($t['content']);
|
|
$rt[$t['id']]['id'] = $t['id'];
|
|
$rt[$t['id']]['inputtime'] = $t['inputtime'];
|
|
}
|
|
}
|
|
|
|
return $rt;
|
|
}
|
|
|
|
// 获取草稿内容
|
|
public function get_draft($id) {
|
|
|
|
$data = $this->db
|
|
->table($this->mytable.'_draft')
|
|
->where('uid', $this->uid)
|
|
->where('id', $id)
|
|
->get()->getRowArray();
|
|
if (!$data) {
|
|
return NULL;
|
|
}
|
|
|
|
$body = dr_string2array($data['content']);
|
|
$body['draft']['cid'] = $data['cid'];
|
|
$body['draft']['catid'] = $body['catid'] = $data['catid'];
|
|
|
|
return $body;
|
|
}
|
|
|
|
// 删除草稿
|
|
public function delete_draft($id) {
|
|
$this->table($this->mytable.'_draft')->delete($id, 'uid='.$this->uid);
|
|
// 删附件
|
|
SYS_ATTACHMENT_DB && \Phpcmf\Service::M('Attachment')->id_delete(
|
|
$this->member,
|
|
[$id],
|
|
$this->dbprefix($this->mytable.'_draft-'.$id)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 生成/更新索引数据
|
|
*
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function index($id, $data) {
|
|
|
|
$in = [
|
|
'uid' => (int)$data[1]['uid'],
|
|
'catid' => (int)$data[1]['catid'],
|
|
'status' => (int)$data[1]['status'],
|
|
'inputtime' => (int)$data[1]['inputtime'],
|
|
];
|
|
|
|
if ($this->is_share) {
|
|
// 共享模块
|
|
if ($id) {
|
|
// 修改
|
|
//$this->table($this->mysharetable.'_index')->replace(['id' => $id, 'mid' => $this->dirname ]);
|
|
$in['id'] = $id;
|
|
} else {
|
|
// 新增
|
|
$rt = $this->table($this->mysharetable.'_index')->replace(['mid' => $this->dirname]);
|
|
$id = $in['id'] = (int)$rt['code'];
|
|
}
|
|
// 更新模块索引
|
|
$this->table($this->mytable.'_index')->replace($in);
|
|
} else {
|
|
// 独立模块
|
|
if ($id) {
|
|
// 修改
|
|
$in['id'] = $id;
|
|
$this->table($this->mytable.'_index')->replace($in);
|
|
} else {
|
|
// 新增
|
|
$rt = $this->table($this->mytable.'_index')->replace($in);
|
|
$id = (int)$rt['code'];
|
|
}
|
|
}
|
|
|
|
return $id;
|
|
}
|
|
|
|
// 按自定义字段获取内容
|
|
public function find_row($field, $value) {
|
|
|
|
if (!$field) {
|
|
return [];
|
|
} elseif (!strlen($value)) {
|
|
return [];
|
|
} elseif (!$this->is_field_exists($this->mytable, $field)) {
|
|
return [];
|
|
}
|
|
|
|
return $this->db->table($this->mytable)->where($field, dr_safe_replace($value))->get()->getRowArray();
|
|
}
|
|
|
|
// 获取内容
|
|
public function get_data($id, $is_table = 0, $param = [], $is_more = 0) {
|
|
|
|
$cdata = $tables = $row = [];
|
|
|
|
// 主表
|
|
$tables[] = $table = $this->mytable;
|
|
|
|
if (!$id) {
|
|
if (!$param) {
|
|
return [];
|
|
} elseif (!$param['field']) {
|
|
return [];
|
|
}
|
|
$row = $this->find_row($param['field'], $param['value']);
|
|
if (!$row) {
|
|
return [];
|
|
}
|
|
$id = $row['id'];
|
|
} else {
|
|
$row = $this->table($table)->get($id);
|
|
if (!$row) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
$cdata[$table] = $row;
|
|
|
|
// 附表id
|
|
$tableid = intval($row['tableid']);
|
|
|
|
// 副表
|
|
$tables[] = $table = $this->mytable.'_data_'.$tableid;
|
|
$cdata[$table] = $data = $this->table($table)->get($id);
|
|
$data && $row = $row + $data;
|
|
|
|
// 栏目模型数据
|
|
if ((!$this->is_hcategory && \Phpcmf\Service::C()->module['category_data_field']) or $is_more) {
|
|
$tables[] = $table = $this->mytable.'_category_data';
|
|
$cdata[$table] = $data = $this->table($table)->get($id);
|
|
if ($data) {
|
|
$row = $row + $data;
|
|
}
|
|
}
|
|
|
|
$row = $this->_format_content_data($row);
|
|
|
|
if ($is_table) {
|
|
return [$row, $tables, $cdata];
|
|
}
|
|
|
|
return $row;
|
|
}
|
|
|
|
// 判断用户前端权限
|
|
public function check_member_auth($catid, $action) {
|
|
|
|
if (!$this->is_hcategory) {
|
|
$cat = \Phpcmf\Service::C()->_get_module_member_category(\Phpcmf\Service::C()->module, $action);
|
|
if (!isset($cat[$catid])) {
|
|
return 0;
|
|
}
|
|
} else {
|
|
$rt = $this->_hcategory_member_del_auth();
|
|
if (!$rt['code']) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// 格式化入库数据
|
|
public function format_data($data) {
|
|
|
|
isset($data[1]['uid']) && $data[0]['uid'] = (int)$data[1]['uid'];
|
|
isset($data[1]['hits']) && $data[1]['hits'] = (int)$data[1]['hits'];
|
|
|
|
if (isset($data[1]['keywords']) && $data[1]['keywords']) {
|
|
// 不要自动获取关键词,容易卡顿,引起发布延迟
|
|
$kws = array_unique(explode(',', trim(str_replace('"', '', $data[1]['keywords']))));
|
|
if (isset(\Phpcmf\Service::C()->module['setting']['kws_limit'])
|
|
&& \Phpcmf\Service::C()->module['setting']['kws_limit']) {
|
|
$kws = dr_arraycut($kws, \Phpcmf\Service::C()->module['setting']['kws_limit']);
|
|
}
|
|
$data[1]['keywords'] = implode(',', $kws);
|
|
}
|
|
if (!$data[1]['description']) {
|
|
if (isset(\Phpcmf\Service::C()->module['setting']['desc_auto'])
|
|
&& \Phpcmf\Service::C()->module['setting']['desc_auto']) {
|
|
// 手动填充描述
|
|
} else {
|
|
// 自动填充描述
|
|
if (isset($data[0]['content']) && $data[0]['content']) {
|
|
$data[1]['description'] = dr_get_description($data[0]['content']);
|
|
} elseif (isset($data[1]['content']) && $data[1]['content']) {
|
|
$data[1]['description'] = dr_get_description($data[1]['content']);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
// 同步更新其他栏目
|
|
public function sync_update_cat($lid, $data) {
|
|
|
|
$id = $lid > 0 ? $lid : $data[1]['id'];
|
|
|
|
unset($data[1]['id'],$data[1]['catid']);
|
|
$this->db->table($this->mytable)->where('link_id', (int)$id)->update($data[1]);
|
|
}
|
|
|
|
// 同步到其他栏目
|
|
public function sync_cat($catid, $data) {
|
|
|
|
if (!$catid) {
|
|
return;
|
|
}
|
|
|
|
$id = (int)$data[1]['id'];
|
|
$sync = @explode(',', $catid);
|
|
if ($sync && $id) {
|
|
// 更新主表状态主表
|
|
$this->table($this->mytable)->update($id, ['link_id' => -1]);
|
|
// 同步记录
|
|
foreach ($sync as $catid) {
|
|
if ($catid && $catid != $data[1]['catid']) {
|
|
// 插入到同步栏目中
|
|
$new = $data;
|
|
$new[1]['catid'] = $catid;
|
|
$new[1]['link_id'] = $id;
|
|
$new[1]['tableid'] = 0;
|
|
$new[1]['id'] = $this->index(0, $new);
|
|
$new[1]['id'] && $this->table($this->mytable)->replace($new[1]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 删除数据,放入回收站
|
|
public function delete_to_recycle($ids, $note = '无') {
|
|
|
|
if (!$ids) {
|
|
return dr_return_data(1);
|
|
}
|
|
|
|
// 格式化
|
|
foreach ($ids as $id) {
|
|
|
|
$id = intval($id);
|
|
|
|
\Phpcmf\Service::L('cache')->clear('module_'.$this->dirname.'_show_id_'.$id);
|
|
|
|
// 主表
|
|
$tables[$this->mytable] = $row = $this->table($this->mytable)->get($id);
|
|
if (!$row) {
|
|
return dr_return_data(0, dr_lang('内容不存在: '.$id));
|
|
} elseif (dr_is_app('cqx') && \Phpcmf\Service::M('content', 'cqx')->is_edit($row['catid'], $row['uid'])) {
|
|
return dr_return_data(0, dr_lang('当前角色无权限管理此栏目'));
|
|
}
|
|
|
|
if ($row['link_id'] == '-1') {
|
|
// 表示作为母内容
|
|
// 查询其他栏目的内容
|
|
$ort = $this->table($this->mytable)->where('link_id', $id)->getAll();
|
|
if ($ort) {
|
|
$_ids = [];
|
|
foreach ($ort as $n) {
|
|
$_ids[] = $n['id'];
|
|
}
|
|
$this->delete_to_recycle($_ids, $note);
|
|
}
|
|
}
|
|
|
|
$row['url'] = dr_url_prefix($row['url'], $this->dirname, $this->siteid, 0);
|
|
|
|
// 站长工具
|
|
if (dr_is_app('bdts')) {
|
|
\Phpcmf\Service::M('bdts', 'bdts')->module_bdts($this->dirname, $row['url'], 'del');
|
|
}
|
|
if (dr_is_app('bdxz')) {
|
|
\Phpcmf\Service::M('bdxz', 'bdxz')->module_bdxz($this->dirname, $row['url'], 'del');
|
|
}
|
|
|
|
// 附表id
|
|
$tableid = intval($row['tableid']);
|
|
|
|
// 副表
|
|
$table = $this->mytable.'_data_'.$tableid;
|
|
$tables[$table] = $this->table($table)->get($id);
|
|
|
|
if (!$this->is_hcategory) {
|
|
// 栏目模型数据
|
|
$table = $this->mytable.'_category_data';
|
|
$tables[$table] = $this->table($table)->get($id);
|
|
}
|
|
|
|
// 删除表数据
|
|
foreach ($tables as $table => $t) {
|
|
if ($t) {
|
|
$rt = $this->table($table)->delete($id);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 改改状态
|
|
$rt = $this->table($this->mytable.'_index')->update($id, ['status' => 10]);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
|
|
\Phpcmf\Service::M('member')->delete_admin_notice($this->dirname.'/verify/edit:id/'.$id, $this->siteid);
|
|
\Phpcmf\Service::L('cache')->clear('module_'.$this->dirname.'_show_id_'.$id);
|
|
|
|
// 放入回收站
|
|
$rt = $this->table($this->mytable.'_recycle')->insert([
|
|
'uid' => intval($row['uid']),
|
|
'cid' => $id,
|
|
'catid' => intval($row['catid']),
|
|
'content' => dr_array2string($tables),
|
|
'result' => $note,
|
|
'inputtime' => SYS_TIME
|
|
]);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
|
|
$row['note'] = dr_clearhtml($note);
|
|
|
|
// 回收站钩子
|
|
\Phpcmf\Hooks::trigger('module_content_recycle', $row);
|
|
|
|
// 通知用户
|
|
$row['title'] = dr_strcut(dr_clearhtml($row['title']), 50);
|
|
\Phpcmf\Service::L('Notice')->send_notice('module_content_delete', $row);
|
|
|
|
// 删除文件
|
|
$this->_delete_show_file($row);
|
|
|
|
// 删除执行的方法
|
|
$this->_recycle_content($id, $row, $note);
|
|
}
|
|
|
|
return dr_return_data(1);
|
|
}
|
|
|
|
// 删除静态文件
|
|
protected function _delete_show_file($row) {
|
|
|
|
if (!$row['url']) {
|
|
return;
|
|
}
|
|
|
|
$file = \Phpcmf\Service::L('Router')->remove_domain($row['url']); // 从地址中获取要生成的文件名
|
|
$root = dr_is_app('chtml') ? \Phpcmf\Service::L('html', 'chtml')->get_webpath($this->siteid, $this->dirname) : WEBPATH;
|
|
|
|
// 删除文件
|
|
if (is_file($root.$file)) {
|
|
unlink($root.$file);
|
|
}
|
|
if (is_file($root.SITE_MOBILE_DIR.'/'.$file)) {
|
|
unlink($root.SITE_MOBILE_DIR.'/'.$file);
|
|
}
|
|
}
|
|
|
|
// 删除回收站数据
|
|
public function delete_for_recycle($ids) {
|
|
|
|
foreach ($ids as $id) {
|
|
$id = intval($id);
|
|
$row = $this->table($this->mytable.'_recycle')->get($id);
|
|
if (!$row) {
|
|
return NULL;
|
|
} elseif (\Phpcmf\Service::M('auth')->is_post_user() && $row['uid'] != $this->uid) {
|
|
return NULL;
|
|
}
|
|
$cid = intval($row['cid']);
|
|
if (!$cid) {
|
|
return NULL;
|
|
}
|
|
\Phpcmf\Service::L('cache')->clear('module_'.$this->dirname.'_show_id_'.$cid);
|
|
// 删除执行的方法
|
|
$this->_delete_content($cid, $row);
|
|
// 删除钩子
|
|
\Phpcmf\Hooks::trigger('module_content_delete', dr_string2array($row['content']));
|
|
// 删除回收站表
|
|
$this->table($this->mytable.'_recycle')->delete($id);
|
|
// 才彻底删除内容数据
|
|
$this->delete_content($cid);
|
|
}
|
|
|
|
return dr_return_data(1);
|
|
}
|
|
|
|
// 删除全部内容数据
|
|
public function delete_content($cid) {
|
|
|
|
if (!$cid) {
|
|
return;
|
|
}
|
|
|
|
$module = \Phpcmf\Service::L('cache')->get('module-'.$this->siteid.'-'.$this->dirname);
|
|
|
|
// 删除索引表
|
|
$this->table($this->mytable.'_index')->delete($cid);
|
|
|
|
// 删除主表
|
|
$this->table($this->mytable)->delete($cid);
|
|
|
|
// 删除标记表
|
|
$this->table($this->mytable.'_flag')->delete($cid);
|
|
|
|
// 删除统计
|
|
$this->table($this->mytable.'_hits')->delete($cid);
|
|
$this->table($this->mytable.'_verify')->delete($cid);
|
|
|
|
// 共享模块删除
|
|
if ($this->is_share) {
|
|
$this->table($this->mysharetable.'_index')->delete($cid);
|
|
}
|
|
// 删除草稿表
|
|
$this->db->table($this->mytable.'_draft')->where('cid', $cid)->delete();
|
|
// 删除相关插件表
|
|
if ($this->is_table_exists($this->mytable.'_favorite')) {
|
|
$this->db->table($this->mytable.'_favorite')->where('cid', $cid)->delete();
|
|
}
|
|
if ($this->is_table_exists($this->mytable.'_support')) {
|
|
$this->db->table($this->mytable.'_support')->where('cid', $cid)->delete();
|
|
}
|
|
if ($this->is_table_exists($this->mytable.'_oppose')) {
|
|
$this->db->table($this->mytable.'_oppose')->where('cid', $cid)->delete();
|
|
}
|
|
if ($this->is_table_exists($this->mytable.'_donation')) {
|
|
$this->db->table($this->mytable.'_donation')->where('cid', $cid)->delete();
|
|
}
|
|
// 删除内容
|
|
$tid = $this->_table_id($cid);
|
|
if ($this->is_table_exists($this->mytable.'_data_'.$tid)) {
|
|
$this->table($this->mytable.'_data_'.$tid)->delete($cid);
|
|
}
|
|
if (!$this->is_hcategory) {
|
|
$this->table($this->mytable.'_category_data')->delete($cid);
|
|
}
|
|
// 模块表单
|
|
if ($module['form']) {
|
|
foreach ($module['form'] as $t) {
|
|
$table = $this->mytable.'_form_'.$t['table'];
|
|
if (!$this->is_table_exists($table)) {
|
|
break;
|
|
}
|
|
$this->db->table($table)->where('cid', $cid)->delete();
|
|
for ($i = 0; $i < 200; $i ++) {
|
|
if (!$this->db->query("SHOW TABLES LIKE '".$this->dbprefix($table).'_data_'.$i."'")->getRowArray()) {
|
|
break;
|
|
}
|
|
$this->db->table($table.'_data_'.$i)->where('cid', $cid)->delete();
|
|
}
|
|
//\Phpcmf\Service::M('attachment')->related_delete($this->dbprefix($table), );
|
|
}
|
|
}
|
|
|
|
// 执行删除同步
|
|
\Phpcmf\Service::M('Sync')->delete_content($cid, $this->siteid, $this->dirname);
|
|
|
|
// 删除归档的附件
|
|
SYS_ATTACHMENT_DB && \Phpcmf\Service::M('attachment')->related_delete($this->dbprefix($this->mytable), $cid);
|
|
}
|
|
|
|
// 恢复数据
|
|
public function recovery($ids) {
|
|
|
|
$rt = [];
|
|
foreach ($ids as $id) {
|
|
|
|
$id = intval($id);
|
|
$row = $this->table($this->mytable.'_recycle')->get($id);
|
|
if (!$row) {
|
|
return NULL;
|
|
}
|
|
|
|
$rt[] = $cid = intval($row['cid']);
|
|
$tables = dr_string2array($row['content']);
|
|
if (!$tables) {
|
|
return NULL;
|
|
}
|
|
// 内容恢复
|
|
foreach ($tables as $table => $t) {
|
|
if ($t) {
|
|
$rt = $this->table($table)->replace($t);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
}
|
|
}
|
|
$rt = $this->table($this->mytable.'_index')->update($cid, ['status' => 9]);
|
|
if (!$rt['code']) {
|
|
return $rt;
|
|
}
|
|
|
|
$this->db->table($this->mytable.'_recycle')->where('id', $id)->delete();
|
|
$this->_recovery_content($cid, $row);
|
|
}
|
|
|
|
return dr_return_data(1, 'ok', $rt);
|
|
}
|
|
|
|
// 移动栏目
|
|
public function move_category($ids, $catid) {
|
|
|
|
if (!$catid) {
|
|
return dr_return_data(0, dr_lang('目标栏目不存在'));
|
|
}
|
|
|
|
$all = $this->table($this->mytable)->where_in('id', $ids)->getAll();
|
|
if ($all) {
|
|
foreach ($all as $t) {
|
|
|
|
$id = intval($t['id']);
|
|
$this->table($this->mytable)->update($id, ['catid' => $catid]);
|
|
$this->table($this->mytable.'_index')->update($id, ['catid' => $catid]);
|
|
// 判断附表是否存在,不存在则创建
|
|
$this->is_data_table($this->mytable.'_data_', $t['tableid']);
|
|
$this->db->table($this->mytable.'_data_'.intval($t['tableid']))->where('id', $id)->update(['catid' => $catid]);
|
|
$this->db->table($this->mytable.'_category_data')->where('id', $id)->update(['catid' => $catid]);
|
|
|
|
// 变更栏目的一些联动操作
|
|
$this->_edit_category_id($t, $catid);
|
|
}
|
|
}
|
|
|
|
return dr_return_data(1);
|
|
}
|
|
|
|
// 批量更新其他表的栏目id号
|
|
public function update_catids($oid, $catid) {
|
|
|
|
if (!$catid) {
|
|
return;
|
|
} elseif (!$oid) {
|
|
return;
|
|
}
|
|
|
|
$all = $this->table($this->mytable)->where('catid', $oid)->getAll();
|
|
if ($all) {
|
|
foreach ($all as $t) {
|
|
|
|
$id = intval($t['id']);
|
|
$this->table($this->mytable)->update($id, ['catid' => $catid]);
|
|
$this->table($this->mytable.'_index')->update($id, ['catid' => $catid]);
|
|
$this->db->table($this->mytable.'_data_'.intval($t['tableid']))->where('id', $id)->update(['catid' => $catid]);
|
|
$this->db->table($this->mytable.'_category_data')->where('id', $id)->update(['catid' => $catid]);
|
|
|
|
// 变更栏目的一些联动操作
|
|
$this->_edit_category_id($t, $catid);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
// 变更栏目的一些联动操作
|
|
protected function _edit_category_id($t, $catid) {
|
|
|
|
$id = intval($t['id']);
|
|
$this->db->table($this->mytable.'_time')->where('id', $id)->update(['catid' => $catid]);
|
|
$this->db->table($this->mytable.'_verify')->where('id', $id)->update(['catid' => $catid]);
|
|
// 同步移动相关表单表
|
|
$form = \Phpcmf\Service::L('cache')->get('module-'.$this->siteid.'-'.$this->dirname, 'form');
|
|
if ($form) {
|
|
foreach ($form as $r) {
|
|
$table = $this->mytable.'_form_'.$r['table'];
|
|
$this->db->table($table)->where('cid', $id)->update(['catid' => $catid]);
|
|
for ($i = 0; $i < 200; $i ++) {
|
|
if (!$this->db->query("SHOW TABLES LIKE '".$table.'_data_'.$i."'")->getRowArray()) {
|
|
break;
|
|
}
|
|
$this->db->table($table.'_data_'.$i)->where('cid', $id)->update(['catid' => $catid]);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 同步自定义接口
|
|
$this->_edit_category_row($t, $catid);
|
|
}
|
|
|
|
// 移动栏目时的联动继承类
|
|
protected function _edit_category_row($row, $catid) {
|
|
|
|
}
|
|
|
|
// 变更作者的一些联动操作
|
|
protected function _edit_author_id($t) {
|
|
|
|
$id = intval($t['id']);
|
|
$uid = intval($t['uid']);
|
|
|
|
$this->db->table($this->mytable.'_time')->where('id', $id)->update(['uid' => $uid]);
|
|
$this->db->table($this->mytable.'_verify')->where('id', $id)->update(['uid' => $uid]);
|
|
|
|
// 同步自定义接口
|
|
$this->_edit_author_row($t);
|
|
}
|
|
|
|
// 作者时的联动继承类
|
|
protected function _edit_author_row($row) {
|
|
|
|
}
|
|
|
|
// 用于表单和评论的公共方法==========================================
|
|
|
|
// 获取主数据
|
|
public function get_row($id, $myid = 'id') {
|
|
|
|
if (!$id) {
|
|
return [];
|
|
}
|
|
|
|
$data = $this->table($this->mytable)->get($id);
|
|
if (!$data) {
|
|
return [];
|
|
}
|
|
|
|
$data['url'] = dr_url_prefix($data['url'], $this->dirname, $this->siteid, 0);
|
|
$data['is_comment'] = isset($data['is_comment']) ? $data['is_comment'] : 0;
|
|
|
|
return $data;
|
|
}
|
|
|
|
// 获取评论对象
|
|
public function comment() {
|
|
return \Phpcmf\Service::M('comment', 'comment')->_init($this, \Phpcmf\Service::C()->module['comment']);
|
|
}
|
|
|
|
// 获取评论索引数据
|
|
public function get_comment_index($cid, $catid = 0) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return [];
|
|
}
|
|
|
|
return $this->comment()->get_comment_index($cid);
|
|
}
|
|
|
|
// 提交评论
|
|
// $value 主题信息和回复人;$data评论内容和点评内容;$my自定义字段
|
|
public function insert_comment($value, $data, $my = []) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return dr_return_data(0, dr_lang('没有安装评论插件'));
|
|
}
|
|
|
|
return $this->comment()->insert_comment($value, $data, $my);
|
|
}
|
|
|
|
// 审核评论
|
|
public function verify_comment($row) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return dr_return_data(0, dr_lang('没有安装评论插件'));
|
|
}
|
|
|
|
return $this->comment()->verify_comment($row);
|
|
}
|
|
|
|
// 获取评论列表
|
|
public function get_comment_result($cid, $order, $page, $pagesize, $total, $field) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return [];
|
|
}
|
|
|
|
return $this->comment()->get_comment_result($cid, $order, $page, $pagesize, $total, $field);
|
|
}
|
|
|
|
// 删除评论
|
|
public function delete_comment($id, $cid = 0) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return 0;
|
|
}
|
|
|
|
return $this->comment()->delete_comment($id, $cid = 0);
|
|
}
|
|
|
|
// 更新统计
|
|
public function comment_update_total($row) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return;
|
|
}
|
|
|
|
return $this->comment()->comment_update_total($row);
|
|
}
|
|
|
|
// 更新评分
|
|
public function comment_update_review($row) {
|
|
|
|
if (!dr_is_app('comment')) {
|
|
return;
|
|
}
|
|
|
|
return $this->comment()->comment_update_review($row);
|
|
|
|
}
|
|
|
|
// 获取表单数据
|
|
public function get_form_row($id, $form) {
|
|
|
|
if (!$id || !$form) {
|
|
return [];
|
|
}
|
|
|
|
$rt = $this->table($this->mytable.'_form_'.$form)->get($id);
|
|
if (!$rt) {
|
|
return [];
|
|
}
|
|
|
|
$rt2 = $this->table($this->mytable.'_form_'.$form.'_data_'.intval($rt['tableid']))->get($id);
|
|
if (!$rt2) {
|
|
return $rt;
|
|
}
|
|
|
|
return $rt + $rt2;
|
|
}
|
|
|
|
// 更新统计字段
|
|
public function update_form_total($cid, $form) {
|
|
|
|
$total = $this->table($this->mytable.'_form_'.$form)->where('status', 1)->where('cid', $cid)->counts();
|
|
$this->table($this->mytable)->update($cid, [
|
|
$form.'_total' => $total,
|
|
]);
|
|
}
|
|
|
|
// 用户中心计算审核id
|
|
public function get_verify_status($id, $member, $auth) {
|
|
|
|
$verify = \Phpcmf\Service::C()->get_cache('verify');
|
|
if (!$verify) {
|
|
return 9;
|
|
} elseif (!$auth) {
|
|
return 9; // 默认不走审核
|
|
}
|
|
|
|
$v = $verify[$auth];
|
|
if (!$v) {
|
|
return 9;
|
|
} elseif ($id && !$v['value']['edit']) {
|
|
return 9; // 修改不审核
|
|
}
|
|
|
|
return 1; // 1 表示进入审核流程
|
|
}
|
|
|
|
// 审核时候的权限组,返回可用权限组的id
|
|
// array(
|
|
// * to_uid 指定人
|
|
// * to_rid 指定角色组
|
|
// * )
|
|
protected function _get_verify_roleid($catid, $status, $member) {
|
|
|
|
$verify = \Phpcmf\Service::C()->get_cache('verify');
|
|
if (!$verify) {
|
|
return ['to_uid' => 0, 'to_rid' => 0, 'verify_id' => 0];
|
|
}
|
|
|
|
if (IS_MEMBER) {
|
|
// 前端找用户设置
|
|
$auth = \Phpcmf\Service::M('member_auth', 'cms')->category_auth(\Phpcmf\Service::C()->module, $catid, 'verify', $member);
|
|
} else {
|
|
// 后台投稿者
|
|
$auth = \Phpcmf\Service::M('auth')->is_post_user_status();
|
|
}
|
|
|
|
if ($auth) {
|
|
$v = $verify[$auth];
|
|
$status = max(1, $status);
|
|
if ($v && isset($v['value']['role'][$status]) && $v['value']['role'][$status]) {
|
|
return ['to_uid' => 0, 'to_rid' => $v['value']['role'][$status], 'verify_id' => $v['id']];
|
|
}
|
|
}
|
|
|
|
return ['to_uid' => 0, 'to_rid' => 0, 'verify_id' => 0];
|
|
}
|
|
|
|
// 更新时间
|
|
public function update_time($ids) {
|
|
$this->db->table($this->mytable)->whereIn('id', $ids)->update([
|
|
'updatetime' => SYS_TIME,
|
|
]);
|
|
}
|
|
|
|
// 用户中心菜单
|
|
public function module_menu() {
|
|
|
|
return [
|
|
'list' => [
|
|
'name' => dr_lang('内容管理'),
|
|
'icon' => dr_icon(\Phpcmf\Service::C()->module['icon']),
|
|
'url' => \Phpcmf\Service::L('router')->member_url($this->dirname.'/home/index'),
|
|
],
|
|
'verify' => [
|
|
'name' => dr_lang('审核管理'),
|
|
'icon' => 'fa fa-edit',
|
|
'url' => \Phpcmf\Service::L('router')->member_url($this->dirname.'/verify/index'),
|
|
],
|
|
'draft' => [
|
|
'name' => dr_lang('草稿箱'),
|
|
'icon' => 'fa fa-pencil',
|
|
'url' => \Phpcmf\Service::L('router')->member_url($this->dirname.'/draft/index'),
|
|
],
|
|
'add' => [
|
|
'name' => dr_lang('发布内容'),
|
|
'icon' => 'fa fa-plus',
|
|
'url' => \Phpcmf\Service::L('router')->member_url($this->dirname.'/home/add'),
|
|
],
|
|
];
|
|
|
|
}
|
|
|
|
// 按附表分表
|
|
public function _table_id($id) {
|
|
return $this->get_table_id($id);
|
|
}
|
|
|
|
////////////////////后台权限开放////////////////////
|
|
|
|
// 后台审核列表条件
|
|
public function get_admin_list_verify_where($where) {
|
|
return '(' . (\Phpcmf\Service::M('auth')->is_post_user() ? 'uid='.$this->uid.' OR ' : '')
|
|
. $this->get_admin_verify_status_list().')' . ($where ? ' AND '.$where : '');
|
|
}
|
|
|
|
// 后台内容审核列表的权限的sql语句
|
|
public function get_admin_verify_status_list() {
|
|
|
|
if (dr_in_array(1, \Phpcmf\Service::C()->admin['roleid'])) {
|
|
return '`status`>=0'; // 超管用户
|
|
} elseif (!IS_USE_MEMBER && !\Phpcmf\Service::M('auth')->is_post_user()) {
|
|
return '`status`>=0'; // 普通管理员
|
|
}
|
|
|
|
$verify = \Phpcmf\Service::C()->get_cache('verify');
|
|
if (!$verify) {
|
|
return '`status`=0'; // 没有审核流程时
|
|
}
|
|
|
|
$where = [];
|
|
foreach ($verify as $t) {
|
|
if ($t['value']['role']) {
|
|
foreach ($t['value']['role'] as $status => $rid) {
|
|
if (is_array($rid)) {
|
|
if (dr_array_intersect($rid, \Phpcmf\Service::C()->admin['roleid'])) {
|
|
$where[] = '(`status`='.$status.' and `vid`='.$t['id'].')';
|
|
}
|
|
} else {
|
|
if (dr_in_array($rid, \Phpcmf\Service::C()->admin['roleid'])) {
|
|
$where[] = '(`status`='.$status.' and `vid`='.$t['id'].')';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 此管理员没有管理权限
|
|
if (!$where) {
|
|
return 'status=0';
|
|
}
|
|
|
|
return '`status` = 0 OR '.implode(' OR ', $where);
|
|
}
|
|
|
|
// 后台内容列表条件
|
|
public function get_admin_list_where($table = '') {
|
|
|
|
if (\Phpcmf\Service::M('auth')->is_post_user()) {
|
|
// 作为投稿者只能允许看自己的记录
|
|
return 'uid = '.$this->uid;
|
|
}
|
|
|
|
return dr_is_app('cqx') ? \Phpcmf\Service::M('content', 'cqx')->get_list_where($table) : '';
|
|
}
|
|
|
|
// 后台内容编辑权限
|
|
public function admin_is_edit($data) {
|
|
|
|
if (\Phpcmf\Service::M('auth')->is_post_user()) {
|
|
if ($data['uid'] == $this->uid) {
|
|
return false;
|
|
}
|
|
return !$data['uid'] ? false : true;
|
|
}
|
|
|
|
if (dr_is_app('cqx')) {
|
|
$cqx = \Phpcmf\Service::M('content', 'cqx');
|
|
if (method_exists($cqx, 'is_edit')) {
|
|
return $cqx->is_edit((int)$data['catid'], (int)$data['uid']);
|
|
} elseif (method_exists($cqx, 'is_edit_v2')) {
|
|
return $cqx->is_edit2($data);
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
////////////////////二次开发调用////////////////////
|
|
|
|
// 内容发布之前
|
|
// 错误信息返回格式:return dr_return_data(0, '错误信息')
|
|
public function _content_post_before($id, $data, $old) {
|
|
return $data;
|
|
}
|
|
|
|
// 内容发布之后
|
|
public function _content_post_after($id, $data, $old) { }
|
|
|
|
// 内容删除之后
|
|
public function _delete_content($id, $row) { }
|
|
|
|
// 内容回收站之后
|
|
public function _recycle_content($id, $row, $note) { }
|
|
|
|
// 内容恢复之后
|
|
public function _recovery_content($id, $row) { }
|
|
|
|
// 打赏成功之后
|
|
public function _content_donation_after($id, $pay) { }
|
|
|
|
// 内复制成功之后
|
|
public function _content_copy_after($id, $save) { }
|
|
|
|
// 内容审核操作之后
|
|
public function _call_verify($data, $verify) { }
|
|
|
|
// 评论成功操作之后
|
|
public function _comment_after($data) { }
|
|
|
|
// 格式化处理内容,用于获取内容数据后的格式化
|
|
public function _format_content_data($data) {
|
|
return $data;
|
|
}
|
|
|
|
// 用于前端模块首页的执行方法
|
|
public function _call_index() { }
|
|
|
|
// 格式化显示内容,用于前端内容栏目页面的格式化
|
|
public function _call_category($data) {
|
|
return $data;
|
|
}
|
|
|
|
// 格式化显示内容,用于前端内容搜索页面的格式化
|
|
public function _call_search($data) {
|
|
return $data;
|
|
}
|
|
|
|
// 格式化显示内容,用于前端内容详情页面的格式化
|
|
public function _call_show($data) {
|
|
return $data;
|
|
}
|
|
|
|
// 格式化栏目seo信息
|
|
public function _format_category_seo($mod, $catid, $page) {
|
|
|
|
$cat = dr_cat_value($mod['mid'], $catid);
|
|
$cat['page'] = intval($page);
|
|
$cat['name'] = $cat['catname'] = $cat['name'];
|
|
$cat['catpname'] = dr_get_cat_pname($mod, $catid, SITE_SEOJOIN);
|
|
$cat['modulename'] = $cat['modname'] = $mod['dirname'] == 'share' ? '': dr_lang($mod['name']);
|
|
|
|
if (!$mod['share'] && (!isset($mod['site'][SITE_ID]['is_cat']) || !$mod['site'][SITE_ID]['is_cat'])) {
|
|
// 独立模块统一规则模式
|
|
$seo = $mod['site'][SITE_ID];
|
|
} else {
|
|
$seo = $cat['setting']['seo'];
|
|
}
|
|
|
|
$meta_title = $seo['list_title'] ? $seo['list_title'] : '['.dr_lang('第%s页', '{page}').'{join}]{SITE_NAME}';
|
|
$meta_title = $page > 1 ? str_replace(['[', ']'], '', $meta_title) : preg_replace('/\[(.+)\]/U', '', $meta_title);
|
|
|
|
return \Phpcmf\Service::L('Seo')->get_seo_value($cat, [
|
|
'meta_title' => $meta_title,
|
|
'meta_keywords' => isset($seo['list_keywords']) && $seo['list_keywords'] ? $seo['list_keywords'] : ($mod['site'][SITE_ID]['module_keywords'] ? $mod['site'][SITE_ID]['module_keywords'] : \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_KEYWORDS')),
|
|
'meta_description' => isset($seo['list_description']) && $seo['list_description'] ? $seo['list_description'] : ($mod['site'][SITE_ID]['module_description'] ? $mod['site'][SITE_ID]['module_description'] : \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_DESCRIPTION')),
|
|
]);
|
|
|
|
|
|
}
|
|
|
|
// 格式化首页seo信息
|
|
public function _format_home_seo($mod) {
|
|
|
|
$seo = [];
|
|
|
|
$seo['meta_title'] = $mod['site'][SITE_ID]['module_title'] ? $mod['site'][SITE_ID]['module_title'] : $mod['name'].SITE_SEOJOIN.SITE_NAME;
|
|
$seo['meta_keywords'] = $mod['site'][SITE_ID]['module_keywords'];
|
|
|
|
$seo['meta_title'] = htmlspecialchars(dr_clearhtml($seo['meta_title']));
|
|
$seo['meta_description'] = $mod['site'][SITE_ID]['module_description'];
|
|
$seo['meta_description'] = htmlspecialchars(dr_clearhtml($seo['meta_description']));
|
|
|
|
if (strpos($seo['meta_title'], '{page}') !== false) {
|
|
$page = max(1, intval($_GET['page']));
|
|
if ($page > 1) {
|
|
$seo['meta_title'] = str_replace(array('[', ']'), '', $seo['meta_title']);
|
|
$seo['meta_title'] = str_replace('{join}', SITE_SEOJOIN, $seo['meta_title']);
|
|
$seo['meta_title'] = str_replace('{page}', $page, $seo['meta_title']);
|
|
} else {
|
|
$seo['meta_title'] = preg_replace('/\[.+\]/U', '', $seo['meta_title']);
|
|
}
|
|
}
|
|
|
|
if (!$seo['meta_keywords']) {
|
|
// 留空时使用主站seo
|
|
$seo['meta_keywords'] = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_KEYWORDS');
|
|
}
|
|
|
|
if (!$seo['meta_description']) {
|
|
// 留空时使用主站seo
|
|
$seo['meta_description'] = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_DESCRIPTION');
|
|
}
|
|
|
|
return \Phpcmf\Service::L('Seo')->get_seo_value([], $seo);
|
|
}
|
|
|
|
// 格式化内容页seo信息
|
|
public function _format_show_seo($mod, $data, $page) {
|
|
|
|
$data['cat'] = $cat = dr_cat_value($mod['mid'], $data['catid']);
|
|
$data['page'] = $page;
|
|
$data['name'] = $data['catname'] = $cat['name'];
|
|
//$data['title'] = dr_clearhtml($data['title']);
|
|
$data['catname'] = $data['cat.name'] = $cat['name'];
|
|
$data['catpname'] = $data['cat.pname'] = dr_get_cat_pname($mod, $data['catid'], SITE_SEOJOIN);
|
|
foreach ($cat as $i => $t) {
|
|
$data['cat.'.$i] = $t;
|
|
}
|
|
$data['modulename'] = $data['modname'] = dr_lang($mod['name']);
|
|
$data['modulename'] = $data['modname'] = $mod['dirname'] == 'share' ? '': dr_lang($mod['name']);
|
|
|
|
$data['keywords'] = htmlspecialchars(dr_safe_replace(dr_clearhtml($data['keywords'])));
|
|
$data['description'] = htmlspecialchars(dr_safe_replace(dr_clearhtml($data['description'])));
|
|
|
|
$meta_title = isset($mod['site'][SITE_ID]['show_title']) && $mod['site'][SITE_ID]['show_title'] ? $mod['site'][SITE_ID]['show_title'] : '['.dr_lang('第%s页', '{page}').'{join}]{title}{join}{catpname}{join}{SITE_NAME}';
|
|
$meta_title = $page > 1 ? str_replace(['[', ']'], '', $meta_title) : preg_replace('/\[(.+)\]/U', '', $meta_title);
|
|
|
|
return \Phpcmf\Service::L('Seo')->get_seo_value($data, [
|
|
'meta_title' => $meta_title,
|
|
'meta_keywords' => isset($mod['site'][SITE_ID]['show_keywords']) && $mod['site'][SITE_ID]['show_keywords'] ? $mod['site'][SITE_ID]['show_keywords'] : $data['keywords'],
|
|
'meta_description' => isset($mod['site'][SITE_ID]['show_description']) && $mod['site'][SITE_ID]['show_description'] ? $mod['site'][SITE_ID]['show_description'] : $data['description'],
|
|
]);
|
|
|
|
}
|
|
|
|
// 格式化内容搜索seo信息
|
|
public function _format_search_seo($mod, $catid, $param, $page) {
|
|
|
|
$seo = [];
|
|
$seo['meta_keywords'] = '';
|
|
|
|
$data['page'] = $page > 1 ? $page : '';
|
|
$data['param'] = '';
|
|
$data['keyword'] = '';
|
|
$data['modulename'] = $data['modname'] = $mod['dirname'] == 'share' ? '': dr_lang($mod['name']);
|
|
|
|
$param_value = [];
|
|
if ($param['keyword']) {
|
|
$param_value['keyword'] = $data['keyword'] = urldecode($param['keyword']);
|
|
unset($param['keyword']);
|
|
}
|
|
if ($param['groupid']) {
|
|
$data['groupid'] = $param['groupid'];
|
|
}
|
|
if ($param['updatetime']) {
|
|
$param_value['updatetime'] = $param['updatetime'];
|
|
}
|
|
|
|
if ($catid) {
|
|
$t = dr_get_cat_pname($mod, $catid, SITE_SEOJOIN);
|
|
if ($t) {
|
|
$param_value['catid'] = $t;
|
|
}
|
|
unset($param['catid']);
|
|
unset($param['catdir']);
|
|
}
|
|
|
|
if ($param) {
|
|
$myfield = $mod['field'];
|
|
if ($catid) {
|
|
$cat_field = $mod['category_data_field'];
|
|
$cat_field && $myfield = dr_array22array($myfield, $cat_field);
|
|
}
|
|
|
|
$seofield = $myfield;
|
|
foreach ($param as $name => $value) {
|
|
$now_field = [];
|
|
if (isset($myfield[$name])) {
|
|
// 模块字段
|
|
$now_field = $myfield[$name];
|
|
} elseif ($name == 'flag') {
|
|
// 推荐位
|
|
if ($value) {
|
|
$flag = $mod['setting']['flag'];
|
|
$arr = explode('|', $value);
|
|
if ($arr) {
|
|
foreach ($arr as $a) {
|
|
if (isset($flag[$a]) && $flag[$a]) {
|
|
$param_value[$name][] = $flag[$a]['name'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
continue;
|
|
} elseif ($name == 'groupid') {
|
|
// 会员组名称
|
|
if ($value) {
|
|
$param_value[$name] = \Phpcmf\Service::C()->member_cache['group'][$value]['name'];
|
|
}
|
|
continue;
|
|
} elseif (isset(\Phpcmf\Service::C()->member_cache['field'][$name])) {
|
|
// 会员字段
|
|
$now_field = \Phpcmf\Service::C()->member_cache['field'][$name];
|
|
$seofield[$name] = $now_field;
|
|
}
|
|
// 按字段属性组合
|
|
if ($now_field) {
|
|
switch ($now_field['fieldtype']) {
|
|
|
|
case 'Radio':
|
|
case 'Select':
|
|
case 'Selects':
|
|
case 'Checkbox':
|
|
$opt = dr_format_option_array($now_field['setting']['option']['options']);
|
|
$arr = explode('|', $value);
|
|
if ($arr) {
|
|
foreach ($arr as $a) {
|
|
if (isset($opt[$a]) && $opt[$a]) {
|
|
$param_value[$name][] = $opt[$a];
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'Linkages':
|
|
case 'Linkage':
|
|
$arr = explode('|', $value);
|
|
if ($arr) {
|
|
foreach ($arr as $a) {
|
|
$param_value[$name][] = dr_linkagepos($now_field['setting']['option']['linkage'], $a, SITE_SEOJOIN);
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case 'Cat':
|
|
case 'Cats':
|
|
case 'Catid':
|
|
$arr = explode('|', $value);
|
|
if ($arr) {
|
|
foreach ($arr as $a) {
|
|
$param_value[$name][] = dr_cat_value($now_field['setting']['option']['module'], $a, 'name');
|
|
}
|
|
}
|
|
break;
|
|
case 'Related':
|
|
if ($now_field['setting']['option']['module']) {
|
|
$arr = explode('|', $value);
|
|
if ($arr) {
|
|
foreach ($arr as $a) {
|
|
$row = $this->table_site($now_field['setting']['option']['module'])->get($a);
|
|
$row && $param_value[$name][] = $row['title'];
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$value && $param_value[$name] = $value;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$meta_title = $mod['site'][SITE_ID]['search_title'] ? $mod['site'][SITE_ID]['search_title'] : '['.dr_lang('第%s页', '{page}').'{join}][{keyword}{join}][{param}{join}]{SITE_NAME}';
|
|
$seo['param_value'] = [];
|
|
if ($param_value) {
|
|
$str = [];
|
|
$seofield['catid'] = $seofield['catdir'] = [ 'name' => dr_lang('栏目') ];
|
|
$seofield['groupid'] = ['name' => dr_lang('用户组')];
|
|
$seofield['flag'] = ['name' => dr_lang('推荐位')];
|
|
$seofield['keyword'] = ['name' => dr_lang('关键词')];
|
|
$seofield['updatetime'] = ['name' => dr_lang('更新时间')];
|
|
$db = \Phpcmf\Service::C()->content_model;
|
|
if ($db) {
|
|
list($seofield, $param_value) = $db->_format_search_param_value($seofield, $param_value);
|
|
}
|
|
foreach ($param_value as $f => $t) {
|
|
$seo['param_value'][$f] = [
|
|
'name' => $seofield[$f]['name'],
|
|
'value' => is_array($t) ? implode('|', $t) : $t,
|
|
'value_array' => is_array($t) ? $t : [],
|
|
];
|
|
$str[$f] = is_array($t) ? implode('|', $t) : $t;
|
|
}
|
|
|
|
// 避免重复keyword
|
|
if (isset($str['keyword']) && strpos($meta_title, 'keyword') !== false) {
|
|
unset($str['keyword']);
|
|
}
|
|
$data['param'] = implode(SITE_SEOJOIN, $str);
|
|
}
|
|
|
|
if (preg_match_all('/\[.*\{(.+)\}.*\]/U', $meta_title, $m)) {
|
|
$new = '';
|
|
$replace = '';
|
|
foreach ($m[1] as $i => $field) {
|
|
$replace.= $m[0][$i];
|
|
if (isset($data[$field]) && strlen($data[$field])) {
|
|
$new.= str_replace(['[', ']'], '', $m[0][$i]);
|
|
}
|
|
}
|
|
$meta_title = str_replace($replace, $new, $meta_title);
|
|
}
|
|
return \Phpcmf\Service::L('Seo')->get_seo_value($data, [
|
|
'meta_title' => $meta_title,
|
|
'param_value' => $seo['param_value'],
|
|
'meta_keywords' => $seo['meta_keywords'] ? $seo['meta_keywords'] : (isset($mod['site'][SITE_ID]['search_keywords']) && $mod['site'][SITE_ID]['search_keywords'] ? $mod['site'][SITE_ID]['search_keywords'] : \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_KEYWORDS')),
|
|
'meta_description' => isset($mod['site'][SITE_ID]['search_description']) && $mod['site'][SITE_ID]['search_description'] ? $mod['site'][SITE_ID]['search_description'] : \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'seo', 'SITE_DESCRIPTION'),
|
|
]);
|
|
}
|
|
|
|
|
|
// 格式化内容搜索的param参数名称值
|
|
public function _format_search_param_value($myfield, $param) {
|
|
return [$myfield, $param];
|
|
}
|
|
|
|
////////////////////禁用栏目时,二次开发调用////////////////////
|
|
|
|
// 禁用栏目时,用户保存内容之前的权限验证
|
|
public function _hcategory_member_save_before($data) {
|
|
return $data;
|
|
}
|
|
|
|
// 禁用栏目时,用户保存内容时的内容文章状态 $id 内容id
|
|
public function _hcategory_member_post_status($id) {
|
|
return 9;
|
|
}
|
|
|
|
// 禁用栏目时,用户评论时的状态
|
|
public function _hcategory_member_comment_status() {
|
|
return 1;
|
|
}
|
|
|
|
// 禁用栏目时,用户保存内容时是否启用验证码
|
|
public function _hcategory_member_post_code() {
|
|
return 0;
|
|
}
|
|
|
|
// 禁用栏目时,用户发布内容时的权限验证
|
|
public function _hcategory_member_add_auth() {
|
|
return dr_return_data(1, 'ok');
|
|
}
|
|
|
|
// 禁用栏目时,用户评论时的权限验证
|
|
public function _hcategory_member_comment_auth() {
|
|
return dr_return_data(1, 'ok');
|
|
}
|
|
|
|
// 禁用栏目时,用户修改内容时的权限验证
|
|
public function _hcategory_member_edit_auth() {
|
|
return dr_return_data(1, 'ok');
|
|
}
|
|
|
|
// 禁用栏目时,用户删除内容时的权限验证
|
|
public function _hcategory_member_del_auth() {
|
|
return dr_return_data(1, 'ok');
|
|
}
|
|
|
|
// 禁用栏目时,用户阅读内容时的权限验证
|
|
public function _hcategory_member_show_auth() {
|
|
return dr_return_data(1, 'ok');
|
|
}
|
|
|
|
}
|
|
|
|
|
|
namespace Phpcmf\Model;
|
|
class Content extends \Phpcmf\Model\Cms\Content {
|
|
|
|
} |