Initial project files: BESCMS full source
This commit is contained in:
@@ -0,0 +1,347 @@
|
||||
<?php namespace Phpcmf\Controllers\Admin;
|
||||
|
||||
class Template extends \Phpcmf\Table
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
// 表单显示名称
|
||||
$this->name = dr_lang('模板消息');
|
||||
// 模板前缀(避免混淆)
|
||||
$this->tpl_prefix = 'template_';
|
||||
// 用于表储存的字段,后台可修改的表字段
|
||||
$field = array(
|
||||
'title' => array(
|
||||
'name' => dr_lang('主题'),
|
||||
'fieldname' => 'title', // 这是字段名称必须和主键相同
|
||||
),
|
||||
'template' => array(
|
||||
'name' => dr_lang('模板ID'),
|
||||
'fieldname' => 'template', // 这是字段名称必须和主键相同
|
||||
),
|
||||
'url' => array(
|
||||
'name' => dr_lang('消息URL'),
|
||||
'fieldname' => 'url', // 这是字段名称必须和主键相同
|
||||
),
|
||||
);
|
||||
// 初始化数据表
|
||||
$this->_init([
|
||||
'table' => weixin_wxtable('template'),
|
||||
'field' => $field, // 可查询的字段
|
||||
'order_by' => 'inputtime desc', // 列表排序
|
||||
'date_field' => 'inputtime', // 按时间段搜索字段
|
||||
]);
|
||||
|
||||
// 把公共变量传入模板
|
||||
\Phpcmf\Service::V()->assign([
|
||||
// 搜索字段
|
||||
'field' => $field,
|
||||
// 后台的菜单
|
||||
'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
|
||||
[
|
||||
WEIXIN_MORE_NAME. $this->name => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-edit'],
|
||||
'创建' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'],
|
||||
'修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'],
|
||||
]),
|
||||
'group' => \Phpcmf\Service::M('User', APP_DIR)->get_group_data(),
|
||||
'ucount' => \Phpcmf\Service::M()->table(weixin_wxtable('user'))->counts(),
|
||||
]);
|
||||
}
|
||||
|
||||
// 来自cms的群发
|
||||
public function show_add() {
|
||||
|
||||
$id = (int)\Phpcmf\Service::L('Input')->get('id');
|
||||
$mid = dr_safe_filename(\Phpcmf\Service::L('Input')->get('mid'));
|
||||
if (!$id || !$mid) {
|
||||
$this->_json(0, '参数不能为空');
|
||||
}
|
||||
|
||||
$data = \Phpcmf\Service::M()->table_site($mid)->get($id);
|
||||
if (!$data) {
|
||||
$this->_json(0, '内容不存在');
|
||||
}
|
||||
|
||||
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
|
||||
if (!$cache) {
|
||||
$this->_json(0, dr_lang('没有可用粉丝'));
|
||||
}
|
||||
|
||||
$tpl = [];
|
||||
|
||||
|
||||
// 生成模板
|
||||
$template = [];
|
||||
foreach ($tpl['content'] as $t) {
|
||||
if ($t['name']) {
|
||||
$template[$t['name']] = [
|
||||
'value' => $t['value'],
|
||||
'color' => $t['color'],
|
||||
];
|
||||
}
|
||||
}
|
||||
if (!$template) {
|
||||
$this->_json(0, dr_lang('模板内容解析后不存在'));
|
||||
}
|
||||
|
||||
// 存储文件
|
||||
\Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
|
||||
'data' => $data,
|
||||
'template' => $template,
|
||||
'users' => dr_save_bfb_data($cache)
|
||||
], 3600);
|
||||
|
||||
|
||||
$this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
|
||||
}
|
||||
|
||||
// 查看列表
|
||||
public function index() {
|
||||
list($tpl) = $this->_List();
|
||||
\Phpcmf\Service::V()->display($tpl);
|
||||
}
|
||||
|
||||
// 添加内容
|
||||
public function add() {
|
||||
list($tpl) =$this->_Post(0);
|
||||
\Phpcmf\Service::V()->display($tpl);
|
||||
}
|
||||
|
||||
// 修改内容
|
||||
public function edit() {
|
||||
|
||||
$id = intval(\Phpcmf\Service::L('Input')->get('id'));
|
||||
list($tpl) = $this->_Post($id);
|
||||
\Phpcmf\Service::V()->display($tpl);
|
||||
}
|
||||
|
||||
// 删除内容
|
||||
public function del() {
|
||||
$this->_Del(
|
||||
\Phpcmf\Service::L('Input')->get_post_ids(),
|
||||
null,
|
||||
null,
|
||||
\Phpcmf\Service::M()->dbprefix($this->init['table'])
|
||||
);
|
||||
}
|
||||
|
||||
// 内容处理
|
||||
public function todo_add() {
|
||||
|
||||
$id = \Phpcmf\Service::L('input')->get('id');
|
||||
$data = \Phpcmf\Service::M()->table($this->init['table'])->get($id);
|
||||
if (!$data) {
|
||||
$this->_json(0, dr_lang('模板内容不存在'));
|
||||
} elseif (!$data['content']) {
|
||||
$this->_json(0, dr_lang('内容参数不存在'));
|
||||
} elseif (!$data['template']) {
|
||||
$this->_json(0, dr_lang('模板ID不存在'));
|
||||
}
|
||||
|
||||
$data['content'] = dr_string2array($data['content']);
|
||||
if ($data['groupid'] < 0) {
|
||||
$gid = abs($data['groupid']);
|
||||
$where = 'uid in (select uid from '.\Phpcmf\Service::M()->dbprefix('member_group_index').' where gid='.$gid.')';
|
||||
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where($where)->getAll();
|
||||
} elseif ($data['groupid'] > 0) {
|
||||
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where('groupids LIKE "%\"'.\Phpcmf\Service::M()->db->escapeString($data['groupid'], true).'\"%"')->getAll();
|
||||
} else {
|
||||
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
|
||||
}
|
||||
if (!$cache) {
|
||||
$this->_json(0, dr_lang('没有可用粉丝'));
|
||||
}
|
||||
|
||||
// 生成模板
|
||||
$template = [];
|
||||
foreach ($data['content'] as $t) {
|
||||
if ($t['name']) {
|
||||
$template[$t['name']] = [
|
||||
'value' => $t['value'],
|
||||
'color' => $t['color'],
|
||||
];
|
||||
}
|
||||
}
|
||||
if (!$template) {
|
||||
$this->_json(0, dr_lang('模板内容解析后不存在'));
|
||||
}
|
||||
|
||||
|
||||
// 存储文件
|
||||
\Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
|
||||
'data' => $data,
|
||||
'template' => $template,
|
||||
'users' => $this->_save_bfb_data($cache),
|
||||
]);
|
||||
|
||||
$this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
|
||||
}
|
||||
|
||||
function _save_bfb_data($data) {
|
||||
|
||||
$cache = [];
|
||||
$count = dr_count($data);
|
||||
$num = ceil($count/10);
|
||||
if ($count > $num) {
|
||||
$pagesize = ceil($count/$num);
|
||||
for ($i = 1; $i <= $num; $i ++) {
|
||||
$cache[$i] = array_slice($data, ($i - 1) * $pagesize, $pagesize);
|
||||
}
|
||||
} else {
|
||||
for ($i = 1; $i <= $count; $i ++) {
|
||||
$cache[$i] = array_slice($data, ($i - 1), 1);
|
||||
}
|
||||
}
|
||||
|
||||
return $cache;
|
||||
}
|
||||
|
||||
|
||||
// 内容处理
|
||||
public function show_index() {
|
||||
\Phpcmf\Service::V()->assign([
|
||||
'menu' => '',
|
||||
'hidebtn' => 1,
|
||||
'todo_url' => dr_url('weixin/template/send_add'),
|
||||
'count_url' => dr_url('weixin/template/show_count_index'),
|
||||
]);
|
||||
\Phpcmf\Service::V()->display('bfb.html');exit;
|
||||
}
|
||||
|
||||
// 内容数量统计
|
||||
public function show_count_index() {
|
||||
|
||||
$data = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
|
||||
!dr_count($data) && $this->_json(0, dr_lang('无可用数据,缓存已失效'));
|
||||
|
||||
$this->_json(count($data['users']), 'ok');
|
||||
}
|
||||
|
||||
public function send_add() {
|
||||
|
||||
$page = max(1, intval($_GET['pp']));
|
||||
$cache = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
|
||||
!$cache && $this->_json(0, dr_lang('缓存不存在'));
|
||||
|
||||
$data = $cache['users'][$page];
|
||||
$cts = count($cache['users']);
|
||||
if ($data) {
|
||||
$html = '';
|
||||
foreach ($data as $user) {
|
||||
$rt = $this->_send_template($user['openid'], $cache['data']['template'], $cache['template'], $cache['data']['url'], $cache['data']['color']);
|
||||
if (!$rt['code']) {
|
||||
$ok = "<span class='error'>".$rt['msg']."</span>";
|
||||
$class = ' p_error';
|
||||
} else {
|
||||
$ok = "<span class='ok'>".dr_lang('发送成功')."</span>";
|
||||
\Phpcmf\Service::M()->db->table($this->init['table'])
|
||||
->where('id', intval($cache['data']['id']))
|
||||
->increment('counts', 1);
|
||||
}
|
||||
$html.= '<p class="'.$class.'"><label class="rleft">'.dr_html2emoji($user['nickname']).'</label><label class="rright">'.$ok.'</label></p>';
|
||||
|
||||
}
|
||||
$this->_json($page + 1, $html, [
|
||||
'msg' => '正在执行第'.$page.'页/共'.$cts.'页',
|
||||
'bfb' => round($page/$cts * 100, 2),
|
||||
]);
|
||||
}
|
||||
|
||||
// 完成
|
||||
\Phpcmf\Service::L('cache')->del_auth_data('app-weixin-template-send');
|
||||
$this->_json($cts, 'ok');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取微信 access token
|
||||
*/
|
||||
public function _weixin_template_access_token() {
|
||||
|
||||
$cache_data = \Phpcmf\Service::L('cache')->init('file')->get('access_token');
|
||||
if (isset($cache_data['time']) && $cache_data['access_token']) {
|
||||
$access_token = $cache_data['access_token'];
|
||||
} else {
|
||||
$weixin = \Phpcmf\Service::C()->get_cache('weixin');
|
||||
$result = wx_get_https_json_data('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$weixin['account']['appid'].'&secret='.$weixin['account']['appsecret']);
|
||||
if (!$result['code']) {
|
||||
return dr_return_data(0, 'AccessToken:'.$result['msg']);
|
||||
}
|
||||
\Phpcmf\Service::L('cache')->init('file')->save('access_token', $result['data'], 3600);
|
||||
$access_token = $result['data']['access_token'];
|
||||
}
|
||||
|
||||
return dr_return_data(1, 'ok', ['access_token' => $access_token]);
|
||||
}
|
||||
|
||||
private function _send_template($oid, $id, $data, $url = '', $color = '') {
|
||||
|
||||
$rt = $this->_weixin_template_access_token();
|
||||
if (!$rt['code']) {
|
||||
return dr_return_data(0, $rt['msg']);
|
||||
}
|
||||
|
||||
$p = [
|
||||
'touser' => $oid,
|
||||
'template_id' => $id,
|
||||
'url' => $url,
|
||||
'topcolor' => $color,
|
||||
'data' => $data,
|
||||
];
|
||||
$rt = wx_post_https_json_data('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$rt['data']['access_token'], $p);
|
||||
|
||||
return $rt;
|
||||
}
|
||||
|
||||
// 复制
|
||||
public function copy_edit() {
|
||||
|
||||
$id = intval(\Phpcmf\Service::L('input')->get('id'));
|
||||
$data = \Phpcmf\Service::M()->db->table(weixin_wxtable('template'))->where('id', $id)->get()->getRowArray();
|
||||
if (!$data) {
|
||||
$this->_json(0, dr_lang('数据#%s不存在', $id));
|
||||
}
|
||||
|
||||
unset($data['id']);
|
||||
$data['title'].= '_copy';
|
||||
|
||||
$rt = \Phpcmf\Service::M()->table(weixin_wxtable('template'))->insert($data);
|
||||
if (!$rt['code']) {
|
||||
$this->_json(0, dr_lang($rt['msg']));
|
||||
}
|
||||
|
||||
$this->_json(1, dr_lang('复制成功'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取内容
|
||||
* $id 内容id,新增为0
|
||||
* */
|
||||
protected function _Data($id = 0) {
|
||||
|
||||
$data = parent::_Data($id);
|
||||
if (!$data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$data['content'] = dr_string2array($data['content']);
|
||||
return $data;
|
||||
}
|
||||
|
||||
// 格式化保存数据
|
||||
protected function _Format_Data($id, $data, $old) {
|
||||
|
||||
$data[1] = \Phpcmf\Service::L('input')->post('data');
|
||||
$data[1]['content'] = dr_array2string($data[1]['content']);
|
||||
if (!$id) {
|
||||
// 当提交新数据时,把当前时间插入进去
|
||||
$data[1]['counts'] = 0;
|
||||
$data[1]['inputtime'] = SYS_TIME;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user