123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654 |
- define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'clipboard'], function ($, undefined, Backend, Table, Form, ClipboardJS) {
- var output = $("#output");
- var refresh = function (obj) {
- if (obj.data("selectpicker")) {
- obj.selectpicker('refresh');
- }
- };
- var check = function (data) {
- if (data.id && data.key && data.id == data.key) {
- return "循环变量id和键名变量key不能相同";
- }
- if (data.id && data.id.match(/^[0-9]+/)) {
- return "循环变量id不能以数字开头";
- }
- if (data.key && data.key.match(/^[0-9]+/)) {
- return "键名变量key不能以数字开头";
- }
- if (data.limit && !data.limit.match(/^(([0-9]+)|([0-9]+\,[0-9]+))$/)) {
- return "偏移值格式不正确";
- }
- if (data.cache && !data.cache.match(/^(true|false|[0-9]+)$/)) {
- return "缓存时长只能是true、false或具体的数字";
- }
- return '';
- };
- var flash = function (dom) {
- var flashClass = "flash";
- dom.addClass(flashClass);
- dom.on('animationend', function () {
- dom.removeClass(flashClass);
- });
- };
- $(document).on("click", ".btn-result", function () {
- Fast.api.ajax({
- url: "cms/builder/parse",
- data: {"tag": output.val()}
- }, function (data, ret) {
- data = $.trim(data);
- data = data ? data : "未配置循环字段或返回结果为空";
- $("#result").val(data);
- flash($("#result"));
- return false;
- }, function (data, ret) {
- });
- });
- var Controller = {
- index: function () {
- this.config($("#config-form"));
- this.arclist($("#arclist-form"));
- this.channellist($("#channellist-form"));
- this.spagelist($("#spagelist-form"));
- this.speciallist($("#speciallist-form"));
- this.blocklist($("#blocklist-form"));
- this.userlist($("#userlist-form"));
- this.query($("#query-form"));
- this.api.bindevent();
- },
- config: function (form) {
- form.on("click", ".config-list a", function () {
- $(".config-list a").removeClass("btn-info active");
- $(this).addClass("btn-info active");
- if ($(this).data("type") == "array") {
- if ($("#func", form).val().indexOf("json_encode") == -1) {
- $("#func", form).val("json_encode");
- }
- } else {
- if ($("#func", form).val().indexOf("json_encode") > -1) {
- $("#func", form).val("");
- }
- }
- $(".btn-command", form).trigger("click");
- return false;
- });
- form.on("click", ".btn-command", function () {
- if ($(".config-list a.active").size() == 0) {
- Layer.msg("请选择")
- return false;
- }
- var data = $(".config-list a.active").data();
- data.defaultvalue = $("#defaultvalue", form).val() ? "|default='" + $("#defaultvalue", form).val() + "'" : "";
- data.func = $("#func", form).val() ? "|" + $("#func", form).val() : "";
- output.val(Template("configtpl", data));
- flash(output);
- });
- },
- arclist: function (form) {
- var model = $("#model", form);
- var channel = $("#channel", form);
- var channeltype = $("#channeltype", form);
- var field = $("#field", form);
- var addon = $("#addon", form);
- var channelfield = $("#channelfield", form);
- var userfield = $("#userfield", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'channel', 'type', 'with', 'field', 'addon'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'addon' || j.name == 'with' || j.name == 'channel') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["url", "fullurl", "imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (addon.find("option[value='']:selected").size() == 0) {
- $(addon.find("option" + (addon.find("option[value='true']:selected").size() > 0 ? "[value!=''][value!='true']" : ":selected"))).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (channelfield.find("option:selected").size() > 0) {
- $(channelfield.find("option:selected")).each(function (i, j) {
- columns.push("{$" + data.id + ".channel." + $(j).attr("value") + "}");
- });
- }
- if (userfield.find("option:selected").size() > 0) {
- $(userfield.find("option:selected")).each(function (i, j) {
- columns.push("{$" + data.id + ".user." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、副表字段、栏目字段、会员字段中选择需要显示的字段信息}");
- columns.push("{//你也可以直接在循环体内添加文字、标签或判断}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("arclisttpl", data));
- flash(output);
- return false;
- });
- form.on("change", "#model", function () {
- $("option", channel).prop("disabled", false).prop("selected", false);
- addon.find("option").prop("selected", false);
- var id = $(this).val();
- if (!id) {
- $("option[data-type='link']", channel).prop("disabled", true);
- } else {
- $("option[data-model!='" + id + "']", channel).prop("disabled", true);
- }
- addon.prop("disabled", false);
- refresh(channel);
- refresh(addon);
- return false;
- });
- form.on("change", "#channel", function () {
- var modelIds = [];
- $("option:selected", channel).each(function () {
- if (modelIds.indexOf($(this).data("model")) == -1) {
- modelIds.push($(this).data("model"));
- }
- });
- if (modelIds.length > 1) {
- addon.prop("disabled", true).html("");
- addon.data("id", currentId[name]);
- } else {
- addon.prop("disabled", false);
- }
- refresh(addon);
- return false;
- });
- var currentId = {channel: '', model: ''};
- form.on("change", "#channel,#model", function () {
- var orderby = $("#orderby", form);
- var name = $(this).attr("name");
- currentId[name] = name == "model" ? $(this).val() : $("option:selected", this).data("model");
- if (currentId[name]) {
- if (addon.data("id") != currentId[name]) {
- $("optgroup", orderby).remove();
- Fast.api.ajax({
- url: "cms/builder/get_model_fields",
- data: {"id": currentId[name]}
- }, function (data, ret) {
- var fields = data.fields;
- fields.unshift({name: "", title: "无"}, {name: "true", title: "全部"});
- var html = [];
- for (var i = 0; i < fields.length; i++) {
- html.push("<option value='" + fields[i].name + "' data-subtext='" + fields[i].title + "'>" + fields[i].name + "</option>");
- }
- addon.html(html.join(""));
- addon.data("id", currentId[name]);
- orderby.append("<optgroup label='副表'>" + html.slice(2).join("") + "</optgroup>");
- refresh(addon);
- refresh(orderby);
- return false;
- });
- }
- } else {
- $("optgroup", orderby).remove();
- addon.data("id", currentId[name]);
- refresh(addon);
- refresh(orderby);
- }
- return false;
- });
- var oldFieldValue = [];
- form.on("change", "#field", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='user_id'],option[value='channel_id'],option[value='title'],option[value='diyname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- form.on("change", "#addon", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 || value.indexOf("true") > -1) {
- var selected = value.indexOf("true") > -1 ? "true" : "";
- addon.find("option").prop("selected", false);
- addon.find("option[value='" + selected + "']").prop("selected", true);
- refresh(addon);
- }
- });
- },
- channellist: function (form) {
- var model = $("[name='model']", form);
- var channel = $("[name='typeid']", form);
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'typeid', 'type', 'with', 'field'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'typeid') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["url", "fullurl", "imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、中选择需要显示的字段信息}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("channellisttpl", data));
- flash(output);
- return false;
- });
- model.on("change", function () {
- $("option", channel).prop("disabled", false).prop("selected", false);
- var id = $(this).val();
- if (!id) {
- $("option[data-type='link']", channel).prop("disabled", true);
- } else {
- $("option[data-model!='" + id + "']", channel).prop("disabled", true);
- }
- refresh(channel);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='name'],option[value='diyname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- spagelist: function (form) {
- var model = $("[name='model']", form);
- var channel = $("[name='typeid']", form);
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'type', 'with', 'field'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'type') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["url", "fullurl", "imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、中选择需要显示的字段信息}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("spagelisttpl", data));
- flash(output);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='title'],option[value='diyname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- speciallist: function (form) {
- var model = $("[name='model']", form);
- var channel = $("[name='typeid']", form);
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'type', 'with', 'field'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'type') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["url", "fullurl", "imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、中选择需要显示的字段信息}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("speciallisttpl", data));
- flash(output);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='title'],option[value='image'],option[value='diyname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- blocklist: function (form) {
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'type', 'name', 'with', 'field'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'type' || j.name == 'name') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、中选择需要显示的字段信息}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("blocklisttpl", data));
- flash(output);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='title'],option[value='url'],option[value='image'],option[value='begintime'],option[value='endtime']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- userlist: function (form) {
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'orderby', 'orderway', 'offset', 'limit', 'cache', 'model', 'type', 'with', 'field'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (j.name == 'field' || j.name == 'type') {
- j.value = $.map($("#" + j.name + " option:selected", form).filter(function (key, value) {
- return ["url", "fullurl", "imglink", "textlink", "img"].indexOf($(value).attr("value")) == -1;
- }), function (j) {
- return $(j).attr("value");
- }).join(",");
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- var columns = [];
- if (field.find("option[value!='']:selected").size() > 0) {
- $("option" + (field.find("option:selected").size() ? ":selected" : "") + "[value!='']", field).each(function (i, j) {
- columns.push("{$" + data.id + "." + $(j).attr("value") + "}");
- });
- }
- if (columns.length == 0) {
- columns.push("{//你可以从左侧主表字段、中选择需要显示的字段信息}");
- }
- data.attrs = data.attrs.join(" ");
- data.columns = columns;
- output.val(Template("userlisttpl", data));
- flash(output);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='avatar'],option[value='nickname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- query: function (form) {
- var field = $("[name='field']", form);
- form.on("click", ".btn-command", function () {
- var attrs = ['id', 'empty', 'key', 'mod', 'row', 'sql', 'bind'];
- var data = {attrs: []};
- $(form.serializeArray()).each(function (i, j) {
- if (j.name == 'id' && j.value == '') {
- j.value = 'item';
- }
- if (typeof data[j.name] == 'undefined') {
- data[j.name] = j.value;
- if (attrs.indexOf(j.name) > -1 && j.value != '') {
- data.attrs.push(j.name + '="' + j.value + '"');
- }
- }
- });
- var tips = check(data);
- if (tips) {
- Layer.msg(tips);
- return;
- }
- data.attrs = data.attrs.join(" ");
- output.val(Template("querytpl", data));
- flash(output);
- return false;
- });
- var oldFieldValue = [];
- field.on("change", function () {
- var value = $(this).val();
- if (value.indexOf("") > -1 && oldFieldValue.indexOf("") == -1) {
- field.find("option").prop("selected", false);
- field.find("option[value='']").prop("selected", true);
- } else {
- field.find("option[value='']").prop("selected", false);
- field.find("option[value='id'],option[value='avatar'],option[value='nickname']").prop("selected", true);
- }
- refresh(field);
- oldFieldValue = field.val();
- });
- },
- api: {
- bindevent: function () {
- Form.api.bindevent($("form[role=form]"));
- //点击复制
- var clipboard = new ClipboardJS('.btn-copy', {
- text: function () {
- return output.val();
- }
- });
- clipboard.on('success', function (e) {
- Layer.msg("复制成功");
- e.clearSelection();
- });
- }
- }
- };
- return Controller;
- });
|