form.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. {extend name="../../admin/view/main"}
  2. {block name="style"}
  3. <style>
  4. .keys-container .layui-card {
  5. width: 580px;
  6. height: 578px;
  7. position: absolute;
  8. border: 1px solid #ccc
  9. }
  10. .keys-container .layui-card .layui-card-body {
  11. height: 495px;
  12. padding-right: 50px
  13. }
  14. .keys-container .layui-card .layui-card-body [data-tips-image] {
  15. width: 112px;
  16. height: auto
  17. }
  18. .keys-container .layui-card .layui-card-body .layui-form-label {
  19. width: 60px;
  20. color: #6c6c6c;
  21. font-weight: 700;
  22. }
  23. .keys-container .layui-card .layui-card-body .layui-form-label + .layui-input-block {
  24. margin-left: 100px;
  25. }
  26. </style>
  27. {/block}
  28. {block name="content"}
  29. <div class="nowrap think-box-shadow" style="width:910px">
  30. <div class='mobile-preview inline-block'>
  31. <div class='mobile-header'>公众号</div>
  32. <div class='mobile-body' data-iframe-box></div>
  33. </div>
  34. <div class="keys-container inline-block absolute margin-left-10 margin-right-15">
  35. <form class="layui-form" onsubmit="return false" autocomplete="off" data-auto="true" action="{:request()->url()}" method="post">
  36. <div class="layui-card relative">
  37. <div class="layui-card-header layui-bg-gray text-center">编辑关键字</div>
  38. <div class="layui-card-body">
  39. <!--{if !isset($vo.keys) or ($vo.keys neq 'default' and $vo.keys neq 'subscribe')}-->
  40. <div class="layui-form-item margin-top-10">
  41. <label class="layui-form-label">关 键 字</label>
  42. <div class="layui-input-block">
  43. <input required placeholder='请输入关键字' maxlength='20' name='keys' class="layui-input" value='{$vo.keys|default=""}'>
  44. </div>
  45. </div>
  46. <!--{else}-->
  47. <input type="hidden" name="keys" value="{$vo.keys|default=''}">
  48. <!--{/if}-->
  49. <div class="layui-form-item">
  50. <label class="layui-form-label label-required">规则状态</label>
  51. <div class="layui-input-block">
  52. {foreach ['1'=>'启用','0'=>'禁用'] as $k=>$v}
  53. <label class="think-radio">
  54. <!--{if (!isset($vo.status) and $k eq '1') or (isset($vo.status) and $vo.status eq $k)}-->
  55. <input type="radio" checked name="status" value="{$k}"> {$v}
  56. <!--{else}-->
  57. <input type="radio" name="status" value="{$k}"> {$v}
  58. <!--{/if}-->
  59. </label>
  60. {/foreach}
  61. </div>
  62. </div>
  63. <div class="layui-form-item">
  64. <label class="layui-form-label label-required">消息类型</label>
  65. <div class="layui-input-block">
  66. {foreach $types as $k=>$v}
  67. <label class="think-radio">
  68. <!--{if (!isset($vo.type) and $k eq 'text') or (isset($vo.type) and$vo.type eq $k)}-->
  69. <input name="type" checked type="radio" value="{$k}"> {$v}
  70. <!--{else}-->
  71. <input name="type" type="radio" value="{$k}"> {$v}
  72. <!--{/if}-->
  73. </label>
  74. {/foreach}
  75. </div>
  76. </div>
  77. <div class="layui-form-item" data-keys-type='text'>
  78. <label class="layui-form-label">回复文字</label>
  79. <div class="layui-input-block">
  80. <textarea name="content" required placeholder="请输入回复文字" maxlength="10000" class="layui-textarea">{$vo.content|raw|default='说点什么吧'}</textarea>
  81. </div>
  82. </div>
  83. <div class="layui-form-item" data-keys-type='news'>
  84. <label class="layui-form-label label-required">选取图文</label>
  85. <div class="layui-input-block">
  86. <input type="hidden" name="news_id" value="{$vo.news_id|default=0}">
  87. <a class="layui-btn layui-btn-sm layui-btn-primary" data-title="选择图文" data-iframe="{:url('wechat/news/select')}?field={:encode('news_id')}">选择图文</a>
  88. </div>
  89. </div>
  90. <div class="layui-form-item" data-keys-type='image'>
  91. <label class="layui-form-label label-required">图片地址</label>
  92. <div class="layui-input-block">
  93. <input class="layui-input padding-right-30" onchange="$(this).nextAll('img').attr('src', this.value)" value="{$vo.image_url|default=$defaultImage}" name="image_url" required placeholder="请上传图片或输入图片URL地址  ">
  94. <a data-file="btn" data-type="bmp,png,jpeg,jpg,gif" data-field="image_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
  95. <p class="help-block">文件最大2Mb,支持bmp/png/jpeg/jpg/gif格式</p>
  96. <img data-tips-image src='{$vo.image_url|default=$defaultImage}' alt="img">
  97. </div>
  98. </div>
  99. <div class="layui-form-item" data-keys-type='voice'>
  100. <label class="layui-form-label">上传语音</label>
  101. <div class="layui-input-block">
  102. <input class='layui-input padding-right-30' value="{$vo.voice_url|default=''}" name="voice_url" required title="请上传语音文件或输入语音URL地址  ">
  103. <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="voice_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
  104. <p class="help-block">文件最大2Mb,播放长度不超过60s,mp3/wma/wav/amr格式</p>
  105. </div>
  106. </div>
  107. <div class="layui-form-item" data-keys-type='music'>
  108. <label class="layui-form-label">音乐标题</label>
  109. <div class="layui-input-block">
  110. <input class='layui-input' value="{$vo.music_title|default='音乐标题'}" name="music_title" required title="请输入音乐标题">
  111. </div>
  112. </div>
  113. <div class="layui-form-item" data-keys-type='music'>
  114. <label class="layui-form-label label-required">上传音乐</label>
  115. <div class="layui-input-block">
  116. <input class='layui-input padding-right-30' value="{$vo.music_url|default=''}" name="music_url" required title="请上传音乐文件或输入音乐URL地址  ">
  117. <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="music_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
  118. </div>
  119. </div>
  120. <div class="layui-form-item" data-keys-type='music'>
  121. <label class="layui-form-label">音乐描述</label>
  122. <div class="layui-input-block">
  123. <input name="music_desc" class="layui-input" value="{$vo.music_desc|default='音乐描述'|raw}">
  124. </div>
  125. </div>
  126. <div class="layui-form-item" data-keys-type='music'>
  127. <label class="layui-form-label">音乐图片</label>
  128. <div class="layui-input-block">
  129. <input class="layui-input padding-right-30" value="{$vo.music_image|default=$defaultImage}" name="music_image" required title="请上传音乐图片或输入音乐图片URL地址  ">
  130. <a data-file="btn" data-type="jpg,png" data-field="music_image" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
  131. <p class="help-block">文件最大64KB,只支持JPG格式</p>
  132. </div>
  133. </div>
  134. <div class="layui-form-item" data-keys-type='video'>
  135. <label class="layui-form-label">视频标题</label>
  136. <div class="layui-input-block">
  137. <input class='layui-input' value="{$vo.video_title|default='视频标题'}" name="video_title" required placeholder="请输入视频标题">
  138. </div>
  139. </div>
  140. <div class="layui-form-item" data-keys-type='video'>
  141. <label class="layui-form-label">上传视频</label>
  142. <div class="layui-input-block">
  143. <input class='layui-input padding-right-30' value="{$vo.video_url|default=''}" name="video_url" required title="请上传视频或输入音乐视频URL地址  ">
  144. <a data-file="btn" data-type="mp4" data-field="video_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
  145. <p class="help-block">文件最大10MB,只支持MP4格式</p>
  146. </div>
  147. </div>
  148. <div class="layui-form-item" data-keys-type='video'>
  149. <label class="layui-form-label">视频描述</label>
  150. <div class="layui-input-block">
  151. <input value="{$vo.video_desc|default='视频描述'}" name="video_desc" maxlength="50" class="layui-input">
  152. </div>
  153. </div>
  154. <div class="text-center padding-bottom-10 absolute full-width" style="bottom:0;margin-left:-15px">
  155. <div class="hr-line-dashed margin-top-10 margin-bottom-10"></div>
  156. <button class="layui-btn menu-submit">保存数据</button>
  157. <!--{if !isset($vo.keys) || !in_array($vo.keys,['default','subscribe'])}-->
  158. <button data-history-back class="layui-btn layui-btn-danger" type='button'>取消编辑</button>
  159. <!--{/if}-->
  160. {if isset($vo['id'])}<input type='hidden' value='{$vo.id}' name='id'>{/if}
  161. </div>
  162. </div>
  163. </div>
  164. </form>
  165. </div>
  166. </div>
  167. {/block}
  168. {block name="script"}
  169. <script>
  170. (function ($body) {
  171. /*! 刷新预览显示 */
  172. function showReview(params, location) {
  173. if (params['type'] === 'news') {
  174. location = '{:url("@wechat/api.view/news")}?id=_id_'.replace('_id_', params.content);
  175. } else {
  176. location = '{:url("@wechat/api.view/_type_")}?'.replace('_type_', params.type) + $.param(params || {});
  177. }
  178. var iframe = '<iframe id="phone-preview" frameborder="0" marginheight="0" marginwidth="0"></iframe>';
  179. $('[data-iframe-box]').empty().append($(iframe).attr('src', location));
  180. }
  181. $body.off('change', '[name="news_id"]').on('change', '[name="news_id"]', function () {
  182. /*! 图文显示预览 */
  183. showReview({type: 'news', content: this.value});
  184. }).off('change', '[name="content"]').on('change', '[name="content"]', function () {
  185. /*! 文字显示预览 */
  186. showReview({type: 'text', content: this.value});
  187. }).off('change', '[name="image_url"]').on('change', '[name="image_url"]', function () {
  188. /*! 图片显示预览 */
  189. showReview({type: 'image', content: this.value});
  190. }).off('change', '[name="voice_url"]').on('change', '[name="voice_url"]', function () {
  191. /*! 语音显示预览 */
  192. showReview({type: 'voice', content: this.value});
  193. });
  194. /*! 音乐显示预览 */
  195. var musicSelector = '[name="music_url"],[name="music_title"],[name="music_desc"],[name="music_image"]';
  196. $body.off('change', musicSelector).on('change', musicSelector, function () {
  197. var params = {type: 'music'}, $parent = $(this).parents('form');
  198. params.url = $parent.find('[name="music_url"]').val();
  199. params.desc = $parent.find('[name="music_desc"]').val();
  200. params.title = $parent.find('[name="music_title"]').val();
  201. params.image = $parent.find('[name="music_image"]').val();
  202. showReview(params);
  203. });
  204. /*! 视频显示预览 */
  205. var videoSelector = '[name="video_title"],[name="video_url"],[name="video_desc"]';
  206. $body.off('change', videoSelector).on('change', videoSelector, function () {
  207. var params = {type: 'video'}, $parent = $(this).parents('form');
  208. params.url = $parent.find('[name="video_url"]').val();
  209. params.desc = $parent.find('[name="video_desc"]').val();
  210. params.title = $parent.find('[name="video_title"]').val();
  211. showReview(params);
  212. });
  213. /*! 默认类型事件 */
  214. $body.off('click', 'input[name=type]').on('click', 'input[name=type]', function () {
  215. var value = $(this).val(), $form = $(this).parents('form');
  216. if (value === 'customservice') value = 'text';
  217. var $current = $form.find('[data-keys-type="' + value + '"]').removeClass('layui-hide');
  218. $form.find('[data-keys-type]').not($current).addClass('layui-hide');
  219. switch (value) {
  220. case 'news':
  221. return $('[name="news_id"]').trigger('change');
  222. case 'text':
  223. case 'customservice':
  224. return $('[name="content"]').trigger('change');
  225. case 'image':
  226. return $('[name="image_url"]').trigger('change');
  227. case 'video':
  228. return $('[name="video_url"]').trigger('change');
  229. case 'music':
  230. return $('[name="music_url"]').trigger('change');
  231. case 'voice':
  232. return $('[name="voice_url"]').trigger('change');
  233. }
  234. });
  235. /*! 默认事件触发 */
  236. $('input[name=type]:checked').map(function () {
  237. $(this).trigger('click');
  238. });
  239. })($('body'));
  240. </script>
  241. {/block}