news.form.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. {extend name='extra@admin/content'}
  2. {block name='content'}
  3. <!--左侧图文列表 开始-->
  4. <div class="panel panel-default news-left">
  5. <div class="panel-heading">图文列表</div>
  6. <div class="panel-body news-box">
  7. {if empty($vo['articles']) eq false}
  8. {foreach $vo.articles as $key=>$value}
  9. <div class="news-item transition" data-id="{$value.id}" style="background-image:url('{$value.local_url}?imageView2/1/w/338/h/190/interlace/1')">
  10. <a class="upload-multiple-close fa fa-close hide"></a>
  11. <span class="news-title">{$value.title}</span>
  12. </div>
  13. <hr/>
  14. {/foreach}
  15. {else}
  16. <div class="news-item transition active news-image" style="background-image:url('__STATIC__/plugs/uploader/theme/image.png')">
  17. <a class="upload-multiple-close fa fa-close hide"></a>
  18. <span class="news-title"></span>
  19. </div>
  20. <hr/>
  21. {/if}
  22. <a href="javascript:void(0)" class='article-add transition' data-text-tip="添加图文"><i class="fa fa-plus"></i></a>
  23. </div>
  24. </div>
  25. <!--左侧图文列表 结束-->
  26. <!--右侧编辑区 开始-->
  27. <div class="panel panel-default news-right" style="overflow:hidden">
  28. <div class="panel-heading">图文内容编辑</div>
  29. <div class="panel-body">
  30. <form class="form-horizontal" role="form" name="news" onsubmit="return false;">
  31. <div class="form-group">
  32. <div class="col-md-12">
  33. <div class="input-group">
  34. <span class="input-group-addon">标题</span>
  35. <input maxlength="64" required="required" title="标题不能为空哦" placeholder="请在这里输入标题" name='title' class="layui-input">
  36. <input type="hidden" name="id">
  37. </div>
  38. </div>
  39. </div>
  40. <div class="form-group">
  41. <div class="col-md-12">
  42. <div class="input-group">
  43. <span class="input-group-addon">作者</span>
  44. <input maxlength="8" required="required" title="作者不能为空哦" placeholder="请输入作者" name='author' class="layui-input">
  45. </div>
  46. </div>
  47. </div>
  48. <div class="form-group">
  49. <div class="col-md-12">
  50. <div class="form-control" style="height:auto">
  51. <label style="color:#ccc">图文封面大图片设置</label>
  52. <div class="row nowrap">
  53. <div class="col-xs-3" style="width:160px">
  54. <div class="upload-image-box transition">
  55. <input value="__STATIC__/plugs/uploader/theme/image.png" type="hidden" name="local_url">
  56. </div>
  57. </div>
  58. <div class="col-xs-6">
  59. <br>
  60. <a data-file="one" data-type="jpg,png,jpeg" data-field="local_url" class="btn btn-sm">上传图片</a>
  61. <a data-iframe='{:url("image")}?field=local_url' class="btn btn-sm">选择图片</a>
  62. <br><br>
  63. <label style="margin-left:0;padding-left:10px">
  64. <input data-auto-none type="checkbox" value="1" name="show_cover_pic">
  65. 在正文显示此图片
  66. </label>
  67. </div>
  68. </div>
  69. <p class="help-block" style="margin-top:10px;color:#ccc">封面大图片建议尺寸:900像素 * 500像素</p>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="form-group">
  74. <div class="col-md-12">
  75. <textarea name='content'></textarea>
  76. </div>
  77. </div>
  78. <div class="form-group">
  79. <div class="col-md-12">
  80. <label style="color:#aaa">摘要选填,如果不填写会默认抓取正文前54个字</label>
  81. <textarea name="digest" class="layui-input" style="height:80px;resize:none;line-height:20px"></textarea>
  82. </div>
  83. </div>
  84. <div class="form-group">
  85. <div class="col-md-12">
  86. <label style="display:block"><span style="color:#aaa;">原文链接<b>选填</b>,填写之后在图文左下方会出现此链接</span>
  87. <input maxlength="200" name='content_source_url' class="layui-input">
  88. </label>
  89. </div>
  90. </div>
  91. <div class="form-actions">
  92. <div class="row">
  93. <div class="col-md-offset-4 col-md-9">
  94. <button data-submit type="button" class="layui-btn">保存图文</button>
  95. </div>
  96. </div>
  97. </div>
  98. </form>
  99. </div>
  100. </div>
  101. <!--右侧编辑区 结束-->
  102. {/block}
  103. {block name='script'}
  104. <script>
  105. $(function () {
  106. var editDdata = {$vo.articles | default = [] | json_encode};
  107. for (var i in editDdata) {
  108. $('.news-item').eq(i).data('item', editDdata[i]);
  109. }
  110. $('body').on('change', '.upload-image-box input', function () {
  111. $('.news-item.active').css('background-image', 'url(' + this.value + ')');
  112. $(this).parent('.upload-image-box').css('background-image', 'url(' + this.value + ')');
  113. });
  114. /*! 实例富文本编辑器 */
  115. var editor, $item;
  116. /*! 默认编辑第一篇图文 */
  117. editor = window.createEditor('[name="content"]');
  118. var $form = $('form[name="news"]'), $body = $('body');
  119. $form.validate();
  120. /*! 数据提交 */
  121. $form.find('button[data-submit]').on('click', function () {
  122. var data = [];
  123. $form.submit();
  124. if (!syncEditor($('.news-item.active'))) {
  125. editor.setData('文章内容不能留空,请输入内容!');
  126. return false;
  127. }
  128. $('.news-item').map(function () {
  129. var item = $(this).data('item');
  130. item.content = item.content || '文章内容不能留空,请输入内容!';
  131. data.push(item);
  132. });
  133. $.form.load('__SELF__', {data: data}, "post");
  134. });
  135. /*! 输入标题显示 */
  136. $form.find('[name="title"]').on('keyup', function () {
  137. if ($item) {
  138. $item.find('.news-title').html(this.value).show();
  139. }
  140. });
  141. /*! 同步编辑器 */
  142. function syncEditor($pItem) {
  143. // 处理上一个编辑器
  144. if ($form && $pItem && $pItem.size() > 0) {
  145. var data = {};
  146. data.id = $form.find('[name=id]').val();
  147. data.title = $form.find('[name=title]').val();
  148. data.local_url = $form.find('[name=local_url]').val();
  149. data.content = editor.getData() || '';
  150. data.author = $form.find('[name=author]').val();
  151. data.digest = $form.find('[name=digest]').val();
  152. data.show_cover_pic = $form.find('[name="show_cover_pic"]').get(0).checked ? 1 : 0;
  153. data.content_source_url = $form.find('[name="content_source_url"]').val();
  154. $form.find('[name=local_url]').trigger('change');
  155. $pItem.data('item', data), $form.submit();
  156. if ($form.find('input.validate-error').size() > 0 || data.content.length < 1) {
  157. ((data.content || '').length < 1) && editor.setData('文章内容不能留空,请输入内容!');
  158. $pItem.addClass('active').siblings().removeClass('active');
  159. return false;
  160. }
  161. }
  162. return true;
  163. }
  164. /*! 显示编辑器 */
  165. function showEditor() {
  166. // 读取对象数据
  167. $item = $('.news-item.active');
  168. this.get = function () {
  169. var data = $item.data('item') || {};
  170. data.id = data.id || 0;
  171. data.title = data.title || '';
  172. data.local_url = data.local_url || '__STATIC__/plugs/uploader/theme/image.png';
  173. data.content = data.content || '';
  174. data.author = data.author || '';
  175. data.digest = data.digest || '';
  176. data.content_source_url = data.content_source_url||'';
  177. data.show_cover_pic = data.show_cover_pic || 0;
  178. return data;
  179. };
  180. // 重置表单
  181. $form.get(0).reset();
  182. // 获取当前数据
  183. var data = this.get();
  184. for (var i in data) {
  185. if (i !== 'content' && i !== 'show_cover_pic') {
  186. $form.find('[name="' + i + '"]').val(data[i]).trigger('change');
  187. }
  188. }
  189. if (parseInt(data.show_cover_pic) === 1) {
  190. $form.find('[name="show_cover_pic"]').get(0).checked = true;
  191. }
  192. editor.setData(data.content);
  193. }
  194. /*! 添加新图文 */
  195. $body.off('click', '.news-box .article-add').on('click', '.news-box .article-add', function () {
  196. var $html = $('<div class="news-item transition" style="background-image:url(__STATIC__/plugs/uploader/theme/image.png)"><a class="upload-multiple-close fa fa-close hide"></a><span class="news-title"></span></div><hr />');
  197. $html.insertBefore(this).trigger('click');
  198. $('.news-item').size() >= 7 && $(this).hide();
  199. });
  200. /*! 列表选择 */
  201. $body.off('click', '.news-item').on('click', '.news-item', function () {
  202. if (syncEditor($('.news-item.active'))) {
  203. $(this).addClass('active').siblings().removeClass('active');
  204. showEditor($item);
  205. }
  206. });
  207. /*! 隐藏删除按钮 */
  208. $body.off('mouseleave').on('mouseleave', '.news-item', function () {
  209. $(this).find('.upload-multiple-close').addClass('hide');
  210. });
  211. /*! 显示删除按钮 */
  212. $body.off('mouseenter', '.news-item').on('mouseenter', '.news-item', function () {
  213. $('.upload-multiple-close').addClass('hide');
  214. $(this).find('.upload-multiple-close').removeClass('hide');
  215. });
  216. /*! 删除操作图文 */
  217. $body.off('click', '.upload-multiple-close').on('click', '.upload-multiple-close', function () {
  218. var $box = $(this).parents('.news-item');
  219. $box.add($box.next('hr')).remove();
  220. $('.news-item').size() < 7 && $('.news-box .article-add').show();
  221. });
  222. /*! 默认显示第一个 */
  223. $('.news-box .news-item:first').trigger('click');
  224. });
  225. </script>
  226. {/block}
  227. {block name="style"}
  228. <style>
  229. .panel{border-radius:0}
  230. .news-left {left:20px;width:300px;position:absolute;}
  231. .news-right {position:absolute;left:330px;right:20px;}
  232. .news-left .news-item {position:relative;width:280px;height:150px;max-width:270px;overflow:hidden;border:1px solid #ccc;background-size:cover;background-position:center center;}
  233. .news-left .news-item.active {border:1px solid #44b549 !important;}
  234. .news-left .article-add {font-size:22px;text-align:center;display:block;color:#999;}
  235. .news-left .article-add:hover{color:#666;}
  236. .news-left .news-title{bottom:0;width:272px;color:#fff;display:block;padding:0 5px;overflow:hidden;position:absolute;margin-left:-1px;text-overflow:ellipsis;max-height:6em;background:rgba(0,0,0,0.7);}
  237. .news-right .layui-input{border-radius:0;border:1px solid #e5e6e7;}
  238. .news-right .layui-input:hover, .news-right .layui-input:focus{border-color:#e5e6e7!important;}
  239. .news-right .input-group-addon{background:#fff;border-radius:0;border-color:#e5e6e7;}
  240. .news-right .upload-image-box{width:130px;height:90px;background-size:cover;background-position:center center;border:1px solid rgba(125,125,125,0.1);margin:5px}
  241. .news-item .upload-multiple-close{width:30px;height:30px;line-height:30px;text-align:center;background-color:rgba(0,0,0,.5);color:#fff;float:right;margin-right:-1px;margin-top:-1px}
  242. .news-item .upload-multiple-close:hover{text-decoration:none}
  243. </style>
  244. {/block}