require-form.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], function ($, undefined, Backend, Toastr, Upload, Validator) {
  2. var Form = {
  3. config: {
  4. },
  5. api: {
  6. submit: function (form, onBeforeSubmit, onAfterSubmit) {
  7. if (form.size() == 0)
  8. return Toastr.error("表单未初始化完成,无法提交");
  9. //提交前事件
  10. var beforeSubmit = form.data("before-submit");
  11. //元素绑定函数
  12. if (beforeSubmit && typeof Form.api.custom[beforeSubmit] == 'function') {
  13. if (!Form.api.custom[beforeSubmit].call(form)) {
  14. return false;
  15. }
  16. }
  17. //自定义函数
  18. if (typeof onBeforeSubmit == 'function') {
  19. if (!onBeforeSubmit.call(form)) {
  20. return false;
  21. }
  22. }
  23. var type = form.attr("method").toUpperCase();
  24. type = type && (type == 'GET' || type == 'POST') ? type : 'GET';
  25. url = form.attr("action");
  26. url = url ? url : location.href;
  27. $.ajax({
  28. type: type,
  29. url: url,
  30. data: form.serialize(),
  31. dataType: 'json',
  32. success: function (ret) {
  33. if (ret.hasOwnProperty("code")) {
  34. var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
  35. var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
  36. if (ret.code === 1) {
  37. $('.form-group', form).removeClass('has-feedback has-success has-error');
  38. //成功提交后事件
  39. var afterSubmit = form.data("after-submit");
  40. //元素绑定函数
  41. if (afterSubmit && typeof Form.api.custom[afterSubmit] == 'function') {
  42. if (!Form.api.custom[afterSubmit].call(form, data)) {
  43. return false;
  44. }
  45. }
  46. //自定义函数
  47. if (typeof onAfterSubmit == 'function') {
  48. if (!onAfterSubmit.call(form, data)) {
  49. return false;
  50. }
  51. }
  52. Toastr.success(msg ? msg : __('Operation completed'));
  53. } else {
  54. if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
  55. $("input[name='__token__']").val(data.token);
  56. }
  57. Toastr.error(msg ? msg : __('Operation failed'));
  58. }
  59. } else {
  60. Toastr.error(__('Unknown data format'));
  61. }
  62. }, error: function () {
  63. Toastr.error(__('Network error'));
  64. }, complete: function (e) {
  65. }
  66. });
  67. return false;
  68. },
  69. bindevent: function (form, onBeforeSubmit, onAfterSubmit) {
  70. form.validator($.extend({
  71. validClass: 'has-success',
  72. invalidClass: 'has-error',
  73. bindClassTo: '.form-group',
  74. formClass: 'n-default n-bootstrap',
  75. msgClass: 'n-right',
  76. stopOnError: true,
  77. display: function (elem) {
  78. return $(elem).closest('.form-group').find(".control-label").text().replace(/\:/, '');
  79. },
  80. target: function (input) {
  81. var $formitem = $(input).closest('.form-group'),
  82. $msgbox = $formitem.find('span.msg-box');
  83. if (!$msgbox.length) {
  84. return [];
  85. }
  86. return $msgbox;
  87. },
  88. valid: function (ret) {
  89. //验证通过提交表单
  90. Form.api.submit($(ret), onBeforeSubmit, function (data) {
  91. if (typeof onAfterSubmit == 'function') {
  92. if (!onAfterSubmit.call($(ret), data)) {
  93. return false;
  94. }
  95. }
  96. //提示及关闭当前窗口
  97. parent.Toastr.success(__('Operation completed'));
  98. parent.$(".btn-refresh").trigger("click");
  99. var index = parent.Layer.getFrameIndex(window.name);
  100. parent.Layer.close(index);
  101. });
  102. return false;
  103. }
  104. }, form.data("validator-options") || {}));
  105. //绑定select元素事件
  106. if ($(".selectpicker", form).size() > 0) {
  107. require(['bootstrap-select'], function () {
  108. $('.selectpicker', form).selectpicker();
  109. });
  110. }
  111. //绑定selectpage元素事件
  112. if ($(".selectpage", form).size() > 0) {
  113. require(['selectpage'], function () {
  114. $('.selectpage', form).selectPage({
  115. source: 'ajax/selectpage',
  116. });
  117. });
  118. }
  119. //绑定cxselect元素事件
  120. if ($("[data-toggle='cxselect']").size() > 0) {
  121. require(['cxselect'], function () {
  122. $.cxSelect.defaults.jsonName = 'name';
  123. $.cxSelect.defaults.jsonValue = 'value';
  124. $.cxSelect.defaults.jsonSpace = 'data';
  125. $("[data-toggle='cxselect']").cxSelect();
  126. });
  127. }
  128. //绑定日期时间元素事件
  129. if ($(".datetimepicker", form).size() > 0) {
  130. require(['bootstrap-datetimepicker'], function () {
  131. $('.datetimepicker', form).parent().css('position', 'relative');
  132. $('.datetimepicker', form)
  133. .datetimepicker({
  134. format: 'YYYY-MM-DD HH:mm:ss',
  135. icons: {
  136. time: 'fa fa-clock-o',
  137. date: 'fa fa-calendar',
  138. up: 'fa fa-chevron-up',
  139. down: 'fa fa-chevron-down',
  140. previous: 'fa fa-chevron-left',
  141. next: 'fa fa-chevron-right',
  142. today: 'fa fa-history',
  143. clear: 'fa fa-trash',
  144. close: 'fa fa-remove'
  145. },
  146. showTodayButton: true,
  147. showClose: true
  148. });
  149. });
  150. }
  151. //绑定summernote事件
  152. if ($(".summernote", form).size() > 0) {
  153. require(['summernote'], function () {
  154. $(".summernote", form).summernote({
  155. height: 250,
  156. lang: 'zh-CN',
  157. fontNames: [
  158. 'Arial', 'Arial Black', 'Serif', 'Sans', 'Courier',
  159. 'Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande',
  160. "Open Sans", "Hiragino Sans GB", "Microsoft YaHei",
  161. '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆',
  162. ],
  163. fontNamesIgnoreCheck: [
  164. "Open Sans", "Microsoft YaHei",
  165. '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆'
  166. ],
  167. dialogsInBody: true,
  168. callbacks: {
  169. onChange: function (contents) {
  170. $(this).val(contents);
  171. $(this).trigger('change');
  172. },
  173. onInit: function () {
  174. },
  175. onImageUpload: function (files) {
  176. var that = this;
  177. //依次上传图片
  178. for (var i = 0; i < files.length; i++) {
  179. Upload.api.send(files[i], function (data) {
  180. var url = Backend.api.cdnurl(data.url);
  181. $(that).summernote("insertImage", url, 'filename');
  182. });
  183. }
  184. }
  185. }
  186. });
  187. });
  188. }
  189. //绑定plupload上传元素事件
  190. if ($(".plupload", form).size() > 0) {
  191. Upload.api.plupload();
  192. }
  193. //绑定fachoose选择附件事件
  194. if ($(".fachoose", form).size() > 0) {
  195. $(document).on('click', ".fachoose", function () {
  196. var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;
  197. var mimetype = $(this).data("mimetype") ? $(this).data("mimetype") : '';
  198. Backend.api.open("general/attachment/select?callback=refreshchoose&element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype=" + mimetype, __('Choose'));
  199. return false;
  200. });
  201. //刷新选择的元素
  202. window.refreshchoose = function (id, data, multiple) {
  203. var input_id = $("#" + id).data("input-id");
  204. if (multiple) {
  205. var urlArr = [];
  206. var inputObj = $("#" + input_id);
  207. if (inputObj.val() != "") {
  208. urlArr.push(inputObj.val());
  209. }
  210. urlArr.push(data.url);
  211. inputObj.val(urlArr.join(",")).trigger("change");
  212. } else {
  213. $("#" + input_id).val(data.url).trigger("change");
  214. }
  215. layer.closeAll();
  216. };
  217. }
  218. },
  219. custom: {}
  220. },
  221. };
  222. return Form;
  223. });