display.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. <div class="panel we7-panel panel-reply">
  2. <div class="panel-heading">
  3. {if $_GPC['a'] == 'qr'}二维码触发的关键字
  4. {elseif $_GPC['a'] == 'mass'}群发内容
  5. {else}
  6. {if $_GPC['c'] == 'mc' && $_GPC['a'] == 'chats'}发送聊天内容{else}触发后回复内容{/if}
  7. {if $_GPC['a'] == 'reply' && !empty($_GPC['m']) && $_GPC['m'] == 'keyword'}<span class="pull-right color-gray">添加多条回复内容时, 随机回复其中一条</span>{/if}
  8. {/if}
  9. </div>
  10. <div class="panel-body we7-padding">
  11. <input type="hidden" name="reply[reply_basic]" value="">
  12. <input type="hidden" name="reply[reply_news]" value="">
  13. <input type="hidden" name="reply[reply_image]" value="">
  14. <input type="hidden" name="reply[reply_music]" value="">
  15. <input type="hidden" name="reply[reply_voice]" value="">
  16. <input type="hidden" name="reply[reply_video]" value="">
  17. <input type="hidden" name="reply[reply_keyword]" value="">
  18. <input type="hidden" name="reply[reply_module]" value="">
  19. <input type="hidden" name="reply[reply_wxapp]" value="">
  20. <ul class="keywords-list">
  21. </ul>
  22. <div class="we7-select-msg">
  23. <ul class="tab-navs">
  24. <li class="tab-nav tab-appmsg active {if $options['news']}hidden{/if}">
  25. <a href="javascript:void(0);"{if $_GPC['a'] == 'mass'} onclick="select_mediaid('news', 'wx')"{else} onclick="select_mediaid('news')"{/if}>
  26. <img src="./resource/images/reply/appmsg-icon.png" alt="">
  27. <span class="msg-tab-title">图文</span>
  28. </a>
  29. </li>
  30. <li class="tab-nav tab-text {if $options['basic']}hidden{/if}">
  31. <a href="javascript:void(0);" onclick="select_mediaid('basic');">
  32. <img src="./resource/images/reply/text-icon.png" alt="">
  33. </i><span class="msg-tab-title">文字</span>
  34. </a>
  35. </li>
  36. <li class="tab-nav tab-img {if $options['image']}hidden{/if}">
  37. <a href="javascript:void(0);" onclick="select_mediaid('image');">
  38. <img src="./resource/images/reply/image-icon.png" alt="">
  39. <span class="msg-tab-title">微信图片</span>
  40. </a>
  41. </li>
  42. <li class="tab-nav tab-audio {if $options['music']}hidden{/if}">
  43. <a href="javascript:void(0);" onclick="select_mediaid('music');">
  44. <img src="./resource/images/reply/music-icon.png" alt="">
  45. <span class="msg-tab-title">音乐</span>
  46. </a>
  47. </li>
  48. <li class="tab-nav tab-audio {if $options['voice']}hidden{/if}">
  49. <a href="javascript:void(0);" onclick="select_mediaid('voice');">
  50. <img src="./resource/images/reply/radio-icon.png" alt="">
  51. <span class="msg-tab-title">语音</span>
  52. </a>
  53. </li>
  54. <li class="tab-nav tab-video {if $options['video']}hidden{/if}">
  55. <a href="javascript:void(0);" onclick="select_mediaid('video');">
  56. <img src="./resource/images/reply/vedio-icon.png" alt="">
  57. <span class="msg-tab-title">视频</span>
  58. </a>
  59. </li>
  60. <li class="tab-nav tab-video {if $options['wxapp']}hidden{/if}">
  61. <a href="javascript:void(0);" onclick="select_mediaid('wxapp');">
  62. <img src="./resource/images/reply/wxapp-icon.png" alt="">
  63. <span class="msg-tab-title">小程序</span>
  64. </a>
  65. </li>
  66. <li class="tab-nav tab-cardmsg {if $options['keyword']}hidden{/if}">
  67. <a href="javascript:void(0);" onclick="select_mediaid('keyword');">
  68. <img src="./resource/images/reply/keyword-icon.png" alt="">
  69. <span class="msg-tab-title">{if !empty($_GPC['m']) && $_GPC['m'] == 'welcome'}匹配{else}触发{/if}关键字</span>
  70. </a>
  71. </li>
  72. <li class="tab-nav tab-cardmsg {if $options['module']}hidden{/if}">
  73. <a href="javascript:void(0);" onclick="select_mediaid('module');">
  74. <img src="./resource/images/reply/module-icon.png" alt="">
  75. <span class="msg-tab-title">模块</span>
  76. </a>
  77. </li>
  78. </ul>
  79. </div>
  80. </div>
  81. </div>
  82. <script>
  83. var action = "{php echo empty($_GPC['a']) ? '' : $_GPC['a']}";
  84. var m = "{php echo empty($_GPC['m']) ? '' : $_GPC['m']}";
  85. //删除已选素材
  86. var delmedia = function(type, ele) {
  87. var oldVal = $(':hidden[name="reply[reply_'+type+']"]').val();
  88. var newVal;
  89. var media = $(ele).attr('data-media');
  90. switch(type) {
  91. case 'basic':
  92. var middleVal = oldVal.split(',');
  93. newVal = angular.copy(middleVal);
  94. angular.forEach(middleVal, function(val, key) {
  95. middleVal[key] = htmlEncode(angular.toJson(val));
  96. });
  97. var index = _.indexOf(middleVal, htmlEncode(angular.toJson(media)));
  98. newVal = _.without(newVal, newVal[index]);
  99. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  100. break;
  101. case 'image':
  102. var middleVal = oldVal.split(',');
  103. newVal = angular.copy(middleVal);
  104. newVal = _.without(newVal, '"' + media + '"');
  105. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  106. break;
  107. case 'news':
  108. var middleVal = JSON.parse('[' +oldVal + ']' );
  109. newVal = angular.copy(middleVal);
  110. var findKey = false
  111. angular.forEach(middleVal, function(val, key){
  112. if(!findKey && val.mediaid == media ) {
  113. findKey = key
  114. }
  115. });
  116. newVal.splice(findKey, 1)
  117. angular.forEach(newVal, function(val, key) {
  118. newVal[key] = angular.toJson(val)
  119. });
  120. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  121. break;
  122. case 'music':
  123. var middleVal = JSON.parse('[' +oldVal + ']' );
  124. newVal = angular.copy(middleVal);
  125. var findKey = false
  126. angular.forEach(middleVal, function(val, key){
  127. if(!findKey && val.url == media ) {
  128. findKey = key
  129. }
  130. });
  131. newVal.splice(findKey, 1)
  132. angular.forEach(newVal, function(val, key) {
  133. newVal[key] = angular.toJson(val)
  134. });
  135. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  136. break;
  137. case 'video':
  138. var middleVal = JSON.parse('[' +oldVal + ']' );
  139. newVal = angular.copy(middleVal);
  140. var findKey = false
  141. angular.forEach(middleVal, function(val, key){
  142. if(!findKey && val.mediaid == media ) {
  143. findKey = key
  144. }
  145. });
  146. newVal.splice(findKey, 1)
  147. angular.forEach(newVal, function(val, key) {
  148. newVal[key] = angular.toJson(val)
  149. });
  150. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  151. break;
  152. case 'voice':
  153. var middleVal = oldVal.split(',');
  154. newVal = angular.copy(middleVal);
  155. newVal = _.without(newVal, '"' + media + '"');
  156. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  157. break;
  158. case 'wxapp':
  159. oldVal = JSON.parse('[' +oldVal + ']' )
  160. oldVal.splice(media, 1)
  161. var newVal = []
  162. for(var i in oldVal) {
  163. newVal.push(angular.toJson(oldVal[i]))
  164. }
  165. $(':hidden[name="reply[reply_'+type+']"]').val(newVal);
  166. break;
  167. case 'keyword':
  168. oldVal = oldVal.split(',');
  169. index = _.indexOf(oldVal, media);
  170. oldVal.splice(index, 1);
  171. $(':hidden[name="reply[reply_'+type+']"]').val(oldVal);
  172. break;
  173. case 'module':
  174. oldVal = oldVal.split(',');
  175. index = _.indexOf(oldVal, media);
  176. oldVal.splice(index, 1);
  177. $(':hidden[name="reply[reply_'+type+']"]').val(oldVal);
  178. break;
  179. }
  180. //显示隐藏-start
  181. if((action == 'qr' || action == 'mass' || m == 'special' || m == 'welcome' || m == 'default') && $(':hidden[name="reply[reply_'+type+']"]').val().length == 0) {
  182. $('.we7-select-msg').removeClass('hide');
  183. }
  184. //显示隐藏-end
  185. $(ele).parent().parent('.del-'+type+'-media').parent('li').remove();
  186. };
  187. window.select_mediaid = function(type, otherVal){
  188. var draft = "{php echo !empty($_GPC['a']) && $_GPC['a'] == 'mass' ? true : false}";
  189. var option = {
  190. type: type,
  191. isWechat : type != 'music' || draft, // 默认显示微信
  192. needType : 3, // 除了图文 其他只能微信
  193. otherVal : otherVal,//
  194. showType: type == 'news' && !draft ? 3 : (type != 'music' && !draft ? 1 : 2), // 只显示微信素材
  195. others: {
  196. image: {
  197. needType : 1
  198. },
  199. video : {
  200. needType : 1
  201. },
  202. voice : {
  203. needType : 3
  204. }
  205. },
  206. is_draft : draft,
  207. is_wx : draft && type == 'news' ? 1 : 0,
  208. is_local : draft && type == 'news' ? 1 : 0,
  209. is_index : draft && type == 'news' ? 2 : 0,
  210. };
  211. if (type == 'module'){
  212. document.cookie = "special_reply_type={php echo empty($_GPC['type']) ? '' : $_GPC['type']}";
  213. }
  214. util.material(function(material){
  215. var replyVal = [];
  216. $(':hidden[name="reply[reply_'+type+']"]').val() == '' ? '' : replyVal.push($(':hidden[name="reply[reply_'+type+']"]').val());
  217. if (type == 'basic') {
  218. if (angular.isDefined(otherVal)) {
  219. var editmedia = $(".del-basic-media");
  220. for (var i = 0; i < editmedia.length; i++) {
  221. if (htmlEncode($(editmedia.get(i)).find('.edit-gray').data('media')) == htmlEncode(angular.toJson(otherVal))) {
  222. var inputVal = $(':hidden[name="reply[reply_'+type+']"]').val();
  223. var inputValArr = inputVal.split(',');
  224. var middleVal = angular.copy(inputValArr);
  225. angular.forEach(inputValArr, function(val, key) {
  226. inputValArr[key] = htmlEncode(val);
  227. });
  228. var index = _.indexOf(inputValArr, htmlEncode(angular.toJson(otherVal)));
  229. material.content = material.content.replace(/,/g, ',');
  230. middleVal[index] = angular.toJson(material.content);
  231. replyVal = middleVal.join(',');
  232. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  233. $(editmedia.get(i)).html(
  234. ' <div class="desc">'+
  235. ' <div class="media-content">'+
  236. ' <span data-toggle="tooltip" data-placement="bottom" title="'+htmlEncode(material.content)+'">'+htmlEncode(cutStr(material.content,60))+
  237. ' </span>'+
  238. ' </div>'+
  239. ' </div>'+
  240. ' <div class="opr">'+
  241. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(material.content))+'" class="edit-gray" onclick="select_mediaid(\'basic\', '+htmlEncode(angular.toJson(material.content))+')">编辑</a>'+
  242. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(material.content))+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  243. ' </div>'
  244. );
  245. break;
  246. }
  247. }
  248. } else {
  249. if($.trim(material.content).length == 0) {
  250. return false;
  251. }
  252. material.content = material.content.replace(/,/g, ',');
  253. replyVal.push(angular.toJson(material.content));
  254. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  255. $('.keywords-list').append(
  256. '<li>'+
  257. '<div class="del-'+type+'-media">'+
  258. ' <div class="desc">'+
  259. ' <div class="media-content">'+
  260. ' <span data-toggle="tooltip" data-placement="bottom" title="'+htmlEncode(material.content)+'">'+htmlEncode(cutStr(material.content,60))+'</span>'+
  261. ' </div>'+
  262. ' </div>'+
  263. ' <div class="opr">'+
  264. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(material.content))+'" class="edit-gray" onclick="select_mediaid(\'basic\', '+htmlEncode(angular.toJson(material.content))+')">编辑</a>'+
  265. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(material.content))+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  266. ' </div>'+
  267. '</div>'+
  268. '</li>'
  269. );
  270. }
  271. } else if(type == 'keyword') {
  272. if($.trim(material.id).length == 0) {
  273. return false;
  274. }
  275. replyVal.push(material.id);
  276. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  277. var keywords = [];
  278. for(var i = 0; i < material.length; i++) {
  279. keywords += '&nbsp;&nbsp;' + material.content;
  280. }
  281. $('.keywords-list').append(
  282. '<li>'+
  283. '<div class="del-'+type+'-media">'+
  284. ' <div class="desc">'+
  285. ' <div class="media-content">'+
  286. ' <a class="title-wrp" href="javascript:;">'+
  287. ' <span class="title">[关键字]'+material.content+'</span>'+
  288. ' </a>'+
  289. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+keywords+'</a></p>'+
  290. ' </div>'+
  291. ' </div>'+
  292. ' <div class="opr">'+
  293. // ' <a href="./index.php?c=platform&a=reply&do=post&m=keyword&rid=' + material.rid + '" target="_blank" class="del-gray">编辑</a> ' +
  294. ' <a href="javascript:;" data-media="'+material.content+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  295. ' </div>'+
  296. '</div>'+
  297. '</li>'
  298. );
  299. } else if(type == 'module') {
  300. if($.trim(material.name).length == 0) {
  301. return false;
  302. }
  303. $('.keywords-list').append(
  304. '<li>'+
  305. '<div class="del-'+type+'-media">'+
  306. ' <div class="desc">'+
  307. ' <div class="media-content">'+
  308. ' <div class="appmsgSendedItem">'+
  309. ' <a class="title-wrp" href="javascript:;">'+
  310. ' <span class="icon cover" style="background-image:url('+material.icon+');"></span>'+
  311. ' <span class="title">[模块]'+material.title+'</span>'+
  312. ' </a>'+
  313. ' </div>'+
  314. ' </div>'+
  315. ' </div>'+
  316. ' <div class="opr">'+
  317. ' <a href="javascript:;" data-media="'+material.name+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  318. ' </div>'+
  319. '</div>'+
  320. '</li>'
  321. );
  322. replyVal.push(material.name);
  323. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  324. } else {
  325. if(type != 'music' && type != 'wxapp' && ($.trim(material.media_id).length == 0 && $.trim(material.article_id).length == 0) && !(type == 'news' && material.model == 'local')) {
  326. return false;
  327. };
  328. switch(type) {
  329. case 'image':
  330. replyVal.push(angular.toJson(material.media_id));
  331. $('.keywords-list').append(
  332. '<li>'+
  333. '<div class="del-'+type+'-media">'+
  334. ' <div class="desc">'+
  335. ' <div class="media-content">'+
  336. ' <div class="appmsgSendedItem">'+
  337. ' <a class="title-wrp" href="javascript:;">'+
  338. ' <span class="icon cover" style="background-image:url('+material.url+');"></span>'+
  339. ' <span class="title">[图片]</span>'+
  340. ' </a>'+
  341. ' </div>'+
  342. ' </div>'+
  343. ' </div>'+
  344. ' <div class="opr">'+
  345. ' <a href="javascript:;" data-media="'+material.media_id+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  346. ' </div>'+
  347. '</div>'+
  348. '</li>'
  349. );
  350. break;
  351. case 'news':
  352. replyVal.push(angular.toJson({
  353. title: material.items[0].title,
  354. author: material.items[0].author,
  355. description: material.items[0].digest,
  356. thumb: material.items[0].thumb_url,
  357. url: material.items[0].content_source_url ? material.items[0].content_source_url : material.items[0].url,
  358. createtime: material.items[0].createtime,
  359. displayorder: material.items[0].displayorder ? material.items[0].displayorder : 0,
  360. mediaid: material.media_id,
  361. articleid: material.article_id,
  362. model: material.model,
  363. attach_id: material.items[0].attach_id
  364. }));
  365. $('.keywords-list').append(
  366. '<li>'+
  367. '<div class="del-'+type+'-media">'+
  368. ' <div class="desc">'+
  369. ' <div class="media-content">'+
  370. ' <div class="appmsgSendedItem">'+
  371. ' <a class="title-wrp" href="javascript:;">'+
  372. ' <span class="icon cover" style="background-image:url('+material.items[0].thumb_url+');"></span>'+
  373. ' <span class="title">[图文消息]'+material.items[0].title+'<span class="color-red">(多条图文只显示一条)</span></span>'+
  374. ' </a>'+
  375. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+material.items[0].digest+'</a></p>'+
  376. ' </div>'+
  377. ' </div>'+
  378. ' </div>'+
  379. ' <div class="opr">'+
  380. // ' <a href="./index.php?c=platform&a=material-post&type=reply&newsid='+material.id+'" target="_blank" class="del-gray">编辑</a>'+
  381. ' <a href="javascript:;" data-media="'+material.media_id+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  382. ' </div>'+
  383. '</div>'+
  384. '</li>'
  385. );
  386. break;
  387. case 'voice':
  388. replyVal.push(angular.toJson(material.media_id));
  389. $('.keywords-list').append(
  390. '<li>'+
  391. '<div class="del-'+type+'-media">'+
  392. ' <div class="desc">'+
  393. ' <div class="media-content">'+
  394. ' <div class="audio-msg">'+
  395. ' <div class="icon-audio-wrp">'+
  396. ' <span class="icon-audio-msg"></span>'+
  397. ' </div>'+
  398. ' <div class="audio-content">'+
  399. ' <div class="audio-title">[语音]'+material.filename+'</div>'+
  400. ' </div>'+
  401. ' </div>'+
  402. ' </div>'+
  403. ' </div>'+
  404. ' <div class="opr">'+
  405. ' <a href="javascript:;" data-media="'+material.media_id+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  406. ' </div>'+
  407. '</div>'+
  408. '</li>'
  409. );
  410. break;
  411. case 'video':
  412. replyVal.push(angular.toJson({
  413. mediaid: material.media_id,
  414. title: material.tag.title,
  415. description: material.tag.description
  416. }));
  417. $('.keywords-list').append(
  418. '<li>'+
  419. '<div class="del-'+type+'-media">'+
  420. ' <div class="desc">'+
  421. ' <div class="media-content">'+
  422. ' <div class="appmsgSendedItem">'+
  423. ' <a class="title-wrp" href="javascript:;">'+
  424. ' <span class="icon cover" data-contenturl="'+material.tag.down_url+'"></span>'+
  425. ' <span class="title">[视频]'+material.filename+'</span>'+
  426. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+(material.tag.description ? material.tag.description : '--')+'</a></p>'+
  427. ' </a>'+
  428. ' </div>'+
  429. ' </div>'+
  430. ' </div>'+
  431. ' <div class="opr">'+
  432. ' <a href="javascript:;" data-media="'+material.media_id+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  433. ' </div>'+
  434. '</div>'+
  435. '</li>'
  436. );
  437. break;
  438. case 'music':
  439. replyVal.push(angular.toJson({
  440. title: material.title,
  441. url: material.url,
  442. hqurl: material.HQUrl,
  443. description: material.description,
  444. }));
  445. $('.keywords-list').append(
  446. '<li>'+
  447. '<div class="del-'+type+'-media">'+
  448. ' <div class="desc">'+
  449. ' <div class="media-content">'+
  450. ' <div class="appmsgSendedItem">'+
  451. ' <a class="title-wrp" href="javascript:;">'+
  452. ' <span class="icon cover" style="background-image:'+material.url+';"></span>'+
  453. ' <span class="title">[音乐]'+material.title+'</span>'+
  454. ' </a>'+
  455. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+material.description+'</a></p>'+
  456. ' </div>'+
  457. ' </div>'+
  458. ' </div>'+
  459. ' <div class="opr">'+
  460. ' <a href="javascript:;" data-media="'+material.url+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  461. ' </div>'+
  462. '</div>'+
  463. '</li>'
  464. );
  465. break;
  466. case 'wxapp':
  467. if(material.media_id && !material.appid) {
  468. setTimeout(function() {
  469. window.select_mediaid(type, {image: material})
  470. }, 300)
  471. } else {
  472. var length = JSON.parse('[' +$(':hidden[name="reply[reply_'+type+']"]').val() + ']' ).length
  473. replyVal.push(angular.toJson(material));
  474. $('.keywords-list').append(
  475. '<li>'+
  476. '<div class="del-'+type+'-media">'+
  477. ' <div class="desc">'+
  478. ' <div class="media-content">'+
  479. ' <div class="appmsgSendedItem">'+
  480. ' <a class="title-wrp" href="javascript:;">'+
  481. ' <span class="icon cover" style="background-image:url('+material.mediaUrl+');"></span>'+
  482. ' <span class="title">[小程序]'+material.title+'</span>'+
  483. ' <p class="desc"><a href="javascript:;" class="appmsg-desc"></a></p>'+
  484. ' </a>'+
  485. ' </div>'+
  486. ' </div>'+
  487. ' </div>'+
  488. ' <div class="opr">'+
  489. ' <a href="javascript:;" data-media="'+(length)+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  490. ' </div>'+
  491. '</div>'+
  492. '</li>'
  493. );
  494. }
  495. break;
  496. }
  497. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  498. }
  499. //显示隐藏-start
  500. if((action == 'qr' || action == 'mass' || m == 'special' || m == 'welcome' || m == 'default') && replyVal.length > 0) {
  501. $('.we7-select-msg').addClass('hide');
  502. }
  503. //显示隐藏-end
  504. }, option);
  505. };
  506. window.initReplyController = function($scope) {
  507. $scope.context = {};
  508. $scope.context.items = {php echo json_encode($replies)};
  509. var newsMediaIds = [];
  510. var module_name = [];
  511. var keyword_rids = [];
  512. angular.forEach($scope.context.items, function(val, key){
  513. var replyVal = [];
  514. var type = key;
  515. switch(type) {
  516. case 'basic':
  517. angular.forEach(val, function(basicVal, basicKey) {
  518. replyVal.push(angular.toJson(basicVal.content));
  519. $('.keywords-list').append(
  520. '<li>'+
  521. '<div class="del-'+type+'-media">'+
  522. ' <div class="desc">'+
  523. ' <div class="media-content">'+
  524. ' <span data-toggle="tooltip" data-placement="bottom" title="'+htmlEncode(basicVal.content)+'">'+htmlEncode(cutStr(basicVal.content,60))+'</span>'+
  525. ' </div>'+
  526. ' </div>'+
  527. ' <div class="opr">'+
  528. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(basicVal.content))+'" class="edit-gray" onclick="select_mediaid(\'basic\', '+htmlEncode(angular.toJson(basicVal.content))+')">编辑</a>'+
  529. ' <a href="javascript:;" data-media="'+htmlEncode(angular.toJson(basicVal.content))+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  530. ' </div>'+
  531. '</div>'+
  532. '</li>'
  533. );
  534. });
  535. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  536. break;
  537. case 'news':
  538. angular.forEach(val, function(newsVal, newsKey) {
  539. var index = _.indexOf(newsMediaIds, newsVal.media_id);
  540. replyVal.push(angular.toJson({
  541. title: newsVal.title,
  542. author: newsVal.author,
  543. description: newsVal.description ? newsVal.description : newsVal.digest,
  544. thumb: newsVal.thumb ? newsVal.thumb : newsVal.thumb_url,
  545. url: newsVal.url,
  546. createtime: newsVal.createtime,
  547. displayorder: newsVal.displayorder ? newsVal.displayorder : 0,
  548. incontent: newsVal.incontent ? newsVal.incontent : 0,
  549. parent_id: newsVal.parent_id ? newsVal.parent_id : 0,
  550. mediaid: newsVal.media_id,
  551. attach_id: newsVal.attach_id,
  552. model: newsVal.model
  553. }));
  554. if (index == -1) {
  555. $('.keywords-list').append(
  556. '<li>'+
  557. '<div class="del-'+type+'-media">'+
  558. ' <div class="desc">'+
  559. ' <div class="media-content">'+
  560. ' <div class="appmsgSendedItem">'+
  561. ' <a class="title-wrp" href="javascript:;">'+
  562. ' <span class="icon cover" style="background-image:url('+(newsVal.thumb ? newsVal.thumb : newsVal.thumb_url)+');"></span>'+
  563. ' <span class="title">[图文消息]'+newsVal.title+(!newsVal.attach_id ? '<span class="color-red">(素材不存在或已被删除)</span>' : '')+
  564. ' </span>'+
  565. ' </a>'+
  566. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+(newsVal.description ? newsVal.description : '')+'</a></p>'+
  567. ' </div>'+
  568. ' </div>'+
  569. ' </div>'+
  570. ' <div class="opr">'+
  571. // '<a href="./index.php?c=platform&a=material-post&type=reply&newsid='+(newsVal.attach_id ? newsVal.attach_id : '')+'&reply_news_id='+newsVal.id+'" target="_blank" class="del-gray">编辑</a>' +
  572. ' <a href="javascript:;" data-media="'+newsVal.media_id+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  573. ' </div>'+
  574. '</div>'+
  575. '</li>'
  576. );
  577. newsMediaIds.push(newsVal.media_id);
  578. }
  579. });
  580. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  581. break;
  582. case 'image':
  583. angular.forEach(val, function(imageVal, imageKey) {
  584. replyVal.push(angular.toJson(imageVal.mediaid));
  585. $('.keywords-list').append(
  586. '<li>'+
  587. '<div class="del-'+type+'-media">'+
  588. ' <div class="desc">'+
  589. ' <div class="media-content">'+
  590. ' <div class="appmsgSendedItem">'+
  591. ' <a class="title-wrp" href="javascript:;">'+
  592. ' <span class="icon cover" style="background-image:url('+imageVal.img_url+');"></span>'+
  593. ' <span class="title">[图片]</span>'+
  594. ' </a>'+
  595. ' </div>'+
  596. ' </div>'+
  597. ' </div>'+
  598. ' <div class="opr">'+
  599. ' <a href="javascript:;" data-media="'+imageVal.mediaid+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  600. ' </div>'+
  601. '</div>'+
  602. '</li>'
  603. );
  604. });
  605. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  606. break;
  607. case 'voice':
  608. angular.forEach(val, function(voiceVal, voiceKey) {
  609. replyVal.push(angular.toJson(voiceVal.mediaid));
  610. $('.keywords-list').append(
  611. '<li>'+
  612. '<div class="del-'+type+'-media">'+
  613. ' <div class="desc">'+
  614. ' <div class="media-content">'+
  615. ' <div class="audio-msg">'+
  616. ' <div class="icon-audio-wrp">'+
  617. ' <span class="icon-audio-msg"></span>'+
  618. ' </div>'+
  619. ' <div class="audio-content">'+
  620. ' <div class="audio-title">[语音]'+voiceVal.title+'</div>'+
  621. ' </div>'+
  622. ' </div>'+
  623. ' </div>'+
  624. ' </div>'+
  625. ' <div class="opr">'+
  626. ' <a href="javascript:;" data-media="'+voiceVal.mediaid+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  627. ' </div>'+
  628. '</div>'+
  629. '</li>'
  630. );
  631. });
  632. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  633. break;
  634. case 'video':
  635. angular.forEach(val, function(videoVal, videoKey) {
  636. replyVal.push(angular.toJson({
  637. mediaid: videoVal.mediaid,
  638. title: videoVal.title,
  639. description: videoVal.description
  640. }));
  641. $('.keywords-list').append(
  642. '<li>'+
  643. '<div class="del-'+type+'-media">'+
  644. ' <div class="desc">'+
  645. ' <div class="media-content">'+
  646. ' <div class="appmsgSendedItem">'+
  647. ' <a class="title-wrp" href="javascript:;">'+
  648. ' <span class="icon cover" data-contenturl="'+videoVal.down_url+'"></span>'+
  649. ' <span class="title">[视频]'+(videoVal.filename ? videoVal.filename : '--')+'</span>'+
  650. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+(videoVal.description ? videoVal.description : '--')+'</a></p>'+
  651. ' </a>'+
  652. ' </div>'+
  653. ' </div>'+
  654. ' </div>'+
  655. ' <div class="opr">'+
  656. ' <a href="javascript:;" data-media="'+videoVal.mediaid+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  657. ' </div>'+
  658. '</div>'+
  659. '</li>'
  660. );
  661. });
  662. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  663. break;
  664. case 'wxapp':
  665. angular.forEach(val, function(material, videoKey) {
  666. replyVal.push(angular.toJson(material));
  667. $('.keywords-list').append(
  668. '<li>'+
  669. '<div class="del-'+type+'-media">'+
  670. ' <div class="desc">'+
  671. ' <div class="media-content">'+
  672. ' <div class="appmsgSendedItem">'+
  673. ' <a class="title-wrp" href="javascript:;">'+
  674. ' <span class="icon cover" style="background-image:url('+material.thumb_url+');"></span>'+
  675. ' <span class="title">[小程序]'+material.title+'</span>'+
  676. ' <p class="desc"><a href="javascript:;" class="appmsg-desc"></a></p>'+
  677. ' </a>'+
  678. ' </div>'+
  679. ' </div>'+
  680. ' </div>'+
  681. ' <div class="opr">'+
  682. ' <a href="javascript:;" data-media="'+videoKey+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  683. ' </div>'+
  684. '</div>'+
  685. '</li>'
  686. );
  687. });
  688. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  689. break;
  690. case 'keyword':
  691. angular.forEach(val, function(keywordVal, keywordKey) {
  692. replyVal.push(angular.toJson(keywordVal.id));
  693. var keywords = '&nbsp;&nbsp;' + keywordVal.content;
  694. $('.keywords-list').append(
  695. '<li>'+
  696. '<div class="del-'+type+'-media">'+
  697. ' <div class="desc">'+
  698. ' <div class="media-content">'+
  699. ' <a class="title-wrp" href="javascript:;">'+
  700. ' <span class="title">[关键字]'+keywordVal.name+'</span>'+
  701. ' </a>'+
  702. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+keywords+'</a></p>'+
  703. ' </div>'+
  704. ' </div>'+
  705. ' <div class="opr">'+
  706. // '<a href="./index.php?c=platform&a=reply&do=post&m=keyword&rid=' + keywordVal.rid + '" target="_blank" class="del-gray">编辑</a> ' +
  707. '<a href="javascript:;" data-media="'+keywordVal.name+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  708. ' </div>'+
  709. '</div>'+
  710. '</li>'
  711. );
  712. keyword_rids.push(keywordVal.id);
  713. });
  714. $(':hidden[name="reply[reply_'+type+']"]').val(keyword_rids);
  715. break;
  716. case 'module':
  717. angular.forEach(val, function(keywordVal, keywordKey) {
  718. replyVal.push(angular.toJson(keywordVal.rid));
  719. var keywords = '&nbsp;&nbsp;' + keywordVal.content;
  720. $('.keywords-list').append(
  721. '<li>'+
  722. '<div class="del-'+type+'-media">'+
  723. ' <div class="desc">'+
  724. ' <div class="media-content">'+
  725. ' <div class="appmsgSendedItem">'+
  726. ' <a class="title-wrp" href="javascript:;">'+
  727. ' <span class="icon cover" style="background-image:url('+keywordVal.icon+');"></span>'+
  728. ' <span class="title">[模块]'+keywordVal.title+'</span>'+
  729. ' </a>'+
  730. ' </div>'+
  731. ' </div>'+
  732. ' </div>'+
  733. ' <div class="opr">'+
  734. ' <a href="javascript:;" data-media="'+keywordVal.name+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  735. ' </div>'+
  736. '</div>'+
  737. '</li>'
  738. );
  739. module_name.push(keywordVal.name);
  740. });
  741. $(':hidden[name="reply[reply_'+type+']"]').val(module_name);
  742. break;
  743. case 'music':
  744. angular.forEach(val, function(musicVal, musicKey) {
  745. replyVal.push(angular.toJson({
  746. title: musicVal.title,
  747. url: musicVal.url,
  748. hqurl: musicVal.hqurl,
  749. description: musicVal.description,
  750. }));
  751. $('.keywords-list').append(
  752. '<li>'+
  753. '<div class="del-'+type+'-media">'+
  754. ' <div class="desc">'+
  755. ' <div class="media-content">'+
  756. ' <div class="appmsgSendedItem">'+
  757. ' <a class="title-wrp" href="javascript:;">'+
  758. ' <span class="icon cover" style="background-image:'+musicVal.url+';"></span>'+
  759. ' <span class="title">[音乐]'+musicVal.title+'</span>'+
  760. ' </a>'+
  761. ' <p class="desc"><a href="javascript:;" class="appmsg-desc">'+musicVal.description+'</a></p>'+
  762. ' </div>'+
  763. ' </div>'+
  764. ' </div>'+
  765. ' <div class="opr">'+
  766. ' <a href="javascript:;" data-media="'+musicVal.url+'" class="del-gray" onclick="delmedia(\''+type+'\', this)">删除</a>'+
  767. ' </div>'+
  768. '</div>'+
  769. '</li>'
  770. );
  771. });
  772. $(':hidden[name="reply[reply_'+type+']"]').val(replyVal);
  773. break;
  774. }
  775. //显示隐藏-start
  776. if((action == 'qr' || action == 'mass' || m == 'special' || m == 'welcome' || m == 'default') && replyVal.length > 0) {
  777. $('.we7-select-msg').addClass('hide');
  778. }
  779. //显示隐藏-end
  780. });
  781. };
  782. function htmlEncode(str) {
  783. var s = "";
  784. if(str.length == 0) return "";
  785. s = str.replace(/&/g,"&amp;");
  786. s = s.replace(/</g,"&lt;");
  787. s = s.replace(/>/g,"&gt;");
  788. s = s.replace(/\'/g,"&#039;");
  789. s = s.replace(/\"/g,"&quot;");
  790. s = s.replace(/\n/g, "\\n");
  791. return s;
  792. }
  793. function htmlDecode(str) {
  794. var s = "";
  795. if(str.length == 0) return "";
  796. s = str.replace(/&amp;/g,"&");
  797. s = s.replace(/&lt;/g,"<");
  798. s = s.replace(/&gt;/g,">");
  799. s = s.replace(/&#039;/g,"'");
  800. s = s.replace(/&quot;/g,'"');
  801. s = s.replace(/\\n/g,'\n');
  802. return s;
  803. }
  804. function cutStr(str, len) {
  805. var str_length = 0;
  806. var str_len = 0;
  807. str_cut = new String();
  808. str_len = str.length;
  809. for (var i = 0; i < str_len; i++) {
  810. a = str.charAt(i);
  811. str_length++;
  812. if (escape(a).length > 4) {
  813. //中文字符的长度经编码之后大于4
  814. str_length++;
  815. }
  816. str_cut = str_cut.concat(a);
  817. if (str_length >= len) {
  818. str_cut = str_cut.concat("...");
  819. return str_cut;
  820. }
  821. }
  822. //如果给定字符串小于指定长度,则返回源字符串;
  823. if (str_length < len) {
  824. return str;
  825. }
  826. }
  827. $(document).on("mouseover","body",function(){
  828. $("[data-toggle='tooltip']").tooltip();
  829. });
  830. </script>
  831. <style lang="scss">
  832. .we7-select-msg ul li.tab-nav {
  833. width: 160px !important;
  834. padding: 10px 0 !important;
  835. }
  836. </style>