Files
BESCMS/dayrui/App/Cms/Extends/Member/Module.php
T

1053 lines
44 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php namespace Phpcmf\Member;
// 内容模块操作类 基于 Table
class Module extends \Phpcmf\Table
{
// 上级公共类
public function __construct() {
parent::__construct();
if (!IS_USE_MEMBER) {
$this->_admin_msg(0, dr_lang('需要安装【用户系统】插件'));
}
$this->_Extend_Init();
}
// 继承类初始化
protected function _Extend_Init() {
// 初始化模块
$this->_module_init(APP_DIR);
// 支持附表存储
$this->is_data = 1;
// 是否支持模块表
$this->is_module_index = 1;
// 是否支持模型字段
$this->is_category_data_field = $this->module['category_data_field'] ? 1 : 0;
// 模板前缀(避免混淆)
$this->tpl_prefix = 'module_';
// 单独模板命名
$this->tpl_name = 'content';
// 模块显示名称
$this->name = dr_lang('内容模块[%s]%s', $this->module['dirname'], $this->module['title']);
// 初始化数据表
$this->_init([
'table' => dr_module_table_prefix($this->module['dirname']),
'field' => $this->module['field'],
'date_field' => 'updatetime',
'show_field' => 'title',
'where_list' => 'uid='.$this->uid,
'order_by' => 'updatetime desc',
]);
// 写入模板
if (is_file(dr_get_app_dir('cms').'Libraries/Category.php')) {
$this->module['category'] = \Phpcmf\Service::L('category', 'cms')->get_category($this->module['dirname']);
}
$is_right_field = 1;
if (isset($this->module['setting']['right_field']) && $this->module['setting']['right_field']) {
if ($this->module['setting']['right_field'] == 2) {
$is_right_field = 0;
}
}
\Phpcmf\Service::V()->assign([
'field' => $this->init['field'],
'module' => $this->module,
'module_memu' => $this->content_model->module_menu(),
'is_right_field' => $is_right_field,
]);
}
// ========================
// 查看列表
protected function _Member_List($rt = 0) {
// 判断栏目分表
if ($this->module['is_ctable']) {
$catid = intval(\Phpcmf\Service::L('input')->get('catid'));
if ($catid) {
$this->init['table'] = dr_module_ctable(dr_module_table_prefix(APP_DIR), dr_cat_value($catid));
}
}
list($tpl) = $this->_List();
// 可用的模块表单
$mform = [];
if ($this->module['form']) {
foreach ($this->module['form'] as $tid => $t) {
if ($t['setting']['is_member']) {
$mform[$tid] = $t;
}
}
}
\Phpcmf\Service::V()->assign([
'mcid' => 'list',
'mform' => $mform,
'clink' => $this->_app_clink(), //)这里后面做权限判断
]);
// 客户端 API:精简列表,并按栏目判断修改/删除权限(对齐 PC module_list 模板)
if (!$rt && defined('IS_API_HTTP') && IS_API_HTTP) {
$this->_api_json_member_content_list('home');
}
if ($rt) {
return $tpl;
} else {
return \Phpcmf\Service::V()->display($tpl);
}
}
/**
* 会员可用栏目(修复 mid 为空被误剔、以及自动选取第一个可发布栏目)
*/
public function _get_module_member_category($module, $name) {
if (!$module) {
return [];
}
$cache_key = $module['dirname'].$name;
if (!empty($this->temp['_get_module_member_category'][$cache_key])) {
return $this->temp['_get_module_member_category'][$cache_key];
}
if (isset($module['category'][0]) && dr_is_module($module['category'][0])) {
$module['category'] = \Phpcmf\Service::L('category', 'cms')->get_category($module['dirname']);
}
$category = is_array($module['category']) ? $module['category'] : [];
$mid = $module['dirname'];
foreach ($category as $id => $t) {
if (!is_array($t)) {
continue;
}
// 只要最终栏目才校验 mid / 权限;父栏目保留给下拉树
if (!$t['child']) {
// 独立模块栏目缓存里 mid 可能为空,空 mid 视为当前模块
$cat_mid = isset($t['mid']) ? (string)$t['mid'] : '';
if ($cat_mid !== '' && $cat_mid !== (string)$mid) {
unset($category[$id]);
continue;
}
if (IS_USE_MEMBER && !\Phpcmf\Service::M('member_auth', 'cms')->category_auth($module, $id, $name, $this->member)) {
unset($category[$id]);
}
}
}
$this->temp['_get_module_member_category'][$cache_key] = $category;
return $category;
}
// 从可用栏目中取第一个可发布的叶子栏目
protected function _first_post_catid($category) {
if (!$category || !is_array($category)) {
return 0;
}
foreach ($category as $cid => $c) {
if (!is_array($c)) {
continue;
}
// child=0 为最终栏目;tid=1 为模块内容栏目
if (!$c['child'] && (int)$c['tid'] == 1) {
return intval(isset($c['id']) ? $c['id'] : $cid);
}
}
return 0;
}
// 添加内容
protected function _Member_Add($rt = 0) {
$return_tpl = $rt;
$id = 0;
$did = intval(\Phpcmf\Service::L('input')->get('did'));
$catid = intval(\Phpcmf\Service::L('input')->get('catid'));
$category = [];
$did && $this->auto_save = 0; // 草稿数据时不加载
$draft = $did ? $this->content_model->get_draft($did) : [];
$catid = $draft['catid'] ? $draft['catid'] : $catid;
$select = '';
if (!$this->is_hcategory) {
// 走栏目权限
$category = $this->_get_module_member_category($this->module, 'add');
// 栏目id不存在时就去第一个可用栏目为catid
if (!$catid) {
list($select, $catid) = \Phpcmf\Service::L('Tree')->select_category(
$category,
$catid,
'id=\'dr_catid\' name=\'catid\' onChange="show_category_field(this.value)"',
'', 1, 1, 1
);
// Tree 缓存/解析失败时,直接取第一个可发布叶子栏目
if (!$catid) {
$catid = $this->_first_post_catid($category);
}
} else {
$select = \Phpcmf\Service::L('Tree')->select_category(
$category,
$catid,
'id=\'dr_catid\' name=\'catid\' onChange="show_category_field(this.value)"',
'', 1, 1
);
}
if (!$catid) {
if ($this->uid) {
$this->_msg(0, dr_lang('没有可用的栏目发布权限'));
} else {
$this->_msg(0, dr_lang('您没有登录'), dr_member_url('login/index'));
}
} elseif (!$category[$catid]) {
if ($this->uid) {
$this->_msg(0, dr_lang('当前栏目(%s)没有发布权限', $this->module['category'][$catid]['name']));
} else {
$this->_msg(0, dr_lang('当前栏目(%s)没有发布权限', $this->module['category'][$catid]['name']), dr_member_url('login/index'));
}
}
$this->is_post_code = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $catid, 'code', $this->member);
} else {
// 不走栏目权限,走自定义权限
$auth_rt = $this->content_model->_hcategory_member_add_auth();
if (!$auth_rt['code']) {
$this->_msg(0, $auth_rt['msg'], $auth_rt['data']);
}
$this->is_post_code = $this->content_model->_hcategory_member_post_code();
}
$this->is_get_catid = $catid;
$draft && $draft['catid'] = $catid;
list($tpl) = $this->_Post($id, $draft);
\Phpcmf\Service::V()->assign([
'did' => $did,
'mcid' => 'add',
'form' => dr_form_hidden(['is_draft' => 0, 'module' => $this->module['dirname'], 'id' => $id]),
'catid' => 0,
'select' => $select,
'draft_url' => \Phpcmf\Service::L('Router')->member_url($this->module['dirname'].'/home/add'),
'draft_list' => $this->content_model->get_draft_list('cid='.$id),
'is_post_code' => $this->is_post_code,
'category_field_url' => $this->is_post_code || $this->module['category_data_field'] ? dr_member_url($this->module['dirname'].'/home/add') : ''
]);
if (!$this->uid && is_file(dr_tpl_path().'guest_post.html')) {
$tpl = 'guest_post.html';
}
// 客户端:GET 返回字段/栏目;POST 已在 _Post 内 _json
if (!$return_tpl && defined('IS_API_HTTP') && IS_API_HTTP) {
$this->_api_json_member_content_form(0, $catid, $category, is_array($draft) ? $draft : []);
}
if ($return_tpl) {
return $tpl;
} else {
return \Phpcmf\Service::V()->display($tpl);
}
}
// 修改内容
protected function _Member_Edit($rt = 0) {
$return_tpl = $rt;
$id = intval(\Phpcmf\Service::L('input')->get('id'));
$did = 0;
$this->is_get_catid = intval(\Phpcmf\Service::L('input')->get('catid'));
if (defined('IS_MODULE_VERIFY')) {
$draft = [];
} else {
$did = intval(\Phpcmf\Service::L('input')->get('did'));
$did && $this->auto_save = 0; // 草稿数据时不加载
$draft = $did ? $this->content_model->get_draft($did) : [];
}
list($tpl, $data) = $this->_Post($id, $draft);
if (!$data) {
$this->_msg(0, dr_lang('内容不存在'));
} elseif ($this->uid != $data['uid']) {
$this->_msg(0, dr_lang('无权限操作'));
} elseif (defined('IS_MODULE_VERIFY') && $data['status'] != 0 && $data['islock']) {
// 判断是否来至审核
$this->_msg(0, dr_lang('正在审核之中'));
}
$category = [];
if (defined('IS_MODULE_VERIFY')) {
// 审核文章编辑时采用投稿权限判断
// 可编辑的栏目
$category = $this->_get_module_member_category($this->module, 'add');
if (!$category[$data['catid']]) {
$this->_msg(0, dr_lang('当前栏目[%s]没有发布权限', $this->module['category'][$data['catid']]['name']));
}
} else {
if (!$this->is_hcategory) {
// 可编辑的栏目
$category = $this->_get_module_member_category($this->module, 'edit');
if (!$category[$data['catid']]) {
$this->_msg(0, dr_lang('当前栏目[%s]没有修改权限', $this->module['category'][$data['catid']]['name']));
}
} else {
$auth_rt = $this->content_model->_hcategory_member_edit_auth();
if (!$auth_rt['code']) {
$this->_msg(0, $auth_rt['msg'], $auth_rt['data']);
}
}
}
\Phpcmf\Service::V()->assign([
'did' => $did,
'form' => dr_form_hidden(['is_draft' => 0, 'module' => $this->module['dirname'], 'id' => $id]),
'select' => \Phpcmf\Service::L('Tree')->select_category(
$category,
$data['catid'],
'id=\'dr_catid\' name=\'catid\' onChange="show_category_field(this.value)"',
'--', 1, 1
),
'is_verify' => defined('IS_MODULE_VERIFY') ? 1 : 0,
'is_sync_cat' => defined('IS_MODULE_VERIFY') ? $data['sync_cat'] : '',
'draft_url' =>\Phpcmf\Service::L('Router')->member_url($this->module['dirname'].'/home/edit', ['id' => $id]),
'draft_list' => $this->content_model->get_draft_list('cid='.$id),
'is_post_code' => $this->is_hcategory ? $this->content_model->_hcategory_member_post_code() : $this->is_post_code,
'category_field_url' => $this->is_post_code || $this->module['category_data_field'] ? dr_member_url($this->module['dirname'].'/'.(defined('IS_MODULE_VERIFY') ? 'verify' : 'home').'/edit', ['id' => $id]) : ''
]);
// 客户端:GET 返回字段/栏目;POST 已在 _Post 内 _json
if (!$return_tpl && defined('IS_API_HTTP') && IS_API_HTTP) {
$this->_api_json_member_content_form($id, intval($data['catid'] ?? 0), $category, is_array($draft) ? $draft : []);
}
if ($return_tpl) {
return $tpl;
} else {
return \Phpcmf\Service::V()->display($tpl);
}
}
// 删除内容
protected function _Member_Del() {
$id = (int)\Phpcmf\Service::L('input')->get('id');
if (!$id) {
$this->_json(0, dr_lang('id不存在'));
}
$row = \Phpcmf\Service::M()->table(dr_module_table_prefix($this->module['dirname']).'_index')->get($id);
if (!$row) {
$this->_json(0, dr_lang('内容不存在'));
} elseif ($row['uid'] != $this->uid) {
$this->_json(0, dr_lang('不能删除别人的内容'));
}
if (!$this->is_hcategory) {
$cat = $this->_get_module_member_category($this->module, 'del');
if (!isset($cat[$row['catid']])) {
$this->_json(0, dr_lang('当前栏目[%s]没有删除权限', $this->module['category'][$row['catid']]['name']));
}
} else {
$rt = $this->content_model->_hcategory_member_del_auth();
if (!$rt['code']) {
$this->_msg(0, $rt['msg'], $rt['data']);
}
}
$rt = $this->content_model->delete_to_recycle([$id]);
if ($rt['code']) {
$this->_json(1, dr_lang('删除成功'));
} else {
$this->_json(0, $rt['msg']);
}
}
// ===========================
// 查看审核列表
protected function _Member_Verify_List($rt = 0) {
if (isset($this->field['content'])) {
$this->field['content']['fieldtype'] = 'Text'; // 防止识别为编辑器字段被转义
}
$this->_init([
'table' => dr_module_table_prefix($this->module['dirname']).'_verify',
'date_field' => 'inputtime',
'order_by' => 'inputtime desc',
'where_list' => 'uid='.$this->uid,
]);
$this->_List();
\Phpcmf\Service::V()->assign([
'mcid' => 'verify',
'clink' => $this->_app_clink(), //)这里后面做权限判断
]);
$tpl = 'module_verify.html';
if (!$rt && defined('IS_API_HTTP') && IS_API_HTTP) {
$this->_api_json_member_content_list('verify');
}
if ($rt) {
return $tpl;
} else {
return \Phpcmf\Service::V()->display($tpl);
}
}
// 修改审核内容
protected function _Member_Verify_Edit($rt = 0) {
// 说明来自审核页面
define('IS_MODULE_VERIFY', 1);
return $this->_Member_Edit($rt);
}
// 删除审核内容
protected function _Member_Verify_Del() {
// 支持附表存储
$this->is_data = 0;
$this->_init([
'table' => dr_module_table_prefix($this->module['dirname']).'_verify',
]);
// 删除条件
$this->delete_where = 'uid='.$this->uid;
// 执行删除
$this->_Del(\Phpcmf\Service::L('input')->get_post_ids(), null, function($rows) {
foreach ($rows as $t) {
// 删除索引
$t['isnew'] && \Phpcmf\Service::M()->table(dr_module_table_prefix($this->module['dirname']).'_index')->delete($t['id']);
// 删除审核提醒
\Phpcmf\Service::M('member')->delete_admin_notice($this->module['dirname'].'/verify/edit:id/'.$t['id'], SITE_ID);
}
return dr_return_data(1, 'ok');
});
}
// ===========================
// 查看草稿列表
protected function _Member_Draft_List($rt = 0) {
if (isset($this->field['content'])) {
$this->field['content']['fieldtype'] = 'Text'; // 防止识别为编辑器字段被转义
}
$this->_init([
'db' => SITE_ID,
'table' => dr_module_table_prefix($this->module['dirname']).'_draft',
'order_by' => 'inputtime desc',
'date_field' => 'inputtime',
'where_list' => 'uid='.$this->uid,
]);
$this->_List();
\Phpcmf\Service::V()->assign([
'mcid' => 'draft'
]);
$tpl = 'module_draft.html';
if (!$rt && defined('IS_API_HTTP') && IS_API_HTTP) {
$this->_api_json_member_content_list('draft');
}
if ($rt) {
return $tpl;
} else {
return \Phpcmf\Service::V()->display($tpl);
}
}
// 删除草稿内容
protected function _Member_Draft_Del() {
// 支持附表存储
$this->is_data = 0;
$this->_init([
'table' => dr_module_table_prefix($this->module['dirname']).'_draft',
]);
// 删除条件
$this->delete_where = 'uid='.$this->uid;
// 执行删除
$this->_Del(\Phpcmf\Service::L('input')->get_post_ids());
}
// 同步到多个栏目
public function syncat_edit() {
$sync = \Phpcmf\Service::L('input')->get('catid');
$category = $this->_get_module_member_category($this->module, 'add');
if (IS_AJAX_POST) {
$catid = \Phpcmf\Service::L('input')->post('catid');
$catid = dr_string2array($catid);
if (!$catid) {
$this->_json(0, dr_lang('你没有选择同步的栏目'));
}
$syncat = [];
foreach ($catid as $i) {
//if ($this->where_list_sql && $this->content_model->admin_is_edit(['catid' => $i])) {
//$this->_json(0, dr_lang('当前角色无权限管理此栏目'));
//}
if (!$category[$i]) {
exit($this->_json(0, dr_lang('当前栏目[%s]没有发布权限', $this->module['category'][$i]['name'])));
} elseif (!$this->module['category'][$i]) {
continue;
} elseif ($this->module['category'][$i]['tid'] != 1) {
continue;
} elseif (!$this->module['category'][$i]['is_post']) {
continue;
} else {
$syncat[] = $i;
}
}
if (!$syncat) {
$this->_json(0, dr_lang('所选栏目无效'));
} else {
$this->_json(1, dr_count($syncat), implode(',', $syncat));
}
}
\Phpcmf\Service::V()->admin(dr_get_app_dir('Module').'/Views/');
\Phpcmf\Service::V()->assign([
'menu' => '',
'form' => dr_form_hidden(),
'select' => \Phpcmf\Service::L('Tree')->select_category(
$category,
$sync ? explode(',', $sync) : 0,
'id=\'dr_catid\' name=\'catid[]\' multiple="multiple" data-actions-box="true"',
'', 1, 1
),
]);
\Phpcmf\Service::V()->display('share_syncat.html');exit;
}
// ===========================
/**
* 获取内容
* $id 内容id,新增为0
* */
protected function _Data($id = 0) {
// 判断是否来至审核
if (defined('IS_MODULE_VERIFY')) {
$row = \Phpcmf\Service::M()->table(dr_module_table_prefix($this->module['dirname']).'_verify')->get($id);
if (!$row) {
return [];
} elseif ($this->uid != $row['uid']) {
return [];
}
$data = dr_string2array($row['content']);
$data['islock'] = $row['islock'];
define('IS_MODULE_VERIFY_NEW', $row['isnew']);
$data['backinfo'] = dr_string2array($row['backinfo']);
!$this->is_get_catid && $this->is_get_catid = (int)$row['catid'];
// 栏目验证码
$this->is_post_code = $this->is_hcategory ? $this->content_model->_hcategory_member_post_code() : \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $this->is_get_catid, 'code', $this->member);
return $data;
}
$row = $this->content_model->get_data($id);
if (!$row) {
return [];
} elseif ($this->uid != $row['uid']) {
return [];
}
if ($this->module['is_ctable']) {
$this->init['table'] = dr_module_ctable($this->init['table'], dr_cat_value($row['catid']));
}
// 判断是同步栏目数据
if ($row['link_id'] > 0) {
$row = $this->content_model->get_data($row['link_id']);
if (!$row) {
return [];
}
$this->replace_id = $id = $row['id'];
}
!$this->is_get_catid && $this->is_get_catid = (int)$row['catid'];
// 栏目验证码
$this->is_post_code = $this->is_hcategory ? $this->content_model->_hcategory_member_post_code() : \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $this->is_get_catid, 'code', $this->member);
// 更新时间
$row['updatetime'] = SYS_TIME;
return $row;
}
// 格式化保存数据
protected function _Format_Data($id, $data, $old) {
// 验证栏目 验证码
$catid = (int)\Phpcmf\Service::L('input')->post('catid');
if (!$this->module['category'][$catid] && !$this->is_hcategory) {
$this->_json(0, dr_lang('栏目[%s]不存在', $catid), ['field' => 'catid']);
}
// 判断栏目分表
$this->module['is_ctable'] && $this->init['table'] = dr_module_ctable(dr_module_table_prefix(APP_DIR), dr_cat_value($catid));
// 默认数据
$data[1]['uid'] = $data[0]['uid'] = $this->uid;
$data[1]['catid'] = $data[0]['catid'] = $catid;
$data[1]['updatetime'] = SYS_TIME;
// 第一次保存初始化信息
if (!$id) {
$data[1]['inputip'] = \Phpcmf\Service::L('input')->ip_info();
$data[1]['inputtime'] = SYS_TIME;
$data[1]['displayorder'] = 0;
}
// 判断是否来至审核
if (defined('IS_MODULE_VERIFY')) {
$data[1]['status'] = 1;
// 审核时
} else {
// 判断权限
// 验证状态
$data[1]['status'] = $this->is_hcategory ? $this->content_model->_hcategory_member_post_status($id) : $this->content_model->get_verify_status($id,
$this->member,
\Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $catid, 'verify', $this->member)
);
}
// 默认数据
$data = $this->content_model->format_data($data);
return $data;
}
/**
* 保存内容
* $id 内容id,新增为0
* $data 提交内容数组,留空为自动获取
* $func 格式化提交的数据
* */
protected function _Save($id = 0, $data = [], $old = [], $func = null, $func2 = null) {
$did = intval(\Phpcmf\Service::L('input')->get('did'));
$is_draft = intval(\Phpcmf\Service::L('input')->post('is_draft'));
if (!defined('IS_MODULE_VERIFY') && $is_draft) {
// 草稿箱存储
$data[1]['id'] = $id;
return $this->content_model->insert_draft($did, $data);
} else {
// 删除草稿
$did && $this->content_model->delete_draft($did);
// 正常存储
return parent::_Save($id, $data, $old,
// 保存之前
function ($id, $data, $old) {
// 判断是否来至审核
if (defined('IS_MODULE_VERIFY')) {
if ($old['status'] != 0 && $old['islock']) {
return dr_return_data(0, dr_lang('内容正在审核之中,无法再次修改'));
}
}
if ($this->is_hcategory) {
// 没有开通栏目时
$data = $this->content_model->_hcategory_member_save_before($data);
return dr_return_data(1, '', $data);
}
if ($old) {
// 表示修改
if (defined('IS_MODULE_VERIFY')) {
// 审核文章编辑时采用投稿权限判断
$cat = $this->_get_module_member_category($this->module, 'add');
if (!$cat[$old['catid']]) {
return dr_return_data(0, dr_lang('当前栏目[%s]没有发布权限', $this->module['category'][$old['catid']]['name']));
}
} else {
$cat = $this->_get_module_member_category($this->module, 'edit');
if (!$cat[$old['catid']]) {
return dr_return_data(0, dr_lang('当前栏目[%s]没有修改权限', $this->module['category'][$old['catid']]['name']));
}
}
// 禁止修改栏目
if ($this->module['category'][$old['catid']]['setting']['notedit']) {
$data[1]['catid'] = $old['catid'];
}
} else {
// 表示新增
$cat = $this->_get_module_member_category($this->module, 'add');
if (!$cat[$data[1]['catid']]) {
return dr_return_data(0, dr_lang('当前栏目[%s]没有发布权限', $this->module['category'][(int)$data[1]['catid']]['name']));
}
if ($this->uid) {
// 判断日发布量
$type_post = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $data[1]['catid'], 'type_post', $this->member);
$day_post = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $data[1]['catid'], 'day_post', $this->member);
if ($day_post) {
if ($type_post && \Phpcmf\Service::M('member_auth', 'cms')->is_category_public) {
// 按全局算
if (\Phpcmf\Service::M()->db
->table(dr_module_table_prefix($this->module['dirname']).'_index')
->where('uid', $this->uid)
->where('DATEDIFF(from_unixtime(inputtime),now())=0')
->countAllResults() >= $day_post) {
return dr_return_data(0, dr_lang('当前模块每天发布数量不能超过%s个', $day_post));
}
} else {
// 按栏目算
if (\Phpcmf\Service::M()->db
->table(dr_module_table_prefix($this->module['dirname']).'_index')
->where('uid', $this->uid)
->where('DATEDIFF(from_unixtime(inputtime),now())=0')
->where('catid', $data[1]['catid'])
->countAllResults() >= $day_post) {
return dr_return_data(0, dr_lang('当前栏目[%s]每天发布数量不能超过%s个', $this->module['category'][$data[1]['catid']]['name'], $day_post));
}
}
}
// 判断发布总量
$total_post = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $data[1]['catid'], 'total_post', $this->member);
if ($total_post) {
if ($type_post && \Phpcmf\Service::M('member_auth', 'cms')->is_category_public) {
// 按全局算
/*
$my_total = 0;
$modules = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-content');
foreach ($modules as $m) {
if ($m['share']) {
$my_total+= \Phpcmf\Service::M()->db
->table(dr_module_table_prefix($m['dirname']).'_index')
->where('uid', $this->uid)
->countAllResults();
}
}
if ($my_total >= $total_post) {
return dr_return_data(0, dr_lang('发布数量不能超过%s个', $total_post));
}*/
if (\Phpcmf\Service::M()->db
->table(dr_module_table_prefix($this->module['dirname']).'_index')
->where('uid', $this->uid)
->countAllResults() >= $total_post) {
return dr_return_data(0, dr_lang('当前模块发布数量不能超过%s个', $total_post));
}
} else {
// 按栏目算
if (\Phpcmf\Service::M()->db
->table(dr_module_table_prefix($this->module['dirname']).'_index')
->where('uid', $this->uid)
->where('catid', $data[1]['catid'])
->countAllResults() >= $total_post) {
return dr_return_data(0, dr_lang('当前栏目[%s]发布数量不能超过%s个', $this->module['category'][$data[1]['catid']]['name'], $total_post));
}
}
}
// 金币验证
$score = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $data[1]['catid'], 'score', $this->member);
if ((int)$score + (int)$this->member['score'] < 0) {
$attr = dr_is_app('scorelog') ? [
'button' => [ 'name' => dr_lang('充值'), 'url' => dr_member_url('scorelog/home/pay')]
] : [];
return dr_return_data(0, dr_lang(SITE_SCORE.'不足,当前栏目[%s]需要%s'.SITE_SCORE, $this->module['category'][$data[1]['catid']]['name'], abs($score)), $attr);
}
// 金额验证
$money = \Phpcmf\Service::M('member_auth', 'cms')->category_auth($this->module, $data[1]['catid'], 'money', $this->member);
if ((float)$money + (float)$this->member['money'] < 0) {
$attr = dr_is_app('pay') ? [
'button' => [ 'name' => dr_lang('充值'), 'url' => dr_member_url('pay/recharge/index')]
] : [];
return dr_return_data(0, dr_lang('余额不足,当前栏目[%s]需要%s元', $this->module['category'][$data[1]['catid']]['name'], abs($money)), $attr);
}
}
}
return dr_return_data(1, '', $data);
},
// 保存之后
function ($id, $data, $old) {
// 同步发送到其他栏目
if ($data[1]['status'] == 9 && \Phpcmf\Service::L('input')->post('sync_cat')) {
$this->content_model->sync_cat(\Phpcmf\Service::L('input')->post('sync_cat'), $data);
}
return $data;
}
);
}
}
protected function _api_json_member_content_list($list_type = 'home') {
$list_type = in_array($list_type, ['home', 'verify', 'draft'], true) ? $list_type : 'home';
$list = \Phpcmf\Service::V()->get_value('list');
$total = intval(\Phpcmf\Service::V()->get_value('total'));
$param = \Phpcmf\Service::V()->get_value('param');
$category = is_array($this->module['category'] ?? null) ? $this->module['category'] : [];
$auth_edit = [];
$auth_del = [];
$rows = [];
if (is_array($list)) {
foreach ($list as $t) {
if (!is_array($t) || empty($t['id'])) {
continue;
}
$catid = intval($t['catid'] ?? 0);
$catname = '';
if ($catid && isset($category[$catid]['name'])) {
$catname = (string)$category[$catid]['name'];
} elseif (!empty($t['catname'])) {
$catname = (string)$t['catname'];
}
// 审核/草稿:主题在 content 序列化字段中
$content = [];
if ($list_type === 'verify' || $list_type === 'draft') {
$raw = $t['content'] ?? [];
if (is_string($raw)) {
$content = dr_string2array($raw);
} elseif (is_array($raw)) {
$content = $raw;
}
if (!is_array($content)) {
$content = [];
}
}
if ($list_type === 'home') {
if (!isset($auth_edit[$catid])) {
$auth_edit[$catid] = $this->content_model->check_member_auth($catid, 'edit') ? 1 : 0;
$auth_del[$catid] = $this->content_model->check_member_auth($catid, 'del') ? 1 : 0;
}
$rows[] = [
'id' => intval($t['id']),
'title' => (string)($t['title'] ?? ''),
'catid' => $catid,
'catname' => $catname,
'author' => (string)($t['author'] ?? ''),
'url' => (string)($t['url'] ?? ''),
'uid' => intval($t['uid'] ?? 0),
'status' => intval($t['status'] ?? 0),
'inputtime' => $t['inputtime'] ?? '',
'updatetime' => $t['updatetime'] ?? '',
'can_edit' => $auth_edit[$catid],
'can_del' => $auth_del[$catid],
];
} elseif ($list_type === 'verify') {
$status = intval($t['status'] ?? 0);
$rows[] = [
'id' => intval($t['id']),
'title' => (string)($content['title'] ?? $t['title'] ?? ''),
'catid' => $catid,
'catname' => $catname,
'author' => (string)($content['author'] ?? $t['author'] ?? ''),
'uid' => intval($t['uid'] ?? 0),
'status' => $status,
'status_text' => $status ? dr_lang('%s审中', $status) : dr_lang('被拒绝'),
'inputtime' => $t['inputtime'] ?? '',
'updatetime' => $t['updatetime'] ?? ($t['inputtime'] ?? ''),
'isnew' => intval($t['isnew'] ?? 0),
'can_edit' => 1,
'can_del' => 1,
];
} else { // draft
$cid = intval($t['cid'] ?? 0);
$rows[] = [
'id' => intval($t['id']),
'did' => intval($t['id']),
'cid' => $cid,
'title' => (string)($content['title'] ?? $t['title'] ?? ''),
'catid' => $catid,
'catname' => $catname,
'author' => (string)($content['author'] ?? ''),
'uid' => intval($t['uid'] ?? 0),
'inputtime' => $t['inputtime'] ?? '',
'updatetime' => $t['inputtime'] ?? '',
'can_edit' => 1,
'can_del' => 1,
];
}
}
}
$page = is_array($param) ? intval($param['page'] ?? 1) : intval(\Phpcmf\Service::L('input')->get('page'));
!$page && $page = 1;
$pagesize = intval(\Phpcmf\Service::V()->get_value('mytable_pagesize'));
if (!$pagesize) {
$pagesize = intval($this->member_cache['config']['pagesize_api'] ?? 0);
}
!$pagesize && $pagesize = 10;
$this->_json(1, 'ok', [
'mid' => (string)($this->module['dirname'] ?? APP_DIR),
'module_name' => (string)($this->module['name'] ?? $this->module['cname'] ?? ''),
'list_type' => $list_type,
'list' => $rows,
'total' => $total,
'page' => $page,
'pagesize' => $pagesize,
'param' => is_array($param) ? [
'field' => (string)($param['field'] ?? ''),
'keyword' => (string)($param['keyword'] ?? ''),
'catid' => intval($param['catid'] ?? 0),
] : [],
]);
}
/**
* 客户端内容发布/编辑表单(IS_API_HTTP GET
* 字段尽量经 member_api 的 dr_member_api_format_client_fields 附加上传/编辑器参数
* @param array $fill 草稿等内容填充值(add&did= 时必传,否则无 client_value
*/
protected function _api_json_member_content_form($id, $catid, $category = [], $fill = []) {
$id = intval($id);
$catid = intval($catid);
$did = intval(\Phpcmf\Service::L('input')->get('did'));
$mydata = $id ? $this->_Data($id) : [];
if (!is_array($mydata)) {
$mydata = [];
}
// 草稿 / 额外填充:覆盖到字段值(草稿编辑 id=0,必须靠 fill 回填 client_value
if (is_array($fill) && $fill) {
if (!$id) {
$mydata = $fill;
} else {
$mydata = array_merge($mydata, $fill);
}
} elseif (!$id && $did) {
$draft = $this->content_model->get_draft($did);
if (is_array($draft) && $draft) {
$mydata = $draft;
}
}
if ($catid) {
$mydata['catid'] = $catid;
} elseif (!empty($mydata['catid'])) {
$catid = intval($mydata['catid']);
}
list($my_field, $sys_field, $diy_field, $cat_field) = $this->_field_group($mydata);
$field = [];
foreach ([$my_field, $sys_field, $diy_field, $cat_field] as $group) {
if (!is_array($group)) {
continue;
}
foreach ($group as $name => $t) {
if (is_array($t)) {
$field[$name] = $t;
}
}
}
if (function_exists('dr_array_sort')) {
$field = dr_array_sort($field, 'displayorder', 'asc');
}
$filtered = [];
$member = is_array($this->member) ? $this->member : [];
$groupids = isset($member['groupid']) ? $member['groupid'] : [];
foreach ($field as $name => $t) {
if (!is_array($t)) {
continue;
}
// 对齐 Field::toform 会员侧可见规则
if (empty($t['ismember'])) {
continue;
}
if (!empty($t['setting']['show_member']) && $groupids
&& function_exists('dr_array_intersect')
&& dr_array_intersect($groupids, $t['setting']['show_member'])) {
continue;
}
$ftype = (string)($t['fieldtype'] ?? '');
if (in_array($ftype, ['Group', 'Merge', 'Diy', 'Related', 'Catids'], true)) {
continue;
}
$fname = (string)($t['fieldname'] ?? $name);
$filtered[$fname] = $t;
}
if (function_exists('dr_member_api_format_client_fields')) {
$client_field = dr_member_api_format_client_fields($filtered, $mydata, [
'check_allow' => false,
'check_support' => true,
]);
} else {
$client_field = $filtered;
}
$cats = [];
if (!$this->is_hcategory && is_array($category)) {
foreach ($category as $cid => $c) {
if (!is_array($c) || !empty($c['child'])) {
continue;
}
if (isset($c['tid']) && (int)$c['tid'] != 1) {
continue;
}
$cats[] = [
'id' => intval(isset($c['id']) ? $c['id'] : $cid),
'name' => (string)($c['name'] ?? ''),
'pid' => intval($c['pid'] ?? 0),
];
}
}
$is_post_code = $this->is_hcategory
? ($this->content_model->_hcategory_member_post_code() ? 1 : 0)
: ($this->is_post_code ? 1 : 0);
$this->_json(1, 'ok', [
'mid' => (string)($this->module['dirname'] ?? APP_DIR),
'module_name' => (string)($this->module['name'] ?? $this->module['cname'] ?? ''),
'id' => $id,
'did' => $did,
'is_edit' => $id ? 1 : 0,
'is_draft' => $did ? 1 : 0,
'catid' => $catid,
'category' => $cats,
'field' => $client_field,
'is_post_code' => $is_post_code,
'need_catid' => $this->is_hcategory ? 0 : 1,
]);
}
/**
* 回调处理结果
* $data
* */
protected function _Call_Post($data) {
if ($data[1]['status'] == 9) {
$list = $html = '';
if ($this->module['category'][$data[1]['catid']]['setting']['html']) {
// 生成权限文件
if (!dr_html_auth(1)) {
return dr_return_data(0, dr_lang('/cache/html/ 无法写入文件'));
}
$list = WEB_DIR.'index.php?s='.$this->module['dirname'].'&c=html&m=categoryfile&id='.$data[1]['catid'];
}
if ($this->module['category'][$data[1]['catid']]['setting']['chtml']) {
// 生成权限文件
if (!dr_html_auth(1)) {
return dr_return_data(0, dr_lang('/cache/html/ 无法写入文件'));
}
$html = WEB_DIR.'index.php?s='.$this->module['dirname'].'&c=html&m=showfile&id='.$data[1]['id'];
}
return dr_return_data(1, dr_lang('操作成功'), ['id' => $data[1]['id'], 'catid' => $data[1]['catid'], 'htmlfile' => $html, 'htmllist' => $list]);
} else {
if (\Phpcmf\Service::L('input')->post('is_draft')) {
return dr_return_data(1, dr_lang('操作成功,已存储到草稿箱'));
} else {
return dr_return_data(1, dr_lang('操作成功,等待管理员审核'), ['id' => $data[1]['id'], 'catid' => (int)$data[1]['catid']]);
}
}
}
}