Files
BESCMS/dayrui/App/Weixin/Controllers/Admin/Template.php
T

348 lines
12 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\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;
}
}