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 { }